From 300b7bbbddacd0c3bc1a2b5fd40b7a07d349c7b3 Mon Sep 17 00:00:00 2001 From: Zukero Date: Mon, 3 Apr 2017 17:53:44 +0200 Subject: [PATCH] Fixed caching issue with spritesheet chooser. Improved actor condition management for items. --- ATCS_JAR.jardesc | 2 +- packaging/Windows/ATCS_Installer.nsi | 2 +- .../rpg/atcontentstudio/ATContentStudio.java | 2 +- .../rpg/atcontentstudio/model/Project.java | 20 ++ .../model/WorkspaceSettings.java | 2 +- .../model/gamedata/ActorCondition.java | 2 + .../ui/gamedataeditors/ItemEditor.java | 197 ++++++++++++++++-- .../ui/sprites/SpriteChooser.java | 22 +- .../ui/sprites/SpritesheetEditor.java | 1 + 9 files changed, 232 insertions(+), 18 deletions(-) diff --git a/ATCS_JAR.jardesc b/ATCS_JAR.jardesc index 319aa94..14ebad3 100644 --- a/ATCS_JAR.jardesc +++ b/ATCS_JAR.jardesc @@ -1,6 +1,6 @@ - + diff --git a/packaging/Windows/ATCS_Installer.nsi b/packaging/Windows/ATCS_Installer.nsi index 9da5239..30a275d 100644 --- a/packaging/Windows/ATCS_Installer.nsi +++ b/packaging/Windows/ATCS_Installer.nsi @@ -1,6 +1,6 @@ !include MUI2.nsh -!define VERSION "0.5.2" +!define VERSION "0.5.3" !define TRAINER_VERSION "0.1.3" !define JAVA_BIN "javaw" diff --git a/src/com/gpl/rpg/atcontentstudio/ATContentStudio.java b/src/com/gpl/rpg/atcontentstudio/ATContentStudio.java index fbb2ab8..081d624 100644 --- a/src/com/gpl/rpg/atcontentstudio/ATContentStudio.java +++ b/src/com/gpl/rpg/atcontentstudio/ATContentStudio.java @@ -22,7 +22,7 @@ import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector; public class ATContentStudio { public static final String APP_NAME = "Andor's Trail Content Studio"; - public static final String APP_VERSION = "v0.5.2"; + public static final String APP_VERSION = "v0.5.3"; public static boolean STARTED = false; public static StudioFrame frame = null; diff --git a/src/com/gpl/rpg/atcontentstudio/model/Project.java b/src/com/gpl/rpg/atcontentstudio/model/Project.java index 570db25..d46f830 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/Project.java +++ b/src/com/gpl/rpg/atcontentstudio/model/Project.java @@ -665,6 +665,26 @@ public class Project implements ProjectTreeNode, Serializable { return sheet; } + public int getSpritesheetCount() { + return createdContent.gameSprites.spritesheets.size() + baseContent.gameSprites.spritesheets.size(); + } + + public Spritesheet getSpritesheet(int index) { + if (index < createdContent.gameSprites.spritesheets.size()) { + return createdContent.gameSprites.spritesheets.get(index); + } else if (index < getQuestCount()){ + return getSpritesheet(baseContent.gameSprites.spritesheets.get(index - createdContent.gameSprites.spritesheets.size()).id); + } + return null; + } + + public int getSpritesheetIndex(Spritesheet spritesheet) { + if (spritesheet.getDataType() == GameSource.Type.created) { + return createdContent.gameSprites.spritesheets.indexOf(spritesheet); + } else { + return createdContent.gameSprites.spritesheets.size() + baseContent.gameSprites.spritesheets.indexOf(baseContent.gameSprites.getSpritesheet(spritesheet.id)); + } + } public TMXMap getMap(String id) { TMXMap map = createdContent.gameMaps.getMap(id); diff --git a/src/com/gpl/rpg/atcontentstudio/model/WorkspaceSettings.java b/src/com/gpl/rpg/atcontentstudio/model/WorkspaceSettings.java index 37c9329..666e0f1 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/WorkspaceSettings.java +++ b/src/com/gpl/rpg/atcontentstudio/model/WorkspaceSettings.java @@ -110,7 +110,7 @@ public class WorkspaceSettings { return; } - json.put(VERSION_KEY, ATContentStudio.APP_VERSION); + json.put(VERSION_KEY, SETTINGS_VERSION); StringWriter writer = new JsonPrettyWriter(); try { JSONObject.writeJSONString(json, writer); diff --git a/src/com/gpl/rpg/atcontentstudio/model/gamedata/ActorCondition.java b/src/com/gpl/rpg/atcontentstudio/model/gamedata/ActorCondition.java index 02a653a..f76a9cf 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/gamedata/ActorCondition.java +++ b/src/com/gpl/rpg/atcontentstudio/model/gamedata/ActorCondition.java @@ -20,6 +20,8 @@ import com.gpl.rpg.atcontentstudio.model.GameSource; public class ActorCondition extends JSONElement { private static final long serialVersionUID = -3969824899972048507L; + + public static final Integer CLEAR_AC_MAGNITUDE = -99; // Available from init state //public String id; inherited. diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java index 5706d89..b801691 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import javax.swing.ButtonGroup; import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JButton; @@ -15,6 +16,7 @@ import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; +import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.JTextField; @@ -98,6 +100,8 @@ public class ItemEditor extends JSONElementEditor { @SuppressWarnings("rawtypes") private JList hitSourceConditionsList; private MyComboBox hitSourceConditionBox; + private JRadioButton hitSourceConditionClear; + private JRadioButton hitSourceConditionApply; private JSpinner hitSourceConditionMagnitude; private JSpinner hitSourceConditionDuration; private JSpinner hitSourceConditionChance; @@ -105,6 +109,8 @@ public class ItemEditor extends JSONElementEditor { @SuppressWarnings("rawtypes") private JList hitTargetConditionsList; private MyComboBox hitTargetConditionBox; + private JRadioButton hitTargetConditionClear; + private JRadioButton hitTargetConditionApply; private JSpinner hitTargetConditionMagnitude; private JSpinner hitTargetConditionDuration; private JSpinner hitTargetConditionChance; @@ -119,6 +125,8 @@ public class ItemEditor extends JSONElementEditor { @SuppressWarnings("rawtypes") private JList killSourceConditionsList; private MyComboBox killSourceConditionBox; + private JRadioButton killSourceConditionClear; + private JRadioButton killSourceConditionApply; private JSpinner killSourceConditionMagnitude; private JSpinner killSourceConditionDuration; private JSpinner killSourceConditionChance; @@ -461,55 +469,169 @@ public class ItemEditor extends JSONElementEditor { } - public void updateHitSourceTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, FieldUpdateListener listener) { + public void updateHitSourceTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, final FieldUpdateListener listener) { pane.removeAll(); if (hitSourceConditionBox != null) { removeElementListener(hitSourceConditionBox); } + if (condition == null) { + pane.revalidate(); + pane.repaint(); + return; + } + boolean writable = ((Item)target).writable; Project proj = ((Item)target).getProject(); hitSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - hitSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, false, writable, listener); - hitSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + hitSourceConditionApply = new JRadioButton("Apply new condition"); + pane.add(hitSourceConditionApply, JideBoxLayout.FIX); + hitSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, false, writable, listener); + hitSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); + hitSourceConditionClear = new JRadioButton("Clear active condition"); + pane.add(hitSourceConditionClear, JideBoxLayout.FIX); + + ButtonGroup radioGroup = new ButtonGroup(); + radioGroup.add(hitSourceConditionApply); + radioGroup.add(hitSourceConditionClear); + + if (condition != null && condition.magnitude != null && condition.magnitude == ActorCondition.CLEAR_AC_MAGNITUDE) { + hitSourceConditionClear.setSelected(true); + hitSourceConditionApply.setSelected(false); + hitSourceConditionMagnitude.setEnabled(false); + hitSourceConditionDuration.setEnabled(false); + } else { + hitSourceConditionClear.setSelected(false); + hitSourceConditionApply.setSelected(true); + hitSourceConditionMagnitude.setEnabled(true); + hitSourceConditionDuration.setEnabled(true); + } + + hitSourceConditionClear.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitSourceConditionClear, new Boolean(hitSourceConditionClear.isSelected())); + } + }); + hitSourceConditionApply.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitSourceConditionApply, new Boolean(hitSourceConditionApply.isSelected())); + } + }); pane.revalidate(); pane.repaint(); } - public void updateHitTargetTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, FieldUpdateListener listener) { + public void updateHitTargetTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, final FieldUpdateListener listener) { pane.removeAll(); if (hitTargetConditionBox != null) { removeElementListener(hitTargetConditionBox); } + if (condition == null) { + pane.revalidate(); + pane.repaint(); + return; + } boolean writable = ((Item)target).writable; Project proj = ((Item)target).getProject(); hitTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - hitTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, false, writable, listener); - hitTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - + hitTargetConditionApply = new JRadioButton("Apply new condition"); + pane.add(hitTargetConditionApply, JideBoxLayout.FIX); + hitTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, false, writable, listener); + hitTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); + hitTargetConditionClear = new JRadioButton("Clear active condition"); + pane.add(hitTargetConditionClear, JideBoxLayout.FIX); + + ButtonGroup radioGroup = new ButtonGroup(); + radioGroup.add(hitTargetConditionApply); + radioGroup.add(hitTargetConditionClear); + + if (condition != null && condition.magnitude != null && condition.magnitude == ActorCondition.CLEAR_AC_MAGNITUDE) { + hitTargetConditionClear.setSelected(true); + hitTargetConditionApply.setSelected(false); + hitTargetConditionMagnitude.setEnabled(false); + hitTargetConditionDuration.setEnabled(false); + } else { + hitTargetConditionClear.setSelected(false); + hitTargetConditionApply.setSelected(true); + hitTargetConditionMagnitude.setEnabled(true); + hitTargetConditionDuration.setEnabled(true); + } + + hitTargetConditionClear.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitTargetConditionClear, new Boolean(hitTargetConditionClear.isSelected())); + } + }); + hitTargetConditionApply.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitTargetConditionApply, new Boolean(hitTargetConditionApply.isSelected())); + } + }); + pane.revalidate(); pane.repaint(); } - public void updateKillSourceTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, FieldUpdateListener listener) { + public void updateKillSourceTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, final FieldUpdateListener listener) { pane.removeAll(); if (killSourceConditionBox != null) { removeElementListener(killSourceConditionBox); } + if (condition == null) { + pane.revalidate(); + pane.repaint(); + return; + } boolean writable = ((Item)target).writable; Project proj = ((Item)target).getProject(); killSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - killSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, false, writable, listener); - killSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); killSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - + killSourceConditionApply = new JRadioButton("Apply new condition"); + pane.add(killSourceConditionApply, JideBoxLayout.FIX); + killSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, false, writable, listener); + killSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); + killSourceConditionClear = new JRadioButton("Clear active condition"); + pane.add(killSourceConditionClear, JideBoxLayout.FIX); + + ButtonGroup radioGroup = new ButtonGroup(); + radioGroup.add(killSourceConditionApply); + radioGroup.add(killSourceConditionClear); + + if (condition != null && condition.magnitude != null && condition.magnitude == ActorCondition.CLEAR_AC_MAGNITUDE) { + killSourceConditionClear.setSelected(true); + killSourceConditionApply.setSelected(false); + killSourceConditionMagnitude.setEnabled(false); + killSourceConditionDuration.setEnabled(false); + } else { + killSourceConditionClear.setSelected(false); + killSourceConditionApply.setSelected(true); + killSourceConditionMagnitude.setEnabled(true); + killSourceConditionDuration.setEnabled(true); + } + + killSourceConditionClear.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(killSourceConditionClear, new Boolean(killSourceConditionClear.isSelected())); + } + }); + killSourceConditionApply.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(killSourceConditionApply, new Boolean(killSourceConditionApply.isSelected())); + } + }); pane.revalidate(); pane.repaint(); } @@ -519,6 +641,11 @@ public class ItemEditor extends JSONElementEditor { if (equipConditionBox != null) { removeElementListener(equipConditionBox); } + if (condition == null) { + pane.revalidate(); + pane.repaint(); + return; + } boolean writable = ((Item)target).writable; Project proj = ((Item)target).getProject(); @@ -666,7 +793,11 @@ public class ItemEditor extends JSONElementEditor { if (effect.condition != null) { label.setIcon(new ImageIcon(effect.condition.getIcon())); - label.setText(effect.chance+"% chances to give "+effect.duration+" rounds of "+effect.condition.getDesc()+" x"+effect.magnitude); + if (effect.magnitude == ActorCondition.CLEAR_AC_MAGNITUDE) { + label.setText(effect.chance+"% chances to clear "+effect.condition.getDesc()); + } else { + label.setText(effect.chance+"% chances to give "+effect.duration+" rounds of "+effect.condition.getDesc()+" x"+effect.magnitude); + } } else { label.setText("New, undefined actor condition effect."); } @@ -984,6 +1115,20 @@ public class ItemEditor extends JSONElementEditor { } hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); updateHit = true; + } else if (source == hitSourceConditionClear) { + selectedHitEffectSourceCondition.magnitude = ActorCondition.CLEAR_AC_MAGNITUDE; + selectedHitEffectSourceCondition.duration = null; + hitSourceConditionMagnitude.setEnabled(false); + hitSourceConditionDuration.setEnabled(false); + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionApply) { + selectedHitEffectSourceCondition.magnitude = 0; + selectedHitEffectSourceCondition.duration = 0; + hitSourceConditionMagnitude.setEnabled(true); + hitSourceConditionDuration.setEnabled(true); + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; } else if (source == hitSourceConditionMagnitude) { selectedHitEffectSourceCondition.magnitude = (Integer) value; hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); @@ -1011,6 +1156,20 @@ public class ItemEditor extends JSONElementEditor { } hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); updateHit = true; + } else if (source == hitTargetConditionClear) { + selectedHitEffectTargetCondition.magnitude = ActorCondition.CLEAR_AC_MAGNITUDE; + selectedHitEffectTargetCondition.duration = null; + hitTargetConditionMagnitude.setEnabled(false); + hitTargetConditionDuration.setEnabled(false); + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionApply) { + selectedHitEffectTargetCondition.magnitude = 0; + selectedHitEffectTargetCondition.duration = 0; + hitTargetConditionMagnitude.setEnabled(true); + hitTargetConditionDuration.setEnabled(true); + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; } else if (source == hitTargetConditionMagnitude) { selectedHitEffectTargetCondition.magnitude = (Integer) value; hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); @@ -1054,6 +1213,20 @@ public class ItemEditor extends JSONElementEditor { } killSourceConditionsModel.itemChanged(selectedKillEffectCondition); updateKill = true; + } else if (source == killSourceConditionClear) { + selectedKillEffectCondition.magnitude = ActorCondition.CLEAR_AC_MAGNITUDE; + selectedKillEffectCondition.duration = null; + killSourceConditionMagnitude.setEnabled(false); + killSourceConditionDuration.setEnabled(false); + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; + } else if (source == killSourceConditionApply) { + selectedKillEffectCondition.magnitude = 0; + selectedKillEffectCondition.duration = 0; + killSourceConditionMagnitude.setEnabled(true); + killSourceConditionDuration.setEnabled(true); + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; } else if (source == killSourceConditionMagnitude) { selectedKillEffectCondition.magnitude = (Integer) value; killSourceConditionsModel.itemChanged(selectedKillEffectCondition); diff --git a/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpriteChooser.java b/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpriteChooser.java index 689e34a..8601a9c 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpriteChooser.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpriteChooser.java @@ -35,13 +35,26 @@ public class SpriteChooser extends JDialog { private static final int MAX_PER_ROW = 10; public static Map> cache = new LinkedHashMap>(); - + public static Map>> cacheValidator = new LinkedHashMap>>(); + + public static SpriteChooser getChooser(Project proj, Spritesheet.Category category) { if (cache.get(proj) == null) { cache.put(proj, new LinkedHashMap()); } if (cache.get(proj).get(category) == null) { cache.get(proj).put(category, new SpriteChooser(proj, category)); + } else { + List spritesheets = new ArrayList(); + for (int i=0; i spritesheets = new ArrayList(); - for (Spritesheet sheet : proj.baseContent.gameSprites.spritesheets) { + for (int i=0; i>()); + } + cacheValidator.get(proj).put(category, spritesheets); JPanel pane = new JPanel(); diff --git a/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpritesheetEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpritesheetEditor.java index cf3c80d..89692e5 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpritesheetEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpritesheetEditor.java @@ -445,6 +445,7 @@ public class SpritesheetEditor extends Editor { } else if (source == categoryBox) { sheet.category = (Spritesheet.Category) value; } + sheet.save(); } }