diff --git a/src/com/gpl/rpg/atcontentstudio/img/bonemeal.png b/src/com/gpl/rpg/atcontentstudio/img/bonemeal.png new file mode 100644 index 0000000..84a5305 Binary files /dev/null and b/src/com/gpl/rpg/atcontentstudio/img/bonemeal.png differ diff --git a/src/com/gpl/rpg/atcontentstudio/img/timer.png b/src/com/gpl/rpg/atcontentstudio/img/timer.png new file mode 100644 index 0000000..eb897a4 Binary files /dev/null and b/src/com/gpl/rpg/atcontentstudio/img/timer.png differ diff --git a/src/com/gpl/rpg/atcontentstudio/img/ui_icon_skill.png b/src/com/gpl/rpg/atcontentstudio/img/ui_icon_skill.png new file mode 100644 index 0000000..4322852 Binary files /dev/null and b/src/com/gpl/rpg/atcontentstudio/img/ui_icon_skill.png differ diff --git a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java index 8294c64..0321d1c 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java +++ b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java @@ -56,9 +56,54 @@ public class Requirement extends JSONElement { hasActorCondition } + public enum SkillID { + weaponChance + ,weaponDmg + ,barter + ,dodge + ,barkSkin + ,moreCriticals + ,betterCriticals + ,speed // Raises max ap + ,coinfinder + ,moreExp + ,cleave // +10ap on kill + ,eater // +1hp per kill + ,fortitude // +N hp per levelup + ,evasion // increase successful flee chance & reduce chance of monster attack + ,regeneration // +N hp per round + ,lowerExploss + ,magicfinder + ,resistanceMental // lowers chance to get negative active conditions by monsters (Mental like Dazed) + ,resistancePhysical // lowers chance to get negative active conditions by monsters (Physical Capacity like Minor fatigue) + ,resistanceBlood // lowers chance to get negative active conditions by monsters (Blood Disorder like Weak Poison) + ,shadowBless + ,crit1 // lowers atk ability + ,crit2 // lowers def ability ,rejuvenation // Reduces magnitudes of conditions + ,rejuvenation // Reduces magnitudes of conditions + ,taunt // Causes AP loss of attackers that miss + ,concussion // AC loss for monsters with (AC-BC)>N + ,weaponProficiencyDagger + ,weaponProficiency1hsword + ,weaponProficiency2hsword + ,weaponProficiencyAxe + ,weaponProficiencyBlunt + ,weaponProficiencyUnarmed + ,armorProficiencyShield + ,armorProficiencyUnarmored + ,armorProficiencyLight + ,armorProficiencyHeavy + ,fightstyleDualWield + ,fightstyle2hand + ,fightstyleWeaponShield + ,specializationDualWield + ,specialization2hand + ,specializationWeaponShield + } + @Override public String getDesc() { - return ((negated != null && negated) ? "NOT " : "")+required_obj_id+(required_value == null ? "" : ":"+required_value.toString()); + return ((negated != null && negated) ? "NOT " : "")+(type == null ? "" : type.toString()+":")+required_obj_id+(required_value == null ? "" : ":"+required_value.toString()); } @Override diff --git a/src/com/gpl/rpg/atcontentstudio/ui/DefaultIcons.java b/src/com/gpl/rpg/atcontentstudio/ui/DefaultIcons.java index c2fc23a..a7512be 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/DefaultIcons.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/DefaultIcons.java @@ -107,6 +107,10 @@ public class DefaultIcons { public static Image getNPCImage() { return getImage(NPC_RES); } public static Image getNPCIcon() { return getIcon(NPC_RES); } + private static String BONEMEAL_RES = "/com/gpl/rpg/atcontentstudio/img/bonemeal.png"; + public static Image getBonemealImage() { return getImage(BONEMEAL_RES); } + public static Image getBonemealIcon() { return getIcon(BONEMEAL_RES); } + private static String NPC_CLOSE_RES = "/com/gpl/rpg/atcontentstudio/img/npc_close.png"; public static Image getNPCCloseImage() { return getImage(NPC_CLOSE_RES); } public static Image getNPCCloseIcon() { return getIcon(NPC_CLOSE_RES); } @@ -130,6 +134,10 @@ public class DefaultIcons { private static String GOLD_RES = "/com/gpl/rpg/atcontentstudio/img/ui_icon_coins.png"; public static Image getGoldImage() { return getImage(GOLD_RES); } public static Image getGoldIcon() { return getIcon(GOLD_RES); } + + private static String SKILL_RES = "/com/gpl/rpg/atcontentstudio/img/ui_icon_skill.png"; + public static Image getSkillImage() { return getImage(SKILL_RES); } + public static Image getSkillIcon() { return getIcon(SKILL_RES); } private static String ITEM_CATEGORY_RES = "/com/gpl/rpg/atcontentstudio/img/equip_weapon.png"; public static Image getItemCategoryImage() { return getImage(ITEM_CATEGORY_RES); } @@ -235,6 +243,10 @@ public class DefaultIcons { public static Image getZoomImage() { return getImage(ZOOM_RES); } public static Image getZoomIcon() { return getIcon(ZOOM_RES); } + private static String TIMER_RES = "/com/gpl/rpg/atcontentstudio/img/timer.png"; + public static Image getTimerImage() { return getImage(TIMER_RES); } + public static Image getTimerIcon() { return getIcon(TIMER_RES); } + private static String STATUS_RED_RES = "/com/gpl/rpg/atcontentstudio/img/status_red.png"; public static Image getStatusRedImage() { return getImage(STATUS_RED_RES); } public static Image getStatusRedIcon() { return getIcon(STATUS_RED_RES); } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java index d8c5922..ca8134e 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java @@ -114,6 +114,7 @@ public class DialogueEditor extends JSONElementEditor { private JComboBox requirementTypeCombo; private JPanel requirementParamsPane; private MyComboBox requirementObj; + private JComboBox requirementSkill; private JTextField requirementObjId; private JComponent requirementValue; private BooleanBasedCheckBox requirementNegated; @@ -684,8 +685,13 @@ public class DialogueEditor extends JSONElementEditor { requirementValue = addQuestStageBox(pane, project, "Quest stage: ", requirement.required_value, writable, listener, (Quest) requirement.required_obj, requirementObj); break; case skillLevel: + Requirement.SkillID skillId = null; + try { + skillId = requirement.required_obj_id == null ? null : Requirement.SkillID.valueOf(requirement.required_obj_id); + } catch(IllegalArgumentException e) {} requirementObj = null; - requirementObjId = addTextField(pane, "Skill ID:", requirement.required_obj_id, writable, listener); + requirementSkill = addEnumValueBox(pane, "Skill ID:", Requirement.SkillID.values(), skillId, writable, listener); + requirementObjId = null;//addTextField(pane, "Skill ID:", requirement.required_obj_id, writable, listener); requirementValue = addIntegerField(pane, "Level: ", requirement.required_value, false, writable, listener); break; case timerElapsed: @@ -1071,7 +1077,16 @@ public class DialogueEditor extends JSONElementEditor { if (req.required_obj.getIcon() != null) { label.setIcon(new ImageIcon(req.required_obj.getIcon())); } - } if (req.type == null) { + } else if (req.type == Requirement.RequirementType.skillLevel) { + label.setIcon(new ImageIcon(DefaultIcons.getSkillIcon())); + } else if (req.type == Requirement.RequirementType.spentGold) { + label.setIcon(new ImageIcon(DefaultIcons.getGoldIcon())); + } else if (req.type == Requirement.RequirementType.consumedBonemeals) { + label.setIcon(new ImageIcon(DefaultIcons.getBonemealIcon())); + } else if (req.type == Requirement.RequirementType.timerElapsed) { + label.setIcon(new ImageIcon(DefaultIcons.getTimerIcon())); + } + if (req.type == null) { label.setText("New, undefined requirement."); } } @@ -1205,6 +1220,15 @@ public class DialogueEditor extends JSONElementEditor { selectedRequirement.required_obj_id = null; } requirementsListModel.itemChanged(selectedRequirement); + } else if (source == requirementSkill) { + if (selectedRequirement.required_obj != null) { + selectedRequirement.required_obj.removeBacklink(dialogue); + selectedRequirement.required_obj = null; + } + if (selectedRequirement.type == Requirement.RequirementType.skillLevel) { + selectedRequirement.required_obj_id = value == null ? null : value.toString(); + } + requirementsListModel.itemChanged(selectedRequirement); } else if (source == requirementObjId) { selectedRequirement.required_obj_id = (String) value; selectedRequirement.required_obj = null; diff --git a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java index 2aa5ac4..87a5c00 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java @@ -697,8 +697,12 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe requirementValue = addQuestStageBox(pane, project, "Quest stage: ", requirement.required_value, writable, listener, (Quest) requirement.required_obj, requirementObj); break; case skillLevel: - requirementObj = null; - requirementObjId = addTextField(pane, "Skill ID:", requirement.required_obj_id, writable, listener); + Requirement.SkillID skillId = null; + try { + skillId = requirement.required_obj_id == null ? null : Requirement.SkillID.valueOf(requirement.required_obj_id); + } catch(IllegalArgumentException e) {} + requirementObj = addEnumValueBox(pane, "Skill ID:", Requirement.SkillID.values(), skillId, writable, listener); + requirementObjId = null;//addTextField(pane, "Skill ID:", requirement.required_obj_id, writable, listener); requirementValue = addIntegerField(pane, "Level: ", requirement.required_value, false, writable, listener); break; case timerElapsed: @@ -2006,11 +2010,15 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe } else if (source == requirementObj) { if (selectedMapObject instanceof KeyArea) { KeyArea area = (KeyArea) selectedMapObject; - area.requirement.required_obj = (GameDataElement) value; - if (area.requirement.required_obj != null) { - area.requirement.required_obj_id = area.requirement.required_obj.id; + if (area.requirement.type == Requirement.RequirementType.skillLevel) { + area.requirement.required_obj_id = value == null ? null : value.toString(); } else { - area.requirement.required_obj_id = null; + area.requirement.required_obj = (GameDataElement) value; + if (area.requirement.required_obj != null) { + area.requirement.required_obj_id = area.requirement.required_obj.id; + } else { + area.requirement.required_obj_id = null; + } } if (area.oldSchoolRequirement) { area.updateNameFromRequirementChange(); @@ -2019,11 +2027,15 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe } } else if (selectedMapObject instanceof ReplaceArea) { ReplaceArea area = (ReplaceArea) selectedMapObject; - area.requirement.required_obj = (GameDataElement) value; - if (area.requirement.required_obj != null) { - area.requirement.required_obj_id = area.requirement.required_obj.id; + if (area.requirement.type == Requirement.RequirementType.skillLevel) { + area.requirement.required_obj_id = value == null ? null : value.toString(); } else { - area.requirement.required_obj_id = null; + area.requirement.required_obj = (GameDataElement) value; + if (area.requirement.required_obj != null) { + area.requirement.required_obj_id = area.requirement.required_obj.id; + } else { + area.requirement.required_obj_id = null; + } } if (area.oldSchoolRequirement) { area.updateNameFromRequirementChange(); diff --git a/src/com/gpl/rpg/atcontentstudio/utils/DesktopIntegration.java b/src/com/gpl/rpg/atcontentstudio/utils/DesktopIntegration.java index 8505652..91ae199 100644 --- a/src/com/gpl/rpg/atcontentstudio/utils/DesktopIntegration.java +++ b/src/com/gpl/rpg/atcontentstudio/utils/DesktopIntegration.java @@ -18,7 +18,7 @@ public class DesktopIntegration { } } else { try { - Runtime.getRuntime().exec(Workspace.activeWorkspace.settings.mapEditorCommand.getCurrentValue()+" "+f.getAbsolutePath()); + Runtime.getRuntime().exec(Workspace.activeWorkspace.settings.mapEditorCommand.getCurrentValue()+" \""+f.getAbsolutePath()+"\""); } catch (IOException e) { e.printStackTrace(); } @@ -40,7 +40,7 @@ public class DesktopIntegration { } } else { try { - Runtime.getRuntime().exec(Workspace.activeWorkspace.settings.imageEditorCommand.getCurrentValue()+" "+f.getAbsolutePath()); + Runtime.getRuntime().exec(Workspace.activeWorkspace.settings.imageEditorCommand.getCurrentValue()+" \""+f.getAbsolutePath()+"\""); } catch (IOException e) { e.printStackTrace(); }