From 12ca21b9e44f1eb7d19e87e74364ce712155f159 Mon Sep 17 00:00:00 2001 From: Zukero Date: Fri, 30 Oct 2015 14:02:38 +0100 Subject: [PATCH] Added "active" setting for SpawnAreas. Added cool tooltip to DialogueGraphView --- .../atcontentstudio/model/maps/SpawnArea.java | 7 + .../ui/gamedataeditors/DialogueEditor.java | 128 ++++++++++-------- .../dialoguetree/DialogueGraphView.java | 99 ++++++++++++++ .../atcontentstudio/ui/map/TMXMapEditor.java | 7 + 4 files changed, 181 insertions(+), 60 deletions(-) diff --git a/src/com/gpl/rpg/atcontentstudio/model/maps/SpawnArea.java b/src/com/gpl/rpg/atcontentstudio/model/maps/SpawnArea.java index 9f631d0..cee18b1 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/maps/SpawnArea.java +++ b/src/com/gpl/rpg/atcontentstudio/model/maps/SpawnArea.java @@ -12,6 +12,7 @@ public class SpawnArea extends MapObject { public int quantity = 1; public int spawnchance = 10; + public boolean active = true; public List spawnGroup = new ArrayList(); public SpawnArea(tiled.core.MapObject obj) { @@ -21,6 +22,9 @@ public class SpawnArea extends MapObject { if (obj.getProperties().getProperty("spawnchance") != null) { this.spawnchance = Integer.parseInt(obj.getProperties().getProperty("spawnchance")); } + if (obj.getProperties().getProperty("active") != null) { + this.active = Boolean.parseBoolean(obj.getProperties().getProperty("active")); + } } @Override @@ -67,6 +71,9 @@ public class SpawnArea extends MapObject { if (spawnchance != 10) { tmxObject.getProperties().setProperty("spawnchance", Integer.toString(spawnchance)); } + if (!this.active) { + tmxObject.getProperties().setProperty("active", Boolean.toString(active)); + } } } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java index 9b19a6a..d2a8be5 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java @@ -717,63 +717,67 @@ public class DialogueEditor extends JSONElementEditor { JLabel label = ((JLabel)c); Dialogue.Reward reward = (Dialogue.Reward)value; - if (reward.type != null) { - String rewardObjDesc = null; - if( reward.reward_obj != null) { - rewardObjDesc = reward.reward_obj.getDesc(); - } else if (reward.reward_obj_id != null) { - rewardObjDesc = reward.reward_obj_id; - } - switch (reward.type) { - case activateMapChangeArea: - label.setText("Activate mapchange area "+rewardObjDesc+" on map "+reward.map_name); - break; - case actorCondition: - label.setText("Give actor condition "+rewardObjDesc+" for "+reward.reward_value+" turns"); - if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon())); - break; - case alignmentChange: - label.setText("Change alignment for faction "+rewardObjDesc+" : "+reward.reward_value); - break; - case createTimer: - label.setText("Create timer "+rewardObjDesc); - break; - case deactivateMapChangeArea: - label.setText("Deactivate mapchange area "+rewardObjDesc+" on map "+reward.map_name); - break; - case deactivateSpawnArea: - label.setText("Deactivate spawnarea area "+rewardObjDesc+" on map "+reward.map_name); - break; - case dropList: - label.setText("Give contents of droplist "+rewardObjDesc); - if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon())); - break; - case giveItem: - label.setText("Give "+reward.reward_value+" "+rewardObjDesc); - if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon())); - break; - case questProgress: - label.setText("Give quest progress "+rewardObjDesc+":"+reward.reward_value); - if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon())); - break; - case removeSpawnArea: - label.setText("Remove all monsters in spawnarea area "+rewardObjDesc+" on map "+reward.map_name); - break; - case skillIncrease: - label.setText("Increase skill "+rewardObjDesc+" level"); - break; - case spawnAll: - label.setText("Respawn all monsters in spawnarea area "+rewardObjDesc+" on map "+reward.map_name); - break; - } - } else { - label.setText("New, undefined reward"); - } + decorateRewardJLabel(label, reward); } return c; } } + public static void decorateRewardJLabel(JLabel label, Dialogue.Reward reward) { + if (reward.type != null) { + String rewardObjDesc = null; + if( reward.reward_obj != null) { + rewardObjDesc = reward.reward_obj.getDesc(); + } else if (reward.reward_obj_id != null) { + rewardObjDesc = reward.reward_obj_id; + } + switch (reward.type) { + case activateMapChangeArea: + label.setText("Activate mapchange area "+rewardObjDesc+" on map "+reward.map_name); + break; + case actorCondition: + label.setText("Give actor condition "+rewardObjDesc+" for "+reward.reward_value+" turns"); + if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon())); + break; + case alignmentChange: + label.setText("Change alignment for faction "+rewardObjDesc+" : "+reward.reward_value); + break; + case createTimer: + label.setText("Create timer "+rewardObjDesc); + break; + case deactivateMapChangeArea: + label.setText("Deactivate mapchange area "+rewardObjDesc+" on map "+reward.map_name); + break; + case deactivateSpawnArea: + label.setText("Deactivate spawnarea area "+rewardObjDesc+" on map "+reward.map_name); + break; + case dropList: + label.setText("Give contents of droplist "+rewardObjDesc); + if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon())); + break; + case giveItem: + label.setText("Give "+reward.reward_value+" "+rewardObjDesc); + if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon())); + break; + case questProgress: + label.setText("Give quest progress "+rewardObjDesc+":"+reward.reward_value); + if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon())); + break; + case removeSpawnArea: + label.setText("Remove all monsters in spawnarea area "+rewardObjDesc+" on map "+reward.map_name); + break; + case skillIncrease: + label.setText("Increase skill "+rewardObjDesc+" level"); + break; + case spawnAll: + label.setText("Respawn all monsters in spawnarea area "+rewardObjDesc+" on map "+reward.map_name); + break; + } + } else { + label.setText("New, undefined reward"); + } + } + public static class RepliesListModel implements ListModel { @@ -981,19 +985,23 @@ public class DialogueEditor extends JSONElementEditor { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (c instanceof JLabel) { - ((JLabel)c).setText(((Requirement)value).getDesc()); - if (((Requirement)value).required_obj != null) { - if (((Requirement)value).required_obj.getIcon() != null) { - ((JLabel)c).setIcon(new ImageIcon(((Requirement)value).required_obj.getIcon())); - } - } if (((Requirement)value).type == null) { - ((JLabel)c).setText("New, undefined requirement."); - } + decorateRequirementJLabel((JLabel)c, (Requirement)value); } return c; } } + public static void decorateRequirementJLabel(JLabel label, Requirement req) { + label.setText(req.getDesc()); + if (req.required_obj != null) { + if (req.required_obj.getIcon() != null) { + label.setIcon(new ImageIcon(req.required_obj.getIcon())); + } + } if (req.type == null) { + label.setText("New, undefined requirement."); + } + } + public class DialogueFieldUpdater implements FieldUpdateListener { @Override public void valueChanged(JComponent source, Object value) { diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/dialoguetree/DialogueGraphView.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/dialoguetree/DialogueGraphView.java index d3d5951..d11964e 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/dialoguetree/DialogueGraphView.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/dialoguetree/DialogueGraphView.java @@ -1,7 +1,11 @@ package com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree; import java.awt.BasicStroke; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; import java.awt.Image; +import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; @@ -9,6 +13,12 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JToolTip; +import javax.swing.ToolTipManager; + import prefuse.Display; import prefuse.Visualization; import prefuse.action.ActionList; @@ -42,7 +52,11 @@ import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue; import com.gpl.rpg.atcontentstudio.model.gamedata.NPC; +import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement; import com.gpl.rpg.atcontentstudio.ui.DefaultIcons; +import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.DialogueEditor; +import com.gpl.rpg.atcontentstudio.ui.map.TMXMapEditor.TMXReplacementViewer; +import com.jidesoft.swing.JideBoxLayout; public class DialogueGraphView extends Display { @@ -147,6 +161,7 @@ public class DialogueGraphView extends Display { setSize(500,500); pan(250, 250); setHighQuality(true); + addControlListener(new TooltipControl()); addControlListener(new DoubleClickControl()); addControlListener(new WheelZoomControl()); addControlListener(new ZoomControl()); @@ -434,6 +449,90 @@ public class DialogueGraphView extends Display { } } } + + class TooltipControl extends ControlAdapter { + + @Override + public void itemEntered(VisualItem item, MouseEvent e) { + if (item.get(TARGET) != null) { + tooltippedItem = item; + if (!tooltipActivated) { + setToolTipText(""); + ToolTipManager.sharedInstance().registerComponent(DialogueGraphView.this); + ToolTipManager.sharedInstance().setEnabled(true); + tooltipActivated = true; + } + } + } + @Override + public void itemExited(VisualItem item, MouseEvent e) { + //Hides the tooltip... + ToolTipManager.sharedInstance().setEnabled(false); + ToolTipManager.sharedInstance().unregisterComponent(DialogueGraphView.this); + tooltipActivated = false; + } + } + + JToolTip tt = null; + private VisualItem tooltippedItem = null; + private VisualItem lastTTItem = null; + private boolean tooltipActivated = false; + + @Override + public Point getToolTipLocation(MouseEvent event) { + return new Point(event.getX() + 5, event.getY() + 5); + } + + @Override + public JToolTip createToolTip() { + if (tt == null) tt = super.createToolTip(); + if (tooltippedItem == lastTTItem) { + return tt; + } + tt = super.createToolTip(); + lastTTItem = tooltippedItem; + tt.setLayout(new BorderLayout()); + JPanel content = new JPanel(); + content.setLayout(new JideBoxLayout(content, JideBoxLayout.PAGE_AXIS)); + JLabel label; + if (tooltippedItem != null) { + Object target = tooltippedItem.get(TARGET); + if (target != null) { + if (target instanceof Dialogue) { + Dialogue d = (Dialogue) target; + label = new JLabel(new ImageIcon(DefaultIcons.getDialogueIcon())); + label.setText(d.id); + content.add(label, JideBoxLayout.FIX); + if (tooltippedItem.get(REPLY) == null) { + if (d.rewards != null && !d.rewards.isEmpty()) { + for (Dialogue.Reward r : d.rewards) { + label = new JLabel(); + DialogueEditor.decorateRewardJLabel(label, r); + content.add(label, JideBoxLayout.FIX); + } + } + } else { + Object replObj = tooltippedItem.get(REPLY); + if (replObj instanceof Dialogue.Reply) { + Dialogue.Reply r = (Dialogue.Reply) replObj; + if (r.requirements != null && !r.requirements.isEmpty()) { + for (Requirement req : r.requirements) { + label = new JLabel(); + DialogueEditor.decorateRequirementJLabel(label, req); + content.add(label, JideBoxLayout.FIX); + } + } + } + } + } + } + + } + + tt.add(content, BorderLayout.CENTER); + tt.setPreferredSize(tt.getLayout().preferredLayoutSize(tt)); + return tt; + } } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java index 41a7221..bb4d205 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java @@ -146,6 +146,7 @@ public class TMXMapEditor extends Editor { private JComboBox targetAreaCombo; private JComboBox evaluateTriggerBox; private JSpinner quantityField; + private JCheckBox activeForNewGame; private JList npcList; private SpawnGroupNpcListModel npcListModel; @@ -547,6 +548,7 @@ public class TMXMapEditor extends Editor { } else if (selected instanceof SpawnArea) { areaField = addTextField(pane, "Spawn group ID: ", ((SpawnArea)selected).name, ((TMXMap)target).writable, listener); quantityField = addIntegerField(pane, "Number of spawned NPCs: ", ((SpawnArea)selected).quantity, false, ((TMXMap)target).writable, listener); + activeForNewGame = addBooleanBasedCheckBox(pane, "Active in a new game: ", ((SpawnArea)selected).active, ((TMXMap)target).writable, listener); npcListModel = new SpawnGroupNpcListModel((SpawnArea) selected); npcList = new JList(npcListModel); npcList.setCellRenderer(new GDERenderer(true, ((TMXMap)target).writable)); @@ -1800,6 +1802,11 @@ public class TMXMapEditor extends Editor { SpawnArea area = (SpawnArea) selectedMapObject; area.quantity = (Integer) value; } + } else if (source == activeForNewGame) { + if (selectedMapObject instanceof SpawnArea) { + SpawnArea area = (SpawnArea) selectedMapObject; + area.active = (Boolean) value; + } } else if (source == requirementTypeCombo) { if (selectedMapObject instanceof KeyArea) { KeyArea area = (KeyArea) selectedMapObject;