From 6b049d3b7ba67ef8c4d05fb213f922eafe8e258f Mon Sep 17 00:00:00 2001 From: OMGeeky Date: Sat, 21 Jun 2025 17:38:16 +0200 Subject: [PATCH] rename CustomListModel to OrderedListenerListModel --- ...del.java => OrderedListenerListModel.java} | 4 +- .../ui/gamedataeditors/DialogueEditor.java | 12 +- .../ui/gamedataeditors/DroplistEditor.java | 4 +- .../ui/gamedataeditors/ItemEditor.java | 3920 ++++++++--------- .../ui/gamedataeditors/NPCEditor.java | 3224 +++++++------- .../ui/gamedataeditors/QuestEditor.java | 552 +-- .../atcontentstudio/ui/map/TMXMapEditor.java | 6 +- .../rpg/atcontentstudio/utils/UiUtils.java | 32 +- 8 files changed, 3875 insertions(+), 3879 deletions(-) rename src/com/gpl/rpg/atcontentstudio/ui/{CustomListModel.java => OrderedListenerListModel.java} (94%) diff --git a/src/com/gpl/rpg/atcontentstudio/ui/CustomListModel.java b/src/com/gpl/rpg/atcontentstudio/ui/OrderedListenerListModel.java similarity index 94% rename from src/com/gpl/rpg/atcontentstudio/ui/CustomListModel.java rename to src/com/gpl/rpg/atcontentstudio/ui/OrderedListenerListModel.java index db403c7..e4ceeee 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/CustomListModel.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/OrderedListenerListModel.java @@ -6,13 +6,13 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -public abstract class CustomListModel implements ListenerListModel { +public abstract class OrderedListenerListModel implements ListenerListModel { protected S source; protected abstract List getItems(); protected abstract void setItems(List items); - public CustomListModel(S source) { + public OrderedListenerListModel(S source) { this.source = source; } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java index 3480137..88e1c45 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java @@ -6,10 +6,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; @@ -44,7 +40,7 @@ import com.gpl.rpg.atcontentstudio.ui.BooleanBasedCheckBox; import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel; import com.gpl.rpg.atcontentstudio.ui.DefaultIcons; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; -import com.gpl.rpg.atcontentstudio.ui.CustomListModel; +import com.gpl.rpg.atcontentstudio.ui.OrderedListenerListModel; import com.gpl.rpg.atcontentstudio.ui.OverlayIcon; import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView; import com.gpl.rpg.atcontentstudio.utils.UiUtils; @@ -867,7 +863,7 @@ public class DialogueEditor extends JSONElementEditor { } - public static class RewardsListModel extends CustomListModel { + public static class RewardsListModel extends OrderedListenerListModel { @Override protected List getItems() { return source.rewards; @@ -990,7 +986,7 @@ public class DialogueEditor extends JSONElementEditor { } - public static class RepliesListModel extends CustomListModel { + public static class RepliesListModel extends OrderedListenerListModel { @Override protected List getItems() { return source.replies; @@ -1056,7 +1052,7 @@ public class DialogueEditor extends JSONElementEditor { } } - public static class ReplyRequirementsListModel extends CustomListModel { + public static class ReplyRequirementsListModel extends OrderedListenerListModel { @Override protected List getItems() { return source.requirements; diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DroplistEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DroplistEditor.java index 6e5fefe..e85d12c 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DroplistEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DroplistEditor.java @@ -22,7 +22,7 @@ import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist.DroppedItem; import com.gpl.rpg.atcontentstudio.model.gamedata.Item; import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; -import com.gpl.rpg.atcontentstudio.ui.CustomListModel; +import com.gpl.rpg.atcontentstudio.ui.OrderedListenerListModel; import com.gpl.rpg.atcontentstudio.utils.UiUtils; import com.jidesoft.swing.JideBoxLayout; @@ -101,7 +101,7 @@ public class DroplistEditor extends JSONElementEditor { pane.repaint(); } - public class DroppedItemsListModel extends CustomListModel { + public class DroppedItemsListModel extends OrderedListenerListModel { public DroppedItemsListModel(Droplist droplist) { super(droplist); } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java index 6beab6d..49a23b6 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java @@ -1,1960 +1,1960 @@ -package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; - -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -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; -import javax.swing.JComboBox; -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; -import javax.swing.ListModel; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListDataEvent; -import javax.swing.event.ListDataListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import com.gpl.rpg.atcontentstudio.ATContentStudio; -import com.gpl.rpg.atcontentstudio.model.GameDataElement; -import com.gpl.rpg.atcontentstudio.model.Project; -import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; -import com.gpl.rpg.atcontentstudio.model.gamedata.*; -import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet; -import com.gpl.rpg.atcontentstudio.ui.*; -import com.jidesoft.swing.JideBoxLayout; - -public class ItemEditor extends JSONElementEditor { - - private static final long serialVersionUID = 7538154592029351986L; - - private static final String form_view_id = "Form"; - private static final String json_view_id = "JSON"; - - private static final String killLabel = "Effect on every kill: "; - private static final String useLabel = "Effect on use: "; - - - private Common.ConditionEffect selectedEquipEffectCondition; - private Common.TimedConditionEffect selectedHitEffectSourceCondition; - private Common.TimedConditionEffect selectedHitEffectTargetCondition; - private Common.TimedConditionEffect selectedKillEffectCondition; - private Common.TimedConditionEffect selectedHitReceivedEffectSourceCondition; - private Common.TimedConditionEffect selectedHitReceivedEffectTargetCondition; - - - private JButton itemIcon; - private JTextField idField; - private JTextField nameField; - private JTextField descriptionField; - @SuppressWarnings("rawtypes") - private JComboBox typeBox; - private IntegerBasedCheckBox manualPriceBox; - private JSpinner baseCostField; - private MyComboBox categoryBox; - private Integer baseManualPrice = null; - - private CollapsiblePanel equipEffectPane; - private Item.EquipEffect equipEffect; - private JSpinner equipDmgMin; - private JSpinner equipDmgMax; - private JSpinner equipBoostHP; - private JSpinner equipBoostAP; - private JSpinner equipBoostAC; - private JSpinner equipBoostBC; - private JSpinner equipBoostCS; - private JSpinner equipSetCM; - private JSpinner equipSetDM; - private JSpinner equipBoostDR; - private JSpinner equipIncMoveCost; - private JSpinner equipIncUseCost; - private JSpinner equipIncReequipCost; - private JSpinner equipIncAttackCost; - private ConditionsListModel equipConditionsModel; - @SuppressWarnings("rawtypes") - private JList equipConditionsList; - private MyComboBox equipConditionBox; - private JRadioButton equipConditionWithMagnitude; - private JRadioButton equipConditionImmunity; - private JSpinner equipConditionMagnitude; - - private CollapsiblePanel hitEffectPane; - private Common.HitEffect hitEffect; - private JSpinner hitHPMin; - private JSpinner hitHPMax; - private JSpinner hitAPMin; - private JSpinner hitAPMax; - private SourceTimedConditionsListModel hitSourceConditionsModel; - @SuppressWarnings("rawtypes") - private JList hitSourceConditionsList; - private MyComboBox hitSourceConditionBox; - private JSpinner hitSourceConditionChance; - private JRadioButton hitSourceConditionClear; - private JRadioButton hitSourceConditionApply; - private JRadioButton hitSourceConditionImmunity; - private JSpinner hitSourceConditionMagnitude; - private JRadioButton hitSourceConditionTimed; - private JRadioButton hitSourceConditionForever; - private JSpinner hitSourceConditionDuration; - private TargetTimedConditionsListModel hitTargetConditionsModel; - @SuppressWarnings("rawtypes") - private JList hitTargetConditionsList; - private MyComboBox hitTargetConditionBox; - private JSpinner hitTargetConditionChance; - private JRadioButton hitTargetConditionClear; - private JRadioButton hitTargetConditionApply; - private JRadioButton hitTargetConditionImmunity; - private JSpinner hitTargetConditionMagnitude; - private JRadioButton hitTargetConditionTimed; - private JRadioButton hitTargetConditionForever; - private JSpinner hitTargetConditionDuration; - - private CollapsiblePanel killEffectPane; - private Common.DeathEffect killEffect; - private JSpinner killHPMin; - private JSpinner killHPMax; - private JSpinner killAPMin; - private JSpinner killAPMax; - private SourceTimedConditionsListModel killSourceConditionsModel; - @SuppressWarnings("rawtypes") - private JList killSourceConditionsList; - private MyComboBox killSourceConditionBox; - private JSpinner killSourceConditionChance; - private JRadioButton killSourceConditionClear; - private JRadioButton killSourceConditionApply; - private JRadioButton killSourceConditionImmunity; - private JSpinner killSourceConditionMagnitude; - private JRadioButton killSourceConditionTimed; - private JRadioButton killSourceConditionForever; - private JSpinner killSourceConditionDuration; - - private CollapsiblePanel hitReceivedEffectPane; - private Common.HitReceivedEffect hitReceivedEffect; - private JSpinner hitReceivedHPMin; - private JSpinner hitReceivedHPMax; - private JSpinner hitReceivedAPMin; - private JSpinner hitReceivedAPMax; - private JSpinner hitReceivedHPMinTarget; - private JSpinner hitReceivedHPMaxTarget; - private JSpinner hitReceivedAPMinTarget; - private JSpinner hitReceivedAPMaxTarget; - private SourceTimedConditionsListModel hitReceivedSourceConditionsModel; - @SuppressWarnings("rawtypes") - private JList hitReceivedSourceConditionsList; - private MyComboBox hitReceivedSourceConditionBox; - private JSpinner hitReceivedSourceConditionChance; - private JRadioButton hitReceivedSourceConditionClear; - private JRadioButton hitReceivedSourceConditionApply; - private JRadioButton hitReceivedSourceConditionImmunity; - private JSpinner hitReceivedSourceConditionMagnitude; - private JRadioButton hitReceivedSourceConditionTimed; - private JRadioButton hitReceivedSourceConditionForever; - private JSpinner hitReceivedSourceConditionDuration; - private TargetTimedConditionsListModel hitReceivedTargetConditionsModel; - @SuppressWarnings("rawtypes") - private JList hitReceivedTargetConditionsList; - private MyComboBox hitReceivedTargetConditionBox; - private JSpinner hitReceivedTargetConditionChance; - private JRadioButton hitReceivedTargetConditionClear; - private JRadioButton hitReceivedTargetConditionApply; - private JRadioButton hitReceivedTargetConditionImmunity; - private JSpinner hitReceivedTargetConditionMagnitude; - private JRadioButton hitReceivedTargetConditionTimed; - private JRadioButton hitReceivedTargetConditionForever; - private JSpinner hitReceivedTargetConditionDuration; - - public ItemEditor(Item item) { - super(item, item.getDesc(), item.getIcon()); - addEditorTab(form_view_id, getFormView()); - addEditorTab(json_view_id, getJSONView()); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void insertFormViewDataField(JPanel pane) { - - final Item item = (Item) target; - - final FieldUpdateListener listener = new ItemFieldUpdater(); - - itemIcon = createButtonPane(pane, item.getProject(), item, Item.class, item.getImage(), Spritesheet.Category.item, listener); - - idField = addTextField(pane, "Internal ID: ", item.id, item.writable, listener); - nameField = addTranslatableTextField(pane, "Display name: ", item.name, item.writable, listener); - descriptionField = addTranslatableTextField(pane, "Description: ", item.description, item.writable, listener); - typeBox = addEnumValueBox(pane, "Type: ", Item.DisplayType.values(), item.display_type, item.writable, listener); - manualPriceBox = addIntegerBasedCheckBox(pane, "Has manual price", item.has_manual_price, item.writable, listener); - baseManualPrice = item.base_market_cost; - baseCostField = addIntegerField(pane, "Base market cost: ", (item.has_manual_price != null && item.has_manual_price == 1) ? item.base_market_cost : item.computePrice(), false, item.writable, listener); - if (!manualPriceBox.isSelected()) { - baseCostField.setEnabled(false); - } - categoryBox = addItemCategoryBox(pane, item.getProject(), "Category: ", item.category, item.writable, listener); - - equipEffectPane = new CollapsiblePanel("Effect when equipped: "); - equipEffectPane.setLayout(new JideBoxLayout(equipEffectPane, JideBoxLayout.PAGE_AXIS)); - if (item.equip_effect == null) { - equipEffect = new Item.EquipEffect(); - } else { - equipEffect = item.equip_effect; - } - equipDmgMin = addIntegerField(equipEffectPane, "Attack Damage min: ", equipEffect.damage_boost_min, true, item.writable, listener); - equipDmgMax = addIntegerField(equipEffectPane, "Attack Damage max: ", equipEffect.damage_boost_max, true, item.writable, listener); - equipSetDM = addIntegerField(equipEffectPane, "Damage modifier %: ", equipEffect.damage_modifier, 100, false, item.writable, listener); - equipBoostHP = addIntegerField(equipEffectPane, "Boost max HP: ", equipEffect.max_hp_boost, true, item.writable, listener); - equipBoostAP = addIntegerField(equipEffectPane, "Boost max AP: ", equipEffect.max_ap_boost, true, item.writable, listener); - equipBoostAC = addIntegerField(equipEffectPane, "Boost attack chance: ", equipEffect.increase_attack_chance, true, item.writable, listener); - equipBoostBC = addIntegerField(equipEffectPane, "Boost block chance: ", equipEffect.increase_block_chance, true, item.writable, listener); - equipBoostCS = addIntegerField(equipEffectPane, "Boost critical skill: ", equipEffect.increase_critical_skill, true, item.writable, listener); - equipSetCM = addDoubleField(equipEffectPane, "Critical multiplier: ", equipEffect.critical_multiplier, item.writable, listener); - equipBoostDR = addIntegerField(equipEffectPane, "Boost damage resistance: ", equipEffect.increase_damage_resistance, true, item.writable, listener); - equipIncMoveCost = addIntegerField(equipEffectPane, "Increase move cost: ", equipEffect.increase_move_cost, true, item.writable, listener); - equipIncUseCost = addIntegerField(equipEffectPane, "Increase item use cost: ", equipEffect.increase_use_item_cost, true, item.writable, listener); - equipIncReequipCost = addIntegerField(equipEffectPane, "Increase reequip cost: ", equipEffect.increase_reequip_cost, true, item.writable, listener); - equipIncAttackCost = addIntegerField(equipEffectPane, "Increase attack cost: ", equipEffect.increase_attack_cost, true, item.writable, listener); - CollapsiblePanel equipConditionsPane = new CollapsiblePanel("Actor Conditions applied when equipped: "); - equipConditionsPane.setLayout(new JideBoxLayout(equipConditionsPane, JideBoxLayout.PAGE_AXIS)); - equipConditionsModel = new ConditionsListModel(equipEffect); - equipConditionsList = new JList(equipConditionsModel); - equipConditionsList.setCellRenderer(new ConditionsCellRenderer()); - equipConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - equipConditionsPane.add(new JScrollPane(equipConditionsList), JideBoxLayout.FIX); - final JPanel equipConditionsEditorPane = new JPanel(); - final JButton createEquipCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteEquipCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - equipConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedEquipEffectCondition = (Common.ConditionEffect) equipConditionsList.getSelectedValue(); - if (selectedEquipEffectCondition == null) { - deleteEquipCondition.setEnabled(false); - } else { - deleteEquipCondition.setEnabled(true); - } - updateEquipConditionEditorPane(equipConditionsEditorPane, selectedEquipEffectCondition, listener); - } - }); - if (item.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createEquipCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.ConditionEffect condition = new Common.ConditionEffect(); - equipConditionsModel.addItem(condition); - equipConditionsList.setSelectedValue(condition, true); - listener.valueChanged(equipConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteEquipCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedEquipEffectCondition != null) { - equipConditionsModel.removeItem(selectedEquipEffectCondition); - selectedEquipEffectCondition = null; - equipConditionsList.clearSelection(); - listener.valueChanged(equipConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createEquipCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteEquipCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - equipConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - equipConditionsEditorPane.setLayout(new JideBoxLayout(equipConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - equipConditionsPane.add(equipConditionsEditorPane, JideBoxLayout.FIX); - if (item.equip_effect == null || item.equip_effect.conditions == null || item.equip_effect.conditions.isEmpty()) { - equipConditionsPane.collapse(); - } - equipEffectPane.add(equipConditionsPane, JideBoxLayout.FIX); - pane.add(equipEffectPane, JideBoxLayout.FIX); - if (item.equip_effect == null) { - equipEffectPane.collapse(); - } - - hitEffectPane = new CollapsiblePanel("Effect on every hit: "); - hitEffectPane.setLayout(new JideBoxLayout(hitEffectPane, JideBoxLayout.PAGE_AXIS)); - if (item.hit_effect == null) { - hitEffect = new Common.HitEffect(); - } else { - hitEffect = item.hit_effect; - } - hitHPMin = addIntegerField(hitEffectPane, "HP bonus min: ", hitEffect.hp_boost_min, true, item.writable, listener); - hitHPMax = addIntegerField(hitEffectPane, "HP bonus max: ", hitEffect.hp_boost_max, true, item.writable, listener); - hitAPMin = addIntegerField(hitEffectPane, "AP bonus min: ", hitEffect.ap_boost_min, true, item.writable, listener); - hitAPMax = addIntegerField(hitEffectPane, "AP bonus max: ", hitEffect.ap_boost_max, true, item.writable, listener); - final CollapsiblePanel hitSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: "); - hitSourceConditionsPane.setLayout(new JideBoxLayout(hitSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); - hitSourceConditionsModel = new SourceTimedConditionsListModel(hitEffect); - hitSourceConditionsList = new JList(hitSourceConditionsModel); - hitSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); - hitSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - hitSourceConditionsPane.add(new JScrollPane(hitSourceConditionsList), JideBoxLayout.FIX); - final JPanel sourceTimedConditionsEditorPane = new JPanel(); - final JButton createHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - hitSourceConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedHitEffectSourceCondition = (Common.TimedConditionEffect) hitSourceConditionsList.getSelectedValue(); - updateHitSourceTimedConditionEditorPane(sourceTimedConditionsEditorPane, selectedHitEffectSourceCondition, listener); - if (selectedHitEffectSourceCondition == null) { - deleteHitSourceCondition.setEnabled(false); - } else { - deleteHitSourceCondition.setEnabled(true); - } - } - }); - if (item.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createHitSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); - hitSourceConditionsModel.addItem(condition); - hitSourceConditionsList.setSelectedValue(condition, true); - listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteHitSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedHitEffectSourceCondition != null) { - hitSourceConditionsModel.removeItem(selectedHitEffectSourceCondition); - selectedHitEffectSourceCondition = null; - hitSourceConditionsList.clearSelection(); - listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createHitSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteHitSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - hitSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - sourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(sourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - hitSourceConditionsPane.add(sourceTimedConditionsEditorPane, JideBoxLayout.FIX); - if (item.hit_effect == null || item.hit_effect.conditions_source == null || item.hit_effect.conditions_source.isEmpty()) { - hitSourceConditionsPane.collapse(); - } - hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX); - final CollapsiblePanel hitTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the target: "); - hitTargetConditionsPane.setLayout(new JideBoxLayout(hitTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); - hitTargetConditionsModel = new TargetTimedConditionsListModel(hitEffect); - hitTargetConditionsList = new JList(hitTargetConditionsModel); - hitTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); - hitTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - hitTargetConditionsPane.add(new JScrollPane(hitTargetConditionsList), JideBoxLayout.FIX); - final JPanel targetTimedConditionsEditorPane = new JPanel(); - final JButton createHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - hitTargetConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedHitEffectTargetCondition = (Common.TimedConditionEffect) hitTargetConditionsList.getSelectedValue(); - updateHitTargetTimedConditionEditorPane(targetTimedConditionsEditorPane, selectedHitEffectTargetCondition, listener); - if (selectedHitEffectTargetCondition == null) { - deleteHitTargetCondition.setEnabled(false); - } else { - deleteHitTargetCondition.setEnabled(true); - } - } - }); - if (item.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createHitTargetCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); - hitTargetConditionsModel.addItem(condition); - hitTargetConditionsList.setSelectedValue(condition, true); - listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteHitTargetCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedHitEffectTargetCondition != null) { - hitTargetConditionsModel.removeItem(selectedHitEffectTargetCondition); - selectedHitEffectTargetCondition = null; - hitTargetConditionsList.clearSelection(); - listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createHitTargetCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteHitTargetCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - hitTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - targetTimedConditionsEditorPane.setLayout(new JideBoxLayout(targetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - hitTargetConditionsPane.add(targetTimedConditionsEditorPane, JideBoxLayout.FIX); - if (item.hit_effect == null || item.hit_effect.conditions_target == null || item.hit_effect.conditions_target.isEmpty()) { - hitTargetConditionsPane.collapse(); - } - hitEffectPane.add(hitTargetConditionsPane, JideBoxLayout.FIX); - if (item.hit_effect == null) { - hitEffectPane.collapse(); - } - pane.add(hitEffectPane, JideBoxLayout.FIX); - - - - killEffectPane = new CollapsiblePanel(killLabel); - killEffectPane.setLayout(new JideBoxLayout(killEffectPane, JideBoxLayout.PAGE_AXIS)); - if (item.kill_effect == null) { - killEffect = new Common.DeathEffect(); - } else { - killEffect = item.kill_effect; - } - killHPMin = addIntegerField(killEffectPane, "HP bonus min: ", killEffect.hp_boost_min, true, item.writable, listener); - killHPMax = addIntegerField(killEffectPane, "HP bonus max: ", killEffect.hp_boost_max, true, item.writable, listener); - killAPMin = addIntegerField(killEffectPane, "AP bonus min: ", killEffect.ap_boost_min, true, item.writable, listener); - killAPMax = addIntegerField(killEffectPane, "AP bonus max: ", killEffect.ap_boost_max, true, item.writable, listener); - final CollapsiblePanel killSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: "); - killSourceConditionsPane.setLayout(new JideBoxLayout(killSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); - killSourceConditionsModel = new SourceTimedConditionsListModel(killEffect); - killSourceConditionsList = new JList(killSourceConditionsModel); - killSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); - killSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - killSourceConditionsPane.add(new JScrollPane(killSourceConditionsList), JideBoxLayout.FIX); - final JPanel killSourceTimedConditionsEditorPane = new JPanel(); - final JButton createKillSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteKillSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - killSourceConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedKillEffectCondition = (Common.TimedConditionEffect) killSourceConditionsList.getSelectedValue(); - updateKillSourceTimedConditionEditorPane(killSourceTimedConditionsEditorPane, selectedKillEffectCondition, listener); - if (selectedKillEffectCondition == null) { - deleteKillSourceCondition.setEnabled(false); - } else { - deleteKillSourceCondition.setEnabled(true); - } - } - }); - if (item.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createKillSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); - killSourceConditionsModel.addItem(condition); - killSourceConditionsList.setSelectedValue(condition, true); - listener.valueChanged(killSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteKillSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedKillEffectCondition != null) { - killSourceConditionsModel.removeItem(selectedKillEffectCondition); - selectedKillEffectCondition = null; - killSourceConditionsList.clearSelection(); - listener.valueChanged(killSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createKillSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteKillSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - killSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - killSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(killSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - killSourceConditionsPane.add(killSourceTimedConditionsEditorPane, JideBoxLayout.FIX); - if (item.kill_effect == null || item.kill_effect.conditions_source == null || item.kill_effect.conditions_source.isEmpty()) { - killSourceConditionsPane.collapse(); - } - killEffectPane.add(killSourceConditionsPane, JideBoxLayout.FIX); - if (item.kill_effect == null) { - killEffectPane.collapse(); - } - pane.add(killEffectPane, JideBoxLayout.FIX); - - - hitReceivedEffectPane = new CollapsiblePanel("Effect on every hit received: "); - hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS)); - if (item.hit_received_effect == null) { - hitReceivedEffect = new Common.HitReceivedEffect(); - } else { - hitReceivedEffect = item.hit_received_effect; - } - hitReceivedHPMin = addIntegerField(hitReceivedEffectPane, "Player HP bonus min: ", hitReceivedEffect.hp_boost_min, true, item.writable, listener); - hitReceivedHPMax = addIntegerField(hitReceivedEffectPane, "Player HP bonus max: ", hitReceivedEffect.hp_boost_max, true, item.writable, listener); - hitReceivedAPMin = addIntegerField(hitReceivedEffectPane, "Player AP bonus min: ", hitReceivedEffect.ap_boost_min, true, item.writable, listener); - hitReceivedAPMax = addIntegerField(hitReceivedEffectPane, "Player AP bonus max: ", hitReceivedEffect.ap_boost_max, true, item.writable, listener); - hitReceivedHPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus min: ", hitReceivedEffect.hp_boost_min_target, true, item.writable, listener); - hitReceivedHPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus max: ", hitReceivedEffect.hp_boost_max_target, true, item.writable, listener); - hitReceivedAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, item.writable, listener); - hitReceivedAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, item.writable, listener); - final CollapsiblePanel hitReceivedSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the player: "); - hitReceivedSourceConditionsPane.setLayout(new JideBoxLayout(hitReceivedSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); - hitReceivedSourceConditionsModel = new SourceTimedConditionsListModel(hitReceivedEffect); - hitReceivedSourceConditionsList = new JList(hitReceivedSourceConditionsModel); - hitReceivedSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); - hitReceivedSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - hitReceivedSourceConditionsPane.add(new JScrollPane(hitReceivedSourceConditionsList), JideBoxLayout.FIX); - final JPanel hitReceivedSourceTimedConditionsEditorPane = new JPanel(); - final JButton createHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - hitReceivedSourceConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedHitReceivedEffectSourceCondition = (Common.TimedConditionEffect) hitReceivedSourceConditionsList.getSelectedValue(); - updateHitReceivedSourceTimedConditionEditorPane(hitReceivedSourceTimedConditionsEditorPane, selectedHitReceivedEffectSourceCondition, listener); - if (selectedHitReceivedEffectSourceCondition == null) { - deleteHitReceivedSourceCondition.setEnabled(false); - } else { - deleteHitReceivedSourceCondition.setEnabled(true); - } - } - }); - if (item.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createHitReceivedSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); - hitReceivedSourceConditionsModel.addItem(condition); - hitReceivedSourceConditionsList.setSelectedValue(condition, true); - listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteHitReceivedSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedHitReceivedEffectSourceCondition != null) { - hitReceivedSourceConditionsModel.removeItem(selectedHitReceivedEffectSourceCondition); - selectedHitReceivedEffectSourceCondition = null; - hitReceivedSourceConditionsList.clearSelection(); - listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createHitReceivedSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteHitReceivedSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - hitReceivedSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - hitReceivedSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - hitReceivedSourceConditionsPane.add(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.FIX); - if (item.hit_received_effect == null || item.hit_received_effect.conditions_source == null || item.hit_received_effect.conditions_source.isEmpty()) { - hitReceivedSourceConditionsPane.collapse(); - } - hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX); - final CollapsiblePanel hitReceivedTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the attacker: "); - hitReceivedTargetConditionsPane.setLayout(new JideBoxLayout(hitReceivedTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); - hitReceivedTargetConditionsModel = new TargetTimedConditionsListModel(hitReceivedEffect); - hitReceivedTargetConditionsList = new JList(hitReceivedTargetConditionsModel); - hitReceivedTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); - hitReceivedTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - hitReceivedTargetConditionsPane.add(new JScrollPane(hitReceivedTargetConditionsList), JideBoxLayout.FIX); - final JPanel hitReceivedTargetTimedConditionsEditorPane = new JPanel(); - final JButton createHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - hitReceivedTargetConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedHitReceivedEffectTargetCondition = (Common.TimedConditionEffect) hitReceivedTargetConditionsList.getSelectedValue(); - updateHitReceivedTargetTimedConditionEditorPane(hitReceivedTargetTimedConditionsEditorPane, selectedHitReceivedEffectTargetCondition, listener); - if (selectedHitReceivedEffectTargetCondition == null) { - deleteHitReceivedTargetCondition.setEnabled(false); - } else { - deleteHitReceivedTargetCondition.setEnabled(true); - } - } - }); - if (item.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createHitReceivedTargetCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); - hitReceivedTargetConditionsModel.addItem(condition); - hitReceivedTargetConditionsList.setSelectedValue(condition, true); - listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteHitReceivedTargetCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedHitReceivedEffectTargetCondition != null) { - hitReceivedTargetConditionsModel.removeItem(selectedHitReceivedEffectTargetCondition); - selectedHitReceivedEffectTargetCondition = null; - hitReceivedTargetConditionsList.clearSelection(); - listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createHitReceivedTargetCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteHitReceivedTargetCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - hitReceivedTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - hitReceivedTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - hitReceivedTargetConditionsPane.add(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.FIX); - if (item.hit_received_effect == null || item.hit_received_effect.conditions_target == null || item.hit_received_effect.conditions_target.isEmpty()) { - hitReceivedTargetConditionsPane.collapse(); - } - hitReceivedEffectPane.add(hitReceivedTargetConditionsPane, JideBoxLayout.FIX); - if (item.hit_received_effect == null) { - hitReceivedEffectPane.collapse(); - } - pane.add(hitReceivedEffectPane, JideBoxLayout.FIX); - - - if (item.category == null || item.category.action_type == null || item.category.action_type == ItemCategory.ActionType.none) { - equipEffectPane.setVisible(false); - hitEffectPane.setVisible(false); - killEffectPane.setVisible(false); - } else if (item.category.action_type == ItemCategory.ActionType.use) { - equipEffectPane.setVisible(false); - hitEffectPane.setVisible(false); - killEffectPane.setVisible(true); - killEffectPane.setTitle(useLabel); - killEffectPane.revalidate(); - killEffectPane.repaint(); - } else if (item.category.action_type == ItemCategory.ActionType.equip) { - equipEffectPane.setVisible(true); - hitEffectPane.setVisible(true); - killEffectPane.setVisible(true); - killEffectPane.setTitle(killLabel); - killEffectPane.revalidate(); - killEffectPane.repaint(); - } - - } - - public void updateHitSourceTimedConditionEditorPane(JPanel pane, Common.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); - hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - - hitSourceConditionClear = new JRadioButton("Clear active condition"); - pane.add(hitSourceConditionClear, JideBoxLayout.FIX); - hitSourceConditionApply = new JRadioButton("Apply condition with magnitude"); - pane.add(hitSourceConditionApply, JideBoxLayout.FIX); - hitSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); - hitSourceConditionImmunity = new JRadioButton("Give immunity to condition"); - pane.add(hitSourceConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(hitSourceConditionApply); - radioEffectGroup.add(hitSourceConditionClear); - radioEffectGroup.add(hitSourceConditionImmunity); - - hitSourceConditionTimed = new JRadioButton("For a number of rounds"); - pane.add(hitSourceConditionTimed, JideBoxLayout.FIX); - hitSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); - hitSourceConditionForever = new JRadioButton("Forever"); - pane.add(hitSourceConditionForever, JideBoxLayout.FIX); - - ButtonGroup radioDurationGroup = new ButtonGroup(); - radioDurationGroup.add(hitSourceConditionTimed); - radioDurationGroup.add(hitSourceConditionForever); - - updateHitSourceTimedConditionWidgets(condition); - - 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())); - } - }); - hitSourceConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitSourceConditionImmunity, new Boolean(hitSourceConditionImmunity.isSelected())); - } - }); - - hitSourceConditionTimed.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitSourceConditionTimed, new Boolean(hitSourceConditionTimed.isSelected())); - } - }); - hitSourceConditionForever.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitSourceConditionForever, new Boolean(hitSourceConditionForever.isSelected())); - } - }); - - pane.revalidate(); - pane.repaint(); - } - - public void updateHitSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { - - boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); - boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); - boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; - - hitSourceConditionClear.setSelected(clear); - hitSourceConditionApply.setSelected(!clear && !immunity); - hitSourceConditionMagnitude.setEnabled(!clear && !immunity); - hitSourceConditionImmunity.setSelected(immunity); - - hitSourceConditionTimed.setSelected(!forever); - hitSourceConditionTimed.setEnabled(!clear); - hitSourceConditionDuration.setEnabled(!clear && !forever); - hitSourceConditionForever.setSelected(forever); - hitSourceConditionForever.setEnabled(!clear); - } - - public void updateHitTargetTimedConditionEditorPane(JPanel pane, Common.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); - hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - - hitTargetConditionClear = new JRadioButton("Clear active condition"); - pane.add(hitTargetConditionClear, JideBoxLayout.FIX); - hitTargetConditionApply = new JRadioButton("Apply condition with magnitude"); - pane.add(hitTargetConditionApply, JideBoxLayout.FIX); - hitTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); - hitTargetConditionImmunity = new JRadioButton("Give immunity to condition"); - pane.add(hitTargetConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(hitTargetConditionApply); - radioEffectGroup.add(hitTargetConditionClear); - radioEffectGroup.add(hitTargetConditionImmunity); - - hitTargetConditionTimed = new JRadioButton("For a number of rounds"); - pane.add(hitTargetConditionTimed, JideBoxLayout.FIX); - hitTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); - hitTargetConditionForever = new JRadioButton("Forever"); - pane.add(hitTargetConditionForever, JideBoxLayout.FIX); - - ButtonGroup radioDurationGroup = new ButtonGroup(); - radioDurationGroup.add(hitTargetConditionTimed); - radioDurationGroup.add(hitTargetConditionForever); - - updateHitTargetTimedConditionWidgets(condition); - - 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())); - } - }); - hitTargetConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitTargetConditionImmunity, new Boolean(hitTargetConditionImmunity.isSelected())); - } - }); - - hitTargetConditionTimed.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitTargetConditionTimed, new Boolean(hitTargetConditionTimed.isSelected())); - } - }); - hitTargetConditionForever.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitTargetConditionForever, new Boolean(hitTargetConditionForever.isSelected())); - } - }); - - pane.revalidate(); - pane.repaint(); - } - - public void updateHitTargetTimedConditionWidgets(Common.TimedConditionEffect condition) { - - boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); - boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); - boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; - - hitTargetConditionClear.setSelected(clear); - hitTargetConditionApply.setSelected(!clear && !immunity); - hitTargetConditionMagnitude.setEnabled(!clear && !immunity); - hitTargetConditionImmunity.setSelected(immunity); - - hitTargetConditionTimed.setSelected(!forever); - hitTargetConditionTimed.setEnabled(!clear); - hitTargetConditionDuration.setEnabled(!clear && !forever); - hitTargetConditionForever.setSelected(forever); - hitTargetConditionForever.setEnabled(!clear); - } - - public void updateKillSourceTimedConditionEditorPane(JPanel pane, Common.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); - killSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - - killSourceConditionClear = new JRadioButton("Clear active condition"); - pane.add(killSourceConditionClear, JideBoxLayout.FIX); - killSourceConditionApply = new JRadioButton("Apply condition with magnitude"); - pane.add(killSourceConditionApply, JideBoxLayout.FIX); - killSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); - killSourceConditionImmunity = new JRadioButton("Give immunity to condition"); - pane.add(killSourceConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(killSourceConditionApply); - radioEffectGroup.add(killSourceConditionClear); - radioEffectGroup.add(killSourceConditionImmunity); - - killSourceConditionTimed = new JRadioButton("For a number of rounds"); - pane.add(killSourceConditionTimed, JideBoxLayout.FIX); - killSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); - killSourceConditionForever = new JRadioButton("Forever"); - pane.add(killSourceConditionForever, JideBoxLayout.FIX); - - ButtonGroup radioDurationGroup = new ButtonGroup(); - radioDurationGroup.add(killSourceConditionTimed); - radioDurationGroup.add(killSourceConditionForever); - - updateKillSourceTimedConditionWidgets(condition); - - 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())); - } - }); - killSourceConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(killSourceConditionImmunity, new Boolean(killSourceConditionImmunity.isSelected())); - } - }); - - killSourceConditionTimed.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(killSourceConditionTimed, new Boolean(killSourceConditionTimed.isSelected())); - } - }); - killSourceConditionForever.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(killSourceConditionForever, new Boolean(killSourceConditionForever.isSelected())); - } - }); - - pane.revalidate(); - pane.repaint(); - } - - public void updateKillSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { - - boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); - boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); - boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; - - killSourceConditionClear.setSelected(clear); - killSourceConditionApply.setSelected(!clear && !immunity); - killSourceConditionMagnitude.setEnabled(!clear && !immunity); - killSourceConditionImmunity.setSelected(immunity); - - killSourceConditionTimed.setSelected(!forever); - killSourceConditionTimed.setEnabled(!clear); - killSourceConditionDuration.setEnabled(!clear && !forever); - killSourceConditionForever.setSelected(forever); - killSourceConditionForever.setEnabled(!clear); - } - - public void updateEquipConditionEditorPane(JPanel pane, Common.ConditionEffect condition, final FieldUpdateListener listener) { - pane.removeAll(); - if (equipConditionBox != null) { - removeElementListener(equipConditionBox); - } - if (condition == null) { - pane.revalidate(); - pane.repaint(); - return; - } - - boolean writable = ((Item)target).writable; - Project proj = ((Item)target).getProject(); - - equipConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - equipConditionWithMagnitude = new JRadioButton("Apply condition with magnitude."); - pane.add(equipConditionWithMagnitude, JideBoxLayout.FIX); - equipConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, 1, false, writable, listener); - equipConditionImmunity = new JRadioButton("Give immunity to condition."); - pane.add(equipConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(equipConditionWithMagnitude); - radioEffectGroup.add(equipConditionImmunity); - - boolean immunity = condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR; - equipConditionImmunity.setSelected(immunity); - equipConditionWithMagnitude.setSelected(!immunity); - equipConditionMagnitude.setEnabled(!immunity); - - equipConditionWithMagnitude.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(equipConditionWithMagnitude, new Boolean(equipConditionWithMagnitude.isSelected())); - } - }); - equipConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(equipConditionImmunity, new Boolean(equipConditionImmunity.isSelected())); - } - }); - - - pane.revalidate(); - pane.repaint(); - } - - public void updateHitReceivedSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { - pane.removeAll(); - if (hitReceivedSourceConditionBox != null) { - removeElementListener(hitReceivedSourceConditionBox); - } - if (condition == null) { - pane.revalidate(); - pane.repaint(); - return; - } - - boolean writable = ((Item)target).writable; - Project proj = ((Item)target).getProject(); - - hitReceivedSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - hitReceivedSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - - hitReceivedSourceConditionClear = new JRadioButton("Clear active condition"); - pane.add(hitReceivedSourceConditionClear, JideBoxLayout.FIX); - hitReceivedSourceConditionApply = new JRadioButton("Apply condition with magnitude"); - pane.add(hitReceivedSourceConditionApply, JideBoxLayout.FIX); - hitReceivedSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); - hitReceivedSourceConditionImmunity = new JRadioButton("Give immunity to condition"); - pane.add(hitReceivedSourceConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(hitReceivedSourceConditionApply); - radioEffectGroup.add(hitReceivedSourceConditionClear); - radioEffectGroup.add(hitReceivedSourceConditionImmunity); - - hitReceivedSourceConditionTimed = new JRadioButton("For a number of rounds"); - pane.add(hitReceivedSourceConditionTimed, JideBoxLayout.FIX); - hitReceivedSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); - hitReceivedSourceConditionForever = new JRadioButton("Forever"); - pane.add(hitReceivedSourceConditionForever, JideBoxLayout.FIX); - - ButtonGroup radioDurationGroup = new ButtonGroup(); - radioDurationGroup.add(hitReceivedSourceConditionTimed); - radioDurationGroup.add(hitReceivedSourceConditionForever); - - updateHitReceivedSourceTimedConditionWidgets(condition); - - hitReceivedSourceConditionClear.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedSourceConditionClear, new Boolean(hitReceivedSourceConditionClear.isSelected())); - } - }); - hitReceivedSourceConditionApply.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedSourceConditionApply, new Boolean(hitReceivedSourceConditionApply.isSelected())); - } - }); - hitReceivedSourceConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedSourceConditionImmunity, new Boolean(hitReceivedSourceConditionImmunity.isSelected())); - } - }); - - hitReceivedSourceConditionTimed.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedSourceConditionTimed, new Boolean(hitReceivedSourceConditionTimed.isSelected())); - } - }); - hitReceivedSourceConditionForever.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedSourceConditionForever, new Boolean(hitReceivedSourceConditionForever.isSelected())); - } - }); - - pane.revalidate(); - pane.repaint(); - } - - public void updateHitReceivedSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { - - boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); - boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); - boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; - - hitReceivedSourceConditionClear.setSelected(clear); - hitReceivedSourceConditionApply.setSelected(!clear && !immunity); - hitReceivedSourceConditionMagnitude.setEnabled(!clear && !immunity); - hitReceivedSourceConditionImmunity.setSelected(immunity); - - hitReceivedSourceConditionTimed.setSelected(!forever); - hitReceivedSourceConditionTimed.setEnabled(!clear); - hitReceivedSourceConditionDuration.setEnabled(!clear && !forever); - hitReceivedSourceConditionForever.setSelected(forever); - hitReceivedSourceConditionForever.setEnabled(!clear); - } - - public void updateHitReceivedTargetTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { - pane.removeAll(); - if (hitReceivedTargetConditionBox != null) { - removeElementListener(hitReceivedTargetConditionBox); - } - if (condition == null) { - pane.revalidate(); - pane.repaint(); - return; - } - - boolean writable = ((Item)target).writable; - Project proj = ((Item)target).getProject(); - - hitReceivedTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - hitReceivedTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - - hitReceivedTargetConditionClear = new JRadioButton("Clear active condition"); - pane.add(hitReceivedTargetConditionClear, JideBoxLayout.FIX); - hitReceivedTargetConditionApply = new JRadioButton("Apply condition with magnitude"); - pane.add(hitReceivedTargetConditionApply, JideBoxLayout.FIX); - hitReceivedTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); - hitReceivedTargetConditionImmunity = new JRadioButton("Give immunity to condition"); - pane.add(hitReceivedTargetConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(hitReceivedTargetConditionApply); - radioEffectGroup.add(hitReceivedTargetConditionClear); - radioEffectGroup.add(hitReceivedTargetConditionImmunity); - - hitReceivedTargetConditionTimed = new JRadioButton("For a number of rounds"); - pane.add(hitReceivedTargetConditionTimed, JideBoxLayout.FIX); - hitReceivedTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); - hitReceivedTargetConditionForever = new JRadioButton("Forever"); - pane.add(hitReceivedTargetConditionForever, JideBoxLayout.FIX); - - ButtonGroup radioDurationGroup = new ButtonGroup(); - radioDurationGroup.add(hitReceivedTargetConditionTimed); - radioDurationGroup.add(hitReceivedTargetConditionForever); - - updateHitReceivedTargetTimedConditionWidgets(condition); - - hitReceivedTargetConditionClear.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedTargetConditionClear, new Boolean(hitReceivedTargetConditionClear.isSelected())); - } - }); - hitReceivedTargetConditionApply.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedTargetConditionApply, new Boolean(hitReceivedTargetConditionApply.isSelected())); - } - }); - hitReceivedTargetConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedTargetConditionImmunity, new Boolean(hitReceivedTargetConditionImmunity.isSelected())); - } - }); - - hitReceivedTargetConditionTimed.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedTargetConditionTimed, new Boolean(hitReceivedTargetConditionTimed.isSelected())); - } - }); - hitReceivedTargetConditionForever.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedTargetConditionForever, new Boolean(hitReceivedTargetConditionForever.isSelected())); - } - }); - - pane.revalidate(); - pane.repaint(); - } - - public void updateHitReceivedTargetTimedConditionWidgets(Common.TimedConditionEffect condition) { - - boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); - boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); - boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; - - hitReceivedTargetConditionClear.setSelected(clear); - hitReceivedTargetConditionApply.setSelected(!clear && !immunity); - hitReceivedTargetConditionMagnitude.setEnabled(!clear && !immunity); - hitReceivedTargetConditionImmunity.setSelected(immunity); - - hitReceivedTargetConditionTimed.setSelected(!forever); - hitReceivedTargetConditionTimed.setEnabled(!clear); - hitReceivedTargetConditionDuration.setEnabled(!clear && !forever); - hitReceivedTargetConditionForever.setSelected(forever); - hitReceivedTargetConditionForever.setEnabled(!clear); - } - - - public static class SourceTimedConditionsListModel extends CustomListModel { - public SourceTimedConditionsListModel(Common.DeathEffect effect) { - super(effect);; - } - @Override - protected List getItems() { - return source.conditions_source; - } - - @Override - protected void setItems(List items) { - source.conditions_source = items; - } - } - - public static class TargetTimedConditionsListModel extends CustomListModel { - public TargetTimedConditionsListModel(Common.HitEffect effect) { - super(effect); - } - - @Override - protected List getItems() { - return source.conditions_target; - } - - @Override - protected void setItems(List items) { - source.conditions_target = items; - } - } - - public static class TimedConditionsCellRenderer extends DefaultListCellRenderer { - private static final long serialVersionUID = 7987880146189575234L; - - @Override - public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (c instanceof JLabel) { - JLabel label = ((JLabel)c); - Common.TimedConditionEffect effect = (Common.TimedConditionEffect) value; - - if (effect.condition != null) { - - boolean immunity = (effect.magnitude == null || effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (effect.duration != null && effect.duration > ActorCondition.DURATION_NONE); - boolean clear = (effect.magnitude == null || effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (effect.duration == null || effect.duration == ActorCondition.DURATION_NONE); - boolean forever = effect.duration != null && effect.duration == ActorCondition.DURATION_FOREVER; - - if (clear) { - label.setIcon(new ImageIcon(effect.condition.getIcon())); - label.setText(effect.chance+"% chances to clear actor condition "+effect.condition.getDesc()); - } else if (immunity) { - label.setIcon(new OverlayIcon(effect.condition.getIcon(), DefaultIcons.getImmunityIcon())); - label.setText(effect.chance+"% chances to give immunity to "+effect.condition.getDesc()+(forever ? " forever" : " for "+effect.duration+" rounds")); - } else { - label.setIcon(new ImageIcon(effect.condition.getIcon())); - label.setText(effect.chance+"% chances to give actor condition "+effect.condition.getDesc()+" x"+effect.magnitude+(forever ? " forever" : " for "+effect.duration+" rounds")); - } - } else { - label.setText("New, undefined actor condition effect."); - } - } - return c; - } - } - - public static class ConditionsListModel extends CustomListModel { - public ConditionsListModel(Item.EquipEffect equipEffect) { - super(equipEffect); - } - - @Override - protected List getItems() { - return source.conditions; - } - - @Override - protected void setItems(List conditions) { - source.conditions = conditions; - } - } - - public static class ConditionsCellRenderer extends DefaultListCellRenderer { - private static final long serialVersionUID = 7987880146189575234L; - - @Override - public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (c instanceof JLabel) { - JLabel label = ((JLabel)c); - Common.ConditionEffect effect = (Common.ConditionEffect) value; - - if (effect.condition != null) { - if (effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) { - label.setIcon(new OverlayIcon(effect.condition.getIcon(), DefaultIcons.getImmunityIcon())); - label.setText("Immune to actor condition "+effect.condition.getDesc()); - } else { - label.setIcon(new ImageIcon(effect.condition.getIcon())); - label.setText("Give actor condition "+effect.condition.getDesc()+" x"+effect.magnitude); - } - } else { - label.setText("New, undefined actor condition effect."); - } - } - return c; - } - } - - public static boolean isNull(Item.EquipEffect effect) { - if (effect.conditions != null) return false; - if (effect.critical_multiplier != null) return false; - if (effect.damage_modifier != null) return false; - if (effect.damage_boost_max != null) return false; - if (effect.damage_boost_min != null) return false; - if (effect.increase_attack_chance != null) return false; - if (effect.increase_attack_cost != null) return false; - if (effect.increase_block_chance != null) return false; - if (effect.increase_critical_skill != null) return false; - if (effect.increase_damage_resistance != null) return false; - if (effect.increase_move_cost != null) return false; - if (effect.increase_reequip_cost != null) return false; - if (effect.increase_use_item_cost != null) return false; - if (effect.max_ap_boost != null) return false; - if (effect.max_hp_boost != null) return false; - return true; - } - - - public static boolean isNull(Common.HitEffect effect) { - if (effect.ap_boost_min != null) return false; - if (effect.ap_boost_max != null) return false; - if (effect.hp_boost_min != null) return false; - if (effect.hp_boost_max != null) return false; - if (effect.conditions_source != null) return false; - if (effect.conditions_target != null) return false; - return true; - } - - - public static boolean isNull(Common.DeathEffect effect) { - if (effect.ap_boost_min != null) return false; - if (effect.ap_boost_max != null) return false; - if (effect.hp_boost_min != null) return false; - if (effect.hp_boost_max != null) return false; - if (effect.conditions_source != null) return false; - return true; - } - - public static boolean isNull(Common.HitReceivedEffect effect) { - if (effect.ap_boost_min != null) return false; - if (effect.ap_boost_max != null) return false; - if (effect.hp_boost_min != null) return false; - if (effect.hp_boost_max != null) return false; - if (effect.ap_boost_min_target != null) return false; - if (effect.ap_boost_max_target != null) return false; - if (effect.hp_boost_min_target != null) return false; - if (effect.hp_boost_max_target != null) return false; - if (effect.conditions_source != null) return false; - if (effect.conditions_target != null) return false; - return true; - } - - - public class ItemFieldUpdater implements FieldUpdateListener { - - @Override - public void valueChanged(JComponent source, Object value) { - Item item = (Item)target; - boolean updatePrice, updateEquip, updateHit, updateKill, updateHitReceived; - updatePrice = updateEquip = updateHit = updateKill = updateHitReceived = false; - if (source == idField) { - //Events caused by cancel an ID edition. Dismiss. - if (skipNext) { - skipNext = false; - return; - } - if (target.id.equals((String) value)) return; - - if (idChanging()) { - item.id = (String) value; - ItemEditor.this.name = item.getDesc(); - item.childrenChanged(new ArrayList()); - ATContentStudio.frame.editorChanged(ItemEditor.this); - } else { - cancelIdEdit(idField); - return; - } - } else if (source == nameField) { - item.name = (String) value; - ItemEditor.this.name = item.getDesc(); - item.childrenChanged(new ArrayList()); - ATContentStudio.frame.editorChanged(ItemEditor.this); - } else if (source == itemIcon) { - item.icon_id = (String) value; - item.childrenChanged(new ArrayList()); - ItemEditor.this.icon = new ImageIcon(item.getProject().getIcon((String) value)); - ATContentStudio.frame.editorChanged(ItemEditor.this); - itemIcon.setIcon(new ImageIcon(item.getProject().getImage((String) value))); - itemIcon.revalidate(); - itemIcon.repaint(); - } else if (source == descriptionField) { - item.description = descriptionField.getText(); - } else if (source == typeBox) { - item.display_type = (Item.DisplayType) value; - } else if (source == manualPriceBox) { - item.has_manual_price = (Integer) value; - if (!manualPriceBox.isSelected()) { - baseCostField.setEnabled(false); - updatePrice = true; - } else { - baseCostField.setEnabled(true); - if (baseManualPrice != null) { - baseCostField.setValue(baseManualPrice); - } - } - } else if (source == baseCostField) { - if (manualPriceBox.isSelected()) { - item.base_market_cost = (Integer) value; - baseManualPrice = item.base_market_cost; - } - } else if (source == categoryBox) { - if (item.category != null) { - item.category.removeBacklink(item); - } - item.category = (ItemCategory) value; - if (item.category != null) { - item.category_id = item.category.id; - item.category.addBacklink(item); - } else { - item.category_id = null; - } - if (item.category == null || item.category.action_type == null || item.category.action_type == ItemCategory.ActionType.none) { - equipEffectPane.setVisible(false); - item.equip_effect = null; - hitEffectPane.setVisible(false); - item.hit_effect = null; - killEffectPane.setVisible(false); - item.kill_effect = null; - hitReceivedEffectPane.setVisible(false); - item.hit_received_effect = null; - ItemEditor.this.revalidate(); - ItemEditor.this.repaint(); - } else if (item.category.action_type == ItemCategory.ActionType.use) { - equipEffectPane.setVisible(false); - item.equip_effect = null; - hitEffectPane.setVisible(false); - item.hit_effect = null; - killEffectPane.setVisible(true); - updateKill = true; - hitReceivedEffectPane.setVisible(false); - item.hit_received_effect = null; - killEffectPane.setTitle(useLabel); - ItemEditor.this.revalidate(); - ItemEditor.this.repaint(); - } else if (item.category.action_type == ItemCategory.ActionType.equip) { - equipEffectPane.setVisible(true); - updateEquip = true; - hitEffectPane.setVisible(true); - updateEquip = true; - killEffectPane.setVisible(true); - updateKill = true; - hitReceivedEffectPane.setVisible(true); - updateEquip = true; - killEffectPane.setTitle(killLabel); - ItemEditor.this.revalidate(); - ItemEditor.this.repaint(); - } - updatePrice = true; - } else if (source == equipDmgMin) { - equipEffect.damage_boost_min = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipDmgMax) { - equipEffect.damage_boost_max = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipBoostHP) { - equipEffect.max_hp_boost = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipBoostAP) { - equipEffect.max_ap_boost = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipBoostAC) { - equipEffect.increase_attack_chance = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipBoostBC) { - equipEffect.increase_block_chance = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipBoostCS) { - equipEffect.increase_critical_skill = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipSetCM) { - equipEffect.critical_multiplier = (Double) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipSetDM) { - equipEffect.damage_modifier = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipBoostDR) { - equipEffect.increase_damage_resistance = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipIncMoveCost) { - equipEffect.increase_move_cost = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipIncUseCost) { - equipEffect.increase_use_item_cost = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipIncReequipCost) { - equipEffect.increase_reequip_cost = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipIncAttackCost) { - equipEffect.increase_attack_cost = (Integer) value; - updatePrice = true; - updateEquip = true; - } else if (source == equipConditionsList) { - updateEquip = true; - } else if (source == equipConditionBox) { - if (selectedEquipEffectCondition.condition != null) { - selectedEquipEffectCondition.condition.removeBacklink(item); - } - selectedEquipEffectCondition.condition = (ActorCondition) value; - if (selectedEquipEffectCondition.condition != null) { - selectedEquipEffectCondition.condition_id = selectedEquipEffectCondition.condition.id; - selectedEquipEffectCondition.condition.addBacklink(item); - } else { - selectedEquipEffectCondition.condition_id = null; - } - equipConditionsModel.itemChanged(selectedEquipEffectCondition); - } else if (source == equipConditionMagnitude) { - selectedEquipEffectCondition.magnitude = (Integer) value; - equipConditionsModel.itemChanged(selectedEquipEffectCondition); - } else if (source == equipConditionImmunity && (Boolean) value) { - selectedEquipEffectCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - equipConditionMagnitude.setEnabled(false); - equipConditionsModel.itemChanged(selectedEquipEffectCondition); - } else if (source == equipConditionWithMagnitude && (Boolean) value) { - selectedEquipEffectCondition.magnitude = (Integer) equipConditionMagnitude.getValue(); - equipConditionMagnitude.setEnabled(true); - equipConditionsModel.itemChanged(selectedEquipEffectCondition); - } else if (source == hitHPMin) { - hitEffect.hp_boost_min = (Integer) value; - updatePrice = true; - updateHit = true; - } else if (source == hitHPMax) { - hitEffect.hp_boost_max = (Integer) value; - updatePrice = true; - updateHit = true; - } else if (source == hitAPMin) { - hitEffect.ap_boost_min = (Integer) value; - updatePrice = true; - updateHit = true; - } else if (source == hitAPMax) { - hitEffect.ap_boost_max = (Integer) value; - updatePrice = true; - updateHit = true; - } else if (source == hitSourceConditionsList) { - updateHit = true; - } else if (source == hitSourceConditionBox) { - if (selectedHitEffectSourceCondition.condition != null) { - selectedHitEffectSourceCondition.condition.removeBacklink(item); - } - selectedHitEffectSourceCondition.condition = (ActorCondition) value; - if (selectedHitEffectSourceCondition.condition != null) { - selectedHitEffectSourceCondition.condition_id = selectedHitEffectSourceCondition.condition.id; - selectedHitEffectSourceCondition.condition.addBacklink(item); - } else { - selectedHitEffectSourceCondition.condition_id = null; - } - hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionClear && (Boolean) value) { - selectedHitEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitEffectSourceCondition.duration = null; - updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); - hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionApply && (Boolean) value) { - selectedHitEffectSourceCondition.magnitude = (Integer) hitSourceConditionMagnitude.getValue(); - selectedHitEffectSourceCondition.duration = hitSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitSourceConditionDuration.getValue(); - if (selectedHitEffectSourceCondition.duration == null) { - selectedHitEffectSourceCondition.duration = 1; - } - updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); - hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionImmunity && (Boolean) value) { - selectedHitEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitEffectSourceCondition.duration = hitSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitSourceConditionDuration.getValue(); - if (selectedHitEffectSourceCondition.duration == null || selectedHitEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectSourceCondition.duration = 1; - } - updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); - hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionMagnitude) { - selectedHitEffectSourceCondition.magnitude = (Integer) value; - hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionTimed && (Boolean) value) { - selectedHitEffectSourceCondition.duration = (Integer) hitSourceConditionDuration.getValue(); - if (selectedHitEffectSourceCondition.duration == null || selectedHitEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectSourceCondition.duration = 1; - } - updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); - hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionForever && (Boolean) value) { - selectedHitEffectSourceCondition.duration = ActorCondition.DURATION_FOREVER; - updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); - hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionDuration) { - selectedHitEffectSourceCondition.duration = (Integer) value; - hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionChance) { - selectedHitEffectSourceCondition.chance = (Double) value; - hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitTargetConditionsList) { - updateHit = true; - } else if (source == hitTargetConditionBox) { - if (selectedHitEffectTargetCondition.condition != null) { - selectedHitEffectTargetCondition.condition.removeBacklink(item); - } - selectedHitEffectTargetCondition.condition = (ActorCondition) value; - if (selectedHitEffectTargetCondition.condition != null) { - selectedHitEffectTargetCondition.condition_id = selectedHitEffectTargetCondition.condition.id; - selectedHitEffectTargetCondition.condition.addBacklink(item); - } else { - selectedHitEffectTargetCondition.condition_id = null; - } - hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionClear && (Boolean) value) { - selectedHitEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitEffectTargetCondition.duration = null; - updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); - hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionApply && (Boolean) value) { - selectedHitEffectTargetCondition.magnitude = (Integer) hitTargetConditionMagnitude.getValue(); - selectedHitEffectTargetCondition.duration = hitTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitTargetConditionDuration.getValue(); - if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectTargetCondition.duration = 1; - } - updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); - hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionImmunity && (Boolean) value) { - selectedHitEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitEffectTargetCondition.duration = hitTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitTargetConditionDuration.getValue(); - if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectTargetCondition.duration = 1; - } - updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); - hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionMagnitude) { - selectedHitEffectTargetCondition.magnitude = (Integer) value; - hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionTimed && (Boolean) value) { - selectedHitEffectTargetCondition.duration = (Integer) hitTargetConditionDuration.getValue(); - if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectTargetCondition.duration = 1; - } - updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); - hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionForever && (Boolean) value) { - selectedHitEffectTargetCondition.duration = ActorCondition.DURATION_FOREVER; - updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); - hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionDuration) { - selectedHitEffectTargetCondition.duration = (Integer) value; - hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionChance) { - selectedHitEffectTargetCondition.chance = (Double) value; - hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == killHPMin) { - killEffect.hp_boost_min = (Integer) value; - updatePrice = true; - updateKill = true; - } else if (source == killHPMax) { - killEffect.hp_boost_max = (Integer) value; - updatePrice = true; - updateKill = true; - } else if (source == killAPMin) { - killEffect.ap_boost_min = (Integer) value; - updatePrice = true; - updateKill = true; - } else if (source == killAPMax) { - killEffect.ap_boost_max = (Integer) value; - updatePrice = true; - updateKill = true; - } else if (source == killSourceConditionsList) { - updateKill = true; - } else if (source == killSourceConditionBox) { - if (selectedKillEffectCondition.condition != null) { - selectedKillEffectCondition.condition.removeBacklink(item); - } - selectedKillEffectCondition.condition = (ActorCondition) value; - if (selectedKillEffectCondition.condition != null) { - selectedKillEffectCondition.condition_id = selectedKillEffectCondition.condition.id; - selectedKillEffectCondition.condition.addBacklink(item); - } else { - selectedKillEffectCondition.condition_id = null; - } - killSourceConditionsModel.itemChanged(selectedKillEffectCondition); - updateKill = true; - } else if (source == killSourceConditionClear && (Boolean) value) { - selectedKillEffectCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedKillEffectCondition.duration = null; - updateKillSourceTimedConditionWidgets(selectedKillEffectCondition); - killSourceConditionsModel.itemChanged(selectedKillEffectCondition); - updateKill = true; - } else if (source == killSourceConditionApply && (Boolean) value) { - selectedKillEffectCondition.magnitude = (Integer) killSourceConditionMagnitude.getValue(); - selectedKillEffectCondition.duration = killSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) killSourceConditionDuration.getValue(); - if (selectedKillEffectCondition.duration == null || selectedKillEffectCondition.duration == ActorCondition.DURATION_NONE) { - selectedKillEffectCondition.duration = 1; - } - updateKillSourceTimedConditionWidgets(selectedKillEffectCondition); - killSourceConditionsModel.itemChanged(selectedKillEffectCondition); - updateKill = true; - } else if (source == killSourceConditionImmunity && (Boolean) value) { - selectedKillEffectCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedKillEffectCondition.duration = killSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) killSourceConditionDuration.getValue(); - if (selectedKillEffectCondition.duration == null || selectedKillEffectCondition.duration == ActorCondition.DURATION_NONE) { - selectedKillEffectCondition.duration = 1; - } - updateKillSourceTimedConditionWidgets(selectedKillEffectCondition); - killSourceConditionsModel.itemChanged(selectedKillEffectCondition); - updateKill = true; - } else if (source == killSourceConditionMagnitude) { - selectedKillEffectCondition.magnitude = (Integer) value; - killSourceConditionsModel.itemChanged(selectedKillEffectCondition); - updateKill = true; - } else if (source == killSourceConditionTimed && (Boolean) value) { - selectedKillEffectCondition.duration = (Integer) killSourceConditionDuration.getValue(); - if (selectedKillEffectCondition.duration == null || selectedKillEffectCondition.duration == ActorCondition.DURATION_NONE) { - selectedKillEffectCondition.duration = 1; - } - updateKillSourceTimedConditionWidgets(selectedKillEffectCondition); - killSourceConditionsModel.itemChanged(selectedKillEffectCondition); - updateKill = true; - } else if (source == killSourceConditionForever && (Boolean) value) { - selectedKillEffectCondition.duration = ActorCondition.DURATION_FOREVER; - updateKillSourceTimedConditionWidgets(selectedKillEffectCondition); - killSourceConditionsModel.itemChanged(selectedKillEffectCondition); - updateKill = true; - } else if (source == killSourceConditionDuration) { - selectedKillEffectCondition.duration = (Integer) value; - killSourceConditionsModel.itemChanged(selectedKillEffectCondition); - updateKill = true; - } else if (source == killSourceConditionChance) { - selectedKillEffectCondition.chance = (Double) value; - killSourceConditionsModel.itemChanged(selectedKillEffectCondition); - updateKill = true; - } else if (source == hitReceivedHPMin) { - hitReceivedEffect.hp_boost_min = (Integer) value; - updatePrice = true; - updateHitReceived = true; - } else if (source == hitReceivedHPMax) { - hitReceivedEffect.hp_boost_max = (Integer) value; - updatePrice = true; - updateHitReceived = true; - } else if (source == hitReceivedAPMin) { - hitReceivedEffect.ap_boost_min = (Integer) value; - updatePrice = true; - updateHitReceived = true; - } else if (source == hitReceivedAPMax) { - hitReceivedEffect.ap_boost_max = (Integer) value; - updatePrice = true; - updateHitReceived = true; - } else if (source == hitReceivedHPMinTarget) { - hitReceivedEffect.hp_boost_min_target = (Integer) value; - updatePrice = true; - updateHitReceived = true; - } else if (source == hitReceivedHPMaxTarget) { - hitReceivedEffect.hp_boost_max_target = (Integer) value; - updatePrice = true; - updateHitReceived = true; - } else if (source == hitReceivedAPMinTarget) { - hitReceivedEffect.ap_boost_min_target = (Integer) value; - updatePrice = true; - updateHitReceived = true; - } else if (source == hitReceivedAPMaxTarget) { - hitReceivedEffect.ap_boost_max_target = (Integer) value; - updatePrice = true; - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionsList) { - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionBox) { - if (selectedHitReceivedEffectSourceCondition.condition != null) { - selectedHitReceivedEffectSourceCondition.condition.removeBacklink(item); - } - selectedHitReceivedEffectSourceCondition.condition = (ActorCondition) value; - if (selectedHitReceivedEffectSourceCondition.condition != null) { - selectedHitReceivedEffectSourceCondition.condition_id = selectedHitReceivedEffectSourceCondition.condition.id; - selectedHitReceivedEffectSourceCondition.condition.addBacklink(item); - } else { - selectedHitReceivedEffectSourceCondition.condition_id = null; - } - hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionClear && (Boolean) value) { - selectedHitReceivedEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitReceivedEffectSourceCondition.duration = null; - updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); - hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionApply && (Boolean) value) { - selectedHitReceivedEffectSourceCondition.magnitude = (Integer) hitReceivedSourceConditionMagnitude.getValue(); - selectedHitReceivedEffectSourceCondition.duration = hitReceivedSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedSourceConditionDuration.getValue(); - if (selectedHitReceivedEffectSourceCondition.duration == null) { - selectedHitReceivedEffectSourceCondition.duration = 1; - } - updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); - hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionImmunity && (Boolean) value) { - selectedHitReceivedEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitReceivedEffectSourceCondition.duration = hitReceivedSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedSourceConditionDuration.getValue(); - if (selectedHitReceivedEffectSourceCondition.duration == null || selectedHitReceivedEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectSourceCondition.duration = 1; - } - updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); - hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionMagnitude) { - selectedHitReceivedEffectSourceCondition.magnitude = (Integer) value; - hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionTimed && (Boolean) value) { - selectedHitReceivedEffectSourceCondition.duration = (Integer) hitReceivedSourceConditionDuration.getValue(); - if (selectedHitReceivedEffectSourceCondition.duration == null || selectedHitReceivedEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectSourceCondition.duration = 1; - } - updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); - hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionForever && (Boolean) value) { - selectedHitReceivedEffectSourceCondition.duration = ActorCondition.DURATION_FOREVER; - updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); - hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionDuration) { - selectedHitReceivedEffectSourceCondition.duration = (Integer) value; - hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionChance) { - selectedHitReceivedEffectSourceCondition.chance = (Double) value; - hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionsList) { - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionBox) { - if (selectedHitReceivedEffectTargetCondition.condition != null) { - selectedHitReceivedEffectTargetCondition.condition.removeBacklink(item); - } - selectedHitReceivedEffectTargetCondition.condition = (ActorCondition) value; - if (selectedHitReceivedEffectTargetCondition.condition != null) { - selectedHitReceivedEffectTargetCondition.condition_id = selectedHitReceivedEffectTargetCondition.condition.id; - selectedHitReceivedEffectTargetCondition.condition.addBacklink(item); - } else { - selectedHitReceivedEffectTargetCondition.condition_id = null; - } - hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionClear && (Boolean) value) { - selectedHitReceivedEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitReceivedEffectTargetCondition.duration = null; - updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); - hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionApply && (Boolean) value) { - selectedHitReceivedEffectTargetCondition.magnitude = (Integer) hitReceivedTargetConditionMagnitude.getValue(); - selectedHitReceivedEffectTargetCondition.duration = hitReceivedTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedTargetConditionDuration.getValue(); - if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectTargetCondition.duration = 1; - } - updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); - hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionImmunity && (Boolean) value) { - selectedHitReceivedEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitReceivedEffectTargetCondition.duration = hitReceivedTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedTargetConditionDuration.getValue(); - if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectTargetCondition.duration = 1; - } - updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); - hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionMagnitude) { - selectedHitReceivedEffectTargetCondition.magnitude = (Integer) value; - hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionTimed && (Boolean) value) { - selectedHitReceivedEffectTargetCondition.duration = (Integer) hitReceivedTargetConditionDuration.getValue(); - if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectTargetCondition.duration = 1; - } - updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); - hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionForever && (Boolean) value) { - selectedHitReceivedEffectTargetCondition.duration = ActorCondition.DURATION_FOREVER; - updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); - hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionDuration) { - selectedHitReceivedEffectTargetCondition.duration = (Integer) value; - hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionChance) { - selectedHitReceivedEffectTargetCondition.chance = (Double) value; - hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } - - if (updateEquip) { - if (isNull(equipEffect)) { - item.equip_effect = null; - } else { - item.equip_effect = equipEffect; - } - } - if (updateHit) { - if (isNull(hitEffect)) { - item.hit_effect = null; - } else { - item.hit_effect = hitEffect; - } - } - if (updateKill) { - if (isNull(killEffect)) { - item.kill_effect = null; - } else { - item.kill_effect = killEffect; - } - } - if (updateHitReceived) { - if (isNull(hitReceivedEffect)) { - item.hit_received_effect = null; - } else { - item.hit_received_effect = hitReceivedEffect; - } - } - if (updatePrice && !manualPriceBox.isSelected()) { - baseCostField.setValue(item.computePrice()); - } - - - if (item.state != GameDataElement.State.modified) { - item.state = GameDataElement.State.modified; - ItemEditor.this.name = item.getDesc(); - item.childrenChanged(new ArrayList()); - ATContentStudio.frame.editorChanged(ItemEditor.this); - } - updateJsonViewText(item.toJsonString()); - - } - - } - -} +package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; + +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +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; +import javax.swing.JComboBox; +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; +import javax.swing.ListModel; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import com.gpl.rpg.atcontentstudio.ATContentStudio; +import com.gpl.rpg.atcontentstudio.model.GameDataElement; +import com.gpl.rpg.atcontentstudio.model.Project; +import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; +import com.gpl.rpg.atcontentstudio.model.gamedata.*; +import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet; +import com.gpl.rpg.atcontentstudio.ui.*; +import com.jidesoft.swing.JideBoxLayout; + +public class ItemEditor extends JSONElementEditor { + + private static final long serialVersionUID = 7538154592029351986L; + + private static final String form_view_id = "Form"; + private static final String json_view_id = "JSON"; + + private static final String killLabel = "Effect on every kill: "; + private static final String useLabel = "Effect on use: "; + + + private Common.ConditionEffect selectedEquipEffectCondition; + private Common.TimedConditionEffect selectedHitEffectSourceCondition; + private Common.TimedConditionEffect selectedHitEffectTargetCondition; + private Common.TimedConditionEffect selectedKillEffectCondition; + private Common.TimedConditionEffect selectedHitReceivedEffectSourceCondition; + private Common.TimedConditionEffect selectedHitReceivedEffectTargetCondition; + + + private JButton itemIcon; + private JTextField idField; + private JTextField nameField; + private JTextField descriptionField; + @SuppressWarnings("rawtypes") + private JComboBox typeBox; + private IntegerBasedCheckBox manualPriceBox; + private JSpinner baseCostField; + private MyComboBox categoryBox; + private Integer baseManualPrice = null; + + private CollapsiblePanel equipEffectPane; + private Item.EquipEffect equipEffect; + private JSpinner equipDmgMin; + private JSpinner equipDmgMax; + private JSpinner equipBoostHP; + private JSpinner equipBoostAP; + private JSpinner equipBoostAC; + private JSpinner equipBoostBC; + private JSpinner equipBoostCS; + private JSpinner equipSetCM; + private JSpinner equipSetDM; + private JSpinner equipBoostDR; + private JSpinner equipIncMoveCost; + private JSpinner equipIncUseCost; + private JSpinner equipIncReequipCost; + private JSpinner equipIncAttackCost; + private ConditionsListModel equipConditionsModel; + @SuppressWarnings("rawtypes") + private JList equipConditionsList; + private MyComboBox equipConditionBox; + private JRadioButton equipConditionWithMagnitude; + private JRadioButton equipConditionImmunity; + private JSpinner equipConditionMagnitude; + + private CollapsiblePanel hitEffectPane; + private Common.HitEffect hitEffect; + private JSpinner hitHPMin; + private JSpinner hitHPMax; + private JSpinner hitAPMin; + private JSpinner hitAPMax; + private SourceTimedConditionsListModel hitSourceConditionsModel; + @SuppressWarnings("rawtypes") + private JList hitSourceConditionsList; + private MyComboBox hitSourceConditionBox; + private JSpinner hitSourceConditionChance; + private JRadioButton hitSourceConditionClear; + private JRadioButton hitSourceConditionApply; + private JRadioButton hitSourceConditionImmunity; + private JSpinner hitSourceConditionMagnitude; + private JRadioButton hitSourceConditionTimed; + private JRadioButton hitSourceConditionForever; + private JSpinner hitSourceConditionDuration; + private TargetTimedConditionsListModel hitTargetConditionsModel; + @SuppressWarnings("rawtypes") + private JList hitTargetConditionsList; + private MyComboBox hitTargetConditionBox; + private JSpinner hitTargetConditionChance; + private JRadioButton hitTargetConditionClear; + private JRadioButton hitTargetConditionApply; + private JRadioButton hitTargetConditionImmunity; + private JSpinner hitTargetConditionMagnitude; + private JRadioButton hitTargetConditionTimed; + private JRadioButton hitTargetConditionForever; + private JSpinner hitTargetConditionDuration; + + private CollapsiblePanel killEffectPane; + private Common.DeathEffect killEffect; + private JSpinner killHPMin; + private JSpinner killHPMax; + private JSpinner killAPMin; + private JSpinner killAPMax; + private SourceTimedConditionsListModel killSourceConditionsModel; + @SuppressWarnings("rawtypes") + private JList killSourceConditionsList; + private MyComboBox killSourceConditionBox; + private JSpinner killSourceConditionChance; + private JRadioButton killSourceConditionClear; + private JRadioButton killSourceConditionApply; + private JRadioButton killSourceConditionImmunity; + private JSpinner killSourceConditionMagnitude; + private JRadioButton killSourceConditionTimed; + private JRadioButton killSourceConditionForever; + private JSpinner killSourceConditionDuration; + + private CollapsiblePanel hitReceivedEffectPane; + private Common.HitReceivedEffect hitReceivedEffect; + private JSpinner hitReceivedHPMin; + private JSpinner hitReceivedHPMax; + private JSpinner hitReceivedAPMin; + private JSpinner hitReceivedAPMax; + private JSpinner hitReceivedHPMinTarget; + private JSpinner hitReceivedHPMaxTarget; + private JSpinner hitReceivedAPMinTarget; + private JSpinner hitReceivedAPMaxTarget; + private SourceTimedConditionsListModel hitReceivedSourceConditionsModel; + @SuppressWarnings("rawtypes") + private JList hitReceivedSourceConditionsList; + private MyComboBox hitReceivedSourceConditionBox; + private JSpinner hitReceivedSourceConditionChance; + private JRadioButton hitReceivedSourceConditionClear; + private JRadioButton hitReceivedSourceConditionApply; + private JRadioButton hitReceivedSourceConditionImmunity; + private JSpinner hitReceivedSourceConditionMagnitude; + private JRadioButton hitReceivedSourceConditionTimed; + private JRadioButton hitReceivedSourceConditionForever; + private JSpinner hitReceivedSourceConditionDuration; + private TargetTimedConditionsListModel hitReceivedTargetConditionsModel; + @SuppressWarnings("rawtypes") + private JList hitReceivedTargetConditionsList; + private MyComboBox hitReceivedTargetConditionBox; + private JSpinner hitReceivedTargetConditionChance; + private JRadioButton hitReceivedTargetConditionClear; + private JRadioButton hitReceivedTargetConditionApply; + private JRadioButton hitReceivedTargetConditionImmunity; + private JSpinner hitReceivedTargetConditionMagnitude; + private JRadioButton hitReceivedTargetConditionTimed; + private JRadioButton hitReceivedTargetConditionForever; + private JSpinner hitReceivedTargetConditionDuration; + + public ItemEditor(Item item) { + super(item, item.getDesc(), item.getIcon()); + addEditorTab(form_view_id, getFormView()); + addEditorTab(json_view_id, getJSONView()); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void insertFormViewDataField(JPanel pane) { + + final Item item = (Item) target; + + final FieldUpdateListener listener = new ItemFieldUpdater(); + + itemIcon = createButtonPane(pane, item.getProject(), item, Item.class, item.getImage(), Spritesheet.Category.item, listener); + + idField = addTextField(pane, "Internal ID: ", item.id, item.writable, listener); + nameField = addTranslatableTextField(pane, "Display name: ", item.name, item.writable, listener); + descriptionField = addTranslatableTextField(pane, "Description: ", item.description, item.writable, listener); + typeBox = addEnumValueBox(pane, "Type: ", Item.DisplayType.values(), item.display_type, item.writable, listener); + manualPriceBox = addIntegerBasedCheckBox(pane, "Has manual price", item.has_manual_price, item.writable, listener); + baseManualPrice = item.base_market_cost; + baseCostField = addIntegerField(pane, "Base market cost: ", (item.has_manual_price != null && item.has_manual_price == 1) ? item.base_market_cost : item.computePrice(), false, item.writable, listener); + if (!manualPriceBox.isSelected()) { + baseCostField.setEnabled(false); + } + categoryBox = addItemCategoryBox(pane, item.getProject(), "Category: ", item.category, item.writable, listener); + + equipEffectPane = new CollapsiblePanel("Effect when equipped: "); + equipEffectPane.setLayout(new JideBoxLayout(equipEffectPane, JideBoxLayout.PAGE_AXIS)); + if (item.equip_effect == null) { + equipEffect = new Item.EquipEffect(); + } else { + equipEffect = item.equip_effect; + } + equipDmgMin = addIntegerField(equipEffectPane, "Attack Damage min: ", equipEffect.damage_boost_min, true, item.writable, listener); + equipDmgMax = addIntegerField(equipEffectPane, "Attack Damage max: ", equipEffect.damage_boost_max, true, item.writable, listener); + equipSetDM = addIntegerField(equipEffectPane, "Damage modifier %: ", equipEffect.damage_modifier, 100, false, item.writable, listener); + equipBoostHP = addIntegerField(equipEffectPane, "Boost max HP: ", equipEffect.max_hp_boost, true, item.writable, listener); + equipBoostAP = addIntegerField(equipEffectPane, "Boost max AP: ", equipEffect.max_ap_boost, true, item.writable, listener); + equipBoostAC = addIntegerField(equipEffectPane, "Boost attack chance: ", equipEffect.increase_attack_chance, true, item.writable, listener); + equipBoostBC = addIntegerField(equipEffectPane, "Boost block chance: ", equipEffect.increase_block_chance, true, item.writable, listener); + equipBoostCS = addIntegerField(equipEffectPane, "Boost critical skill: ", equipEffect.increase_critical_skill, true, item.writable, listener); + equipSetCM = addDoubleField(equipEffectPane, "Critical multiplier: ", equipEffect.critical_multiplier, item.writable, listener); + equipBoostDR = addIntegerField(equipEffectPane, "Boost damage resistance: ", equipEffect.increase_damage_resistance, true, item.writable, listener); + equipIncMoveCost = addIntegerField(equipEffectPane, "Increase move cost: ", equipEffect.increase_move_cost, true, item.writable, listener); + equipIncUseCost = addIntegerField(equipEffectPane, "Increase item use cost: ", equipEffect.increase_use_item_cost, true, item.writable, listener); + equipIncReequipCost = addIntegerField(equipEffectPane, "Increase reequip cost: ", equipEffect.increase_reequip_cost, true, item.writable, listener); + equipIncAttackCost = addIntegerField(equipEffectPane, "Increase attack cost: ", equipEffect.increase_attack_cost, true, item.writable, listener); + CollapsiblePanel equipConditionsPane = new CollapsiblePanel("Actor Conditions applied when equipped: "); + equipConditionsPane.setLayout(new JideBoxLayout(equipConditionsPane, JideBoxLayout.PAGE_AXIS)); + equipConditionsModel = new ConditionsListModel(equipEffect); + equipConditionsList = new JList(equipConditionsModel); + equipConditionsList.setCellRenderer(new ConditionsCellRenderer()); + equipConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + equipConditionsPane.add(new JScrollPane(equipConditionsList), JideBoxLayout.FIX); + final JPanel equipConditionsEditorPane = new JPanel(); + final JButton createEquipCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteEquipCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + equipConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedEquipEffectCondition = (Common.ConditionEffect) equipConditionsList.getSelectedValue(); + if (selectedEquipEffectCondition == null) { + deleteEquipCondition.setEnabled(false); + } else { + deleteEquipCondition.setEnabled(true); + } + updateEquipConditionEditorPane(equipConditionsEditorPane, selectedEquipEffectCondition, listener); + } + }); + if (item.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createEquipCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.ConditionEffect condition = new Common.ConditionEffect(); + equipConditionsModel.addItem(condition); + equipConditionsList.setSelectedValue(condition, true); + listener.valueChanged(equipConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteEquipCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedEquipEffectCondition != null) { + equipConditionsModel.removeItem(selectedEquipEffectCondition); + selectedEquipEffectCondition = null; + equipConditionsList.clearSelection(); + listener.valueChanged(equipConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createEquipCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteEquipCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + equipConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + equipConditionsEditorPane.setLayout(new JideBoxLayout(equipConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + equipConditionsPane.add(equipConditionsEditorPane, JideBoxLayout.FIX); + if (item.equip_effect == null || item.equip_effect.conditions == null || item.equip_effect.conditions.isEmpty()) { + equipConditionsPane.collapse(); + } + equipEffectPane.add(equipConditionsPane, JideBoxLayout.FIX); + pane.add(equipEffectPane, JideBoxLayout.FIX); + if (item.equip_effect == null) { + equipEffectPane.collapse(); + } + + hitEffectPane = new CollapsiblePanel("Effect on every hit: "); + hitEffectPane.setLayout(new JideBoxLayout(hitEffectPane, JideBoxLayout.PAGE_AXIS)); + if (item.hit_effect == null) { + hitEffect = new Common.HitEffect(); + } else { + hitEffect = item.hit_effect; + } + hitHPMin = addIntegerField(hitEffectPane, "HP bonus min: ", hitEffect.hp_boost_min, true, item.writable, listener); + hitHPMax = addIntegerField(hitEffectPane, "HP bonus max: ", hitEffect.hp_boost_max, true, item.writable, listener); + hitAPMin = addIntegerField(hitEffectPane, "AP bonus min: ", hitEffect.ap_boost_min, true, item.writable, listener); + hitAPMax = addIntegerField(hitEffectPane, "AP bonus max: ", hitEffect.ap_boost_max, true, item.writable, listener); + final CollapsiblePanel hitSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: "); + hitSourceConditionsPane.setLayout(new JideBoxLayout(hitSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); + hitSourceConditionsModel = new SourceTimedConditionsListModel(hitEffect); + hitSourceConditionsList = new JList(hitSourceConditionsModel); + hitSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); + hitSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + hitSourceConditionsPane.add(new JScrollPane(hitSourceConditionsList), JideBoxLayout.FIX); + final JPanel sourceTimedConditionsEditorPane = new JPanel(); + final JButton createHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + hitSourceConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedHitEffectSourceCondition = (Common.TimedConditionEffect) hitSourceConditionsList.getSelectedValue(); + updateHitSourceTimedConditionEditorPane(sourceTimedConditionsEditorPane, selectedHitEffectSourceCondition, listener); + if (selectedHitEffectSourceCondition == null) { + deleteHitSourceCondition.setEnabled(false); + } else { + deleteHitSourceCondition.setEnabled(true); + } + } + }); + if (item.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createHitSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); + hitSourceConditionsModel.addItem(condition); + hitSourceConditionsList.setSelectedValue(condition, true); + listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteHitSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedHitEffectSourceCondition != null) { + hitSourceConditionsModel.removeItem(selectedHitEffectSourceCondition); + selectedHitEffectSourceCondition = null; + hitSourceConditionsList.clearSelection(); + listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createHitSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteHitSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + hitSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + sourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(sourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + hitSourceConditionsPane.add(sourceTimedConditionsEditorPane, JideBoxLayout.FIX); + if (item.hit_effect == null || item.hit_effect.conditions_source == null || item.hit_effect.conditions_source.isEmpty()) { + hitSourceConditionsPane.collapse(); + } + hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX); + final CollapsiblePanel hitTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the target: "); + hitTargetConditionsPane.setLayout(new JideBoxLayout(hitTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); + hitTargetConditionsModel = new TargetTimedConditionsListModel(hitEffect); + hitTargetConditionsList = new JList(hitTargetConditionsModel); + hitTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); + hitTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + hitTargetConditionsPane.add(new JScrollPane(hitTargetConditionsList), JideBoxLayout.FIX); + final JPanel targetTimedConditionsEditorPane = new JPanel(); + final JButton createHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + hitTargetConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedHitEffectTargetCondition = (Common.TimedConditionEffect) hitTargetConditionsList.getSelectedValue(); + updateHitTargetTimedConditionEditorPane(targetTimedConditionsEditorPane, selectedHitEffectTargetCondition, listener); + if (selectedHitEffectTargetCondition == null) { + deleteHitTargetCondition.setEnabled(false); + } else { + deleteHitTargetCondition.setEnabled(true); + } + } + }); + if (item.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createHitTargetCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); + hitTargetConditionsModel.addItem(condition); + hitTargetConditionsList.setSelectedValue(condition, true); + listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteHitTargetCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedHitEffectTargetCondition != null) { + hitTargetConditionsModel.removeItem(selectedHitEffectTargetCondition); + selectedHitEffectTargetCondition = null; + hitTargetConditionsList.clearSelection(); + listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createHitTargetCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteHitTargetCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + hitTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + targetTimedConditionsEditorPane.setLayout(new JideBoxLayout(targetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + hitTargetConditionsPane.add(targetTimedConditionsEditorPane, JideBoxLayout.FIX); + if (item.hit_effect == null || item.hit_effect.conditions_target == null || item.hit_effect.conditions_target.isEmpty()) { + hitTargetConditionsPane.collapse(); + } + hitEffectPane.add(hitTargetConditionsPane, JideBoxLayout.FIX); + if (item.hit_effect == null) { + hitEffectPane.collapse(); + } + pane.add(hitEffectPane, JideBoxLayout.FIX); + + + + killEffectPane = new CollapsiblePanel(killLabel); + killEffectPane.setLayout(new JideBoxLayout(killEffectPane, JideBoxLayout.PAGE_AXIS)); + if (item.kill_effect == null) { + killEffect = new Common.DeathEffect(); + } else { + killEffect = item.kill_effect; + } + killHPMin = addIntegerField(killEffectPane, "HP bonus min: ", killEffect.hp_boost_min, true, item.writable, listener); + killHPMax = addIntegerField(killEffectPane, "HP bonus max: ", killEffect.hp_boost_max, true, item.writable, listener); + killAPMin = addIntegerField(killEffectPane, "AP bonus min: ", killEffect.ap_boost_min, true, item.writable, listener); + killAPMax = addIntegerField(killEffectPane, "AP bonus max: ", killEffect.ap_boost_max, true, item.writable, listener); + final CollapsiblePanel killSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: "); + killSourceConditionsPane.setLayout(new JideBoxLayout(killSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); + killSourceConditionsModel = new SourceTimedConditionsListModel(killEffect); + killSourceConditionsList = new JList(killSourceConditionsModel); + killSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); + killSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + killSourceConditionsPane.add(new JScrollPane(killSourceConditionsList), JideBoxLayout.FIX); + final JPanel killSourceTimedConditionsEditorPane = new JPanel(); + final JButton createKillSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteKillSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + killSourceConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedKillEffectCondition = (Common.TimedConditionEffect) killSourceConditionsList.getSelectedValue(); + updateKillSourceTimedConditionEditorPane(killSourceTimedConditionsEditorPane, selectedKillEffectCondition, listener); + if (selectedKillEffectCondition == null) { + deleteKillSourceCondition.setEnabled(false); + } else { + deleteKillSourceCondition.setEnabled(true); + } + } + }); + if (item.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createKillSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); + killSourceConditionsModel.addItem(condition); + killSourceConditionsList.setSelectedValue(condition, true); + listener.valueChanged(killSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteKillSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedKillEffectCondition != null) { + killSourceConditionsModel.removeItem(selectedKillEffectCondition); + selectedKillEffectCondition = null; + killSourceConditionsList.clearSelection(); + listener.valueChanged(killSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createKillSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteKillSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + killSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + killSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(killSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + killSourceConditionsPane.add(killSourceTimedConditionsEditorPane, JideBoxLayout.FIX); + if (item.kill_effect == null || item.kill_effect.conditions_source == null || item.kill_effect.conditions_source.isEmpty()) { + killSourceConditionsPane.collapse(); + } + killEffectPane.add(killSourceConditionsPane, JideBoxLayout.FIX); + if (item.kill_effect == null) { + killEffectPane.collapse(); + } + pane.add(killEffectPane, JideBoxLayout.FIX); + + + hitReceivedEffectPane = new CollapsiblePanel("Effect on every hit received: "); + hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS)); + if (item.hit_received_effect == null) { + hitReceivedEffect = new Common.HitReceivedEffect(); + } else { + hitReceivedEffect = item.hit_received_effect; + } + hitReceivedHPMin = addIntegerField(hitReceivedEffectPane, "Player HP bonus min: ", hitReceivedEffect.hp_boost_min, true, item.writable, listener); + hitReceivedHPMax = addIntegerField(hitReceivedEffectPane, "Player HP bonus max: ", hitReceivedEffect.hp_boost_max, true, item.writable, listener); + hitReceivedAPMin = addIntegerField(hitReceivedEffectPane, "Player AP bonus min: ", hitReceivedEffect.ap_boost_min, true, item.writable, listener); + hitReceivedAPMax = addIntegerField(hitReceivedEffectPane, "Player AP bonus max: ", hitReceivedEffect.ap_boost_max, true, item.writable, listener); + hitReceivedHPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus min: ", hitReceivedEffect.hp_boost_min_target, true, item.writable, listener); + hitReceivedHPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus max: ", hitReceivedEffect.hp_boost_max_target, true, item.writable, listener); + hitReceivedAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, item.writable, listener); + hitReceivedAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, item.writable, listener); + final CollapsiblePanel hitReceivedSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the player: "); + hitReceivedSourceConditionsPane.setLayout(new JideBoxLayout(hitReceivedSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); + hitReceivedSourceConditionsModel = new SourceTimedConditionsListModel(hitReceivedEffect); + hitReceivedSourceConditionsList = new JList(hitReceivedSourceConditionsModel); + hitReceivedSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); + hitReceivedSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + hitReceivedSourceConditionsPane.add(new JScrollPane(hitReceivedSourceConditionsList), JideBoxLayout.FIX); + final JPanel hitReceivedSourceTimedConditionsEditorPane = new JPanel(); + final JButton createHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + hitReceivedSourceConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedHitReceivedEffectSourceCondition = (Common.TimedConditionEffect) hitReceivedSourceConditionsList.getSelectedValue(); + updateHitReceivedSourceTimedConditionEditorPane(hitReceivedSourceTimedConditionsEditorPane, selectedHitReceivedEffectSourceCondition, listener); + if (selectedHitReceivedEffectSourceCondition == null) { + deleteHitReceivedSourceCondition.setEnabled(false); + } else { + deleteHitReceivedSourceCondition.setEnabled(true); + } + } + }); + if (item.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createHitReceivedSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); + hitReceivedSourceConditionsModel.addItem(condition); + hitReceivedSourceConditionsList.setSelectedValue(condition, true); + listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteHitReceivedSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedHitReceivedEffectSourceCondition != null) { + hitReceivedSourceConditionsModel.removeItem(selectedHitReceivedEffectSourceCondition); + selectedHitReceivedEffectSourceCondition = null; + hitReceivedSourceConditionsList.clearSelection(); + listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createHitReceivedSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteHitReceivedSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + hitReceivedSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + hitReceivedSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + hitReceivedSourceConditionsPane.add(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.FIX); + if (item.hit_received_effect == null || item.hit_received_effect.conditions_source == null || item.hit_received_effect.conditions_source.isEmpty()) { + hitReceivedSourceConditionsPane.collapse(); + } + hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX); + final CollapsiblePanel hitReceivedTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the attacker: "); + hitReceivedTargetConditionsPane.setLayout(new JideBoxLayout(hitReceivedTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); + hitReceivedTargetConditionsModel = new TargetTimedConditionsListModel(hitReceivedEffect); + hitReceivedTargetConditionsList = new JList(hitReceivedTargetConditionsModel); + hitReceivedTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); + hitReceivedTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + hitReceivedTargetConditionsPane.add(new JScrollPane(hitReceivedTargetConditionsList), JideBoxLayout.FIX); + final JPanel hitReceivedTargetTimedConditionsEditorPane = new JPanel(); + final JButton createHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + hitReceivedTargetConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedHitReceivedEffectTargetCondition = (Common.TimedConditionEffect) hitReceivedTargetConditionsList.getSelectedValue(); + updateHitReceivedTargetTimedConditionEditorPane(hitReceivedTargetTimedConditionsEditorPane, selectedHitReceivedEffectTargetCondition, listener); + if (selectedHitReceivedEffectTargetCondition == null) { + deleteHitReceivedTargetCondition.setEnabled(false); + } else { + deleteHitReceivedTargetCondition.setEnabled(true); + } + } + }); + if (item.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createHitReceivedTargetCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); + hitReceivedTargetConditionsModel.addItem(condition); + hitReceivedTargetConditionsList.setSelectedValue(condition, true); + listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteHitReceivedTargetCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedHitReceivedEffectTargetCondition != null) { + hitReceivedTargetConditionsModel.removeItem(selectedHitReceivedEffectTargetCondition); + selectedHitReceivedEffectTargetCondition = null; + hitReceivedTargetConditionsList.clearSelection(); + listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createHitReceivedTargetCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteHitReceivedTargetCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + hitReceivedTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + hitReceivedTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + hitReceivedTargetConditionsPane.add(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.FIX); + if (item.hit_received_effect == null || item.hit_received_effect.conditions_target == null || item.hit_received_effect.conditions_target.isEmpty()) { + hitReceivedTargetConditionsPane.collapse(); + } + hitReceivedEffectPane.add(hitReceivedTargetConditionsPane, JideBoxLayout.FIX); + if (item.hit_received_effect == null) { + hitReceivedEffectPane.collapse(); + } + pane.add(hitReceivedEffectPane, JideBoxLayout.FIX); + + + if (item.category == null || item.category.action_type == null || item.category.action_type == ItemCategory.ActionType.none) { + equipEffectPane.setVisible(false); + hitEffectPane.setVisible(false); + killEffectPane.setVisible(false); + } else if (item.category.action_type == ItemCategory.ActionType.use) { + equipEffectPane.setVisible(false); + hitEffectPane.setVisible(false); + killEffectPane.setVisible(true); + killEffectPane.setTitle(useLabel); + killEffectPane.revalidate(); + killEffectPane.repaint(); + } else if (item.category.action_type == ItemCategory.ActionType.equip) { + equipEffectPane.setVisible(true); + hitEffectPane.setVisible(true); + killEffectPane.setVisible(true); + killEffectPane.setTitle(killLabel); + killEffectPane.revalidate(); + killEffectPane.repaint(); + } + + } + + public void updateHitSourceTimedConditionEditorPane(JPanel pane, Common.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); + hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + + hitSourceConditionClear = new JRadioButton("Clear active condition"); + pane.add(hitSourceConditionClear, JideBoxLayout.FIX); + hitSourceConditionApply = new JRadioButton("Apply condition with magnitude"); + pane.add(hitSourceConditionApply, JideBoxLayout.FIX); + hitSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); + hitSourceConditionImmunity = new JRadioButton("Give immunity to condition"); + pane.add(hitSourceConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(hitSourceConditionApply); + radioEffectGroup.add(hitSourceConditionClear); + radioEffectGroup.add(hitSourceConditionImmunity); + + hitSourceConditionTimed = new JRadioButton("For a number of rounds"); + pane.add(hitSourceConditionTimed, JideBoxLayout.FIX); + hitSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); + hitSourceConditionForever = new JRadioButton("Forever"); + pane.add(hitSourceConditionForever, JideBoxLayout.FIX); + + ButtonGroup radioDurationGroup = new ButtonGroup(); + radioDurationGroup.add(hitSourceConditionTimed); + radioDurationGroup.add(hitSourceConditionForever); + + updateHitSourceTimedConditionWidgets(condition); + + 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())); + } + }); + hitSourceConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitSourceConditionImmunity, new Boolean(hitSourceConditionImmunity.isSelected())); + } + }); + + hitSourceConditionTimed.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitSourceConditionTimed, new Boolean(hitSourceConditionTimed.isSelected())); + } + }); + hitSourceConditionForever.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitSourceConditionForever, new Boolean(hitSourceConditionForever.isSelected())); + } + }); + + pane.revalidate(); + pane.repaint(); + } + + public void updateHitSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { + + boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); + boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); + boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; + + hitSourceConditionClear.setSelected(clear); + hitSourceConditionApply.setSelected(!clear && !immunity); + hitSourceConditionMagnitude.setEnabled(!clear && !immunity); + hitSourceConditionImmunity.setSelected(immunity); + + hitSourceConditionTimed.setSelected(!forever); + hitSourceConditionTimed.setEnabled(!clear); + hitSourceConditionDuration.setEnabled(!clear && !forever); + hitSourceConditionForever.setSelected(forever); + hitSourceConditionForever.setEnabled(!clear); + } + + public void updateHitTargetTimedConditionEditorPane(JPanel pane, Common.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); + hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + + hitTargetConditionClear = new JRadioButton("Clear active condition"); + pane.add(hitTargetConditionClear, JideBoxLayout.FIX); + hitTargetConditionApply = new JRadioButton("Apply condition with magnitude"); + pane.add(hitTargetConditionApply, JideBoxLayout.FIX); + hitTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); + hitTargetConditionImmunity = new JRadioButton("Give immunity to condition"); + pane.add(hitTargetConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(hitTargetConditionApply); + radioEffectGroup.add(hitTargetConditionClear); + radioEffectGroup.add(hitTargetConditionImmunity); + + hitTargetConditionTimed = new JRadioButton("For a number of rounds"); + pane.add(hitTargetConditionTimed, JideBoxLayout.FIX); + hitTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); + hitTargetConditionForever = new JRadioButton("Forever"); + pane.add(hitTargetConditionForever, JideBoxLayout.FIX); + + ButtonGroup radioDurationGroup = new ButtonGroup(); + radioDurationGroup.add(hitTargetConditionTimed); + radioDurationGroup.add(hitTargetConditionForever); + + updateHitTargetTimedConditionWidgets(condition); + + 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())); + } + }); + hitTargetConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitTargetConditionImmunity, new Boolean(hitTargetConditionImmunity.isSelected())); + } + }); + + hitTargetConditionTimed.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitTargetConditionTimed, new Boolean(hitTargetConditionTimed.isSelected())); + } + }); + hitTargetConditionForever.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitTargetConditionForever, new Boolean(hitTargetConditionForever.isSelected())); + } + }); + + pane.revalidate(); + pane.repaint(); + } + + public void updateHitTargetTimedConditionWidgets(Common.TimedConditionEffect condition) { + + boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); + boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); + boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; + + hitTargetConditionClear.setSelected(clear); + hitTargetConditionApply.setSelected(!clear && !immunity); + hitTargetConditionMagnitude.setEnabled(!clear && !immunity); + hitTargetConditionImmunity.setSelected(immunity); + + hitTargetConditionTimed.setSelected(!forever); + hitTargetConditionTimed.setEnabled(!clear); + hitTargetConditionDuration.setEnabled(!clear && !forever); + hitTargetConditionForever.setSelected(forever); + hitTargetConditionForever.setEnabled(!clear); + } + + public void updateKillSourceTimedConditionEditorPane(JPanel pane, Common.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); + killSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + + killSourceConditionClear = new JRadioButton("Clear active condition"); + pane.add(killSourceConditionClear, JideBoxLayout.FIX); + killSourceConditionApply = new JRadioButton("Apply condition with magnitude"); + pane.add(killSourceConditionApply, JideBoxLayout.FIX); + killSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); + killSourceConditionImmunity = new JRadioButton("Give immunity to condition"); + pane.add(killSourceConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(killSourceConditionApply); + radioEffectGroup.add(killSourceConditionClear); + radioEffectGroup.add(killSourceConditionImmunity); + + killSourceConditionTimed = new JRadioButton("For a number of rounds"); + pane.add(killSourceConditionTimed, JideBoxLayout.FIX); + killSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); + killSourceConditionForever = new JRadioButton("Forever"); + pane.add(killSourceConditionForever, JideBoxLayout.FIX); + + ButtonGroup radioDurationGroup = new ButtonGroup(); + radioDurationGroup.add(killSourceConditionTimed); + radioDurationGroup.add(killSourceConditionForever); + + updateKillSourceTimedConditionWidgets(condition); + + 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())); + } + }); + killSourceConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(killSourceConditionImmunity, new Boolean(killSourceConditionImmunity.isSelected())); + } + }); + + killSourceConditionTimed.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(killSourceConditionTimed, new Boolean(killSourceConditionTimed.isSelected())); + } + }); + killSourceConditionForever.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(killSourceConditionForever, new Boolean(killSourceConditionForever.isSelected())); + } + }); + + pane.revalidate(); + pane.repaint(); + } + + public void updateKillSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { + + boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); + boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); + boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; + + killSourceConditionClear.setSelected(clear); + killSourceConditionApply.setSelected(!clear && !immunity); + killSourceConditionMagnitude.setEnabled(!clear && !immunity); + killSourceConditionImmunity.setSelected(immunity); + + killSourceConditionTimed.setSelected(!forever); + killSourceConditionTimed.setEnabled(!clear); + killSourceConditionDuration.setEnabled(!clear && !forever); + killSourceConditionForever.setSelected(forever); + killSourceConditionForever.setEnabled(!clear); + } + + public void updateEquipConditionEditorPane(JPanel pane, Common.ConditionEffect condition, final FieldUpdateListener listener) { + pane.removeAll(); + if (equipConditionBox != null) { + removeElementListener(equipConditionBox); + } + if (condition == null) { + pane.revalidate(); + pane.repaint(); + return; + } + + boolean writable = ((Item)target).writable; + Project proj = ((Item)target).getProject(); + + equipConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); + equipConditionWithMagnitude = new JRadioButton("Apply condition with magnitude."); + pane.add(equipConditionWithMagnitude, JideBoxLayout.FIX); + equipConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, 1, false, writable, listener); + equipConditionImmunity = new JRadioButton("Give immunity to condition."); + pane.add(equipConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(equipConditionWithMagnitude); + radioEffectGroup.add(equipConditionImmunity); + + boolean immunity = condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR; + equipConditionImmunity.setSelected(immunity); + equipConditionWithMagnitude.setSelected(!immunity); + equipConditionMagnitude.setEnabled(!immunity); + + equipConditionWithMagnitude.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(equipConditionWithMagnitude, new Boolean(equipConditionWithMagnitude.isSelected())); + } + }); + equipConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(equipConditionImmunity, new Boolean(equipConditionImmunity.isSelected())); + } + }); + + + pane.revalidate(); + pane.repaint(); + } + + public void updateHitReceivedSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { + pane.removeAll(); + if (hitReceivedSourceConditionBox != null) { + removeElementListener(hitReceivedSourceConditionBox); + } + if (condition == null) { + pane.revalidate(); + pane.repaint(); + return; + } + + boolean writable = ((Item)target).writable; + Project proj = ((Item)target).getProject(); + + hitReceivedSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); + hitReceivedSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + + hitReceivedSourceConditionClear = new JRadioButton("Clear active condition"); + pane.add(hitReceivedSourceConditionClear, JideBoxLayout.FIX); + hitReceivedSourceConditionApply = new JRadioButton("Apply condition with magnitude"); + pane.add(hitReceivedSourceConditionApply, JideBoxLayout.FIX); + hitReceivedSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); + hitReceivedSourceConditionImmunity = new JRadioButton("Give immunity to condition"); + pane.add(hitReceivedSourceConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(hitReceivedSourceConditionApply); + radioEffectGroup.add(hitReceivedSourceConditionClear); + radioEffectGroup.add(hitReceivedSourceConditionImmunity); + + hitReceivedSourceConditionTimed = new JRadioButton("For a number of rounds"); + pane.add(hitReceivedSourceConditionTimed, JideBoxLayout.FIX); + hitReceivedSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); + hitReceivedSourceConditionForever = new JRadioButton("Forever"); + pane.add(hitReceivedSourceConditionForever, JideBoxLayout.FIX); + + ButtonGroup radioDurationGroup = new ButtonGroup(); + radioDurationGroup.add(hitReceivedSourceConditionTimed); + radioDurationGroup.add(hitReceivedSourceConditionForever); + + updateHitReceivedSourceTimedConditionWidgets(condition); + + hitReceivedSourceConditionClear.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedSourceConditionClear, new Boolean(hitReceivedSourceConditionClear.isSelected())); + } + }); + hitReceivedSourceConditionApply.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedSourceConditionApply, new Boolean(hitReceivedSourceConditionApply.isSelected())); + } + }); + hitReceivedSourceConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedSourceConditionImmunity, new Boolean(hitReceivedSourceConditionImmunity.isSelected())); + } + }); + + hitReceivedSourceConditionTimed.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedSourceConditionTimed, new Boolean(hitReceivedSourceConditionTimed.isSelected())); + } + }); + hitReceivedSourceConditionForever.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedSourceConditionForever, new Boolean(hitReceivedSourceConditionForever.isSelected())); + } + }); + + pane.revalidate(); + pane.repaint(); + } + + public void updateHitReceivedSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { + + boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); + boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); + boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; + + hitReceivedSourceConditionClear.setSelected(clear); + hitReceivedSourceConditionApply.setSelected(!clear && !immunity); + hitReceivedSourceConditionMagnitude.setEnabled(!clear && !immunity); + hitReceivedSourceConditionImmunity.setSelected(immunity); + + hitReceivedSourceConditionTimed.setSelected(!forever); + hitReceivedSourceConditionTimed.setEnabled(!clear); + hitReceivedSourceConditionDuration.setEnabled(!clear && !forever); + hitReceivedSourceConditionForever.setSelected(forever); + hitReceivedSourceConditionForever.setEnabled(!clear); + } + + public void updateHitReceivedTargetTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { + pane.removeAll(); + if (hitReceivedTargetConditionBox != null) { + removeElementListener(hitReceivedTargetConditionBox); + } + if (condition == null) { + pane.revalidate(); + pane.repaint(); + return; + } + + boolean writable = ((Item)target).writable; + Project proj = ((Item)target).getProject(); + + hitReceivedTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); + hitReceivedTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + + hitReceivedTargetConditionClear = new JRadioButton("Clear active condition"); + pane.add(hitReceivedTargetConditionClear, JideBoxLayout.FIX); + hitReceivedTargetConditionApply = new JRadioButton("Apply condition with magnitude"); + pane.add(hitReceivedTargetConditionApply, JideBoxLayout.FIX); + hitReceivedTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); + hitReceivedTargetConditionImmunity = new JRadioButton("Give immunity to condition"); + pane.add(hitReceivedTargetConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(hitReceivedTargetConditionApply); + radioEffectGroup.add(hitReceivedTargetConditionClear); + radioEffectGroup.add(hitReceivedTargetConditionImmunity); + + hitReceivedTargetConditionTimed = new JRadioButton("For a number of rounds"); + pane.add(hitReceivedTargetConditionTimed, JideBoxLayout.FIX); + hitReceivedTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); + hitReceivedTargetConditionForever = new JRadioButton("Forever"); + pane.add(hitReceivedTargetConditionForever, JideBoxLayout.FIX); + + ButtonGroup radioDurationGroup = new ButtonGroup(); + radioDurationGroup.add(hitReceivedTargetConditionTimed); + radioDurationGroup.add(hitReceivedTargetConditionForever); + + updateHitReceivedTargetTimedConditionWidgets(condition); + + hitReceivedTargetConditionClear.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedTargetConditionClear, new Boolean(hitReceivedTargetConditionClear.isSelected())); + } + }); + hitReceivedTargetConditionApply.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedTargetConditionApply, new Boolean(hitReceivedTargetConditionApply.isSelected())); + } + }); + hitReceivedTargetConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedTargetConditionImmunity, new Boolean(hitReceivedTargetConditionImmunity.isSelected())); + } + }); + + hitReceivedTargetConditionTimed.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedTargetConditionTimed, new Boolean(hitReceivedTargetConditionTimed.isSelected())); + } + }); + hitReceivedTargetConditionForever.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedTargetConditionForever, new Boolean(hitReceivedTargetConditionForever.isSelected())); + } + }); + + pane.revalidate(); + pane.repaint(); + } + + public void updateHitReceivedTargetTimedConditionWidgets(Common.TimedConditionEffect condition) { + + boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); + boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); + boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; + + hitReceivedTargetConditionClear.setSelected(clear); + hitReceivedTargetConditionApply.setSelected(!clear && !immunity); + hitReceivedTargetConditionMagnitude.setEnabled(!clear && !immunity); + hitReceivedTargetConditionImmunity.setSelected(immunity); + + hitReceivedTargetConditionTimed.setSelected(!forever); + hitReceivedTargetConditionTimed.setEnabled(!clear); + hitReceivedTargetConditionDuration.setEnabled(!clear && !forever); + hitReceivedTargetConditionForever.setSelected(forever); + hitReceivedTargetConditionForever.setEnabled(!clear); + } + + + public static class SourceTimedConditionsListModel extends OrderedListenerListModel { + public SourceTimedConditionsListModel(Common.DeathEffect effect) { + super(effect);; + } + @Override + protected List getItems() { + return source.conditions_source; + } + + @Override + protected void setItems(List items) { + source.conditions_source = items; + } + } + + public static class TargetTimedConditionsListModel extends OrderedListenerListModel { + public TargetTimedConditionsListModel(Common.HitEffect effect) { + super(effect); + } + + @Override + protected List getItems() { + return source.conditions_target; + } + + @Override + protected void setItems(List items) { + source.conditions_target = items; + } + } + + public static class TimedConditionsCellRenderer extends DefaultListCellRenderer { + private static final long serialVersionUID = 7987880146189575234L; + + @Override + public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (c instanceof JLabel) { + JLabel label = ((JLabel)c); + Common.TimedConditionEffect effect = (Common.TimedConditionEffect) value; + + if (effect.condition != null) { + + boolean immunity = (effect.magnitude == null || effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (effect.duration != null && effect.duration > ActorCondition.DURATION_NONE); + boolean clear = (effect.magnitude == null || effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (effect.duration == null || effect.duration == ActorCondition.DURATION_NONE); + boolean forever = effect.duration != null && effect.duration == ActorCondition.DURATION_FOREVER; + + if (clear) { + label.setIcon(new ImageIcon(effect.condition.getIcon())); + label.setText(effect.chance+"% chances to clear actor condition "+effect.condition.getDesc()); + } else if (immunity) { + label.setIcon(new OverlayIcon(effect.condition.getIcon(), DefaultIcons.getImmunityIcon())); + label.setText(effect.chance+"% chances to give immunity to "+effect.condition.getDesc()+(forever ? " forever" : " for "+effect.duration+" rounds")); + } else { + label.setIcon(new ImageIcon(effect.condition.getIcon())); + label.setText(effect.chance+"% chances to give actor condition "+effect.condition.getDesc()+" x"+effect.magnitude+(forever ? " forever" : " for "+effect.duration+" rounds")); + } + } else { + label.setText("New, undefined actor condition effect."); + } + } + return c; + } + } + + public static class ConditionsListModel extends OrderedListenerListModel { + public ConditionsListModel(Item.EquipEffect equipEffect) { + super(equipEffect); + } + + @Override + protected List getItems() { + return source.conditions; + } + + @Override + protected void setItems(List conditions) { + source.conditions = conditions; + } + } + + public static class ConditionsCellRenderer extends DefaultListCellRenderer { + private static final long serialVersionUID = 7987880146189575234L; + + @Override + public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (c instanceof JLabel) { + JLabel label = ((JLabel)c); + Common.ConditionEffect effect = (Common.ConditionEffect) value; + + if (effect.condition != null) { + if (effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) { + label.setIcon(new OverlayIcon(effect.condition.getIcon(), DefaultIcons.getImmunityIcon())); + label.setText("Immune to actor condition "+effect.condition.getDesc()); + } else { + label.setIcon(new ImageIcon(effect.condition.getIcon())); + label.setText("Give actor condition "+effect.condition.getDesc()+" x"+effect.magnitude); + } + } else { + label.setText("New, undefined actor condition effect."); + } + } + return c; + } + } + + public static boolean isNull(Item.EquipEffect effect) { + if (effect.conditions != null) return false; + if (effect.critical_multiplier != null) return false; + if (effect.damage_modifier != null) return false; + if (effect.damage_boost_max != null) return false; + if (effect.damage_boost_min != null) return false; + if (effect.increase_attack_chance != null) return false; + if (effect.increase_attack_cost != null) return false; + if (effect.increase_block_chance != null) return false; + if (effect.increase_critical_skill != null) return false; + if (effect.increase_damage_resistance != null) return false; + if (effect.increase_move_cost != null) return false; + if (effect.increase_reequip_cost != null) return false; + if (effect.increase_use_item_cost != null) return false; + if (effect.max_ap_boost != null) return false; + if (effect.max_hp_boost != null) return false; + return true; + } + + + public static boolean isNull(Common.HitEffect effect) { + if (effect.ap_boost_min != null) return false; + if (effect.ap_boost_max != null) return false; + if (effect.hp_boost_min != null) return false; + if (effect.hp_boost_max != null) return false; + if (effect.conditions_source != null) return false; + if (effect.conditions_target != null) return false; + return true; + } + + + public static boolean isNull(Common.DeathEffect effect) { + if (effect.ap_boost_min != null) return false; + if (effect.ap_boost_max != null) return false; + if (effect.hp_boost_min != null) return false; + if (effect.hp_boost_max != null) return false; + if (effect.conditions_source != null) return false; + return true; + } + + public static boolean isNull(Common.HitReceivedEffect effect) { + if (effect.ap_boost_min != null) return false; + if (effect.ap_boost_max != null) return false; + if (effect.hp_boost_min != null) return false; + if (effect.hp_boost_max != null) return false; + if (effect.ap_boost_min_target != null) return false; + if (effect.ap_boost_max_target != null) return false; + if (effect.hp_boost_min_target != null) return false; + if (effect.hp_boost_max_target != null) return false; + if (effect.conditions_source != null) return false; + if (effect.conditions_target != null) return false; + return true; + } + + + public class ItemFieldUpdater implements FieldUpdateListener { + + @Override + public void valueChanged(JComponent source, Object value) { + Item item = (Item)target; + boolean updatePrice, updateEquip, updateHit, updateKill, updateHitReceived; + updatePrice = updateEquip = updateHit = updateKill = updateHitReceived = false; + if (source == idField) { + //Events caused by cancel an ID edition. Dismiss. + if (skipNext) { + skipNext = false; + return; + } + if (target.id.equals((String) value)) return; + + if (idChanging()) { + item.id = (String) value; + ItemEditor.this.name = item.getDesc(); + item.childrenChanged(new ArrayList()); + ATContentStudio.frame.editorChanged(ItemEditor.this); + } else { + cancelIdEdit(idField); + return; + } + } else if (source == nameField) { + item.name = (String) value; + ItemEditor.this.name = item.getDesc(); + item.childrenChanged(new ArrayList()); + ATContentStudio.frame.editorChanged(ItemEditor.this); + } else if (source == itemIcon) { + item.icon_id = (String) value; + item.childrenChanged(new ArrayList()); + ItemEditor.this.icon = new ImageIcon(item.getProject().getIcon((String) value)); + ATContentStudio.frame.editorChanged(ItemEditor.this); + itemIcon.setIcon(new ImageIcon(item.getProject().getImage((String) value))); + itemIcon.revalidate(); + itemIcon.repaint(); + } else if (source == descriptionField) { + item.description = descriptionField.getText(); + } else if (source == typeBox) { + item.display_type = (Item.DisplayType) value; + } else if (source == manualPriceBox) { + item.has_manual_price = (Integer) value; + if (!manualPriceBox.isSelected()) { + baseCostField.setEnabled(false); + updatePrice = true; + } else { + baseCostField.setEnabled(true); + if (baseManualPrice != null) { + baseCostField.setValue(baseManualPrice); + } + } + } else if (source == baseCostField) { + if (manualPriceBox.isSelected()) { + item.base_market_cost = (Integer) value; + baseManualPrice = item.base_market_cost; + } + } else if (source == categoryBox) { + if (item.category != null) { + item.category.removeBacklink(item); + } + item.category = (ItemCategory) value; + if (item.category != null) { + item.category_id = item.category.id; + item.category.addBacklink(item); + } else { + item.category_id = null; + } + if (item.category == null || item.category.action_type == null || item.category.action_type == ItemCategory.ActionType.none) { + equipEffectPane.setVisible(false); + item.equip_effect = null; + hitEffectPane.setVisible(false); + item.hit_effect = null; + killEffectPane.setVisible(false); + item.kill_effect = null; + hitReceivedEffectPane.setVisible(false); + item.hit_received_effect = null; + ItemEditor.this.revalidate(); + ItemEditor.this.repaint(); + } else if (item.category.action_type == ItemCategory.ActionType.use) { + equipEffectPane.setVisible(false); + item.equip_effect = null; + hitEffectPane.setVisible(false); + item.hit_effect = null; + killEffectPane.setVisible(true); + updateKill = true; + hitReceivedEffectPane.setVisible(false); + item.hit_received_effect = null; + killEffectPane.setTitle(useLabel); + ItemEditor.this.revalidate(); + ItemEditor.this.repaint(); + } else if (item.category.action_type == ItemCategory.ActionType.equip) { + equipEffectPane.setVisible(true); + updateEquip = true; + hitEffectPane.setVisible(true); + updateEquip = true; + killEffectPane.setVisible(true); + updateKill = true; + hitReceivedEffectPane.setVisible(true); + updateEquip = true; + killEffectPane.setTitle(killLabel); + ItemEditor.this.revalidate(); + ItemEditor.this.repaint(); + } + updatePrice = true; + } else if (source == equipDmgMin) { + equipEffect.damage_boost_min = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipDmgMax) { + equipEffect.damage_boost_max = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipBoostHP) { + equipEffect.max_hp_boost = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipBoostAP) { + equipEffect.max_ap_boost = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipBoostAC) { + equipEffect.increase_attack_chance = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipBoostBC) { + equipEffect.increase_block_chance = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipBoostCS) { + equipEffect.increase_critical_skill = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipSetCM) { + equipEffect.critical_multiplier = (Double) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipSetDM) { + equipEffect.damage_modifier = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipBoostDR) { + equipEffect.increase_damage_resistance = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipIncMoveCost) { + equipEffect.increase_move_cost = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipIncUseCost) { + equipEffect.increase_use_item_cost = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipIncReequipCost) { + equipEffect.increase_reequip_cost = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipIncAttackCost) { + equipEffect.increase_attack_cost = (Integer) value; + updatePrice = true; + updateEquip = true; + } else if (source == equipConditionsList) { + updateEquip = true; + } else if (source == equipConditionBox) { + if (selectedEquipEffectCondition.condition != null) { + selectedEquipEffectCondition.condition.removeBacklink(item); + } + selectedEquipEffectCondition.condition = (ActorCondition) value; + if (selectedEquipEffectCondition.condition != null) { + selectedEquipEffectCondition.condition_id = selectedEquipEffectCondition.condition.id; + selectedEquipEffectCondition.condition.addBacklink(item); + } else { + selectedEquipEffectCondition.condition_id = null; + } + equipConditionsModel.itemChanged(selectedEquipEffectCondition); + } else if (source == equipConditionMagnitude) { + selectedEquipEffectCondition.magnitude = (Integer) value; + equipConditionsModel.itemChanged(selectedEquipEffectCondition); + } else if (source == equipConditionImmunity && (Boolean) value) { + selectedEquipEffectCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + equipConditionMagnitude.setEnabled(false); + equipConditionsModel.itemChanged(selectedEquipEffectCondition); + } else if (source == equipConditionWithMagnitude && (Boolean) value) { + selectedEquipEffectCondition.magnitude = (Integer) equipConditionMagnitude.getValue(); + equipConditionMagnitude.setEnabled(true); + equipConditionsModel.itemChanged(selectedEquipEffectCondition); + } else if (source == hitHPMin) { + hitEffect.hp_boost_min = (Integer) value; + updatePrice = true; + updateHit = true; + } else if (source == hitHPMax) { + hitEffect.hp_boost_max = (Integer) value; + updatePrice = true; + updateHit = true; + } else if (source == hitAPMin) { + hitEffect.ap_boost_min = (Integer) value; + updatePrice = true; + updateHit = true; + } else if (source == hitAPMax) { + hitEffect.ap_boost_max = (Integer) value; + updatePrice = true; + updateHit = true; + } else if (source == hitSourceConditionsList) { + updateHit = true; + } else if (source == hitSourceConditionBox) { + if (selectedHitEffectSourceCondition.condition != null) { + selectedHitEffectSourceCondition.condition.removeBacklink(item); + } + selectedHitEffectSourceCondition.condition = (ActorCondition) value; + if (selectedHitEffectSourceCondition.condition != null) { + selectedHitEffectSourceCondition.condition_id = selectedHitEffectSourceCondition.condition.id; + selectedHitEffectSourceCondition.condition.addBacklink(item); + } else { + selectedHitEffectSourceCondition.condition_id = null; + } + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionClear && (Boolean) value) { + selectedHitEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitEffectSourceCondition.duration = null; + updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionApply && (Boolean) value) { + selectedHitEffectSourceCondition.magnitude = (Integer) hitSourceConditionMagnitude.getValue(); + selectedHitEffectSourceCondition.duration = hitSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitSourceConditionDuration.getValue(); + if (selectedHitEffectSourceCondition.duration == null) { + selectedHitEffectSourceCondition.duration = 1; + } + updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionImmunity && (Boolean) value) { + selectedHitEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitEffectSourceCondition.duration = hitSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitSourceConditionDuration.getValue(); + if (selectedHitEffectSourceCondition.duration == null || selectedHitEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectSourceCondition.duration = 1; + } + updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionMagnitude) { + selectedHitEffectSourceCondition.magnitude = (Integer) value; + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionTimed && (Boolean) value) { + selectedHitEffectSourceCondition.duration = (Integer) hitSourceConditionDuration.getValue(); + if (selectedHitEffectSourceCondition.duration == null || selectedHitEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectSourceCondition.duration = 1; + } + updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionForever && (Boolean) value) { + selectedHitEffectSourceCondition.duration = ActorCondition.DURATION_FOREVER; + updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionDuration) { + selectedHitEffectSourceCondition.duration = (Integer) value; + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionChance) { + selectedHitEffectSourceCondition.chance = (Double) value; + hitSourceConditionsModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitTargetConditionsList) { + updateHit = true; + } else if (source == hitTargetConditionBox) { + if (selectedHitEffectTargetCondition.condition != null) { + selectedHitEffectTargetCondition.condition.removeBacklink(item); + } + selectedHitEffectTargetCondition.condition = (ActorCondition) value; + if (selectedHitEffectTargetCondition.condition != null) { + selectedHitEffectTargetCondition.condition_id = selectedHitEffectTargetCondition.condition.id; + selectedHitEffectTargetCondition.condition.addBacklink(item); + } else { + selectedHitEffectTargetCondition.condition_id = null; + } + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionClear && (Boolean) value) { + selectedHitEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitEffectTargetCondition.duration = null; + updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionApply && (Boolean) value) { + selectedHitEffectTargetCondition.magnitude = (Integer) hitTargetConditionMagnitude.getValue(); + selectedHitEffectTargetCondition.duration = hitTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitTargetConditionDuration.getValue(); + if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectTargetCondition.duration = 1; + } + updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionImmunity && (Boolean) value) { + selectedHitEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitEffectTargetCondition.duration = hitTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitTargetConditionDuration.getValue(); + if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectTargetCondition.duration = 1; + } + updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionMagnitude) { + selectedHitEffectTargetCondition.magnitude = (Integer) value; + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionTimed && (Boolean) value) { + selectedHitEffectTargetCondition.duration = (Integer) hitTargetConditionDuration.getValue(); + if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectTargetCondition.duration = 1; + } + updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionForever && (Boolean) value) { + selectedHitEffectTargetCondition.duration = ActorCondition.DURATION_FOREVER; + updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionDuration) { + selectedHitEffectTargetCondition.duration = (Integer) value; + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionChance) { + selectedHitEffectTargetCondition.chance = (Double) value; + hitTargetConditionsModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == killHPMin) { + killEffect.hp_boost_min = (Integer) value; + updatePrice = true; + updateKill = true; + } else if (source == killHPMax) { + killEffect.hp_boost_max = (Integer) value; + updatePrice = true; + updateKill = true; + } else if (source == killAPMin) { + killEffect.ap_boost_min = (Integer) value; + updatePrice = true; + updateKill = true; + } else if (source == killAPMax) { + killEffect.ap_boost_max = (Integer) value; + updatePrice = true; + updateKill = true; + } else if (source == killSourceConditionsList) { + updateKill = true; + } else if (source == killSourceConditionBox) { + if (selectedKillEffectCondition.condition != null) { + selectedKillEffectCondition.condition.removeBacklink(item); + } + selectedKillEffectCondition.condition = (ActorCondition) value; + if (selectedKillEffectCondition.condition != null) { + selectedKillEffectCondition.condition_id = selectedKillEffectCondition.condition.id; + selectedKillEffectCondition.condition.addBacklink(item); + } else { + selectedKillEffectCondition.condition_id = null; + } + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; + } else if (source == killSourceConditionClear && (Boolean) value) { + selectedKillEffectCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedKillEffectCondition.duration = null; + updateKillSourceTimedConditionWidgets(selectedKillEffectCondition); + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; + } else if (source == killSourceConditionApply && (Boolean) value) { + selectedKillEffectCondition.magnitude = (Integer) killSourceConditionMagnitude.getValue(); + selectedKillEffectCondition.duration = killSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) killSourceConditionDuration.getValue(); + if (selectedKillEffectCondition.duration == null || selectedKillEffectCondition.duration == ActorCondition.DURATION_NONE) { + selectedKillEffectCondition.duration = 1; + } + updateKillSourceTimedConditionWidgets(selectedKillEffectCondition); + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; + } else if (source == killSourceConditionImmunity && (Boolean) value) { + selectedKillEffectCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedKillEffectCondition.duration = killSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) killSourceConditionDuration.getValue(); + if (selectedKillEffectCondition.duration == null || selectedKillEffectCondition.duration == ActorCondition.DURATION_NONE) { + selectedKillEffectCondition.duration = 1; + } + updateKillSourceTimedConditionWidgets(selectedKillEffectCondition); + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; + } else if (source == killSourceConditionMagnitude) { + selectedKillEffectCondition.magnitude = (Integer) value; + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; + } else if (source == killSourceConditionTimed && (Boolean) value) { + selectedKillEffectCondition.duration = (Integer) killSourceConditionDuration.getValue(); + if (selectedKillEffectCondition.duration == null || selectedKillEffectCondition.duration == ActorCondition.DURATION_NONE) { + selectedKillEffectCondition.duration = 1; + } + updateKillSourceTimedConditionWidgets(selectedKillEffectCondition); + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; + } else if (source == killSourceConditionForever && (Boolean) value) { + selectedKillEffectCondition.duration = ActorCondition.DURATION_FOREVER; + updateKillSourceTimedConditionWidgets(selectedKillEffectCondition); + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; + } else if (source == killSourceConditionDuration) { + selectedKillEffectCondition.duration = (Integer) value; + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; + } else if (source == killSourceConditionChance) { + selectedKillEffectCondition.chance = (Double) value; + killSourceConditionsModel.itemChanged(selectedKillEffectCondition); + updateKill = true; + } else if (source == hitReceivedHPMin) { + hitReceivedEffect.hp_boost_min = (Integer) value; + updatePrice = true; + updateHitReceived = true; + } else if (source == hitReceivedHPMax) { + hitReceivedEffect.hp_boost_max = (Integer) value; + updatePrice = true; + updateHitReceived = true; + } else if (source == hitReceivedAPMin) { + hitReceivedEffect.ap_boost_min = (Integer) value; + updatePrice = true; + updateHitReceived = true; + } else if (source == hitReceivedAPMax) { + hitReceivedEffect.ap_boost_max = (Integer) value; + updatePrice = true; + updateHitReceived = true; + } else if (source == hitReceivedHPMinTarget) { + hitReceivedEffect.hp_boost_min_target = (Integer) value; + updatePrice = true; + updateHitReceived = true; + } else if (source == hitReceivedHPMaxTarget) { + hitReceivedEffect.hp_boost_max_target = (Integer) value; + updatePrice = true; + updateHitReceived = true; + } else if (source == hitReceivedAPMinTarget) { + hitReceivedEffect.ap_boost_min_target = (Integer) value; + updatePrice = true; + updateHitReceived = true; + } else if (source == hitReceivedAPMaxTarget) { + hitReceivedEffect.ap_boost_max_target = (Integer) value; + updatePrice = true; + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionsList) { + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionBox) { + if (selectedHitReceivedEffectSourceCondition.condition != null) { + selectedHitReceivedEffectSourceCondition.condition.removeBacklink(item); + } + selectedHitReceivedEffectSourceCondition.condition = (ActorCondition) value; + if (selectedHitReceivedEffectSourceCondition.condition != null) { + selectedHitReceivedEffectSourceCondition.condition_id = selectedHitReceivedEffectSourceCondition.condition.id; + selectedHitReceivedEffectSourceCondition.condition.addBacklink(item); + } else { + selectedHitReceivedEffectSourceCondition.condition_id = null; + } + hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionClear && (Boolean) value) { + selectedHitReceivedEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitReceivedEffectSourceCondition.duration = null; + updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); + hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionApply && (Boolean) value) { + selectedHitReceivedEffectSourceCondition.magnitude = (Integer) hitReceivedSourceConditionMagnitude.getValue(); + selectedHitReceivedEffectSourceCondition.duration = hitReceivedSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedSourceConditionDuration.getValue(); + if (selectedHitReceivedEffectSourceCondition.duration == null) { + selectedHitReceivedEffectSourceCondition.duration = 1; + } + updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); + hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionImmunity && (Boolean) value) { + selectedHitReceivedEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitReceivedEffectSourceCondition.duration = hitReceivedSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedSourceConditionDuration.getValue(); + if (selectedHitReceivedEffectSourceCondition.duration == null || selectedHitReceivedEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectSourceCondition.duration = 1; + } + updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); + hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionMagnitude) { + selectedHitReceivedEffectSourceCondition.magnitude = (Integer) value; + hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionTimed && (Boolean) value) { + selectedHitReceivedEffectSourceCondition.duration = (Integer) hitReceivedSourceConditionDuration.getValue(); + if (selectedHitReceivedEffectSourceCondition.duration == null || selectedHitReceivedEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectSourceCondition.duration = 1; + } + updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); + hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionForever && (Boolean) value) { + selectedHitReceivedEffectSourceCondition.duration = ActorCondition.DURATION_FOREVER; + updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); + hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionDuration) { + selectedHitReceivedEffectSourceCondition.duration = (Integer) value; + hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionChance) { + selectedHitReceivedEffectSourceCondition.chance = (Double) value; + hitReceivedSourceConditionsModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionsList) { + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionBox) { + if (selectedHitReceivedEffectTargetCondition.condition != null) { + selectedHitReceivedEffectTargetCondition.condition.removeBacklink(item); + } + selectedHitReceivedEffectTargetCondition.condition = (ActorCondition) value; + if (selectedHitReceivedEffectTargetCondition.condition != null) { + selectedHitReceivedEffectTargetCondition.condition_id = selectedHitReceivedEffectTargetCondition.condition.id; + selectedHitReceivedEffectTargetCondition.condition.addBacklink(item); + } else { + selectedHitReceivedEffectTargetCondition.condition_id = null; + } + hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionClear && (Boolean) value) { + selectedHitReceivedEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitReceivedEffectTargetCondition.duration = null; + updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); + hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionApply && (Boolean) value) { + selectedHitReceivedEffectTargetCondition.magnitude = (Integer) hitReceivedTargetConditionMagnitude.getValue(); + selectedHitReceivedEffectTargetCondition.duration = hitReceivedTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedTargetConditionDuration.getValue(); + if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectTargetCondition.duration = 1; + } + updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); + hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionImmunity && (Boolean) value) { + selectedHitReceivedEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitReceivedEffectTargetCondition.duration = hitReceivedTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedTargetConditionDuration.getValue(); + if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectTargetCondition.duration = 1; + } + updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); + hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionMagnitude) { + selectedHitReceivedEffectTargetCondition.magnitude = (Integer) value; + hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionTimed && (Boolean) value) { + selectedHitReceivedEffectTargetCondition.duration = (Integer) hitReceivedTargetConditionDuration.getValue(); + if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectTargetCondition.duration = 1; + } + updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); + hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionForever && (Boolean) value) { + selectedHitReceivedEffectTargetCondition.duration = ActorCondition.DURATION_FOREVER; + updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); + hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionDuration) { + selectedHitReceivedEffectTargetCondition.duration = (Integer) value; + hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionChance) { + selectedHitReceivedEffectTargetCondition.chance = (Double) value; + hitReceivedTargetConditionsModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } + + if (updateEquip) { + if (isNull(equipEffect)) { + item.equip_effect = null; + } else { + item.equip_effect = equipEffect; + } + } + if (updateHit) { + if (isNull(hitEffect)) { + item.hit_effect = null; + } else { + item.hit_effect = hitEffect; + } + } + if (updateKill) { + if (isNull(killEffect)) { + item.kill_effect = null; + } else { + item.kill_effect = killEffect; + } + } + if (updateHitReceived) { + if (isNull(hitReceivedEffect)) { + item.hit_received_effect = null; + } else { + item.hit_received_effect = hitReceivedEffect; + } + } + if (updatePrice && !manualPriceBox.isSelected()) { + baseCostField.setValue(item.computePrice()); + } + + + if (item.state != GameDataElement.State.modified) { + item.state = GameDataElement.State.modified; + ItemEditor.this.name = item.getDesc(); + item.childrenChanged(new ArrayList()); + ATContentStudio.frame.editorChanged(ItemEditor.this); + } + updateJsonViewText(item.toJsonString()); + + } + + } + +} diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/NPCEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/NPCEditor.java index 5fe32f3..7ea7871 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/NPCEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/NPCEditor.java @@ -1,1612 +1,1612 @@ -package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -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; -import javax.swing.JComboBox; -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; -import javax.swing.ListModel; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListDataEvent; -import javax.swing.event.ListDataListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import com.gpl.rpg.atcontentstudio.ATContentStudio; -import com.gpl.rpg.atcontentstudio.model.GameDataElement; -import com.gpl.rpg.atcontentstudio.model.Project; -import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; -import com.gpl.rpg.atcontentstudio.model.gamedata.*; -import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet; -import com.gpl.rpg.atcontentstudio.ui.*; -import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView; -import com.jidesoft.swing.JideBoxLayout; - -public class NPCEditor extends JSONElementEditor { - - private static final long serialVersionUID = 4001483665523721800L; - - private static final String form_view_id = "Form"; - private static final String json_view_id = "JSON"; - private static final String dialogue_tree_id = "Dialogue Tree"; - - private Common.TimedConditionEffect selectedHitEffectSourceCondition; - private Common.TimedConditionEffect selectedHitEffectTargetCondition; - private Common.TimedConditionEffect selectedHitReceivedEffectSourceCondition; - private Common.TimedConditionEffect selectedHitReceivedEffectTargetCondition; - private Common.TimedConditionEffect selectedDeathEffectSourceCondition; - - private JButton npcIcon; - private JTextField idField; - private JTextField nameField; - private JTextField spawnGroupField; - private JTextField factionField; - private JSpinner experienceField; - private MyComboBox dialogueBox; - private MyComboBox droplistBox; - @SuppressWarnings("rawtypes") - private JComboBox monsterClassBox; - private IntegerBasedCheckBox uniqueBox; - @SuppressWarnings("rawtypes") - private JComboBox moveTypeBox; - - private CollapsiblePanel combatTraitPane; - private JSpinner maxHP; - private JSpinner maxAP; - private JSpinner moveCost; - private JSpinner atkDmgMin; - private JSpinner atkDmgMax; - private JSpinner atkCost; - private JSpinner atkChance; - private JSpinner critSkill; - private JSpinner critMult; - private JSpinner blockChance; - private JSpinner dmgRes; - - private Common.HitEffect hitEffect; - private CollapsiblePanel hitEffectPane; - private JSpinner hitEffectHPMin; - private JSpinner hitEffectHPMax; - private JSpinner hitEffectAPMin; - private JSpinner hitEffectAPMax; - - private SourceTimedConditionsListModel hitSourceConditionsListModel; - @SuppressWarnings("rawtypes") - private JList hitSourceConditionsList; - private MyComboBox hitSourceConditionBox; - private JSpinner hitSourceConditionChance; - private JRadioButton hitSourceConditionClear; - private JRadioButton hitSourceConditionApply; - private JRadioButton hitSourceConditionImmunity; - private JSpinner hitSourceConditionMagnitude; - private JRadioButton hitSourceConditionTimed; - private JRadioButton hitSourceConditionForever; - private JSpinner hitSourceConditionDuration; - - private TargetTimedConditionsListModel hitTargetConditionsListModel; - @SuppressWarnings("rawtypes") - private JList hitTargetConditionsList; - private MyComboBox hitTargetConditionBox; - private JSpinner hitTargetConditionChance; - private JRadioButton hitTargetConditionClear; - private JRadioButton hitTargetConditionApply; - private JRadioButton hitTargetConditionImmunity; - private JSpinner hitTargetConditionMagnitude; - private JRadioButton hitTargetConditionTimed; - private JRadioButton hitTargetConditionForever; - private JSpinner hitTargetConditionDuration; - - private Common.HitReceivedEffect hitReceivedEffect; - private CollapsiblePanel hitReceivedEffectPane; - private JSpinner hitReceivedEffectHPMin; - private JSpinner hitReceivedEffectHPMax; - private JSpinner hitReceivedEffectAPMin; - private JSpinner hitReceivedEffectAPMax; - private JSpinner hitReceivedEffectHPMinTarget; - private JSpinner hitReceivedEffectHPMaxTarget; - private JSpinner hitReceivedEffectAPMinTarget; - private JSpinner hitReceivedEffectAPMaxTarget; - - private SourceTimedConditionsListModel hitReceivedSourceConditionsListModel; - @SuppressWarnings("rawtypes") - private JList hitReceivedSourceConditionsList; - private MyComboBox hitReceivedSourceConditionBox; - private JSpinner hitReceivedSourceConditionChance; - private JRadioButton hitReceivedSourceConditionClear; - private JRadioButton hitReceivedSourceConditionApply; - private JRadioButton hitReceivedSourceConditionImmunity; - private JSpinner hitReceivedSourceConditionMagnitude; - private JRadioButton hitReceivedSourceConditionTimed; - private JRadioButton hitReceivedSourceConditionForever; - private JSpinner hitReceivedSourceConditionDuration; - - private TargetTimedConditionsListModel hitReceivedTargetConditionsListModel; - @SuppressWarnings("rawtypes") - private JList hitReceivedTargetConditionsList; - private MyComboBox hitReceivedTargetConditionBox; - private JSpinner hitReceivedTargetConditionChance; - private JRadioButton hitReceivedTargetConditionClear; - private JRadioButton hitReceivedTargetConditionApply; - private JRadioButton hitReceivedTargetConditionImmunity; - private JSpinner hitReceivedTargetConditionMagnitude; - private JRadioButton hitReceivedTargetConditionTimed; - private JRadioButton hitReceivedTargetConditionForever; - private JSpinner hitReceivedTargetConditionDuration; - - private Common.DeathEffect deathEffect; - private CollapsiblePanel deathEffectPane; - private JSpinner deathEffectHPMin; - private JSpinner deathEffectHPMax; - private JSpinner deathEffectAPMin; - private JSpinner deathEffectAPMax; - - private SourceTimedConditionsListModel deathSourceConditionsListModel; - @SuppressWarnings("rawtypes") - private JList deathSourceConditionsList; - private MyComboBox deathSourceConditionBox; - private JSpinner deathSourceConditionChance; - private JRadioButton deathSourceConditionClear; - private JRadioButton deathSourceConditionApply; - private JRadioButton deathSourceConditionImmunity; - private JSpinner deathSourceConditionMagnitude; - private JRadioButton deathSourceConditionTimed; - private JRadioButton deathSourceConditionForever; - private JSpinner deathSourceConditionDuration; - - private JPanel dialogueGraphPane; - private DialogueGraphView dialogueGraphView; - - public NPCEditor(NPC npc) { - super(npc, npc.getDesc(), npc.getIcon()); - addEditorTab(form_view_id, getFormView()); - addEditorTab(json_view_id, getJSONView()); - if (npc.dialogue != null) { - createDialogueGraphView(npc); - addEditorTab(dialogue_tree_id, dialogueGraphPane); - } - } - - public JPanel createDialogueGraphView(final NPC npc) { - dialogueGraphPane = new JPanel(); - dialogueGraphPane.setLayout(new BorderLayout()); - - dialogueGraphView = new DialogueGraphView(npc.dialogue, npc); - dialogueGraphPane.add(dialogueGraphView, BorderLayout.CENTER); - - JPanel buttonPane = new JPanel(); - buttonPane.setLayout(new JideBoxLayout(buttonPane, JideBoxLayout.LINE_AXIS)); - JButton reloadButton = new JButton("Refresh graph"); - buttonPane.add(reloadButton, JideBoxLayout.FIX); - buttonPane.add(new JPanel(), JideBoxLayout.VARY); - dialogueGraphPane.add(buttonPane, BorderLayout.NORTH); - - - reloadButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - reloadGraphView(npc); - } - }); - - return dialogueGraphPane; - } - - public void reloadGraphView(NPC npc) { - if (npc.dialogue != null) { - if (dialogueGraphPane != null) { - dialogueGraphPane.remove(dialogueGraphView); - dialogueGraphView = new DialogueGraphView(npc.dialogue, npc); - dialogueGraphPane.add(dialogueGraphView, BorderLayout.CENTER); - dialogueGraphPane.revalidate(); - dialogueGraphPane.repaint(); - } else { - createDialogueGraphView(npc); - addEditorTab(dialogue_tree_id, dialogueGraphPane); - } - } else { - if (dialogueGraphPane != null) { - removeEditorTab(dialogue_tree_id); - dialogueGraphPane = null; - dialogueGraphView = null; - } - } - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void insertFormViewDataField(JPanel pane) { - final NPC npc = (NPC) target; - - final FieldUpdateListener listener = new NPCFieldUpdater(); - - npcIcon = createButtonPane(pane, npc.getProject(), npc, NPC.class, npc.getImage(), Spritesheet.Category.monster, listener); - - idField = addTextField(pane, "Internal ID: ", npc.id, npc.writable, listener); - nameField = addTranslatableTextField(pane, "Display name: ", npc.name, npc.writable, listener); - spawnGroupField = addTextField(pane, "Spawn group ID: ", npc.spawngroup_id, npc.writable, listener); - factionField = addTextField(pane, "Faction ID: ", npc.faction_id, npc.writable, listener); - experienceField = addIntegerField(pane, "Experience reward: ", npc.getMonsterExperience(), false, false, listener); - dialogueBox = addDialogueBox(pane, npc.getProject(), "Initial phrase: ", npc.dialogue, npc.writable, listener); - droplistBox = addDroplistBox(pane, npc.getProject(), "Droplist / Shop inventory: ", npc.droplist, npc.writable, listener); - monsterClassBox = addEnumValueBox(pane, "Monster class: ", NPC.MonsterClass.values(), npc.monster_class, npc.writable, listener); - uniqueBox = addIntegerBasedCheckBox(pane, "Unique", npc.unique, npc.writable, listener); - moveTypeBox = addEnumValueBox(pane, "Movement type: ", NPC.MovementType.values(), npc.movement_type, npc.writable, listener); - combatTraitPane = new CollapsiblePanel("Combat traits: "); - combatTraitPane.setLayout(new JideBoxLayout(combatTraitPane, JideBoxLayout.PAGE_AXIS, 6)); - maxHP = addIntegerField(combatTraitPane, "Max HP: ", npc.max_hp, 1, false, npc.writable, listener); - maxAP = addIntegerField(combatTraitPane, "Max AP: ", npc.max_ap, 10, false, npc.writable, listener); - moveCost = addIntegerField(combatTraitPane, "Move cost: ", npc.move_cost, 10, false, npc.writable, listener); - atkDmgMin = addIntegerField(combatTraitPane, "Attack Damage min: ", npc.attack_damage_min, false, npc.writable, listener); - atkDmgMax = addIntegerField(combatTraitPane, "Attack Damage max: ", npc.attack_damage_max, false, npc.writable, listener); - atkCost = addIntegerField(combatTraitPane, "Attack cost: ", npc.attack_cost, 10, false, npc.writable, listener); - atkChance = addIntegerField(combatTraitPane, "Attack chance: ", npc.attack_chance, false, npc.writable, listener); - critSkill = addIntegerField(combatTraitPane, "Critical skill: ", npc.critical_skill, false, npc.writable, listener); - critMult = addDoubleField(combatTraitPane, "Critical multiplier: ", npc.critical_multiplier, npc.writable, listener); - blockChance = addIntegerField(combatTraitPane, "Block chance: ", npc.block_chance, false, npc.writable, listener); - dmgRes = addIntegerField(combatTraitPane, "Damage resistance: ", npc.damage_resistance, false, npc.writable, listener); - hitEffectPane = new CollapsiblePanel("Effect on every hit: "); - hitEffectPane.setLayout(new JideBoxLayout(hitEffectPane, JideBoxLayout.PAGE_AXIS)); - if (npc.hit_effect == null) { - hitEffect = new Common.HitEffect(); - } else { - hitEffect = npc.hit_effect; - } - hitEffectHPMin = addIntegerField(hitEffectPane, "HP bonus min: ", hitEffect.hp_boost_min, true, npc.writable, listener); - hitEffectHPMax = addIntegerField(hitEffectPane, "HP bonus max: ", hitEffect.hp_boost_max, true, npc.writable, listener); - hitEffectAPMin = addIntegerField(hitEffectPane, "AP bonus min: ", hitEffect.ap_boost_min, true, npc.writable, listener); - hitEffectAPMax = addIntegerField(hitEffectPane, "AP bonus max: ", hitEffect.ap_boost_max, true, npc.writable, listener); - - CollapsiblePanel hitSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: "); - hitSourceConditionsPane.setLayout(new JideBoxLayout(hitSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); - hitSourceConditionsListModel = new SourceTimedConditionsListModel(hitEffect); - hitSourceConditionsList = new JList(hitSourceConditionsListModel); - hitSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); - hitSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - hitSourceConditionsPane.add(new JScrollPane(hitSourceConditionsList), JideBoxLayout.FIX); - final JPanel hitSourceTimedConditionsEditorPane = new JPanel(); - final JButton createHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - hitSourceConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedHitEffectSourceCondition = (Common.TimedConditionEffect) hitSourceConditionsList.getSelectedValue(); - updateHitSourceTimedConditionEditorPane(hitSourceTimedConditionsEditorPane, selectedHitEffectSourceCondition, listener); - } - }); - if (npc.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createHitSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); - hitSourceConditionsListModel.addItem(condition); - hitSourceConditionsList.setSelectedValue(condition, true); - listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteHitSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedHitEffectSourceCondition != null) { - hitSourceConditionsListModel.removeItem(selectedHitEffectSourceCondition); - selectedHitEffectSourceCondition = null; - hitSourceConditionsList.clearSelection(); - listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createHitSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteHitSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - hitSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - hitSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - hitSourceConditionsPane.add(hitSourceTimedConditionsEditorPane, JideBoxLayout.FIX); - if (npc.hit_effect == null || npc.hit_effect.conditions_source == null || npc.hit_effect.conditions_source.isEmpty()) { - hitSourceConditionsPane.collapse(); - } - hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX); - final CollapsiblePanel hitTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the target: "); - hitTargetConditionsPane.setLayout(new JideBoxLayout(hitTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); - hitTargetConditionsListModel = new TargetTimedConditionsListModel(hitEffect); - hitTargetConditionsList = new JList(hitTargetConditionsListModel); - hitTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); - hitTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - hitTargetConditionsPane.add(new JScrollPane(hitTargetConditionsList), JideBoxLayout.FIX); - final JPanel hitTargetTimedConditionsEditorPane = new JPanel(); - final JButton createHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - hitTargetConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedHitEffectTargetCondition = (Common.TimedConditionEffect) hitTargetConditionsList.getSelectedValue(); - updateHitTargetTimedConditionEditorPane(hitTargetTimedConditionsEditorPane, selectedHitEffectTargetCondition, listener); - } - }); - if (npc.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createHitTargetCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); - hitTargetConditionsListModel.addItem(condition); - hitTargetConditionsList.setSelectedValue(condition, true); - listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteHitTargetCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedHitEffectTargetCondition != null) { - hitTargetConditionsListModel.removeItem(selectedHitEffectTargetCondition); - selectedHitEffectTargetCondition = null; - hitTargetConditionsList.clearSelection(); - listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createHitTargetCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteHitTargetCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - hitTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - hitTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - hitTargetConditionsPane.add(hitTargetTimedConditionsEditorPane, JideBoxLayout.FIX); - hitEffectPane.add(hitTargetConditionsPane, JideBoxLayout.FIX); - if (npc.hit_effect == null || npc.hit_effect.conditions_target == null || npc.hit_effect.conditions_target.isEmpty()) { - hitTargetConditionsPane.collapse(); - } - combatTraitPane.add(hitEffectPane, JideBoxLayout.FIX); - - hitReceivedEffectPane = new CollapsiblePanel("Effect on every hit received: "); - hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS)); - if (npc.hit_received_effect == null) { - hitReceivedEffect = new Common.HitReceivedEffect(); - } else { - hitReceivedEffect = npc.hit_received_effect; - } - hitReceivedEffectHPMin = addIntegerField(hitReceivedEffectPane, "NPC HP bonus min: ", hitReceivedEffect.hp_boost_min, true, npc.writable, listener); - hitReceivedEffectHPMax = addIntegerField(hitReceivedEffectPane, "NPC HP bonus max: ", hitReceivedEffect.hp_boost_max, true, npc.writable, listener); - hitReceivedEffectAPMin = addIntegerField(hitReceivedEffectPane, "NPC AP bonus min: ", hitReceivedEffect.ap_boost_min, true, npc.writable, listener); - hitReceivedEffectAPMax = addIntegerField(hitReceivedEffectPane, "NPC AP bonus max: ", hitReceivedEffect.ap_boost_max, true, npc.writable, listener); - hitReceivedEffectHPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus min: ", hitReceivedEffect.hp_boost_min_target, true, npc.writable, listener); - hitReceivedEffectHPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus max: ", hitReceivedEffect.hp_boost_max_target, true, npc.writable, listener); - hitReceivedEffectAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, npc.writable, listener); - hitReceivedEffectAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, npc.writable, listener); - - CollapsiblePanel hitReceivedSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to this NPC: "); - hitReceivedSourceConditionsPane.setLayout(new JideBoxLayout(hitReceivedSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); - hitReceivedSourceConditionsListModel = new SourceTimedConditionsListModel(hitReceivedEffect); - hitReceivedSourceConditionsList = new JList(hitReceivedSourceConditionsListModel); - hitReceivedSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); - hitReceivedSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - hitReceivedSourceConditionsPane.add(new JScrollPane(hitReceivedSourceConditionsList), JideBoxLayout.FIX); - final JPanel hitReceivedSourceTimedConditionsEditorPane = new JPanel(); - final JButton createHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - hitReceivedSourceConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedHitReceivedEffectSourceCondition = (Common.TimedConditionEffect) hitReceivedSourceConditionsList.getSelectedValue(); - updateHitReceivedSourceTimedConditionEditorPane(hitReceivedSourceTimedConditionsEditorPane, selectedHitReceivedEffectSourceCondition, listener); - } - }); - if (npc.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createHitReceivedSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); - hitReceivedSourceConditionsListModel.addItem(condition); - hitReceivedSourceConditionsList.setSelectedValue(condition, true); - listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteHitReceivedSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedHitReceivedEffectSourceCondition != null) { - hitReceivedSourceConditionsListModel.removeItem(selectedHitReceivedEffectSourceCondition); - selectedHitReceivedEffectSourceCondition = null; - hitReceivedSourceConditionsList.clearSelection(); - listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createHitReceivedSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteHitReceivedSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - hitReceivedSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - hitReceivedSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - hitReceivedSourceConditionsPane.add(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.FIX); - if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_source == null || npc.hit_received_effect.conditions_source.isEmpty()) { - hitReceivedSourceConditionsPane.collapse(); - } - hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX); - final CollapsiblePanel hitReceivedTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the attacker: "); - hitReceivedTargetConditionsPane.setLayout(new JideBoxLayout(hitReceivedTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); - hitReceivedTargetConditionsListModel = new TargetTimedConditionsListModel(hitReceivedEffect); - hitReceivedTargetConditionsList = new JList(hitReceivedTargetConditionsListModel); - hitReceivedTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); - hitReceivedTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - hitReceivedTargetConditionsPane.add(new JScrollPane(hitReceivedTargetConditionsList), JideBoxLayout.FIX); - final JPanel hitReceivedTargetTimedConditionsEditorPane = new JPanel(); - final JButton createHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - hitReceivedTargetConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedHitReceivedEffectTargetCondition = (Common.TimedConditionEffect) hitReceivedTargetConditionsList.getSelectedValue(); - updateHitReceivedTargetTimedConditionEditorPane(hitReceivedTargetTimedConditionsEditorPane, selectedHitReceivedEffectTargetCondition, listener); - } - }); - if (npc.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createHitReceivedTargetCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); - hitReceivedTargetConditionsListModel.addItem(condition); - hitReceivedTargetConditionsList.setSelectedValue(condition, true); - listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteHitReceivedTargetCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedHitReceivedEffectTargetCondition != null) { - hitReceivedTargetConditionsListModel.removeItem(selectedHitReceivedEffectTargetCondition); - selectedHitReceivedEffectTargetCondition = null; - hitReceivedTargetConditionsList.clearSelection(); - listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createHitReceivedTargetCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteHitReceivedTargetCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - hitReceivedTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - hitReceivedTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - hitReceivedTargetConditionsPane.add(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.FIX); - hitReceivedEffectPane.add(hitReceivedTargetConditionsPane, JideBoxLayout.FIX); - if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_target == null || npc.hit_received_effect.conditions_target.isEmpty()) { - hitReceivedTargetConditionsPane.collapse(); - } - combatTraitPane.add(hitReceivedEffectPane, JideBoxLayout.FIX); - - deathEffectPane = new CollapsiblePanel("Effect when killed: "); - deathEffectPane.setLayout(new JideBoxLayout(deathEffectPane, JideBoxLayout.PAGE_AXIS)); - if (npc.death_effect == null) { - deathEffect = new Common.DeathEffect(); - } else { - deathEffect = npc.death_effect; - } - deathEffectHPMin = addIntegerField(deathEffectPane, "Killer HP bonus min: ", deathEffect.hp_boost_min, true, npc.writable, listener); - deathEffectHPMax = addIntegerField(deathEffectPane, "Killer HP bonus max: ", deathEffect.hp_boost_max, true, npc.writable, listener); - deathEffectAPMin = addIntegerField(deathEffectPane, "Killer AP bonus min: ", deathEffect.ap_boost_min, true, npc.writable, listener); - deathEffectAPMax = addIntegerField(deathEffectPane, "Killer AP bonus max: ", deathEffect.ap_boost_max, true, npc.writable, listener); - - CollapsiblePanel deathSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the killer: "); - deathSourceConditionsPane.setLayout(new JideBoxLayout(deathSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); - deathSourceConditionsListModel = new SourceTimedConditionsListModel(deathEffect); - deathSourceConditionsList = new JList(deathSourceConditionsListModel); - deathSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); - deathSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - deathSourceConditionsPane.add(new JScrollPane(deathSourceConditionsList), JideBoxLayout.FIX); - final JPanel deathSourceTimedConditionsEditorPane = new JPanel(); - final JButton createDeathSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteDeathSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - deathSourceConditionsList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedDeathEffectSourceCondition = (Common.TimedConditionEffect) deathSourceConditionsList.getSelectedValue(); - updateDeathSourceTimedConditionEditorPane(deathSourceTimedConditionsEditorPane, selectedDeathEffectSourceCondition, listener); - } - }); - if (npc.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createDeathSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); - deathSourceConditionsListModel.addItem(condition); - deathSourceConditionsList.setSelectedValue(condition, true); - listener.valueChanged(deathSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteDeathSourceCondition.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedDeathEffectSourceCondition != null) { - deathSourceConditionsListModel.removeItem(selectedDeathEffectSourceCondition); - selectedDeathEffectSourceCondition = null; - deathSourceConditionsList.clearSelection(); - listener.valueChanged(deathSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - - listButtonsPane.add(createDeathSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(deleteDeathSourceCondition, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - deathSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); - } - deathSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(deathSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); - deathSourceConditionsPane.add(deathSourceTimedConditionsEditorPane, JideBoxLayout.FIX); - if (npc.death_effect == null || npc.death_effect.conditions_source == null || npc.death_effect.conditions_source.isEmpty()) { - deathSourceConditionsPane.collapse(); - } - deathEffectPane.add(deathSourceConditionsPane, JideBoxLayout.FIX); - combatTraitPane.add(deathEffectPane, JideBoxLayout.FIX); - - - pane.add(combatTraitPane, JideBoxLayout.FIX); - } - - public void updateHitSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { - pane.removeAll(); - if (hitSourceConditionBox != null) { - removeElementListener(hitSourceConditionBox); - } - - boolean writable = ((NPC)target).writable; - Project proj = ((NPC)target).getProject(); - - hitSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - - hitSourceConditionClear = new JRadioButton("Clear active condition"); - pane.add(hitSourceConditionClear, JideBoxLayout.FIX); - hitSourceConditionApply = new JRadioButton("Apply condition with magnitude"); - pane.add(hitSourceConditionApply, JideBoxLayout.FIX); - hitSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); - hitSourceConditionImmunity = new JRadioButton("Give immunity to condition"); - pane.add(hitSourceConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(hitSourceConditionApply); - radioEffectGroup.add(hitSourceConditionClear); - radioEffectGroup.add(hitSourceConditionImmunity); - - hitSourceConditionTimed = new JRadioButton("For a number of rounds"); - pane.add(hitSourceConditionTimed, JideBoxLayout.FIX); - hitSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); - hitSourceConditionForever = new JRadioButton("Forever"); - pane.add(hitSourceConditionForever, JideBoxLayout.FIX); - - ButtonGroup radioDurationGroup = new ButtonGroup(); - radioDurationGroup.add(hitSourceConditionTimed); - radioDurationGroup.add(hitSourceConditionForever); - - updateHitSourceTimedConditionWidgets(condition); - - 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())); - } - }); - hitSourceConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitSourceConditionImmunity, new Boolean(hitSourceConditionImmunity.isSelected())); - } - }); - - hitSourceConditionTimed.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitSourceConditionTimed, new Boolean(hitSourceConditionTimed.isSelected())); - } - }); - hitSourceConditionForever.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitSourceConditionForever, new Boolean(hitSourceConditionForever.isSelected())); - } - }); - pane.revalidate(); - pane.repaint(); - } - - public void updateHitSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { - - boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); - boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); - boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; - - hitSourceConditionClear.setSelected(clear); - hitSourceConditionApply.setSelected(!clear && !immunity); - hitSourceConditionMagnitude.setEnabled(!clear && !immunity); - hitSourceConditionImmunity.setSelected(immunity); - - hitSourceConditionTimed.setSelected(!forever); - hitSourceConditionTimed.setEnabled(!clear); - hitSourceConditionDuration.setEnabled(!clear && !forever); - hitSourceConditionForever.setSelected(forever); - hitSourceConditionForever.setEnabled(!clear); - } - - - public void updateHitTargetTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { - pane.removeAll(); - if (hitTargetConditionBox != null) { - removeElementListener(hitTargetConditionBox); - } - - boolean writable = ((NPC)target).writable; - Project proj = ((NPC)target).getProject(); - - hitTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - hitTargetConditionClear = new JRadioButton("Clear active condition"); - pane.add(hitTargetConditionClear, JideBoxLayout.FIX); - hitTargetConditionApply = new JRadioButton("Apply condition with magnitude"); - pane.add(hitTargetConditionApply, JideBoxLayout.FIX); - hitTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); - hitTargetConditionImmunity = new JRadioButton("Give immunity to condition"); - pane.add(hitTargetConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(hitTargetConditionApply); - radioEffectGroup.add(hitTargetConditionClear); - radioEffectGroup.add(hitTargetConditionImmunity); - - hitTargetConditionTimed = new JRadioButton("For a number of rounds"); - pane.add(hitTargetConditionTimed, JideBoxLayout.FIX); - hitTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); - hitTargetConditionForever = new JRadioButton("Forever"); - pane.add(hitTargetConditionForever, JideBoxLayout.FIX); - - ButtonGroup radioDurationGroup = new ButtonGroup(); - radioDurationGroup.add(hitTargetConditionTimed); - radioDurationGroup.add(hitTargetConditionForever); - - updateHitTargetTimedConditionWidgets(condition); - - 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())); - } - }); - hitTargetConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitTargetConditionImmunity, new Boolean(hitTargetConditionImmunity.isSelected())); - } - }); - - hitTargetConditionTimed.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitTargetConditionTimed, new Boolean(hitTargetConditionTimed.isSelected())); - } - }); - hitTargetConditionForever.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitTargetConditionForever, new Boolean(hitTargetConditionForever.isSelected())); - } - }); - pane.revalidate(); - pane.repaint(); - } - - public void updateHitTargetTimedConditionWidgets(Common.TimedConditionEffect condition) { - - boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); - boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); - boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; - - hitTargetConditionClear.setSelected(clear); - hitTargetConditionApply.setSelected(!clear && !immunity); - hitTargetConditionMagnitude.setEnabled(!clear && !immunity); - hitTargetConditionImmunity.setSelected(immunity); - - hitTargetConditionTimed.setSelected(!forever); - hitTargetConditionTimed.setEnabled(!clear); - hitTargetConditionDuration.setEnabled(!clear && !forever); - hitTargetConditionForever.setSelected(forever); - hitTargetConditionForever.setEnabled(!clear); - } - - - public void updateHitReceivedSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { - pane.removeAll(); - if (hitReceivedSourceConditionBox != null) { - removeElementListener(hitReceivedSourceConditionBox); - } - - boolean writable = ((NPC)target).writable; - Project proj = ((NPC)target).getProject(); - - hitReceivedSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - hitReceivedSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - - hitReceivedSourceConditionClear = new JRadioButton("Clear active condition"); - pane.add(hitReceivedSourceConditionClear, JideBoxLayout.FIX); - hitReceivedSourceConditionApply = new JRadioButton("Apply condition with magnitude"); - pane.add(hitReceivedSourceConditionApply, JideBoxLayout.FIX); - hitReceivedSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); - hitReceivedSourceConditionImmunity = new JRadioButton("Give immunity to condition"); - pane.add(hitReceivedSourceConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(hitReceivedSourceConditionApply); - radioEffectGroup.add(hitReceivedSourceConditionClear); - radioEffectGroup.add(hitReceivedSourceConditionImmunity); - - hitReceivedSourceConditionTimed = new JRadioButton("For a number of rounds"); - pane.add(hitReceivedSourceConditionTimed, JideBoxLayout.FIX); - hitReceivedSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); - hitReceivedSourceConditionForever = new JRadioButton("Forever"); - pane.add(hitReceivedSourceConditionForever, JideBoxLayout.FIX); - - ButtonGroup radioDurationGroup = new ButtonGroup(); - radioDurationGroup.add(hitReceivedSourceConditionTimed); - radioDurationGroup.add(hitReceivedSourceConditionForever); - - updateHitReceivedSourceTimedConditionWidgets(condition); - - hitReceivedSourceConditionClear.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedSourceConditionClear, new Boolean(hitReceivedSourceConditionClear.isSelected())); - } - }); - hitReceivedSourceConditionApply.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedSourceConditionApply, new Boolean(hitReceivedSourceConditionApply.isSelected())); - } - }); - hitReceivedSourceConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedSourceConditionImmunity, new Boolean(hitReceivedSourceConditionImmunity.isSelected())); - } - }); - - hitReceivedSourceConditionTimed.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedSourceConditionTimed, new Boolean(hitReceivedSourceConditionTimed.isSelected())); - } - }); - hitReceivedSourceConditionForever.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedSourceConditionForever, new Boolean(hitReceivedSourceConditionForever.isSelected())); - } - }); - pane.revalidate(); - pane.repaint(); - } - - public void updateHitReceivedSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { - - boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); - boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); - boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; - - hitReceivedSourceConditionClear.setSelected(clear); - hitReceivedSourceConditionApply.setSelected(!clear && !immunity); - hitReceivedSourceConditionMagnitude.setEnabled(!clear && !immunity); - hitReceivedSourceConditionImmunity.setSelected(immunity); - - hitReceivedSourceConditionTimed.setSelected(!forever); - hitReceivedSourceConditionTimed.setEnabled(!clear); - hitReceivedSourceConditionDuration.setEnabled(!clear && !forever); - hitReceivedSourceConditionForever.setSelected(forever); - hitReceivedSourceConditionForever.setEnabled(!clear); - } - - - public void updateHitReceivedTargetTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { - pane.removeAll(); - if (hitReceivedTargetConditionBox != null) { - removeElementListener(hitReceivedTargetConditionBox); - } - - boolean writable = ((NPC)target).writable; - Project proj = ((NPC)target).getProject(); - - hitReceivedTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - hitReceivedTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - hitReceivedTargetConditionClear = new JRadioButton("Clear active condition"); - pane.add(hitReceivedTargetConditionClear, JideBoxLayout.FIX); - hitReceivedTargetConditionApply = new JRadioButton("Apply condition with magnitude"); - pane.add(hitReceivedTargetConditionApply, JideBoxLayout.FIX); - hitReceivedTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); - hitReceivedTargetConditionImmunity = new JRadioButton("Give immunity to condition"); - pane.add(hitReceivedTargetConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(hitReceivedTargetConditionApply); - radioEffectGroup.add(hitReceivedTargetConditionClear); - radioEffectGroup.add(hitReceivedTargetConditionImmunity); - - hitReceivedTargetConditionTimed = new JRadioButton("For a number of rounds"); - pane.add(hitReceivedTargetConditionTimed, JideBoxLayout.FIX); - hitReceivedTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); - hitReceivedTargetConditionForever = new JRadioButton("Forever"); - pane.add(hitReceivedTargetConditionForever, JideBoxLayout.FIX); - - ButtonGroup radioDurationGroup = new ButtonGroup(); - radioDurationGroup.add(hitReceivedTargetConditionTimed); - radioDurationGroup.add(hitReceivedTargetConditionForever); - - updateHitReceivedTargetTimedConditionWidgets(condition); - - hitReceivedTargetConditionClear.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedTargetConditionClear, new Boolean(hitReceivedTargetConditionClear.isSelected())); - } - }); - hitReceivedTargetConditionApply.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedTargetConditionApply, new Boolean(hitReceivedTargetConditionApply.isSelected())); - } - }); - hitReceivedTargetConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedTargetConditionImmunity, new Boolean(hitReceivedTargetConditionImmunity.isSelected())); - } - }); - - hitReceivedTargetConditionTimed.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedTargetConditionTimed, new Boolean(hitReceivedTargetConditionTimed.isSelected())); - } - }); - hitReceivedTargetConditionForever.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(hitReceivedTargetConditionForever, new Boolean(hitReceivedTargetConditionForever.isSelected())); - } - }); - pane.revalidate(); - pane.repaint(); - } - - public void updateHitReceivedTargetTimedConditionWidgets(Common.TimedConditionEffect condition) { - - boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); - boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); - boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; - - hitReceivedTargetConditionClear.setSelected(clear); - hitReceivedTargetConditionApply.setSelected(!clear && !immunity); - hitReceivedTargetConditionMagnitude.setEnabled(!clear && !immunity); - hitReceivedTargetConditionImmunity.setSelected(immunity); - - hitReceivedTargetConditionTimed.setSelected(!forever); - hitReceivedTargetConditionTimed.setEnabled(!clear); - hitReceivedTargetConditionDuration.setEnabled(!clear && !forever); - hitReceivedTargetConditionForever.setSelected(forever); - hitReceivedTargetConditionForever.setEnabled(!clear); - } - - public void updateDeathSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { - pane.removeAll(); - if (deathSourceConditionBox != null) { - removeElementListener(deathSourceConditionBox); - } - - boolean writable = ((NPC)target).writable; - Project proj = ((NPC)target).getProject(); - - deathSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); - deathSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); - - deathSourceConditionClear = new JRadioButton("Clear active condition"); - pane.add(deathSourceConditionClear, JideBoxLayout.FIX); - deathSourceConditionApply = new JRadioButton("Apply condition with magnitude"); - pane.add(deathSourceConditionApply, JideBoxLayout.FIX); - deathSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); - deathSourceConditionImmunity = new JRadioButton("Give immunity to condition"); - pane.add(deathSourceConditionImmunity, JideBoxLayout.FIX); - - ButtonGroup radioEffectGroup = new ButtonGroup(); - radioEffectGroup.add(deathSourceConditionApply); - radioEffectGroup.add(deathSourceConditionClear); - radioEffectGroup.add(deathSourceConditionImmunity); - - deathSourceConditionTimed = new JRadioButton("For a number of rounds"); - pane.add(deathSourceConditionTimed, JideBoxLayout.FIX); - deathSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); - deathSourceConditionForever = new JRadioButton("Forever"); - pane.add(deathSourceConditionForever, JideBoxLayout.FIX); - - ButtonGroup radioDurationGroup = new ButtonGroup(); - radioDurationGroup.add(deathSourceConditionTimed); - radioDurationGroup.add(deathSourceConditionForever); - - updateDeathSourceTimedConditionWidgets(condition); - - deathSourceConditionClear.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(deathSourceConditionClear, new Boolean(deathSourceConditionClear.isSelected())); - } - }); - deathSourceConditionApply.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(deathSourceConditionApply, new Boolean(deathSourceConditionApply.isSelected())); - } - }); - deathSourceConditionImmunity.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(deathSourceConditionImmunity, new Boolean(deathSourceConditionImmunity.isSelected())); - } - }); - - deathSourceConditionTimed.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(deathSourceConditionTimed, new Boolean(deathSourceConditionTimed.isSelected())); - } - }); - deathSourceConditionForever.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - listener.valueChanged(deathSourceConditionForever, new Boolean(deathSourceConditionForever.isSelected())); - } - }); - pane.revalidate(); - pane.repaint(); - } - - public void updateDeathSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { - - boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); - boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); - boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; - - deathSourceConditionClear.setSelected(clear); - deathSourceConditionApply.setSelected(!clear && !immunity); - deathSourceConditionMagnitude.setEnabled(!clear && !immunity); - deathSourceConditionImmunity.setSelected(immunity); - - deathSourceConditionTimed.setSelected(!forever); - deathSourceConditionTimed.setEnabled(!clear); - deathSourceConditionDuration.setEnabled(!clear && !forever); - deathSourceConditionForever.setSelected(forever); - deathSourceConditionForever.setEnabled(!clear); - } - - public static class TargetTimedConditionsListModel extends CustomListModel { - public TargetTimedConditionsListModel(Common.HitEffect effect) { - super(effect); - } - - @Override - protected List getItems() { - return source.conditions_target; - } - - @Override - protected void setItems(List items) { - source.conditions_target = items; - } - } - - public static class SourceTimedConditionsListModel extends CustomListModel { - public SourceTimedConditionsListModel(Common.DeathEffect effect) { - super(effect); - } - - @Override - protected List getItems() { - return source.conditions_source; - } - - @Override - protected void setItems(List items) { - source.conditions_source = items; - } - } - - public static class TimedConditionsCellRenderer extends DefaultListCellRenderer { - private static final long serialVersionUID = 7987880146189575234L; - - @Override - public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (c instanceof JLabel) { - JLabel label = ((JLabel)c); - Common.TimedConditionEffect effect = (Common.TimedConditionEffect) value; - - if (effect.condition != null) { - - boolean immunity = (effect.magnitude == null || effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (effect.duration != null && effect.duration > ActorCondition.DURATION_NONE); - boolean clear = (effect.magnitude == null || effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (effect.duration == null || effect.duration == ActorCondition.DURATION_NONE); - boolean forever = effect.duration != null && effect.duration == ActorCondition.DURATION_FOREVER; - - if (clear) { - label.setIcon(new ImageIcon(effect.condition.getIcon())); - label.setText(effect.chance+"% chances to clear actor condition "+effect.condition.getDesc()); - } else if (immunity) { - label.setIcon(new OverlayIcon(effect.condition.getIcon(), DefaultIcons.getImmunityIcon())); - label.setText(effect.chance+"% chances to give immunity to "+effect.condition.getDesc()+(forever ? " forever" : " for "+effect.duration+" rounds")); - } else { - label.setIcon(new ImageIcon(effect.condition.getIcon())); - label.setText(effect.chance+"% chances to give actor condition "+effect.condition.getDesc()+" x"+effect.magnitude+(forever ? " forever" : " for "+effect.duration+" rounds")); - } - } else { - label.setText("New, undefined actor condition effect."); - } - } - return c; - } - } - - public static boolean isNull(Common.HitEffect effect) { - if (effect.ap_boost_min != null) return false; - if (effect.ap_boost_max != null) return false; - if (effect.hp_boost_min != null) return false; - if (effect.hp_boost_max != null) return false; - if (effect.conditions_source != null) return false; - if (effect.conditions_target != null) return false; - return true; - } - - public static boolean isNull(Common.HitReceivedEffect effect) { - if (effect.ap_boost_min != null) return false; - if (effect.ap_boost_max != null) return false; - if (effect.hp_boost_min != null) return false; - if (effect.hp_boost_max != null) return false; - if (effect.ap_boost_min_target != null) return false; - if (effect.ap_boost_max_target != null) return false; - if (effect.hp_boost_min_target != null) return false; - if (effect.hp_boost_max_target != null) return false; - if (effect.conditions_source != null) return false; - if (effect.conditions_target != null) return false; - return true; - } - - public static boolean isNull(Common.DeathEffect effect) { - if (effect.ap_boost_min != null) return false; - if (effect.ap_boost_max != null) return false; - if (effect.hp_boost_min != null) return false; - if (effect.hp_boost_max != null) return false; - if (effect.conditions_source != null) return false; - return true; - } - - public class NPCFieldUpdater implements FieldUpdateListener { - - @Override - public void valueChanged(JComponent source, Object value) { - NPC npc = (NPC)target; - boolean updateHit, updateHitReceived, updateDeath; - updateHit = updateHitReceived = updateDeath = false; - if (source == idField) { - //Events caused by cancel an ID edition. Dismiss. - if (skipNext) { - skipNext = false; - return; - } - if (target.id.equals((String) value)) return; - - if (idChanging()) { - npc.id = (String) value; - NPCEditor.this.name = npc.getDesc(); - npc.childrenChanged(new ArrayList()); - ATContentStudio.frame.editorChanged(NPCEditor.this); - } else { - cancelIdEdit(idField); - return; - } - } else if (source == nameField) { - npc.name = (String) value; - NPCEditor.this.name = npc.getDesc(); - npc.childrenChanged(new ArrayList()); - ATContentStudio.frame.editorChanged(NPCEditor.this); - } else if (source == npcIcon) { - npc.icon_id = (String) value; - npc.childrenChanged(new ArrayList()); - NPCEditor.this.icon = new ImageIcon(npc.getProject().getIcon((String) value)); - ATContentStudio.frame.editorChanged(NPCEditor.this); - npcIcon.setIcon(new ImageIcon(npc.getProject().getImage((String) value))); - npcIcon.revalidate(); - npcIcon.repaint(); - } else if (source == spawnGroupField) { - npc.spawngroup_id = (String) value; - } else if (source == factionField) { - npc.faction_id = (String) value; - } else if (source == dialogueBox) { - if (npc.dialogue != null) { - npc.dialogue.removeBacklink(npc); - } - npc.dialogue = (Dialogue) value; - if (npc.dialogue != null) { - npc.dialogue_id =npc.dialogue.id; - npc.dialogue.addBacklink(npc); - } else { - npc.dialogue_id = null; - } - reloadGraphView(npc); - } else if (source == droplistBox) { - if (npc.droplist != null) { - npc.droplist.removeBacklink(npc); - } - npc.droplist = (Droplist) value; - if (npc.droplist != null) { - npc.droplist_id = npc.droplist.id; - npc.droplist.addBacklink(npc); - } else { - npc.droplist_id = null; - } - } else if (source == monsterClassBox) { - npc.monster_class = (NPC.MonsterClass) value; - } else if (source == uniqueBox) { - npc.unique = (Integer) value; - } else if (source == moveTypeBox) { - npc.movement_type = (NPC.MovementType) value; - } else if (source == maxHP) { - npc.max_hp = (Integer) value; - } else if (source == maxAP) { - npc.max_ap = (Integer) value; - } else if (source == moveCost) { - npc.move_cost = (Integer) value; - } else if (source == atkDmgMin) { - npc.attack_damage_min = (Integer) value; - } else if (source == atkDmgMax) { - npc.attack_damage_max = (Integer) value; - } else if (source == atkCost) { - npc.attack_cost = (Integer) value; - } else if (source == atkChance) { - npc.attack_chance = (Integer) value; - } else if (source == critSkill) { - npc.critical_skill = (Integer) value; - } else if (source == critMult) { - npc.critical_multiplier = (Double) value; - } else if (source == blockChance) { - npc.block_chance = (Integer) value; - } else if (source == dmgRes) { - npc.damage_resistance = (Integer) value; - } else if (source == hitEffectHPMin) { - hitEffect.hp_boost_min = (Integer) value; - updateHit = true; - } else if (source == hitEffectHPMax) { - hitEffect.hp_boost_max = (Integer) value; - updateHit = true; - } else if (source == hitEffectAPMin) { - hitEffect.ap_boost_min = (Integer) value; - updateHit = true; - } else if (source == hitEffectAPMax) { - hitEffect.ap_boost_max = (Integer) value; - updateHit = true; - } else if (source == hitSourceConditionsList) { - updateHit = true; - } else if (source == hitSourceConditionBox) { - if (selectedHitEffectSourceCondition.condition != null) { - selectedHitEffectSourceCondition.condition.removeBacklink(npc); - } - selectedHitEffectSourceCondition.condition = (ActorCondition) value; - if (selectedHitEffectSourceCondition.condition != null) { - selectedHitEffectSourceCondition.condition.addBacklink(npc); - selectedHitEffectSourceCondition.condition_id = selectedHitEffectSourceCondition.condition.id; - } else { - selectedHitEffectSourceCondition.condition_id = null; - } - hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); - } else if (source == hitSourceConditionClear && (Boolean) value) { - selectedHitEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitEffectSourceCondition.duration = null; - updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); - hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionApply && (Boolean) value) { - selectedHitEffectSourceCondition.magnitude = (Integer) hitSourceConditionMagnitude.getValue(); - selectedHitEffectSourceCondition.duration = hitSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitSourceConditionDuration.getValue(); - if (selectedHitEffectSourceCondition.duration == null || selectedHitEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectSourceCondition.duration = 1; - } - updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); - hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionImmunity && (Boolean) value) { - selectedHitEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitEffectSourceCondition.duration = hitSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitSourceConditionDuration.getValue(); - if (selectedHitEffectSourceCondition.duration == null || selectedHitEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectSourceCondition.duration = 1; - } - updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); - hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionMagnitude) { - selectedHitEffectSourceCondition.magnitude = (Integer) value; - hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionTimed && (Boolean) value) { - selectedHitEffectSourceCondition.duration = (Integer) hitSourceConditionDuration.getValue(); - if (selectedHitEffectSourceCondition.duration == null || selectedHitEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectSourceCondition.duration = 1; - } - updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); - hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionForever && (Boolean) value) { - selectedHitEffectSourceCondition.duration = ActorCondition.DURATION_FOREVER; - updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); - hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionDuration) { - selectedHitEffectSourceCondition.duration = (Integer) value; - hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); - updateHit = true; - } else if (source == hitSourceConditionChance) { - selectedHitEffectSourceCondition.chance = (Double) value; - hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); - } else if (source == hitTargetConditionsList) { - updateHit = true; - } else if (source == hitTargetConditionBox) { - if (selectedHitEffectTargetCondition.condition != null) { - selectedHitEffectTargetCondition.condition.removeBacklink(npc); - } - selectedHitEffectTargetCondition.condition = (ActorCondition) value; - if (selectedHitEffectTargetCondition.condition != null) { - selectedHitEffectTargetCondition.condition_id = selectedHitEffectTargetCondition.condition.id; - selectedHitEffectTargetCondition.condition.addBacklink(npc); - } else { - selectedHitEffectTargetCondition.condition_id = null; - } - hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); - } else if (source == hitTargetConditionClear && (Boolean) value) { - selectedHitEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitEffectTargetCondition.duration = null; - updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); - hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionApply && (Boolean) value) { - selectedHitEffectTargetCondition.magnitude = (Integer) hitTargetConditionMagnitude.getValue(); - selectedHitEffectTargetCondition.duration = hitTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitTargetConditionDuration.getValue(); - if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectTargetCondition.duration = 1; - } - updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); - hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionImmunity && (Boolean) value) { - selectedHitEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitEffectTargetCondition.duration = hitTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitTargetConditionDuration.getValue(); - if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectTargetCondition.duration = 1; - } - updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); - hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionMagnitude) { - selectedHitEffectTargetCondition.magnitude = (Integer) value; - hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionTimed && (Boolean) value) { - selectedHitEffectTargetCondition.duration = (Integer) hitTargetConditionDuration.getValue(); - if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitEffectTargetCondition.duration = 1; - } - updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); - hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionForever && (Boolean) value) { - selectedHitEffectTargetCondition.duration = ActorCondition.DURATION_FOREVER; - updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); - hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionDuration) { - selectedHitEffectTargetCondition.duration = (Integer) value; - hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); - updateHit = true; - } else if (source == hitTargetConditionChance) { - selectedHitEffectTargetCondition.chance = (Double) value; - hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); - } else if (source == hitReceivedEffectHPMin) { - hitReceivedEffect.hp_boost_min = (Integer) value; - updateHitReceived = true; - } else if (source == hitReceivedEffectHPMax) { - hitReceivedEffect.hp_boost_max = (Integer) value; - updateHitReceived = true; - } else if (source == hitReceivedEffectAPMin) { - hitReceivedEffect.ap_boost_min = (Integer) value; - updateHitReceived = true; - } else if (source == hitReceivedEffectAPMax) { - hitReceivedEffect.ap_boost_max = (Integer) value; - updateHitReceived = true; - } else if (source == hitReceivedEffectHPMinTarget) { - hitReceivedEffect.hp_boost_min_target = (Integer) value; - updateHitReceived = true; - } else if (source == hitReceivedEffectHPMaxTarget) { - hitReceivedEffect.hp_boost_max_target = (Integer) value; - updateHitReceived = true; - } else if (source == hitReceivedEffectAPMinTarget) { - hitReceivedEffect.ap_boost_min_target = (Integer) value; - updateHitReceived = true; - } else if (source == hitReceivedEffectAPMaxTarget) { - hitReceivedEffect.ap_boost_max_target = (Integer) value; - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionsList) { - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionBox) { - if (selectedHitReceivedEffectSourceCondition.condition != null) { - selectedHitReceivedEffectSourceCondition.condition.removeBacklink(npc); - } - selectedHitReceivedEffectSourceCondition.condition = (ActorCondition) value; - if (selectedHitReceivedEffectSourceCondition.condition != null) { - selectedHitReceivedEffectSourceCondition.condition.addBacklink(npc); - selectedHitReceivedEffectSourceCondition.condition_id = selectedHitReceivedEffectSourceCondition.condition.id; - } else { - selectedHitReceivedEffectSourceCondition.condition_id = null; - } - hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); - } else if (source == hitReceivedSourceConditionClear && (Boolean) value) { - selectedHitReceivedEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitReceivedEffectSourceCondition.duration = null; - updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); - hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionApply && (Boolean) value) { - selectedHitReceivedEffectSourceCondition.magnitude = (Integer) hitReceivedSourceConditionMagnitude.getValue(); - selectedHitReceivedEffectSourceCondition.duration = hitReceivedSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedSourceConditionDuration.getValue(); - if (selectedHitReceivedEffectSourceCondition.duration == null || selectedHitReceivedEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectSourceCondition.duration = 1; - } - updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); - hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionImmunity && (Boolean) value) { - selectedHitReceivedEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitReceivedEffectSourceCondition.duration = hitReceivedSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedSourceConditionDuration.getValue(); - if (selectedHitReceivedEffectSourceCondition.duration == null || selectedHitReceivedEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectSourceCondition.duration = 1; - } - updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); - hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionMagnitude) { - selectedHitReceivedEffectSourceCondition.magnitude = (Integer) value; - hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionTimed && (Boolean) value) { - selectedHitReceivedEffectSourceCondition.duration = (Integer) hitReceivedSourceConditionDuration.getValue(); - if (selectedHitReceivedEffectSourceCondition.duration == null || selectedHitReceivedEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectSourceCondition.duration = 1; - } - updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); - hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionForever && (Boolean) value) { - selectedHitReceivedEffectSourceCondition.duration = ActorCondition.DURATION_FOREVER; - updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); - hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionDuration) { - selectedHitReceivedEffectSourceCondition.duration = (Integer) value; - hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); - updateHitReceived = true; - } else if (source == hitReceivedSourceConditionChance) { - selectedHitReceivedEffectSourceCondition.chance = (Double) value; - hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); - } else if (source == hitReceivedTargetConditionsList) { - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionBox) { - if (selectedHitReceivedEffectTargetCondition.condition != null) { - selectedHitReceivedEffectTargetCondition.condition.removeBacklink(npc); - } - selectedHitReceivedEffectTargetCondition.condition = (ActorCondition) value; - if (selectedHitReceivedEffectTargetCondition.condition != null) { - selectedHitReceivedEffectTargetCondition.condition_id = selectedHitReceivedEffectTargetCondition.condition.id; - selectedHitReceivedEffectTargetCondition.condition.addBacklink(npc); - } else { - selectedHitReceivedEffectTargetCondition.condition_id = null; - } - hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); - } else if (source == hitReceivedTargetConditionClear && (Boolean) value) { - selectedHitReceivedEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitReceivedEffectTargetCondition.duration = null; - updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); - hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionApply && (Boolean) value) { - selectedHitReceivedEffectTargetCondition.magnitude = (Integer) hitReceivedTargetConditionMagnitude.getValue(); - selectedHitReceivedEffectTargetCondition.duration = hitReceivedTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedTargetConditionDuration.getValue(); - if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectTargetCondition.duration = 1; - } - updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); - hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionImmunity && (Boolean) value) { - selectedHitReceivedEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedHitReceivedEffectTargetCondition.duration = hitReceivedTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedTargetConditionDuration.getValue(); - if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectTargetCondition.duration = 1; - } - updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); - hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionMagnitude) { - selectedHitReceivedEffectTargetCondition.magnitude = (Integer) value; - hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionTimed && (Boolean) value) { - selectedHitReceivedEffectTargetCondition.duration = (Integer) hitReceivedTargetConditionDuration.getValue(); - if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { - selectedHitReceivedEffectTargetCondition.duration = 1; - } - updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); - hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionForever && (Boolean) value) { - selectedHitReceivedEffectTargetCondition.duration = ActorCondition.DURATION_FOREVER; - updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); - hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionDuration) { - selectedHitReceivedEffectTargetCondition.duration = (Integer) value; - hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); - updateHitReceived = true; - } else if (source == hitReceivedTargetConditionChance) { - selectedHitReceivedEffectTargetCondition.chance = (Double) value; - hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); - } else if (source == deathEffectHPMin) { - deathEffect.hp_boost_min = (Integer) value; - updateDeath = true; - } else if (source == deathEffectHPMax) { - deathEffect.hp_boost_max = (Integer) value; - updateDeath = true; - } else if (source == deathEffectAPMin) { - deathEffect.ap_boost_min = (Integer) value; - updateDeath = true; - } else if (source == deathEffectAPMax) { - deathEffect.ap_boost_max = (Integer) value; - updateDeath = true; - } else if (source == deathSourceConditionsList) { - updateDeath = true; - } else if (source == deathSourceConditionBox) { - if (selectedDeathEffectSourceCondition.condition != null) { - selectedDeathEffectSourceCondition.condition.removeBacklink(npc); - } - selectedDeathEffectSourceCondition.condition = (ActorCondition) value; - if (selectedDeathEffectSourceCondition.condition != null) { - selectedDeathEffectSourceCondition.condition.addBacklink(npc); - selectedDeathEffectSourceCondition.condition_id = selectedDeathEffectSourceCondition.condition.id; - } else { - selectedDeathEffectSourceCondition.condition_id = null; - } - deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); - } else if (source == deathSourceConditionClear && (Boolean) value) { - selectedDeathEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedDeathEffectSourceCondition.duration = null; - updateDeathSourceTimedConditionWidgets(selectedDeathEffectSourceCondition); - deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); - updateDeath = true; - } else if (source == deathSourceConditionApply && (Boolean) value) { - selectedDeathEffectSourceCondition.magnitude = (Integer) deathSourceConditionMagnitude.getValue(); - selectedDeathEffectSourceCondition.duration = deathSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) deathSourceConditionDuration.getValue(); - if (selectedDeathEffectSourceCondition.duration == null || selectedDeathEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedDeathEffectSourceCondition.duration = 1; - } - updateDeathSourceTimedConditionWidgets(selectedDeathEffectSourceCondition); - deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); - updateDeath = true; - } else if (source == deathSourceConditionImmunity && (Boolean) value) { - selectedDeathEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; - selectedDeathEffectSourceCondition.duration = deathSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) deathSourceConditionDuration.getValue(); - if (selectedDeathEffectSourceCondition.duration == null || selectedDeathEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedDeathEffectSourceCondition.duration = 1; - } - updateDeathSourceTimedConditionWidgets(selectedDeathEffectSourceCondition); - deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); - updateDeath = true; - } else if (source == deathSourceConditionMagnitude) { - selectedDeathEffectSourceCondition.magnitude = (Integer) value; - deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); - updateDeath = true; - } else if (source == deathSourceConditionTimed && (Boolean) value) { - selectedDeathEffectSourceCondition.duration = (Integer) deathSourceConditionDuration.getValue(); - if (selectedDeathEffectSourceCondition.duration == null || selectedDeathEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { - selectedDeathEffectSourceCondition.duration = 1; - } - updateDeathSourceTimedConditionWidgets(selectedDeathEffectSourceCondition); - deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); - updateDeath = true; - } else if (source == deathSourceConditionForever && (Boolean) value) { - selectedDeathEffectSourceCondition.duration = ActorCondition.DURATION_FOREVER; - updateDeathSourceTimedConditionWidgets(selectedDeathEffectSourceCondition); - deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); - updateDeath = true; - } else if (source == deathSourceConditionDuration) { - selectedDeathEffectSourceCondition.duration = (Integer) value; - deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); - updateDeath = true; - } else if (source == deathSourceConditionChance) { - selectedDeathEffectSourceCondition.chance = (Double) value; - deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); - } - - if (updateHit) { - if (isNull(hitEffect)) { - npc.hit_effect = null; - } else { - npc.hit_effect = hitEffect; - } - } - if (updateHitReceived) { - if (isNull(hitReceivedEffect)) { - npc.hit_received_effect = null; - } else { - npc.hit_received_effect = hitReceivedEffect; - } - } - if (updateDeath) { - if (isNull(deathEffect)) { - npc.death_effect = null; - } else { - npc.death_effect = deathEffect; - } - } - - experienceField.setValue(npc.getMonsterExperience()); - - if (npc.state != GameDataElement.State.modified) { - npc.state = GameDataElement.State.modified; - NPCEditor.this.name = npc.getDesc(); - npc.childrenChanged(new ArrayList()); - ATContentStudio.frame.editorChanged(NPCEditor.this); - } - updateJsonViewText(npc.toJsonString()); - - } - - } - - -} +package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +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; +import javax.swing.JComboBox; +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; +import javax.swing.ListModel; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import com.gpl.rpg.atcontentstudio.ATContentStudio; +import com.gpl.rpg.atcontentstudio.model.GameDataElement; +import com.gpl.rpg.atcontentstudio.model.Project; +import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; +import com.gpl.rpg.atcontentstudio.model.gamedata.*; +import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet; +import com.gpl.rpg.atcontentstudio.ui.*; +import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView; +import com.jidesoft.swing.JideBoxLayout; + +public class NPCEditor extends JSONElementEditor { + + private static final long serialVersionUID = 4001483665523721800L; + + private static final String form_view_id = "Form"; + private static final String json_view_id = "JSON"; + private static final String dialogue_tree_id = "Dialogue Tree"; + + private Common.TimedConditionEffect selectedHitEffectSourceCondition; + private Common.TimedConditionEffect selectedHitEffectTargetCondition; + private Common.TimedConditionEffect selectedHitReceivedEffectSourceCondition; + private Common.TimedConditionEffect selectedHitReceivedEffectTargetCondition; + private Common.TimedConditionEffect selectedDeathEffectSourceCondition; + + private JButton npcIcon; + private JTextField idField; + private JTextField nameField; + private JTextField spawnGroupField; + private JTextField factionField; + private JSpinner experienceField; + private MyComboBox dialogueBox; + private MyComboBox droplistBox; + @SuppressWarnings("rawtypes") + private JComboBox monsterClassBox; + private IntegerBasedCheckBox uniqueBox; + @SuppressWarnings("rawtypes") + private JComboBox moveTypeBox; + + private CollapsiblePanel combatTraitPane; + private JSpinner maxHP; + private JSpinner maxAP; + private JSpinner moveCost; + private JSpinner atkDmgMin; + private JSpinner atkDmgMax; + private JSpinner atkCost; + private JSpinner atkChance; + private JSpinner critSkill; + private JSpinner critMult; + private JSpinner blockChance; + private JSpinner dmgRes; + + private Common.HitEffect hitEffect; + private CollapsiblePanel hitEffectPane; + private JSpinner hitEffectHPMin; + private JSpinner hitEffectHPMax; + private JSpinner hitEffectAPMin; + private JSpinner hitEffectAPMax; + + private SourceTimedConditionsListModel hitSourceConditionsListModel; + @SuppressWarnings("rawtypes") + private JList hitSourceConditionsList; + private MyComboBox hitSourceConditionBox; + private JSpinner hitSourceConditionChance; + private JRadioButton hitSourceConditionClear; + private JRadioButton hitSourceConditionApply; + private JRadioButton hitSourceConditionImmunity; + private JSpinner hitSourceConditionMagnitude; + private JRadioButton hitSourceConditionTimed; + private JRadioButton hitSourceConditionForever; + private JSpinner hitSourceConditionDuration; + + private TargetTimedConditionsListModel hitTargetConditionsListModel; + @SuppressWarnings("rawtypes") + private JList hitTargetConditionsList; + private MyComboBox hitTargetConditionBox; + private JSpinner hitTargetConditionChance; + private JRadioButton hitTargetConditionClear; + private JRadioButton hitTargetConditionApply; + private JRadioButton hitTargetConditionImmunity; + private JSpinner hitTargetConditionMagnitude; + private JRadioButton hitTargetConditionTimed; + private JRadioButton hitTargetConditionForever; + private JSpinner hitTargetConditionDuration; + + private Common.HitReceivedEffect hitReceivedEffect; + private CollapsiblePanel hitReceivedEffectPane; + private JSpinner hitReceivedEffectHPMin; + private JSpinner hitReceivedEffectHPMax; + private JSpinner hitReceivedEffectAPMin; + private JSpinner hitReceivedEffectAPMax; + private JSpinner hitReceivedEffectHPMinTarget; + private JSpinner hitReceivedEffectHPMaxTarget; + private JSpinner hitReceivedEffectAPMinTarget; + private JSpinner hitReceivedEffectAPMaxTarget; + + private SourceTimedConditionsListModel hitReceivedSourceConditionsListModel; + @SuppressWarnings("rawtypes") + private JList hitReceivedSourceConditionsList; + private MyComboBox hitReceivedSourceConditionBox; + private JSpinner hitReceivedSourceConditionChance; + private JRadioButton hitReceivedSourceConditionClear; + private JRadioButton hitReceivedSourceConditionApply; + private JRadioButton hitReceivedSourceConditionImmunity; + private JSpinner hitReceivedSourceConditionMagnitude; + private JRadioButton hitReceivedSourceConditionTimed; + private JRadioButton hitReceivedSourceConditionForever; + private JSpinner hitReceivedSourceConditionDuration; + + private TargetTimedConditionsListModel hitReceivedTargetConditionsListModel; + @SuppressWarnings("rawtypes") + private JList hitReceivedTargetConditionsList; + private MyComboBox hitReceivedTargetConditionBox; + private JSpinner hitReceivedTargetConditionChance; + private JRadioButton hitReceivedTargetConditionClear; + private JRadioButton hitReceivedTargetConditionApply; + private JRadioButton hitReceivedTargetConditionImmunity; + private JSpinner hitReceivedTargetConditionMagnitude; + private JRadioButton hitReceivedTargetConditionTimed; + private JRadioButton hitReceivedTargetConditionForever; + private JSpinner hitReceivedTargetConditionDuration; + + private Common.DeathEffect deathEffect; + private CollapsiblePanel deathEffectPane; + private JSpinner deathEffectHPMin; + private JSpinner deathEffectHPMax; + private JSpinner deathEffectAPMin; + private JSpinner deathEffectAPMax; + + private SourceTimedConditionsListModel deathSourceConditionsListModel; + @SuppressWarnings("rawtypes") + private JList deathSourceConditionsList; + private MyComboBox deathSourceConditionBox; + private JSpinner deathSourceConditionChance; + private JRadioButton deathSourceConditionClear; + private JRadioButton deathSourceConditionApply; + private JRadioButton deathSourceConditionImmunity; + private JSpinner deathSourceConditionMagnitude; + private JRadioButton deathSourceConditionTimed; + private JRadioButton deathSourceConditionForever; + private JSpinner deathSourceConditionDuration; + + private JPanel dialogueGraphPane; + private DialogueGraphView dialogueGraphView; + + public NPCEditor(NPC npc) { + super(npc, npc.getDesc(), npc.getIcon()); + addEditorTab(form_view_id, getFormView()); + addEditorTab(json_view_id, getJSONView()); + if (npc.dialogue != null) { + createDialogueGraphView(npc); + addEditorTab(dialogue_tree_id, dialogueGraphPane); + } + } + + public JPanel createDialogueGraphView(final NPC npc) { + dialogueGraphPane = new JPanel(); + dialogueGraphPane.setLayout(new BorderLayout()); + + dialogueGraphView = new DialogueGraphView(npc.dialogue, npc); + dialogueGraphPane.add(dialogueGraphView, BorderLayout.CENTER); + + JPanel buttonPane = new JPanel(); + buttonPane.setLayout(new JideBoxLayout(buttonPane, JideBoxLayout.LINE_AXIS)); + JButton reloadButton = new JButton("Refresh graph"); + buttonPane.add(reloadButton, JideBoxLayout.FIX); + buttonPane.add(new JPanel(), JideBoxLayout.VARY); + dialogueGraphPane.add(buttonPane, BorderLayout.NORTH); + + + reloadButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + reloadGraphView(npc); + } + }); + + return dialogueGraphPane; + } + + public void reloadGraphView(NPC npc) { + if (npc.dialogue != null) { + if (dialogueGraphPane != null) { + dialogueGraphPane.remove(dialogueGraphView); + dialogueGraphView = new DialogueGraphView(npc.dialogue, npc); + dialogueGraphPane.add(dialogueGraphView, BorderLayout.CENTER); + dialogueGraphPane.revalidate(); + dialogueGraphPane.repaint(); + } else { + createDialogueGraphView(npc); + addEditorTab(dialogue_tree_id, dialogueGraphPane); + } + } else { + if (dialogueGraphPane != null) { + removeEditorTab(dialogue_tree_id); + dialogueGraphPane = null; + dialogueGraphView = null; + } + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public void insertFormViewDataField(JPanel pane) { + final NPC npc = (NPC) target; + + final FieldUpdateListener listener = new NPCFieldUpdater(); + + npcIcon = createButtonPane(pane, npc.getProject(), npc, NPC.class, npc.getImage(), Spritesheet.Category.monster, listener); + + idField = addTextField(pane, "Internal ID: ", npc.id, npc.writable, listener); + nameField = addTranslatableTextField(pane, "Display name: ", npc.name, npc.writable, listener); + spawnGroupField = addTextField(pane, "Spawn group ID: ", npc.spawngroup_id, npc.writable, listener); + factionField = addTextField(pane, "Faction ID: ", npc.faction_id, npc.writable, listener); + experienceField = addIntegerField(pane, "Experience reward: ", npc.getMonsterExperience(), false, false, listener); + dialogueBox = addDialogueBox(pane, npc.getProject(), "Initial phrase: ", npc.dialogue, npc.writable, listener); + droplistBox = addDroplistBox(pane, npc.getProject(), "Droplist / Shop inventory: ", npc.droplist, npc.writable, listener); + monsterClassBox = addEnumValueBox(pane, "Monster class: ", NPC.MonsterClass.values(), npc.monster_class, npc.writable, listener); + uniqueBox = addIntegerBasedCheckBox(pane, "Unique", npc.unique, npc.writable, listener); + moveTypeBox = addEnumValueBox(pane, "Movement type: ", NPC.MovementType.values(), npc.movement_type, npc.writable, listener); + combatTraitPane = new CollapsiblePanel("Combat traits: "); + combatTraitPane.setLayout(new JideBoxLayout(combatTraitPane, JideBoxLayout.PAGE_AXIS, 6)); + maxHP = addIntegerField(combatTraitPane, "Max HP: ", npc.max_hp, 1, false, npc.writable, listener); + maxAP = addIntegerField(combatTraitPane, "Max AP: ", npc.max_ap, 10, false, npc.writable, listener); + moveCost = addIntegerField(combatTraitPane, "Move cost: ", npc.move_cost, 10, false, npc.writable, listener); + atkDmgMin = addIntegerField(combatTraitPane, "Attack Damage min: ", npc.attack_damage_min, false, npc.writable, listener); + atkDmgMax = addIntegerField(combatTraitPane, "Attack Damage max: ", npc.attack_damage_max, false, npc.writable, listener); + atkCost = addIntegerField(combatTraitPane, "Attack cost: ", npc.attack_cost, 10, false, npc.writable, listener); + atkChance = addIntegerField(combatTraitPane, "Attack chance: ", npc.attack_chance, false, npc.writable, listener); + critSkill = addIntegerField(combatTraitPane, "Critical skill: ", npc.critical_skill, false, npc.writable, listener); + critMult = addDoubleField(combatTraitPane, "Critical multiplier: ", npc.critical_multiplier, npc.writable, listener); + blockChance = addIntegerField(combatTraitPane, "Block chance: ", npc.block_chance, false, npc.writable, listener); + dmgRes = addIntegerField(combatTraitPane, "Damage resistance: ", npc.damage_resistance, false, npc.writable, listener); + hitEffectPane = new CollapsiblePanel("Effect on every hit: "); + hitEffectPane.setLayout(new JideBoxLayout(hitEffectPane, JideBoxLayout.PAGE_AXIS)); + if (npc.hit_effect == null) { + hitEffect = new Common.HitEffect(); + } else { + hitEffect = npc.hit_effect; + } + hitEffectHPMin = addIntegerField(hitEffectPane, "HP bonus min: ", hitEffect.hp_boost_min, true, npc.writable, listener); + hitEffectHPMax = addIntegerField(hitEffectPane, "HP bonus max: ", hitEffect.hp_boost_max, true, npc.writable, listener); + hitEffectAPMin = addIntegerField(hitEffectPane, "AP bonus min: ", hitEffect.ap_boost_min, true, npc.writable, listener); + hitEffectAPMax = addIntegerField(hitEffectPane, "AP bonus max: ", hitEffect.ap_boost_max, true, npc.writable, listener); + + CollapsiblePanel hitSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: "); + hitSourceConditionsPane.setLayout(new JideBoxLayout(hitSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); + hitSourceConditionsListModel = new SourceTimedConditionsListModel(hitEffect); + hitSourceConditionsList = new JList(hitSourceConditionsListModel); + hitSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); + hitSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + hitSourceConditionsPane.add(new JScrollPane(hitSourceConditionsList), JideBoxLayout.FIX); + final JPanel hitSourceTimedConditionsEditorPane = new JPanel(); + final JButton createHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + hitSourceConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedHitEffectSourceCondition = (Common.TimedConditionEffect) hitSourceConditionsList.getSelectedValue(); + updateHitSourceTimedConditionEditorPane(hitSourceTimedConditionsEditorPane, selectedHitEffectSourceCondition, listener); + } + }); + if (npc.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createHitSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); + hitSourceConditionsListModel.addItem(condition); + hitSourceConditionsList.setSelectedValue(condition, true); + listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteHitSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedHitEffectSourceCondition != null) { + hitSourceConditionsListModel.removeItem(selectedHitEffectSourceCondition); + selectedHitEffectSourceCondition = null; + hitSourceConditionsList.clearSelection(); + listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createHitSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteHitSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + hitSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + hitSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + hitSourceConditionsPane.add(hitSourceTimedConditionsEditorPane, JideBoxLayout.FIX); + if (npc.hit_effect == null || npc.hit_effect.conditions_source == null || npc.hit_effect.conditions_source.isEmpty()) { + hitSourceConditionsPane.collapse(); + } + hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX); + final CollapsiblePanel hitTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the target: "); + hitTargetConditionsPane.setLayout(new JideBoxLayout(hitTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); + hitTargetConditionsListModel = new TargetTimedConditionsListModel(hitEffect); + hitTargetConditionsList = new JList(hitTargetConditionsListModel); + hitTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); + hitTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + hitTargetConditionsPane.add(new JScrollPane(hitTargetConditionsList), JideBoxLayout.FIX); + final JPanel hitTargetTimedConditionsEditorPane = new JPanel(); + final JButton createHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + hitTargetConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedHitEffectTargetCondition = (Common.TimedConditionEffect) hitTargetConditionsList.getSelectedValue(); + updateHitTargetTimedConditionEditorPane(hitTargetTimedConditionsEditorPane, selectedHitEffectTargetCondition, listener); + } + }); + if (npc.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createHitTargetCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); + hitTargetConditionsListModel.addItem(condition); + hitTargetConditionsList.setSelectedValue(condition, true); + listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteHitTargetCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedHitEffectTargetCondition != null) { + hitTargetConditionsListModel.removeItem(selectedHitEffectTargetCondition); + selectedHitEffectTargetCondition = null; + hitTargetConditionsList.clearSelection(); + listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createHitTargetCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteHitTargetCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + hitTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + hitTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + hitTargetConditionsPane.add(hitTargetTimedConditionsEditorPane, JideBoxLayout.FIX); + hitEffectPane.add(hitTargetConditionsPane, JideBoxLayout.FIX); + if (npc.hit_effect == null || npc.hit_effect.conditions_target == null || npc.hit_effect.conditions_target.isEmpty()) { + hitTargetConditionsPane.collapse(); + } + combatTraitPane.add(hitEffectPane, JideBoxLayout.FIX); + + hitReceivedEffectPane = new CollapsiblePanel("Effect on every hit received: "); + hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS)); + if (npc.hit_received_effect == null) { + hitReceivedEffect = new Common.HitReceivedEffect(); + } else { + hitReceivedEffect = npc.hit_received_effect; + } + hitReceivedEffectHPMin = addIntegerField(hitReceivedEffectPane, "NPC HP bonus min: ", hitReceivedEffect.hp_boost_min, true, npc.writable, listener); + hitReceivedEffectHPMax = addIntegerField(hitReceivedEffectPane, "NPC HP bonus max: ", hitReceivedEffect.hp_boost_max, true, npc.writable, listener); + hitReceivedEffectAPMin = addIntegerField(hitReceivedEffectPane, "NPC AP bonus min: ", hitReceivedEffect.ap_boost_min, true, npc.writable, listener); + hitReceivedEffectAPMax = addIntegerField(hitReceivedEffectPane, "NPC AP bonus max: ", hitReceivedEffect.ap_boost_max, true, npc.writable, listener); + hitReceivedEffectHPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus min: ", hitReceivedEffect.hp_boost_min_target, true, npc.writable, listener); + hitReceivedEffectHPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus max: ", hitReceivedEffect.hp_boost_max_target, true, npc.writable, listener); + hitReceivedEffectAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, npc.writable, listener); + hitReceivedEffectAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, npc.writable, listener); + + CollapsiblePanel hitReceivedSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to this NPC: "); + hitReceivedSourceConditionsPane.setLayout(new JideBoxLayout(hitReceivedSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); + hitReceivedSourceConditionsListModel = new SourceTimedConditionsListModel(hitReceivedEffect); + hitReceivedSourceConditionsList = new JList(hitReceivedSourceConditionsListModel); + hitReceivedSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); + hitReceivedSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + hitReceivedSourceConditionsPane.add(new JScrollPane(hitReceivedSourceConditionsList), JideBoxLayout.FIX); + final JPanel hitReceivedSourceTimedConditionsEditorPane = new JPanel(); + final JButton createHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + hitReceivedSourceConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedHitReceivedEffectSourceCondition = (Common.TimedConditionEffect) hitReceivedSourceConditionsList.getSelectedValue(); + updateHitReceivedSourceTimedConditionEditorPane(hitReceivedSourceTimedConditionsEditorPane, selectedHitReceivedEffectSourceCondition, listener); + } + }); + if (npc.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createHitReceivedSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); + hitReceivedSourceConditionsListModel.addItem(condition); + hitReceivedSourceConditionsList.setSelectedValue(condition, true); + listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteHitReceivedSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedHitReceivedEffectSourceCondition != null) { + hitReceivedSourceConditionsListModel.removeItem(selectedHitReceivedEffectSourceCondition); + selectedHitReceivedEffectSourceCondition = null; + hitReceivedSourceConditionsList.clearSelection(); + listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createHitReceivedSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteHitReceivedSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + hitReceivedSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + hitReceivedSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + hitReceivedSourceConditionsPane.add(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.FIX); + if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_source == null || npc.hit_received_effect.conditions_source.isEmpty()) { + hitReceivedSourceConditionsPane.collapse(); + } + hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX); + final CollapsiblePanel hitReceivedTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the attacker: "); + hitReceivedTargetConditionsPane.setLayout(new JideBoxLayout(hitReceivedTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); + hitReceivedTargetConditionsListModel = new TargetTimedConditionsListModel(hitReceivedEffect); + hitReceivedTargetConditionsList = new JList(hitReceivedTargetConditionsListModel); + hitReceivedTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); + hitReceivedTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + hitReceivedTargetConditionsPane.add(new JScrollPane(hitReceivedTargetConditionsList), JideBoxLayout.FIX); + final JPanel hitReceivedTargetTimedConditionsEditorPane = new JPanel(); + final JButton createHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + hitReceivedTargetConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedHitReceivedEffectTargetCondition = (Common.TimedConditionEffect) hitReceivedTargetConditionsList.getSelectedValue(); + updateHitReceivedTargetTimedConditionEditorPane(hitReceivedTargetTimedConditionsEditorPane, selectedHitReceivedEffectTargetCondition, listener); + } + }); + if (npc.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createHitReceivedTargetCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); + hitReceivedTargetConditionsListModel.addItem(condition); + hitReceivedTargetConditionsList.setSelectedValue(condition, true); + listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteHitReceivedTargetCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedHitReceivedEffectTargetCondition != null) { + hitReceivedTargetConditionsListModel.removeItem(selectedHitReceivedEffectTargetCondition); + selectedHitReceivedEffectTargetCondition = null; + hitReceivedTargetConditionsList.clearSelection(); + listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createHitReceivedTargetCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteHitReceivedTargetCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + hitReceivedTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + hitReceivedTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + hitReceivedTargetConditionsPane.add(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.FIX); + hitReceivedEffectPane.add(hitReceivedTargetConditionsPane, JideBoxLayout.FIX); + if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_target == null || npc.hit_received_effect.conditions_target.isEmpty()) { + hitReceivedTargetConditionsPane.collapse(); + } + combatTraitPane.add(hitReceivedEffectPane, JideBoxLayout.FIX); + + deathEffectPane = new CollapsiblePanel("Effect when killed: "); + deathEffectPane.setLayout(new JideBoxLayout(deathEffectPane, JideBoxLayout.PAGE_AXIS)); + if (npc.death_effect == null) { + deathEffect = new Common.DeathEffect(); + } else { + deathEffect = npc.death_effect; + } + deathEffectHPMin = addIntegerField(deathEffectPane, "Killer HP bonus min: ", deathEffect.hp_boost_min, true, npc.writable, listener); + deathEffectHPMax = addIntegerField(deathEffectPane, "Killer HP bonus max: ", deathEffect.hp_boost_max, true, npc.writable, listener); + deathEffectAPMin = addIntegerField(deathEffectPane, "Killer AP bonus min: ", deathEffect.ap_boost_min, true, npc.writable, listener); + deathEffectAPMax = addIntegerField(deathEffectPane, "Killer AP bonus max: ", deathEffect.ap_boost_max, true, npc.writable, listener); + + CollapsiblePanel deathSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the killer: "); + deathSourceConditionsPane.setLayout(new JideBoxLayout(deathSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); + deathSourceConditionsListModel = new SourceTimedConditionsListModel(deathEffect); + deathSourceConditionsList = new JList(deathSourceConditionsListModel); + deathSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); + deathSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + deathSourceConditionsPane.add(new JScrollPane(deathSourceConditionsList), JideBoxLayout.FIX); + final JPanel deathSourceTimedConditionsEditorPane = new JPanel(); + final JButton createDeathSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteDeathSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + deathSourceConditionsList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedDeathEffectSourceCondition = (Common.TimedConditionEffect) deathSourceConditionsList.getSelectedValue(); + updateDeathSourceTimedConditionEditorPane(deathSourceTimedConditionsEditorPane, selectedDeathEffectSourceCondition, listener); + } + }); + if (npc.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createDeathSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Common.TimedConditionEffect condition = new Common.TimedConditionEffect(); + deathSourceConditionsListModel.addItem(condition); + deathSourceConditionsList.setSelectedValue(condition, true); + listener.valueChanged(deathSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteDeathSourceCondition.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedDeathEffectSourceCondition != null) { + deathSourceConditionsListModel.removeItem(selectedDeathEffectSourceCondition); + selectedDeathEffectSourceCondition = null; + deathSourceConditionsList.clearSelection(); + listener.valueChanged(deathSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + + listButtonsPane.add(createDeathSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(deleteDeathSourceCondition, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + deathSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); + } + deathSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(deathSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); + deathSourceConditionsPane.add(deathSourceTimedConditionsEditorPane, JideBoxLayout.FIX); + if (npc.death_effect == null || npc.death_effect.conditions_source == null || npc.death_effect.conditions_source.isEmpty()) { + deathSourceConditionsPane.collapse(); + } + deathEffectPane.add(deathSourceConditionsPane, JideBoxLayout.FIX); + combatTraitPane.add(deathEffectPane, JideBoxLayout.FIX); + + + pane.add(combatTraitPane, JideBoxLayout.FIX); + } + + public void updateHitSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { + pane.removeAll(); + if (hitSourceConditionBox != null) { + removeElementListener(hitSourceConditionBox); + } + + boolean writable = ((NPC)target).writable; + Project proj = ((NPC)target).getProject(); + + hitSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); + hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + + hitSourceConditionClear = new JRadioButton("Clear active condition"); + pane.add(hitSourceConditionClear, JideBoxLayout.FIX); + hitSourceConditionApply = new JRadioButton("Apply condition with magnitude"); + pane.add(hitSourceConditionApply, JideBoxLayout.FIX); + hitSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); + hitSourceConditionImmunity = new JRadioButton("Give immunity to condition"); + pane.add(hitSourceConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(hitSourceConditionApply); + radioEffectGroup.add(hitSourceConditionClear); + radioEffectGroup.add(hitSourceConditionImmunity); + + hitSourceConditionTimed = new JRadioButton("For a number of rounds"); + pane.add(hitSourceConditionTimed, JideBoxLayout.FIX); + hitSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); + hitSourceConditionForever = new JRadioButton("Forever"); + pane.add(hitSourceConditionForever, JideBoxLayout.FIX); + + ButtonGroup radioDurationGroup = new ButtonGroup(); + radioDurationGroup.add(hitSourceConditionTimed); + radioDurationGroup.add(hitSourceConditionForever); + + updateHitSourceTimedConditionWidgets(condition); + + 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())); + } + }); + hitSourceConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitSourceConditionImmunity, new Boolean(hitSourceConditionImmunity.isSelected())); + } + }); + + hitSourceConditionTimed.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitSourceConditionTimed, new Boolean(hitSourceConditionTimed.isSelected())); + } + }); + hitSourceConditionForever.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitSourceConditionForever, new Boolean(hitSourceConditionForever.isSelected())); + } + }); + pane.revalidate(); + pane.repaint(); + } + + public void updateHitSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { + + boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); + boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); + boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; + + hitSourceConditionClear.setSelected(clear); + hitSourceConditionApply.setSelected(!clear && !immunity); + hitSourceConditionMagnitude.setEnabled(!clear && !immunity); + hitSourceConditionImmunity.setSelected(immunity); + + hitSourceConditionTimed.setSelected(!forever); + hitSourceConditionTimed.setEnabled(!clear); + hitSourceConditionDuration.setEnabled(!clear && !forever); + hitSourceConditionForever.setSelected(forever); + hitSourceConditionForever.setEnabled(!clear); + } + + + public void updateHitTargetTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { + pane.removeAll(); + if (hitTargetConditionBox != null) { + removeElementListener(hitTargetConditionBox); + } + + boolean writable = ((NPC)target).writable; + Project proj = ((NPC)target).getProject(); + + hitTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); + hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + hitTargetConditionClear = new JRadioButton("Clear active condition"); + pane.add(hitTargetConditionClear, JideBoxLayout.FIX); + hitTargetConditionApply = new JRadioButton("Apply condition with magnitude"); + pane.add(hitTargetConditionApply, JideBoxLayout.FIX); + hitTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); + hitTargetConditionImmunity = new JRadioButton("Give immunity to condition"); + pane.add(hitTargetConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(hitTargetConditionApply); + radioEffectGroup.add(hitTargetConditionClear); + radioEffectGroup.add(hitTargetConditionImmunity); + + hitTargetConditionTimed = new JRadioButton("For a number of rounds"); + pane.add(hitTargetConditionTimed, JideBoxLayout.FIX); + hitTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); + hitTargetConditionForever = new JRadioButton("Forever"); + pane.add(hitTargetConditionForever, JideBoxLayout.FIX); + + ButtonGroup radioDurationGroup = new ButtonGroup(); + radioDurationGroup.add(hitTargetConditionTimed); + radioDurationGroup.add(hitTargetConditionForever); + + updateHitTargetTimedConditionWidgets(condition); + + 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())); + } + }); + hitTargetConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitTargetConditionImmunity, new Boolean(hitTargetConditionImmunity.isSelected())); + } + }); + + hitTargetConditionTimed.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitTargetConditionTimed, new Boolean(hitTargetConditionTimed.isSelected())); + } + }); + hitTargetConditionForever.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitTargetConditionForever, new Boolean(hitTargetConditionForever.isSelected())); + } + }); + pane.revalidate(); + pane.repaint(); + } + + public void updateHitTargetTimedConditionWidgets(Common.TimedConditionEffect condition) { + + boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); + boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); + boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; + + hitTargetConditionClear.setSelected(clear); + hitTargetConditionApply.setSelected(!clear && !immunity); + hitTargetConditionMagnitude.setEnabled(!clear && !immunity); + hitTargetConditionImmunity.setSelected(immunity); + + hitTargetConditionTimed.setSelected(!forever); + hitTargetConditionTimed.setEnabled(!clear); + hitTargetConditionDuration.setEnabled(!clear && !forever); + hitTargetConditionForever.setSelected(forever); + hitTargetConditionForever.setEnabled(!clear); + } + + + public void updateHitReceivedSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { + pane.removeAll(); + if (hitReceivedSourceConditionBox != null) { + removeElementListener(hitReceivedSourceConditionBox); + } + + boolean writable = ((NPC)target).writable; + Project proj = ((NPC)target).getProject(); + + hitReceivedSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); + hitReceivedSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + + hitReceivedSourceConditionClear = new JRadioButton("Clear active condition"); + pane.add(hitReceivedSourceConditionClear, JideBoxLayout.FIX); + hitReceivedSourceConditionApply = new JRadioButton("Apply condition with magnitude"); + pane.add(hitReceivedSourceConditionApply, JideBoxLayout.FIX); + hitReceivedSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); + hitReceivedSourceConditionImmunity = new JRadioButton("Give immunity to condition"); + pane.add(hitReceivedSourceConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(hitReceivedSourceConditionApply); + radioEffectGroup.add(hitReceivedSourceConditionClear); + radioEffectGroup.add(hitReceivedSourceConditionImmunity); + + hitReceivedSourceConditionTimed = new JRadioButton("For a number of rounds"); + pane.add(hitReceivedSourceConditionTimed, JideBoxLayout.FIX); + hitReceivedSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); + hitReceivedSourceConditionForever = new JRadioButton("Forever"); + pane.add(hitReceivedSourceConditionForever, JideBoxLayout.FIX); + + ButtonGroup radioDurationGroup = new ButtonGroup(); + radioDurationGroup.add(hitReceivedSourceConditionTimed); + radioDurationGroup.add(hitReceivedSourceConditionForever); + + updateHitReceivedSourceTimedConditionWidgets(condition); + + hitReceivedSourceConditionClear.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedSourceConditionClear, new Boolean(hitReceivedSourceConditionClear.isSelected())); + } + }); + hitReceivedSourceConditionApply.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedSourceConditionApply, new Boolean(hitReceivedSourceConditionApply.isSelected())); + } + }); + hitReceivedSourceConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedSourceConditionImmunity, new Boolean(hitReceivedSourceConditionImmunity.isSelected())); + } + }); + + hitReceivedSourceConditionTimed.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedSourceConditionTimed, new Boolean(hitReceivedSourceConditionTimed.isSelected())); + } + }); + hitReceivedSourceConditionForever.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedSourceConditionForever, new Boolean(hitReceivedSourceConditionForever.isSelected())); + } + }); + pane.revalidate(); + pane.repaint(); + } + + public void updateHitReceivedSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { + + boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); + boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); + boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; + + hitReceivedSourceConditionClear.setSelected(clear); + hitReceivedSourceConditionApply.setSelected(!clear && !immunity); + hitReceivedSourceConditionMagnitude.setEnabled(!clear && !immunity); + hitReceivedSourceConditionImmunity.setSelected(immunity); + + hitReceivedSourceConditionTimed.setSelected(!forever); + hitReceivedSourceConditionTimed.setEnabled(!clear); + hitReceivedSourceConditionDuration.setEnabled(!clear && !forever); + hitReceivedSourceConditionForever.setSelected(forever); + hitReceivedSourceConditionForever.setEnabled(!clear); + } + + + public void updateHitReceivedTargetTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { + pane.removeAll(); + if (hitReceivedTargetConditionBox != null) { + removeElementListener(hitReceivedTargetConditionBox); + } + + boolean writable = ((NPC)target).writable; + Project proj = ((NPC)target).getProject(); + + hitReceivedTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); + hitReceivedTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + hitReceivedTargetConditionClear = new JRadioButton("Clear active condition"); + pane.add(hitReceivedTargetConditionClear, JideBoxLayout.FIX); + hitReceivedTargetConditionApply = new JRadioButton("Apply condition with magnitude"); + pane.add(hitReceivedTargetConditionApply, JideBoxLayout.FIX); + hitReceivedTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); + hitReceivedTargetConditionImmunity = new JRadioButton("Give immunity to condition"); + pane.add(hitReceivedTargetConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(hitReceivedTargetConditionApply); + radioEffectGroup.add(hitReceivedTargetConditionClear); + radioEffectGroup.add(hitReceivedTargetConditionImmunity); + + hitReceivedTargetConditionTimed = new JRadioButton("For a number of rounds"); + pane.add(hitReceivedTargetConditionTimed, JideBoxLayout.FIX); + hitReceivedTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); + hitReceivedTargetConditionForever = new JRadioButton("Forever"); + pane.add(hitReceivedTargetConditionForever, JideBoxLayout.FIX); + + ButtonGroup radioDurationGroup = new ButtonGroup(); + radioDurationGroup.add(hitReceivedTargetConditionTimed); + radioDurationGroup.add(hitReceivedTargetConditionForever); + + updateHitReceivedTargetTimedConditionWidgets(condition); + + hitReceivedTargetConditionClear.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedTargetConditionClear, new Boolean(hitReceivedTargetConditionClear.isSelected())); + } + }); + hitReceivedTargetConditionApply.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedTargetConditionApply, new Boolean(hitReceivedTargetConditionApply.isSelected())); + } + }); + hitReceivedTargetConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedTargetConditionImmunity, new Boolean(hitReceivedTargetConditionImmunity.isSelected())); + } + }); + + hitReceivedTargetConditionTimed.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedTargetConditionTimed, new Boolean(hitReceivedTargetConditionTimed.isSelected())); + } + }); + hitReceivedTargetConditionForever.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(hitReceivedTargetConditionForever, new Boolean(hitReceivedTargetConditionForever.isSelected())); + } + }); + pane.revalidate(); + pane.repaint(); + } + + public void updateHitReceivedTargetTimedConditionWidgets(Common.TimedConditionEffect condition) { + + boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); + boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); + boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; + + hitReceivedTargetConditionClear.setSelected(clear); + hitReceivedTargetConditionApply.setSelected(!clear && !immunity); + hitReceivedTargetConditionMagnitude.setEnabled(!clear && !immunity); + hitReceivedTargetConditionImmunity.setSelected(immunity); + + hitReceivedTargetConditionTimed.setSelected(!forever); + hitReceivedTargetConditionTimed.setEnabled(!clear); + hitReceivedTargetConditionDuration.setEnabled(!clear && !forever); + hitReceivedTargetConditionForever.setSelected(forever); + hitReceivedTargetConditionForever.setEnabled(!clear); + } + + public void updateDeathSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) { + pane.removeAll(); + if (deathSourceConditionBox != null) { + removeElementListener(deathSourceConditionBox); + } + + boolean writable = ((NPC)target).writable; + Project proj = ((NPC)target).getProject(); + + deathSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); + deathSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); + + deathSourceConditionClear = new JRadioButton("Clear active condition"); + pane.add(deathSourceConditionClear, JideBoxLayout.FIX); + deathSourceConditionApply = new JRadioButton("Apply condition with magnitude"); + pane.add(deathSourceConditionApply, JideBoxLayout.FIX); + deathSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener); + deathSourceConditionImmunity = new JRadioButton("Give immunity to condition"); + pane.add(deathSourceConditionImmunity, JideBoxLayout.FIX); + + ButtonGroup radioEffectGroup = new ButtonGroup(); + radioEffectGroup.add(deathSourceConditionApply); + radioEffectGroup.add(deathSourceConditionClear); + radioEffectGroup.add(deathSourceConditionImmunity); + + deathSourceConditionTimed = new JRadioButton("For a number of rounds"); + pane.add(deathSourceConditionTimed, JideBoxLayout.FIX); + deathSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, 1, false, writable, listener); + deathSourceConditionForever = new JRadioButton("Forever"); + pane.add(deathSourceConditionForever, JideBoxLayout.FIX); + + ButtonGroup radioDurationGroup = new ButtonGroup(); + radioDurationGroup.add(deathSourceConditionTimed); + radioDurationGroup.add(deathSourceConditionForever); + + updateDeathSourceTimedConditionWidgets(condition); + + deathSourceConditionClear.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(deathSourceConditionClear, new Boolean(deathSourceConditionClear.isSelected())); + } + }); + deathSourceConditionApply.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(deathSourceConditionApply, new Boolean(deathSourceConditionApply.isSelected())); + } + }); + deathSourceConditionImmunity.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(deathSourceConditionImmunity, new Boolean(deathSourceConditionImmunity.isSelected())); + } + }); + + deathSourceConditionTimed.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(deathSourceConditionTimed, new Boolean(deathSourceConditionTimed.isSelected())); + } + }); + deathSourceConditionForever.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.valueChanged(deathSourceConditionForever, new Boolean(deathSourceConditionForever.isSelected())); + } + }); + pane.revalidate(); + pane.repaint(); + } + + public void updateDeathSourceTimedConditionWidgets(Common.TimedConditionEffect condition) { + + boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); + boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); + boolean forever = condition.duration != null && condition.duration == ActorCondition.DURATION_FOREVER; + + deathSourceConditionClear.setSelected(clear); + deathSourceConditionApply.setSelected(!clear && !immunity); + deathSourceConditionMagnitude.setEnabled(!clear && !immunity); + deathSourceConditionImmunity.setSelected(immunity); + + deathSourceConditionTimed.setSelected(!forever); + deathSourceConditionTimed.setEnabled(!clear); + deathSourceConditionDuration.setEnabled(!clear && !forever); + deathSourceConditionForever.setSelected(forever); + deathSourceConditionForever.setEnabled(!clear); + } + + public static class TargetTimedConditionsListModel extends OrderedListenerListModel { + public TargetTimedConditionsListModel(Common.HitEffect effect) { + super(effect); + } + + @Override + protected List getItems() { + return source.conditions_target; + } + + @Override + protected void setItems(List items) { + source.conditions_target = items; + } + } + + public static class SourceTimedConditionsListModel extends OrderedListenerListModel { + public SourceTimedConditionsListModel(Common.DeathEffect effect) { + super(effect); + } + + @Override + protected List getItems() { + return source.conditions_source; + } + + @Override + protected void setItems(List items) { + source.conditions_source = items; + } + } + + public static class TimedConditionsCellRenderer extends DefaultListCellRenderer { + private static final long serialVersionUID = 7987880146189575234L; + + @Override + public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (c instanceof JLabel) { + JLabel label = ((JLabel)c); + Common.TimedConditionEffect effect = (Common.TimedConditionEffect) value; + + if (effect.condition != null) { + + boolean immunity = (effect.magnitude == null || effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (effect.duration != null && effect.duration > ActorCondition.DURATION_NONE); + boolean clear = (effect.magnitude == null || effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (effect.duration == null || effect.duration == ActorCondition.DURATION_NONE); + boolean forever = effect.duration != null && effect.duration == ActorCondition.DURATION_FOREVER; + + if (clear) { + label.setIcon(new ImageIcon(effect.condition.getIcon())); + label.setText(effect.chance+"% chances to clear actor condition "+effect.condition.getDesc()); + } else if (immunity) { + label.setIcon(new OverlayIcon(effect.condition.getIcon(), DefaultIcons.getImmunityIcon())); + label.setText(effect.chance+"% chances to give immunity to "+effect.condition.getDesc()+(forever ? " forever" : " for "+effect.duration+" rounds")); + } else { + label.setIcon(new ImageIcon(effect.condition.getIcon())); + label.setText(effect.chance+"% chances to give actor condition "+effect.condition.getDesc()+" x"+effect.magnitude+(forever ? " forever" : " for "+effect.duration+" rounds")); + } + } else { + label.setText("New, undefined actor condition effect."); + } + } + return c; + } + } + + public static boolean isNull(Common.HitEffect effect) { + if (effect.ap_boost_min != null) return false; + if (effect.ap_boost_max != null) return false; + if (effect.hp_boost_min != null) return false; + if (effect.hp_boost_max != null) return false; + if (effect.conditions_source != null) return false; + if (effect.conditions_target != null) return false; + return true; + } + + public static boolean isNull(Common.HitReceivedEffect effect) { + if (effect.ap_boost_min != null) return false; + if (effect.ap_boost_max != null) return false; + if (effect.hp_boost_min != null) return false; + if (effect.hp_boost_max != null) return false; + if (effect.ap_boost_min_target != null) return false; + if (effect.ap_boost_max_target != null) return false; + if (effect.hp_boost_min_target != null) return false; + if (effect.hp_boost_max_target != null) return false; + if (effect.conditions_source != null) return false; + if (effect.conditions_target != null) return false; + return true; + } + + public static boolean isNull(Common.DeathEffect effect) { + if (effect.ap_boost_min != null) return false; + if (effect.ap_boost_max != null) return false; + if (effect.hp_boost_min != null) return false; + if (effect.hp_boost_max != null) return false; + if (effect.conditions_source != null) return false; + return true; + } + + public class NPCFieldUpdater implements FieldUpdateListener { + + @Override + public void valueChanged(JComponent source, Object value) { + NPC npc = (NPC)target; + boolean updateHit, updateHitReceived, updateDeath; + updateHit = updateHitReceived = updateDeath = false; + if (source == idField) { + //Events caused by cancel an ID edition. Dismiss. + if (skipNext) { + skipNext = false; + return; + } + if (target.id.equals((String) value)) return; + + if (idChanging()) { + npc.id = (String) value; + NPCEditor.this.name = npc.getDesc(); + npc.childrenChanged(new ArrayList()); + ATContentStudio.frame.editorChanged(NPCEditor.this); + } else { + cancelIdEdit(idField); + return; + } + } else if (source == nameField) { + npc.name = (String) value; + NPCEditor.this.name = npc.getDesc(); + npc.childrenChanged(new ArrayList()); + ATContentStudio.frame.editorChanged(NPCEditor.this); + } else if (source == npcIcon) { + npc.icon_id = (String) value; + npc.childrenChanged(new ArrayList()); + NPCEditor.this.icon = new ImageIcon(npc.getProject().getIcon((String) value)); + ATContentStudio.frame.editorChanged(NPCEditor.this); + npcIcon.setIcon(new ImageIcon(npc.getProject().getImage((String) value))); + npcIcon.revalidate(); + npcIcon.repaint(); + } else if (source == spawnGroupField) { + npc.spawngroup_id = (String) value; + } else if (source == factionField) { + npc.faction_id = (String) value; + } else if (source == dialogueBox) { + if (npc.dialogue != null) { + npc.dialogue.removeBacklink(npc); + } + npc.dialogue = (Dialogue) value; + if (npc.dialogue != null) { + npc.dialogue_id =npc.dialogue.id; + npc.dialogue.addBacklink(npc); + } else { + npc.dialogue_id = null; + } + reloadGraphView(npc); + } else if (source == droplistBox) { + if (npc.droplist != null) { + npc.droplist.removeBacklink(npc); + } + npc.droplist = (Droplist) value; + if (npc.droplist != null) { + npc.droplist_id = npc.droplist.id; + npc.droplist.addBacklink(npc); + } else { + npc.droplist_id = null; + } + } else if (source == monsterClassBox) { + npc.monster_class = (NPC.MonsterClass) value; + } else if (source == uniqueBox) { + npc.unique = (Integer) value; + } else if (source == moveTypeBox) { + npc.movement_type = (NPC.MovementType) value; + } else if (source == maxHP) { + npc.max_hp = (Integer) value; + } else if (source == maxAP) { + npc.max_ap = (Integer) value; + } else if (source == moveCost) { + npc.move_cost = (Integer) value; + } else if (source == atkDmgMin) { + npc.attack_damage_min = (Integer) value; + } else if (source == atkDmgMax) { + npc.attack_damage_max = (Integer) value; + } else if (source == atkCost) { + npc.attack_cost = (Integer) value; + } else if (source == atkChance) { + npc.attack_chance = (Integer) value; + } else if (source == critSkill) { + npc.critical_skill = (Integer) value; + } else if (source == critMult) { + npc.critical_multiplier = (Double) value; + } else if (source == blockChance) { + npc.block_chance = (Integer) value; + } else if (source == dmgRes) { + npc.damage_resistance = (Integer) value; + } else if (source == hitEffectHPMin) { + hitEffect.hp_boost_min = (Integer) value; + updateHit = true; + } else if (source == hitEffectHPMax) { + hitEffect.hp_boost_max = (Integer) value; + updateHit = true; + } else if (source == hitEffectAPMin) { + hitEffect.ap_boost_min = (Integer) value; + updateHit = true; + } else if (source == hitEffectAPMax) { + hitEffect.ap_boost_max = (Integer) value; + updateHit = true; + } else if (source == hitSourceConditionsList) { + updateHit = true; + } else if (source == hitSourceConditionBox) { + if (selectedHitEffectSourceCondition.condition != null) { + selectedHitEffectSourceCondition.condition.removeBacklink(npc); + } + selectedHitEffectSourceCondition.condition = (ActorCondition) value; + if (selectedHitEffectSourceCondition.condition != null) { + selectedHitEffectSourceCondition.condition.addBacklink(npc); + selectedHitEffectSourceCondition.condition_id = selectedHitEffectSourceCondition.condition.id; + } else { + selectedHitEffectSourceCondition.condition_id = null; + } + hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); + } else if (source == hitSourceConditionClear && (Boolean) value) { + selectedHitEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitEffectSourceCondition.duration = null; + updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); + hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionApply && (Boolean) value) { + selectedHitEffectSourceCondition.magnitude = (Integer) hitSourceConditionMagnitude.getValue(); + selectedHitEffectSourceCondition.duration = hitSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitSourceConditionDuration.getValue(); + if (selectedHitEffectSourceCondition.duration == null || selectedHitEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectSourceCondition.duration = 1; + } + updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); + hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionImmunity && (Boolean) value) { + selectedHitEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitEffectSourceCondition.duration = hitSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitSourceConditionDuration.getValue(); + if (selectedHitEffectSourceCondition.duration == null || selectedHitEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectSourceCondition.duration = 1; + } + updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); + hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionMagnitude) { + selectedHitEffectSourceCondition.magnitude = (Integer) value; + hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionTimed && (Boolean) value) { + selectedHitEffectSourceCondition.duration = (Integer) hitSourceConditionDuration.getValue(); + if (selectedHitEffectSourceCondition.duration == null || selectedHitEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectSourceCondition.duration = 1; + } + updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); + hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionForever && (Boolean) value) { + selectedHitEffectSourceCondition.duration = ActorCondition.DURATION_FOREVER; + updateHitSourceTimedConditionWidgets(selectedHitEffectSourceCondition); + hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionDuration) { + selectedHitEffectSourceCondition.duration = (Integer) value; + hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); + updateHit = true; + } else if (source == hitSourceConditionChance) { + selectedHitEffectSourceCondition.chance = (Double) value; + hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); + } else if (source == hitTargetConditionsList) { + updateHit = true; + } else if (source == hitTargetConditionBox) { + if (selectedHitEffectTargetCondition.condition != null) { + selectedHitEffectTargetCondition.condition.removeBacklink(npc); + } + selectedHitEffectTargetCondition.condition = (ActorCondition) value; + if (selectedHitEffectTargetCondition.condition != null) { + selectedHitEffectTargetCondition.condition_id = selectedHitEffectTargetCondition.condition.id; + selectedHitEffectTargetCondition.condition.addBacklink(npc); + } else { + selectedHitEffectTargetCondition.condition_id = null; + } + hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); + } else if (source == hitTargetConditionClear && (Boolean) value) { + selectedHitEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitEffectTargetCondition.duration = null; + updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); + hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionApply && (Boolean) value) { + selectedHitEffectTargetCondition.magnitude = (Integer) hitTargetConditionMagnitude.getValue(); + selectedHitEffectTargetCondition.duration = hitTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitTargetConditionDuration.getValue(); + if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectTargetCondition.duration = 1; + } + updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); + hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionImmunity && (Boolean) value) { + selectedHitEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitEffectTargetCondition.duration = hitTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitTargetConditionDuration.getValue(); + if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectTargetCondition.duration = 1; + } + updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); + hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionMagnitude) { + selectedHitEffectTargetCondition.magnitude = (Integer) value; + hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionTimed && (Boolean) value) { + selectedHitEffectTargetCondition.duration = (Integer) hitTargetConditionDuration.getValue(); + if (selectedHitEffectTargetCondition.duration == null || selectedHitEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitEffectTargetCondition.duration = 1; + } + updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); + hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionForever && (Boolean) value) { + selectedHitEffectTargetCondition.duration = ActorCondition.DURATION_FOREVER; + updateHitTargetTimedConditionWidgets(selectedHitEffectTargetCondition); + hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionDuration) { + selectedHitEffectTargetCondition.duration = (Integer) value; + hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); + updateHit = true; + } else if (source == hitTargetConditionChance) { + selectedHitEffectTargetCondition.chance = (Double) value; + hitTargetConditionsListModel.itemChanged(selectedHitEffectTargetCondition); + } else if (source == hitReceivedEffectHPMin) { + hitReceivedEffect.hp_boost_min = (Integer) value; + updateHitReceived = true; + } else if (source == hitReceivedEffectHPMax) { + hitReceivedEffect.hp_boost_max = (Integer) value; + updateHitReceived = true; + } else if (source == hitReceivedEffectAPMin) { + hitReceivedEffect.ap_boost_min = (Integer) value; + updateHitReceived = true; + } else if (source == hitReceivedEffectAPMax) { + hitReceivedEffect.ap_boost_max = (Integer) value; + updateHitReceived = true; + } else if (source == hitReceivedEffectHPMinTarget) { + hitReceivedEffect.hp_boost_min_target = (Integer) value; + updateHitReceived = true; + } else if (source == hitReceivedEffectHPMaxTarget) { + hitReceivedEffect.hp_boost_max_target = (Integer) value; + updateHitReceived = true; + } else if (source == hitReceivedEffectAPMinTarget) { + hitReceivedEffect.ap_boost_min_target = (Integer) value; + updateHitReceived = true; + } else if (source == hitReceivedEffectAPMaxTarget) { + hitReceivedEffect.ap_boost_max_target = (Integer) value; + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionsList) { + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionBox) { + if (selectedHitReceivedEffectSourceCondition.condition != null) { + selectedHitReceivedEffectSourceCondition.condition.removeBacklink(npc); + } + selectedHitReceivedEffectSourceCondition.condition = (ActorCondition) value; + if (selectedHitReceivedEffectSourceCondition.condition != null) { + selectedHitReceivedEffectSourceCondition.condition.addBacklink(npc); + selectedHitReceivedEffectSourceCondition.condition_id = selectedHitReceivedEffectSourceCondition.condition.id; + } else { + selectedHitReceivedEffectSourceCondition.condition_id = null; + } + hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); + } else if (source == hitReceivedSourceConditionClear && (Boolean) value) { + selectedHitReceivedEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitReceivedEffectSourceCondition.duration = null; + updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); + hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionApply && (Boolean) value) { + selectedHitReceivedEffectSourceCondition.magnitude = (Integer) hitReceivedSourceConditionMagnitude.getValue(); + selectedHitReceivedEffectSourceCondition.duration = hitReceivedSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedSourceConditionDuration.getValue(); + if (selectedHitReceivedEffectSourceCondition.duration == null || selectedHitReceivedEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectSourceCondition.duration = 1; + } + updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); + hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionImmunity && (Boolean) value) { + selectedHitReceivedEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitReceivedEffectSourceCondition.duration = hitReceivedSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedSourceConditionDuration.getValue(); + if (selectedHitReceivedEffectSourceCondition.duration == null || selectedHitReceivedEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectSourceCondition.duration = 1; + } + updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); + hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionMagnitude) { + selectedHitReceivedEffectSourceCondition.magnitude = (Integer) value; + hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionTimed && (Boolean) value) { + selectedHitReceivedEffectSourceCondition.duration = (Integer) hitReceivedSourceConditionDuration.getValue(); + if (selectedHitReceivedEffectSourceCondition.duration == null || selectedHitReceivedEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectSourceCondition.duration = 1; + } + updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); + hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionForever && (Boolean) value) { + selectedHitReceivedEffectSourceCondition.duration = ActorCondition.DURATION_FOREVER; + updateHitReceivedSourceTimedConditionWidgets(selectedHitReceivedEffectSourceCondition); + hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionDuration) { + selectedHitReceivedEffectSourceCondition.duration = (Integer) value; + hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); + updateHitReceived = true; + } else if (source == hitReceivedSourceConditionChance) { + selectedHitReceivedEffectSourceCondition.chance = (Double) value; + hitReceivedSourceConditionsListModel.itemChanged(selectedHitReceivedEffectSourceCondition); + } else if (source == hitReceivedTargetConditionsList) { + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionBox) { + if (selectedHitReceivedEffectTargetCondition.condition != null) { + selectedHitReceivedEffectTargetCondition.condition.removeBacklink(npc); + } + selectedHitReceivedEffectTargetCondition.condition = (ActorCondition) value; + if (selectedHitReceivedEffectTargetCondition.condition != null) { + selectedHitReceivedEffectTargetCondition.condition_id = selectedHitReceivedEffectTargetCondition.condition.id; + selectedHitReceivedEffectTargetCondition.condition.addBacklink(npc); + } else { + selectedHitReceivedEffectTargetCondition.condition_id = null; + } + hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); + } else if (source == hitReceivedTargetConditionClear && (Boolean) value) { + selectedHitReceivedEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitReceivedEffectTargetCondition.duration = null; + updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); + hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionApply && (Boolean) value) { + selectedHitReceivedEffectTargetCondition.magnitude = (Integer) hitReceivedTargetConditionMagnitude.getValue(); + selectedHitReceivedEffectTargetCondition.duration = hitReceivedTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedTargetConditionDuration.getValue(); + if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectTargetCondition.duration = 1; + } + updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); + hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionImmunity && (Boolean) value) { + selectedHitReceivedEffectTargetCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedHitReceivedEffectTargetCondition.duration = hitReceivedTargetConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) hitReceivedTargetConditionDuration.getValue(); + if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectTargetCondition.duration = 1; + } + updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); + hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionMagnitude) { + selectedHitReceivedEffectTargetCondition.magnitude = (Integer) value; + hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionTimed && (Boolean) value) { + selectedHitReceivedEffectTargetCondition.duration = (Integer) hitReceivedTargetConditionDuration.getValue(); + if (selectedHitReceivedEffectTargetCondition.duration == null || selectedHitReceivedEffectTargetCondition.duration == ActorCondition.DURATION_NONE) { + selectedHitReceivedEffectTargetCondition.duration = 1; + } + updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); + hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionForever && (Boolean) value) { + selectedHitReceivedEffectTargetCondition.duration = ActorCondition.DURATION_FOREVER; + updateHitReceivedTargetTimedConditionWidgets(selectedHitReceivedEffectTargetCondition); + hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionDuration) { + selectedHitReceivedEffectTargetCondition.duration = (Integer) value; + hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); + updateHitReceived = true; + } else if (source == hitReceivedTargetConditionChance) { + selectedHitReceivedEffectTargetCondition.chance = (Double) value; + hitReceivedTargetConditionsListModel.itemChanged(selectedHitReceivedEffectTargetCondition); + } else if (source == deathEffectHPMin) { + deathEffect.hp_boost_min = (Integer) value; + updateDeath = true; + } else if (source == deathEffectHPMax) { + deathEffect.hp_boost_max = (Integer) value; + updateDeath = true; + } else if (source == deathEffectAPMin) { + deathEffect.ap_boost_min = (Integer) value; + updateDeath = true; + } else if (source == deathEffectAPMax) { + deathEffect.ap_boost_max = (Integer) value; + updateDeath = true; + } else if (source == deathSourceConditionsList) { + updateDeath = true; + } else if (source == deathSourceConditionBox) { + if (selectedDeathEffectSourceCondition.condition != null) { + selectedDeathEffectSourceCondition.condition.removeBacklink(npc); + } + selectedDeathEffectSourceCondition.condition = (ActorCondition) value; + if (selectedDeathEffectSourceCondition.condition != null) { + selectedDeathEffectSourceCondition.condition.addBacklink(npc); + selectedDeathEffectSourceCondition.condition_id = selectedDeathEffectSourceCondition.condition.id; + } else { + selectedDeathEffectSourceCondition.condition_id = null; + } + deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); + } else if (source == deathSourceConditionClear && (Boolean) value) { + selectedDeathEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedDeathEffectSourceCondition.duration = null; + updateDeathSourceTimedConditionWidgets(selectedDeathEffectSourceCondition); + deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); + updateDeath = true; + } else if (source == deathSourceConditionApply && (Boolean) value) { + selectedDeathEffectSourceCondition.magnitude = (Integer) deathSourceConditionMagnitude.getValue(); + selectedDeathEffectSourceCondition.duration = deathSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) deathSourceConditionDuration.getValue(); + if (selectedDeathEffectSourceCondition.duration == null || selectedDeathEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedDeathEffectSourceCondition.duration = 1; + } + updateDeathSourceTimedConditionWidgets(selectedDeathEffectSourceCondition); + deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); + updateDeath = true; + } else if (source == deathSourceConditionImmunity && (Boolean) value) { + selectedDeathEffectSourceCondition.magnitude = ActorCondition.MAGNITUDE_CLEAR; + selectedDeathEffectSourceCondition.duration = deathSourceConditionForever.isSelected() ? ActorCondition.DURATION_FOREVER : (Integer) deathSourceConditionDuration.getValue(); + if (selectedDeathEffectSourceCondition.duration == null || selectedDeathEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedDeathEffectSourceCondition.duration = 1; + } + updateDeathSourceTimedConditionWidgets(selectedDeathEffectSourceCondition); + deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); + updateDeath = true; + } else if (source == deathSourceConditionMagnitude) { + selectedDeathEffectSourceCondition.magnitude = (Integer) value; + deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); + updateDeath = true; + } else if (source == deathSourceConditionTimed && (Boolean) value) { + selectedDeathEffectSourceCondition.duration = (Integer) deathSourceConditionDuration.getValue(); + if (selectedDeathEffectSourceCondition.duration == null || selectedDeathEffectSourceCondition.duration == ActorCondition.DURATION_NONE) { + selectedDeathEffectSourceCondition.duration = 1; + } + updateDeathSourceTimedConditionWidgets(selectedDeathEffectSourceCondition); + deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); + updateDeath = true; + } else if (source == deathSourceConditionForever && (Boolean) value) { + selectedDeathEffectSourceCondition.duration = ActorCondition.DURATION_FOREVER; + updateDeathSourceTimedConditionWidgets(selectedDeathEffectSourceCondition); + deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); + updateDeath = true; + } else if (source == deathSourceConditionDuration) { + selectedDeathEffectSourceCondition.duration = (Integer) value; + deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); + updateDeath = true; + } else if (source == deathSourceConditionChance) { + selectedDeathEffectSourceCondition.chance = (Double) value; + deathSourceConditionsListModel.itemChanged(selectedDeathEffectSourceCondition); + } + + if (updateHit) { + if (isNull(hitEffect)) { + npc.hit_effect = null; + } else { + npc.hit_effect = hitEffect; + } + } + if (updateHitReceived) { + if (isNull(hitReceivedEffect)) { + npc.hit_received_effect = null; + } else { + npc.hit_received_effect = hitReceivedEffect; + } + } + if (updateDeath) { + if (isNull(deathEffect)) { + npc.death_effect = null; + } else { + npc.death_effect = deathEffect; + } + } + + experienceField.setValue(npc.getMonsterExperience()); + + if (npc.state != GameDataElement.State.modified) { + npc.state = GameDataElement.State.modified; + NPCEditor.this.name = npc.getDesc(); + npc.childrenChanged(new ArrayList()); + ATContentStudio.frame.editorChanged(NPCEditor.this); + } + updateJsonViewText(npc.toJsonString()); + + } + + } + + +} diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/QuestEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/QuestEditor.java index 1b62bea..a5cc0b3 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/QuestEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/QuestEditor.java @@ -1,276 +1,276 @@ -package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; - -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import javax.swing.DefaultListCellRenderer; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSpinner; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.ListModel; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListDataEvent; -import javax.swing.event.ListDataListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import com.gpl.rpg.atcontentstudio.ATContentStudio; -import com.gpl.rpg.atcontentstudio.model.GameDataElement; -import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; -import com.gpl.rpg.atcontentstudio.model.gamedata.Common; -import com.gpl.rpg.atcontentstudio.model.gamedata.Quest; -import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage; -import com.gpl.rpg.atcontentstudio.ui.*; -import com.jidesoft.swing.JideBoxLayout; - -public class QuestEditor extends JSONElementEditor { - - private static final long serialVersionUID = 5701667955210615366L; - - private static final String form_view_id = "Form"; - private static final String json_view_id = "JSON"; - - private QuestStage selectedStage = null; - - private JTextField idField; - private JTextField nameField; - private IntegerBasedCheckBox visibleBox; - private StagesListModel stagesListModel; - private JList stagesList; - -// private JPanel stagesParamPane; - private JSpinner progressField; - private JTextArea logTextField; - private JSpinner xpRewardField; - private IntegerBasedCheckBox finishQuestBox; - - - - public QuestEditor(Quest quest) { - super(quest, quest.getDesc(), quest.getIcon()); - addEditorTab(form_view_id, getFormView()); - addEditorTab(json_view_id, getJSONView()); - } - - public void insertFormViewDataField(JPanel pane) { - final Quest quest = ((Quest)target); - - final FieldUpdateListener listener = new QuestFieldUpdater(); - - createButtonPane(pane, quest.getProject(), quest, Quest.class, quest.getImage(), null, listener); - - - idField = addTextField(pane, "Internal ID: ", quest.id, quest.writable, listener); - nameField = addTranslatableTextField(pane, "Quest Name: ", quest.name, quest.writable, listener); - visibleBox = addIntegerBasedCheckBox(pane, "Visible in quest log", quest.visible_in_log, quest.writable, listener); - - CollapsiblePanel stagesPane = new CollapsiblePanel("Quest stages: "); - stagesPane.setLayout(new JideBoxLayout(stagesPane, JideBoxLayout.PAGE_AXIS)); - stagesListModel = new StagesListModel(quest); - stagesList = new JList(stagesListModel); - stagesList.setCellRenderer(new StagesCellRenderer()); - stagesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - stagesPane.add(new JScrollPane(stagesList), JideBoxLayout.FIX); - final JPanel stagesEditorPane = new JPanel(); - final JButton createStage = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); - final JButton deleteStage = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); - final JButton moveStageUp = new JButton(new ImageIcon(DefaultIcons.getArrowUpIcon())); - final JButton moveStageDown = new JButton(new ImageIcon(DefaultIcons.getArrowDownIcon())); - deleteStage.setEnabled(false); - moveStageUp.setEnabled(false); - moveStageDown.setEnabled(false); - stagesList.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - selectedStage = (QuestStage) stagesList.getSelectedValue(); - if (selectedStage != null) { - deleteStage.setEnabled(true); - moveStageUp.setEnabled(stagesList.getSelectedIndex() > 0); - moveStageDown.setEnabled(stagesList.getSelectedIndex() < (stagesListModel.getSize() - 1)); - } else { - deleteStage.setEnabled(false); - moveStageUp.setEnabled(false); - moveStageDown.setEnabled(false); - } - updateStageEditorPane(stagesEditorPane, selectedStage, listener); - } - }); - if (quest.writable) { - JPanel listButtonsPane = new JPanel(); - listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); - createStage.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - QuestStage stage = new QuestStage(quest); - stagesListModel.addItem(stage); - stagesList.setSelectedValue(stage, true); - listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - }); - deleteStage.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (selectedStage != null) { - stagesListModel.removeItem(selectedStage); - selectedStage = null; - stagesList.clearSelection(); - listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - moveStageUp.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - if (selectedStage != null) { - stagesListModel.moveUp(selectedStage); - stagesList.setSelectedValue(selectedStage, true); - listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - moveStageDown.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - if (selectedStage != null) { - stagesListModel.moveDown(selectedStage); - stagesList.setSelectedValue(selectedStage, true); - listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. - } - } - }); - listButtonsPane.add(createStage, JideBoxLayout.FIX); - listButtonsPane.add(deleteStage, JideBoxLayout.FIX); - listButtonsPane.add(moveStageUp, JideBoxLayout.FIX); - listButtonsPane.add(moveStageDown, JideBoxLayout.FIX); - listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); - stagesPane.add(listButtonsPane, JideBoxLayout.FIX); - } - if (quest.stages == null || quest.stages.isEmpty()) { - stagesPane.collapse(); - } - stagesEditorPane.setLayout(new JideBoxLayout(stagesEditorPane, JideBoxLayout.PAGE_AXIS)); - stagesPane.add(stagesEditorPane, JideBoxLayout.FIX); - pane.add(stagesPane, JideBoxLayout.FIX); - - } - - public void updateStageEditorPane(JPanel pane, QuestStage selectedStage, FieldUpdateListener listener) { - pane.removeAll(); - if (selectedStage != null) { - boolean writable = ((Quest)target).writable; - progressField = addIntegerField(pane, "Progress ID: ", selectedStage.progress, false, writable, listener); - logTextField = addTranslatableTextArea(pane, "Log text: ", selectedStage.log_text, writable, listener); - xpRewardField = addIntegerField(pane, "XP Reward: ", selectedStage.exp_reward, false, writable, listener); - finishQuestBox = addIntegerBasedCheckBox(pane, "Finishes quest", selectedStage.finishes_quest, writable, listener); - addBacklinksList(pane, selectedStage, "Elements linking to this quest stage"); - - } - pane.revalidate(); - pane.repaint(); - } - - - public static class StagesListModel extends CustomListModel { - public StagesListModel(Quest quest) { - super(quest); - } - - @Override - protected List getItems() { - return source.stages; - } - - @Override - protected void setItems(List items) { - source.stages = items; - } - } - - - public static class StagesCellRenderer extends DefaultListCellRenderer { - private static final long serialVersionUID = 7987880146189575234L; - - @Override - public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (c instanceof JLabel) { - JLabel label = ((JLabel)c); - label.setText(((QuestStage)value).getDesc()); - label.setIcon(new ImageIcon(((QuestStage)value).getIcon())); - } - return c; - } - } - - - public class QuestFieldUpdater implements FieldUpdateListener { - - @Override - public void valueChanged(JComponent source, Object value) { - Quest quest = (Quest) target; - if (source == idField) { - //Events caused by cancel an ID edition. Dismiss. - if (skipNext) { - skipNext = false; - return; - } - if (target.id.equals((String) value)) return; - - if (idChanging()) { - quest.id = (String) value; - QuestEditor.this.name = quest.getDesc(); - quest.childrenChanged(new ArrayList()); - ATContentStudio.frame.editorChanged(QuestEditor.this); - } else { - cancelIdEdit(idField); - return; - } - } else if (source == nameField) { - quest.name = (String) value; - QuestEditor.this.name = quest.getDesc(); - quest.childrenChanged(new ArrayList()); - ATContentStudio.frame.editorChanged(QuestEditor.this); - } else if (source == visibleBox) { - quest.visible_in_log = (Integer) value; - } else if (source == progressField) { - selectedStage.progress = (Integer) value; - stagesListModel.itemChanged(selectedStage); - } else if (source == logTextField) { - selectedStage.log_text = (String) value; - stagesListModel.itemChanged(selectedStage); - } else if (source == xpRewardField) { - selectedStage.exp_reward = (Integer) value; - stagesListModel.itemChanged(selectedStage); - } else if (source == finishQuestBox) { - selectedStage.finishes_quest = (Integer) value; - stagesListModel.itemChanged(selectedStage); - } - - - if (quest.state != GameDataElement.State.modified) { - quest.state = GameDataElement.State.modified; - QuestEditor.this.name = quest.getDesc(); - quest.childrenChanged(new ArrayList()); - ATContentStudio.frame.editorChanged(QuestEditor.this); - } - updateJsonViewText(quest.toJsonString()); - } - - - } - - -} +package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; + +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSpinner; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.ListModel; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import com.gpl.rpg.atcontentstudio.ATContentStudio; +import com.gpl.rpg.atcontentstudio.model.GameDataElement; +import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; +import com.gpl.rpg.atcontentstudio.model.gamedata.Common; +import com.gpl.rpg.atcontentstudio.model.gamedata.Quest; +import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage; +import com.gpl.rpg.atcontentstudio.ui.*; +import com.jidesoft.swing.JideBoxLayout; + +public class QuestEditor extends JSONElementEditor { + + private static final long serialVersionUID = 5701667955210615366L; + + private static final String form_view_id = "Form"; + private static final String json_view_id = "JSON"; + + private QuestStage selectedStage = null; + + private JTextField idField; + private JTextField nameField; + private IntegerBasedCheckBox visibleBox; + private StagesListModel stagesListModel; + private JList stagesList; + +// private JPanel stagesParamPane; + private JSpinner progressField; + private JTextArea logTextField; + private JSpinner xpRewardField; + private IntegerBasedCheckBox finishQuestBox; + + + + public QuestEditor(Quest quest) { + super(quest, quest.getDesc(), quest.getIcon()); + addEditorTab(form_view_id, getFormView()); + addEditorTab(json_view_id, getJSONView()); + } + + public void insertFormViewDataField(JPanel pane) { + final Quest quest = ((Quest)target); + + final FieldUpdateListener listener = new QuestFieldUpdater(); + + createButtonPane(pane, quest.getProject(), quest, Quest.class, quest.getImage(), null, listener); + + + idField = addTextField(pane, "Internal ID: ", quest.id, quest.writable, listener); + nameField = addTranslatableTextField(pane, "Quest Name: ", quest.name, quest.writable, listener); + visibleBox = addIntegerBasedCheckBox(pane, "Visible in quest log", quest.visible_in_log, quest.writable, listener); + + CollapsiblePanel stagesPane = new CollapsiblePanel("Quest stages: "); + stagesPane.setLayout(new JideBoxLayout(stagesPane, JideBoxLayout.PAGE_AXIS)); + stagesListModel = new StagesListModel(quest); + stagesList = new JList(stagesListModel); + stagesList.setCellRenderer(new StagesCellRenderer()); + stagesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + stagesPane.add(new JScrollPane(stagesList), JideBoxLayout.FIX); + final JPanel stagesEditorPane = new JPanel(); + final JButton createStage = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); + final JButton deleteStage = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + final JButton moveStageUp = new JButton(new ImageIcon(DefaultIcons.getArrowUpIcon())); + final JButton moveStageDown = new JButton(new ImageIcon(DefaultIcons.getArrowDownIcon())); + deleteStage.setEnabled(false); + moveStageUp.setEnabled(false); + moveStageDown.setEnabled(false); + stagesList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + selectedStage = (QuestStage) stagesList.getSelectedValue(); + if (selectedStage != null) { + deleteStage.setEnabled(true); + moveStageUp.setEnabled(stagesList.getSelectedIndex() > 0); + moveStageDown.setEnabled(stagesList.getSelectedIndex() < (stagesListModel.getSize() - 1)); + } else { + deleteStage.setEnabled(false); + moveStageUp.setEnabled(false); + moveStageDown.setEnabled(false); + } + updateStageEditorPane(stagesEditorPane, selectedStage, listener); + } + }); + if (quest.writable) { + JPanel listButtonsPane = new JPanel(); + listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); + createStage.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + QuestStage stage = new QuestStage(quest); + stagesListModel.addItem(stage); + stagesList.setSelectedValue(stage, true); + listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + }); + deleteStage.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (selectedStage != null) { + stagesListModel.removeItem(selectedStage); + selectedStage = null; + stagesList.clearSelection(); + listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + moveStageUp.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if (selectedStage != null) { + stagesListModel.moveUp(selectedStage); + stagesList.setSelectedValue(selectedStage, true); + listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + moveStageDown.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if (selectedStage != null) { + stagesListModel.moveDown(selectedStage); + stagesList.setSelectedValue(selectedStage, true); + listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. + } + } + }); + listButtonsPane.add(createStage, JideBoxLayout.FIX); + listButtonsPane.add(deleteStage, JideBoxLayout.FIX); + listButtonsPane.add(moveStageUp, JideBoxLayout.FIX); + listButtonsPane.add(moveStageDown, JideBoxLayout.FIX); + listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); + stagesPane.add(listButtonsPane, JideBoxLayout.FIX); + } + if (quest.stages == null || quest.stages.isEmpty()) { + stagesPane.collapse(); + } + stagesEditorPane.setLayout(new JideBoxLayout(stagesEditorPane, JideBoxLayout.PAGE_AXIS)); + stagesPane.add(stagesEditorPane, JideBoxLayout.FIX); + pane.add(stagesPane, JideBoxLayout.FIX); + + } + + public void updateStageEditorPane(JPanel pane, QuestStage selectedStage, FieldUpdateListener listener) { + pane.removeAll(); + if (selectedStage != null) { + boolean writable = ((Quest)target).writable; + progressField = addIntegerField(pane, "Progress ID: ", selectedStage.progress, false, writable, listener); + logTextField = addTranslatableTextArea(pane, "Log text: ", selectedStage.log_text, writable, listener); + xpRewardField = addIntegerField(pane, "XP Reward: ", selectedStage.exp_reward, false, writable, listener); + finishQuestBox = addIntegerBasedCheckBox(pane, "Finishes quest", selectedStage.finishes_quest, writable, listener); + addBacklinksList(pane, selectedStage, "Elements linking to this quest stage"); + + } + pane.revalidate(); + pane.repaint(); + } + + + public static class StagesListModel extends OrderedListenerListModel { + public StagesListModel(Quest quest) { + super(quest); + } + + @Override + protected List getItems() { + return source.stages; + } + + @Override + protected void setItems(List items) { + source.stages = items; + } + } + + + public static class StagesCellRenderer extends DefaultListCellRenderer { + private static final long serialVersionUID = 7987880146189575234L; + + @Override + public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (c instanceof JLabel) { + JLabel label = ((JLabel)c); + label.setText(((QuestStage)value).getDesc()); + label.setIcon(new ImageIcon(((QuestStage)value).getIcon())); + } + return c; + } + } + + + public class QuestFieldUpdater implements FieldUpdateListener { + + @Override + public void valueChanged(JComponent source, Object value) { + Quest quest = (Quest) target; + if (source == idField) { + //Events caused by cancel an ID edition. Dismiss. + if (skipNext) { + skipNext = false; + return; + } + if (target.id.equals((String) value)) return; + + if (idChanging()) { + quest.id = (String) value; + QuestEditor.this.name = quest.getDesc(); + quest.childrenChanged(new ArrayList()); + ATContentStudio.frame.editorChanged(QuestEditor.this); + } else { + cancelIdEdit(idField); + return; + } + } else if (source == nameField) { + quest.name = (String) value; + QuestEditor.this.name = quest.getDesc(); + quest.childrenChanged(new ArrayList()); + ATContentStudio.frame.editorChanged(QuestEditor.this); + } else if (source == visibleBox) { + quest.visible_in_log = (Integer) value; + } else if (source == progressField) { + selectedStage.progress = (Integer) value; + stagesListModel.itemChanged(selectedStage); + } else if (source == logTextField) { + selectedStage.log_text = (String) value; + stagesListModel.itemChanged(selectedStage); + } else if (source == xpRewardField) { + selectedStage.exp_reward = (Integer) value; + stagesListModel.itemChanged(selectedStage); + } else if (source == finishQuestBox) { + selectedStage.finishes_quest = (Integer) value; + stagesListModel.itemChanged(selectedStage); + } + + + if (quest.state != GameDataElement.State.modified) { + quest.state = GameDataElement.State.modified; + QuestEditor.this.name = quest.getDesc(); + quest.childrenChanged(new ArrayList()); + ATContentStudio.frame.editorChanged(QuestEditor.this); + } + updateJsonViewText(quest.toJsonString()); + } + + + } + + +} diff --git a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java index d24adf3..73c5841 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java @@ -1147,7 +1147,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe } } - public class ReplacementsListModel extends CustomListModel { + public class ReplacementsListModel extends OrderedListenerListModel { public ReplacementsListModel(ReplaceArea area) { super(area); } @@ -1242,7 +1242,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe } } - public class MapObjectsListModel extends CustomListModel { + public class MapObjectsListModel extends OrderedListenerListModel { public MapObjectsListModel(MapObjectGroup group) { super(group); } @@ -1272,7 +1272,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe } - public class SpawnGroupNpcListModel extends CustomListModel { + public class SpawnGroupNpcListModel extends OrderedListenerListModel { public SpawnGroupNpcListModel(SpawnArea area) { super(area); } diff --git a/src/com/gpl/rpg/atcontentstudio/utils/UiUtils.java b/src/com/gpl/rpg/atcontentstudio/utils/UiUtils.java index 05143df..779e74d 100644 --- a/src/com/gpl/rpg/atcontentstudio/utils/UiUtils.java +++ b/src/com/gpl/rpg/atcontentstudio/utils/UiUtils.java @@ -4,7 +4,7 @@ import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement; import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel; -import com.gpl.rpg.atcontentstudio.ui.CustomListModel; +import com.gpl.rpg.atcontentstudio.ui.OrderedListenerListModel; import com.gpl.rpg.atcontentstudio.ui.DefaultIcons; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; import com.jidesoft.swing.JideBoxLayout; @@ -19,19 +19,19 @@ public class UiUtils { public JList list; } - public static > CollapsibleItemListCreation getCollapsibleItemList(FieldUpdateListener listener, - M itemsListModel, - BasicLambda selectedItemReset, - BasicLambdaWithArg setSelectedItem, - BasicLambdaWithReturn selectedItem, - BasicLambdaWithArg valueChanged, - BasicLambdaWithArg updateEditorPane, - boolean writable, - Supplier tempSupplier, - DefaultListCellRenderer cellRenderer, - String title, - BasicLambdaWithArgAndReturn getReferencedObj, - boolean withMoveButtons) { + public static > CollapsibleItemListCreation getCollapsibleItemList(FieldUpdateListener listener, + M itemsListModel, + BasicLambda selectedItemReset, + BasicLambdaWithArg setSelectedItem, + BasicLambdaWithReturn selectedItem, + BasicLambdaWithArg valueChanged, + BasicLambdaWithArg updateEditorPane, + boolean writable, + Supplier tempSupplier, + DefaultListCellRenderer cellRenderer, + String title, + BasicLambdaWithArgAndReturn getReferencedObj, + boolean withMoveButtons) { CollapsiblePanel itemsPane = new CollapsiblePanel(title); itemsPane.setLayout(new JideBoxLayout(itemsPane, JideBoxLayout.PAGE_AXIS)); final JList itemsList = new JList<>(itemsListModel); @@ -90,7 +90,7 @@ public class UiUtils { }; } - private static > void addRemoveAndAddButtons(FieldUpdateListener listener, M itemsListModel, BasicLambda selectedItemReset, BasicLambdaWithReturn selectedItem, Supplier tempSupplier, JButton createBtn, JList itemsList, JPanel listButtonsPane, JButton deleteBtn) { + private static > void addRemoveAndAddButtons(FieldUpdateListener listener, M itemsListModel, BasicLambda selectedItemReset, BasicLambdaWithReturn selectedItem, Supplier tempSupplier, JButton createBtn, JList itemsList, JPanel listButtonsPane, JButton deleteBtn) { createBtn.addActionListener(e -> { E tempItem = tempSupplier.get(); itemsListModel.addItem(tempItem); @@ -110,7 +110,7 @@ public class UiUtils { listButtonsPane.add(deleteBtn, JideBoxLayout.FIX); } - private static > void addMoveButtonListeners(FieldUpdateListener listener, M itemsListModel, BasicLambdaWithReturn selectedItem, JButton moveUpBtn, JList itemsList, JPanel listButtonsPane, JButton moveDownBtn) { + private static > void addMoveButtonListeners(FieldUpdateListener listener, M itemsListModel, BasicLambdaWithReturn selectedItem, JButton moveUpBtn, JList itemsList, JPanel listButtonsPane, JButton moveDownBtn) { moveUpBtn.addActionListener(e -> { if (selectedItem.doIt() != null) { itemsListModel.moveUp(selectedItem.doIt());