From b3c8879be167fe4fc750a32b5885c1716601e157 Mon Sep 17 00:00:00 2001 From: Gonk Date: Mon, 8 Jul 2019 22:27:23 +0200 Subject: [PATCH 01/11] added pole weapon proficiency --- src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java index 98ccbc8..ad2f7c9 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java +++ b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java @@ -101,6 +101,7 @@ public class Requirement extends JSONElement { ,specializationDualWield ,specialization2hand ,specializationWeaponShield + ,weaponProficiencyPole } @Override From 20877f7850ee3514f0f9cb64b141040a16fdc90e Mon Sep 17 00:00:00 2001 From: Gonk Date: Thu, 11 Jul 2019 21:21:10 +0200 Subject: [PATCH 02/11] Changed the order for the pole weapon proficency --- src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java index ad2f7c9..321d10b 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java +++ b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java @@ -91,6 +91,7 @@ public class Requirement extends JSONElement { ,weaponProficiencyAxe ,weaponProficiencyBlunt ,weaponProficiencyUnarmed + ,weaponProficiencyPole ,armorProficiencyShield ,armorProficiencyUnarmored ,armorProficiencyLight @@ -101,7 +102,6 @@ public class Requirement extends JSONElement { ,specializationDualWield ,specialization2hand ,specializationWeaponShield - ,weaponProficiencyPole } @Override From 7297f47b67d0d39ad4e179ec3017fa80b322974c Mon Sep 17 00:00:00 2001 From: Gonk Date: Wed, 4 Sep 2019 23:33:41 +0200 Subject: [PATCH 03/11] read and write po files using utf 8 encoding until now the system default was used, which is especially on windows not utf 8 --- .../rpg/atcontentstudio/model/tools/i18n/PoPotWriter.java | 5 ++++- src/net/launchpad/tobal/poparser/POParser.java | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/com/gpl/rpg/atcontentstudio/model/tools/i18n/PoPotWriter.java b/src/com/gpl/rpg/atcontentstudio/model/tools/i18n/PoPotWriter.java index 9a836e8..faee965 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/tools/i18n/PoPotWriter.java +++ b/src/com/gpl/rpg/atcontentstudio/model/tools/i18n/PoPotWriter.java @@ -1,9 +1,12 @@ package com.gpl.rpg.atcontentstudio.model.tools.i18n; import java.io.File; +import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; +import java.io.OutputStreamWriter; import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -17,7 +20,7 @@ public class PoPotWriter { public static void writePoFile(Map> stringsResources, Map translations, File destination) { try { - FileWriter fw = new FileWriter(destination); + Writer fw = new OutputStreamWriter(new FileOutputStream(destination), StandardCharsets.UTF_8); if (translations.get("") != null) { fw.write(translations.get("")); writeEndOfEntry(fw); diff --git a/src/net/launchpad/tobal/poparser/POParser.java b/src/net/launchpad/tobal/poparser/POParser.java index ec315f1..1fee0cc 100644 --- a/src/net/launchpad/tobal/poparser/POParser.java +++ b/src/net/launchpad/tobal/poparser/POParser.java @@ -12,6 +12,8 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.Vector; public class POParser @@ -60,11 +62,9 @@ public class POParser POFile result = null; try { - FileReader fr = new FileReader(file); - BufferedReader br = new BufferedReader(fr); + BufferedReader br = Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8); result = parse(br); br.close(); - fr.close(); } catch (java.io.FileNotFoundException e) { From 811870184ba22a349231a1c72c50b414f4fa8f47 Mon Sep 17 00:00:00 2001 From: Gonk Date: Sun, 13 Oct 2019 17:57:41 +0200 Subject: [PATCH 04/11] factionscoreEquals --- .../rpg/atcontentstudio/model/gamedata/Requirement.java | 4 +++- .../atcontentstudio/ui/gamedataeditors/DialogueEditor.java | 7 ++++++- src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java index 98ccbc8..6baea9c 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java +++ b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java @@ -55,7 +55,8 @@ public class Requirement extends JSONElement { consumedBonemeals, hasActorCondition, factionScore, - random + random, + factionScoreEquals } public enum SkillID { @@ -186,6 +187,7 @@ public class Requirement extends JSONElement { case spentGold: case timerElapsed: case factionScore: + case factionScoreEquals: case random: break; } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java index 07560c7..4af6a40 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java @@ -770,6 +770,11 @@ public class DialogueEditor extends JSONElementEditor { requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener); requirementValue = addIntegerField(pane, "Minimum score: ", requirement.required_value, true, writable, listener); break; + case factionScoreEquals: + requirementObj = null; + requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener); + requirementValue = addIntegerField(pane, "Exact value: ", requirement.required_value, true, writable, listener); + break; case wear: requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener); requirementObjId = null; @@ -1174,7 +1179,7 @@ public class DialogueEditor extends JSONElementEditor { label.setIcon(new ImageIcon(DefaultIcons.getBonemealIcon())); } else if (req.type == Requirement.RequirementType.timerElapsed) { label.setIcon(new ImageIcon(DefaultIcons.getTimerIcon())); - } else if (req.type == Requirement.RequirementType.factionScore) { + } else if (req.type == Requirement.RequirementType.factionScore || req.type == Requirement.RequirementType.factionScoreEquals) { label.setIcon(new ImageIcon(DefaultIcons.getAlignmentIcon())); } if (req.type == null) { diff --git a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java index 93947f1..6a4e36c 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java @@ -722,6 +722,11 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener); requirementValue = addIntegerField(pane, "Minimum score: ", requirement.required_value, true, writable, listener); break; + case factionScoreEquals: + requirementObj = null; + requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener); + requirementValue = addIntegerField(pane, "Exact value: ", requirement.required_value, true, writable, listener); + break; case wear: requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener); requirementObjId = null; From d7e83575e3a5ea14a757ece5944af61f66aa7a7f Mon Sep 17 00:00:00 2001 From: Gonk Date: Mon, 11 Nov 2019 21:53:25 +0100 Subject: [PATCH 05/11] wearRemove requirement wear and wearRemove behave similar and wear now also requires the value property --- .../rpg/atcontentstudio/model/gamedata/Requirement.java | 9 +++++++-- .../ui/gamedataeditors/DialogueEditor.java | 7 ++----- src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java | 7 ++----- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java index 98ccbc8..6913cdd 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java +++ b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java @@ -26,10 +26,13 @@ public class Requirement extends JSONElement { countedItemTypes.add(RequirementType.inventoryRemove); countedItemTypes.add(RequirementType.inventoryKeep); countedItemTypes.add(RequirementType.usedItem); + countedItemTypes.add(RequirementType.wear); + countedItemTypes.add(RequirementType.wearRemove); COMPATIBLE_TYPES.put(RequirementType.inventoryRemove, countedItemTypes); COMPATIBLE_TYPES.put(RequirementType.inventoryKeep, countedItemTypes); COMPATIBLE_TYPES.put(RequirementType.usedItem, countedItemTypes); - + COMPATIBLE_TYPES.put(RequirementType.wear, countedItemTypes); + COMPATIBLE_TYPES.put(RequirementType.wearRemove, countedItemTypes); } //Available from parsed state @@ -55,7 +58,8 @@ public class Requirement extends JSONElement { consumedBonemeals, hasActorCondition, factionScore, - random + random, + wearRemove } public enum SkillID { @@ -166,6 +170,7 @@ public class Requirement extends JSONElement { case inventoryRemove: case usedItem: case wear: + case wearRemove: this.required_obj = proj.getItem(required_obj_id); break; case killedMonster: diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java index 07560c7..05856bf 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java @@ -735,6 +735,8 @@ public class DialogueEditor extends JSONElementEditor { case inventoryKeep: case inventoryRemove: case usedItem: + case wear: + case wearRemove: requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener); requirementObjId = null; requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener); @@ -770,11 +772,6 @@ public class DialogueEditor extends JSONElementEditor { requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener); requirementValue = addIntegerField(pane, "Minimum score: ", requirement.required_value, true, writable, listener); break; - case wear: - requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener); - requirementObjId = null; - requirementValue = null; - break; } requirementNegated = addBooleanBasedCheckBox(pane, "Negate this requirement.", requirement.negated, writable, listener); } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java index 93947f1..65d7536 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java @@ -688,6 +688,8 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe case inventoryKeep: case inventoryRemove: case usedItem: + case wear: + case wearRemove: requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener); requirementObjId = null; requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener); @@ -722,11 +724,6 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener); requirementValue = addIntegerField(pane, "Minimum score: ", requirement.required_value, true, writable, listener); break; - case wear: - requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener); - requirementObjId = null; - requirementValue = null; - break; } } requirementNegated = addBooleanBasedCheckBox(pane, "Negate this requirement.", requirement.negated, writable, listener); From 7d40d56430c5098a0ab4d1ba53be859b8cf25324 Mon Sep 17 00:00:00 2001 From: Gonk Date: Thu, 26 Dec 2019 21:05:39 +0100 Subject: [PATCH 06/11] The damage modifier can now be edited, also added "on hit received" columns to the items comparator --- .../atcontentstudio/model/gamedata/Item.java | 6 +- .../ui/gamedataeditors/ItemEditor.java | 7 ++ .../ui/tools/ItemsTableView.java | 116 +++++++++++------- 3 files changed, 85 insertions(+), 44 deletions(-) diff --git a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Item.java b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Item.java index 03d0e6f..e40afb5 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Item.java +++ b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Item.java @@ -83,6 +83,7 @@ public class Item extends JSONElement { public Integer increase_block_chance = null; public Integer increase_damage_resistance = null; public Double critical_multiplier = null; + public Integer damage_modifier = null; } public static class ConditionEffect { @@ -202,7 +203,8 @@ public class Item extends JSONElement { //TODO correct game data, to unify format. // this.equip_effect.critical_multiplier = JSONElement.getDouble((Number) equipEffect.get("setCriticalMultiplier")); if (equipEffect.get("setCriticalMultiplier") != null) this.equip_effect.critical_multiplier = JSONElement.getDouble(Double.parseDouble(equipEffect.get("setCriticalMultiplier").toString())); - + this.equip_effect.damage_modifier = JSONElement.getInteger((Number) equipEffect.get("setDamageModifier")); + List conditionsJson = (List) equipEffect.get("addedConditions"); if (conditionsJson != null && !conditionsJson.isEmpty()) { this.equip_effect.conditions = new ArrayList(); @@ -426,6 +428,7 @@ public class Item extends JSONElement { clone.has_manual_price = this.has_manual_price; if (this.equip_effect != null) { clone.equip_effect = new EquipEffect(); + clone.equip_effect.damage_modifier = this.equip_effect.damage_modifier; clone.equip_effect.critical_multiplier = this.equip_effect.critical_multiplier; clone.equip_effect.damage_boost_max = this.equip_effect.damage_boost_max; clone.equip_effect.damage_boost_min = this.equip_effect.damage_boost_min; @@ -642,6 +645,7 @@ public class Item extends JSONElement { if (this.equip_effect.increase_block_chance != null) equipEffectJson.put("increaseBlockChance", this.equip_effect.increase_block_chance); if (this.equip_effect.increase_damage_resistance != null) equipEffectJson.put("increaseDamageResistance", this.equip_effect.increase_damage_resistance); if (this.equip_effect.critical_multiplier != null) equipEffectJson.put("setCriticalMultiplier", this.equip_effect.critical_multiplier); + if (this.equip_effect.damage_modifier != null) equipEffectJson.put("setDamageModifier", this.equip_effect.damage_modifier); if (this.equip_effect.conditions != null) { List conditionsJson = new ArrayList(); equipEffectJson.put("addedConditions", conditionsJson); diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java index 11434b6..6f8c00a 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java @@ -82,6 +82,7 @@ public class ItemEditor extends JSONElementEditor { private JSpinner equipBoostBC; private JSpinner equipBoostCS; private JSpinner equipSetCM; + private JSpinner equipSetDM; private JSpinner equipBoostDR; private JSpinner equipIncMoveCost; private JSpinner equipIncUseCost; @@ -217,6 +218,7 @@ public class ItemEditor extends JSONElementEditor { } 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, 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); @@ -1431,6 +1433,7 @@ public class ItemEditor extends JSONElementEditor { 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; @@ -1619,6 +1622,10 @@ public class ItemEditor extends JSONElementEditor { 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; diff --git a/src/com/gpl/rpg/atcontentstudio/ui/tools/ItemsTableView.java b/src/com/gpl/rpg/atcontentstudio/ui/tools/ItemsTableView.java index 834a448..448cd43 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/tools/ItemsTableView.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/tools/ItemsTableView.java @@ -37,7 +37,7 @@ public class ItemsTableView extends ElementTableView { @Override public int getColumnCount() { - return 33; + return 43; } @Override @@ -62,20 +62,30 @@ public class ItemsTableView extends ElementTableView { case 16: return "On kill - AP min"; case 17: return "On kill - AP max"; case 18: return "On kill - # conditions"; - case 19: return "AD min"; - case 20: return "AD max"; - case 21: return "Max HP"; - case 22: return "Max AP"; - case 23: return "Attack cost"; - case 24: return "AC"; - case 25: return "BC"; - case 26: return "DR"; - case 27: return "CS"; - case 28: return "CM"; - case 29: return "Move cost"; - case 30: return "Use cost"; - case 31: return "Reequip cost"; - case 32: return "# conditions"; + case 19: return "On hit recv - HP min"; + case 20: return "On hit recv - HP max"; + case 21: return "On hit recv - AP min"; + case 22: return "On hit recv - AP max"; + case 23: return "On hit recv - # conditions"; + case 24: return "On hit recv - Tgt HP min"; + case 25: return "On hit recv - Tgt HP max"; + case 26: return "On hit recv - Tgt AP min"; + case 27: return "On hit recv - Tgt AP max"; + case 28: return "AD min"; + case 29: return "AD max"; + case 30: return "Damage modifier"; + case 31: return "Max HP"; + case 32: return "Max AP"; + case 33: return "Attack cost"; + case 34: return "AC"; + case 35: return "BC"; + case 36: return "DR"; + case 37: return "CS"; + case 38: return "CM"; + case 39: return "Move cost"; + case 40: return "Use cost"; + case 41: return "Reequip cost"; + case 42: return "# conditions"; } return null; } @@ -103,20 +113,30 @@ public class ItemsTableView extends ElementTableView { case 16: return Integer.class;//"On kill - AP min"; case 17: return Integer.class;//"On kill - AP max"; case 18: return Integer.class;//"On kill - # conditions"; - case 19: return Integer.class;//"AD min"; - case 20: return Integer.class;//"AD max"; - case 21: return Integer.class;//"Max HP"; - case 22: return Integer.class;//"Max AP"; - case 23: return Integer.class;//"Attack cost"; - case 24: return Integer.class;//"AC"; - case 25: return Integer.class;//"BC"; - case 26: return Integer.class;//"DR"; - case 27: return Integer.class;//"CS"; - case 28: return Double.class;//"CM"; - case 29: return Integer.class;//"Move cost"; - case 30: return Integer.class;//"Use cost"; - case 31: return Integer.class;//"Reequip cost"; - case 32: return Integer.class;//"# conditions"; + case 19: return Integer.class;//"On hit recv - HP min"; + case 20: return Integer.class;//"On hit recv - HP max"; + case 21: return Integer.class;//"On hit recv - AP min"; + case 22: return Integer.class;//"On hit recv - AP max"; + case 23: return Integer.class;//"On hit recv - # conditions"; + case 24: return Integer.class;//"On hit recv - Tgt HP min"; + case 25: return Integer.class;//"On hit recv - Tgt HP max"; + case 26: return Integer.class;//"On hit recv - Tgt AP min"; + case 27: return Integer.class;//"On hit recv - Tgt AP max"; + case 28: return Integer.class;//"AD min"; + case 29: return Integer.class;//"AD max"; + case 30: return Integer.class;//"Damage modifier"; + case 31: return Integer.class;//"Max HP"; + case 32: return Integer.class;//"Max AP"; + case 33: return Integer.class;//"Attack cost"; + case 34: return Integer.class;//"AC"; + case 35: return Integer.class;//"BC"; + case 36: return Integer.class;//"DR"; + case 37: return Integer.class;//"CS"; + case 38: return Double.class;//"CM"; + case 39: return Integer.class;//"Move cost"; + case 40: return Integer.class;//"Use cost"; + case 41: return Integer.class;//"Reequip cost"; + case 42: return Integer.class;//"# conditions"; } return null; } @@ -177,20 +197,30 @@ public class ItemsTableView extends ElementTableView { case 16: return (!canUse && item.kill_effect != null) ? item.kill_effect.ap_boost_min : null;//"On kill - AP min"; case 17: return (!canUse && item.kill_effect != null) ? item.kill_effect.ap_boost_max : null;//"On kill - AP max"; case 18: return (!canUse && item.kill_effect != null && item.kill_effect.conditions_source != null) ? item.kill_effect.conditions_source.size() : null;//"On kill - # conditions"; - case 19: return (canEquip && item.equip_effect != null) ? item.equip_effect.damage_boost_min : null;//"AD min"; - case 20: return (canEquip && item.equip_effect != null) ? item.equip_effect.damage_boost_max : null;//"AD max"; - case 21: return (canEquip && item.equip_effect != null) ? item.equip_effect.max_hp_boost : null;//"Max HP"; - case 22: return (canEquip && item.equip_effect != null) ? item.equip_effect.max_ap_boost : null;//"Max AP"; - case 23: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_attack_cost : null;//"Attack cost"; - case 24: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_attack_chance : null;//"AC"; - case 25: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_block_chance : null;//"BC"; - case 26: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_damage_resistance : null;//"DR"; - case 27: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_critical_skill : null;//"CS"; - case 28: return (canEquip && item.equip_effect != null) ? item.equip_effect.critical_multiplier : null;//"CM"; - case 29: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_move_cost : null;//"Move cost"; - case 30: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_use_item_cost : null;//"Use cost"; - case 31: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_reequip_cost : null;//"Reequip cost"; - case 32: return (canEquip && item.equip_effect != null && item.equip_effect.conditions != null) ? item.equip_effect.conditions.size() : null;//"# conditions"; + case 19: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.hp_boost_min : null;//"On hit recv - HP min"; + case 20: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.hp_boost_max : null;//"On hit recv - HP max"; + case 21: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.ap_boost_min : null;//"On hit recv - AP min"; + case 22: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.ap_boost_max : null;//"On hit recv - AP max"; + case 23: return (!canUse && item.hit_received_effect != null && item.hit_received_effect.conditions_source != null) ? item.hit_received_effect.conditions_source.size() : null;//"On hit recv - # conditions"; + case 24: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.hp_boost_min : null;//"On hit recv - Tgt HP min"; + case 25: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.hp_boost_max : null;//"On hit recv - Tgt HP max"; + case 26: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.ap_boost_min : null;//"On hit recv - Tgt AP min"; + case 27: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.ap_boost_max : null;//"On hit recv - Tgt AP max"; + case 28: return (canEquip && item.equip_effect != null) ? item.equip_effect.damage_boost_min : null;//"AD min"; + case 29: return (canEquip && item.equip_effect != null) ? item.equip_effect.damage_boost_max : null;//"AD max"; + case 30: return (canEquip && item.equip_effect != null) ? item.equip_effect.damage_modifier : null;//"Damage modifier"; + case 31: return (canEquip && item.equip_effect != null) ? item.equip_effect.max_hp_boost : null;//"Max HP"; + case 32: return (canEquip && item.equip_effect != null) ? item.equip_effect.max_ap_boost : null;//"Max AP"; + case 33: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_attack_cost : null;//"Attack cost"; + case 34: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_attack_chance : null;//"AC"; + case 35: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_block_chance : null;//"BC"; + case 36: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_damage_resistance : null;//"DR"; + case 37: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_critical_skill : null;//"CS"; + case 38: return (canEquip && item.equip_effect != null) ? item.equip_effect.critical_multiplier : null;//"CM"; + case 39: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_move_cost : null;//"Move cost"; + case 40: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_use_item_cost : null;//"Use cost"; + case 41: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_reequip_cost : null;//"Reequip cost"; + case 42: return (canEquip && item.equip_effect != null && item.equip_effect.conditions != null) ? item.equip_effect.conditions.size() : null;//"# conditions"; } return null; } From 2d92a976897031e45c339800692b9c34dedd74c0 Mon Sep 17 00:00:00 2001 From: Gonk Date: Thu, 20 Feb 2020 21:57:35 +0100 Subject: [PATCH 07/11] Named the damage modifier according to the AT sources --- src/com/gpl/rpg/atcontentstudio/model/gamedata/Item.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Item.java b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Item.java index e40afb5..853ffaa 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/gamedata/Item.java +++ b/src/com/gpl/rpg/atcontentstudio/model/gamedata/Item.java @@ -203,7 +203,7 @@ public class Item extends JSONElement { //TODO correct game data, to unify format. // this.equip_effect.critical_multiplier = JSONElement.getDouble((Number) equipEffect.get("setCriticalMultiplier")); if (equipEffect.get("setCriticalMultiplier") != null) this.equip_effect.critical_multiplier = JSONElement.getDouble(Double.parseDouble(equipEffect.get("setCriticalMultiplier").toString())); - this.equip_effect.damage_modifier = JSONElement.getInteger((Number) equipEffect.get("setDamageModifier")); + this.equip_effect.damage_modifier = JSONElement.getInteger((Number) equipEffect.get("setNonWeaponDamageModifier")); List conditionsJson = (List) equipEffect.get("addedConditions"); if (conditionsJson != null && !conditionsJson.isEmpty()) { @@ -218,6 +218,7 @@ public class Item extends JSONElement { } } + Map hitEffect = (Map) itemJson.get("hitEffect"); if (hitEffect != null) { this.hit_effect = new HitEffect(); @@ -645,7 +646,7 @@ public class Item extends JSONElement { if (this.equip_effect.increase_block_chance != null) equipEffectJson.put("increaseBlockChance", this.equip_effect.increase_block_chance); if (this.equip_effect.increase_damage_resistance != null) equipEffectJson.put("increaseDamageResistance", this.equip_effect.increase_damage_resistance); if (this.equip_effect.critical_multiplier != null) equipEffectJson.put("setCriticalMultiplier", this.equip_effect.critical_multiplier); - if (this.equip_effect.damage_modifier != null) equipEffectJson.put("setDamageModifier", this.equip_effect.damage_modifier); + if (this.equip_effect.damage_modifier != null) equipEffectJson.put("setNonWeaponDamageModifier", this.equip_effect.damage_modifier); if (this.equip_effect.conditions != null) { List conditionsJson = new ArrayList(); equipEffectJson.put("addedConditions", conditionsJson); From 4b6be99d98469a8211223d86a05e45e8535b6f17 Mon Sep 17 00:00:00 2001 From: Gonk Date: Tue, 25 Feb 2020 20:24:26 +0100 Subject: [PATCH 08/11] Changed damage modifier default value to 100% --- .../gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java | 2 +- src/com/gpl/rpg/atcontentstudio/ui/tools/ItemsTableView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java index 6f8c00a..55e8db3 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/ItemEditor.java @@ -218,7 +218,7 @@ public class ItemEditor extends JSONElementEditor { } 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, false, 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); diff --git a/src/com/gpl/rpg/atcontentstudio/ui/tools/ItemsTableView.java b/src/com/gpl/rpg/atcontentstudio/ui/tools/ItemsTableView.java index 448cd43..aa2383f 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/tools/ItemsTableView.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/tools/ItemsTableView.java @@ -73,7 +73,7 @@ public class ItemsTableView extends ElementTableView { case 27: return "On hit recv - Tgt AP max"; case 28: return "AD min"; case 29: return "AD max"; - case 30: return "Damage modifier"; + case 30: return "Damage modifier %"; case 31: return "Max HP"; case 32: return "Max AP"; case 33: return "Attack cost"; From 32e1b87e09f89af9bfba94ccbdb2841d246a0845 Mon Sep 17 00:00:00 2001 From: Gonk Date: Sun, 5 Apr 2020 20:46:03 +0200 Subject: [PATCH 09/11] Corrected linking of spritesheets in tmx - added or altered spritesheets are now linked with relative paths so that they can be committed to an ATCS project and don't have any unwanted path infomation included - when exporting the project all links to spritesheets are now changed to ../drawable/FILENAME.PNG --- hacked-libtiled/tiled/io/TMXMapWriter.java | 15 +++++- .../rpg/atcontentstudio/model/Project.java | 46 +++++++++++++++---- .../atcontentstudio/model/maps/TMXMap.java | 2 +- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/hacked-libtiled/tiled/io/TMXMapWriter.java b/hacked-libtiled/tiled/io/TMXMapWriter.java index d7b5335..bda0076 100644 --- a/hacked-libtiled/tiled/io/TMXMapWriter.java +++ b/hacked-libtiled/tiled/io/TMXMapWriter.java @@ -47,6 +47,9 @@ import java.util.Vector; import java.util.zip.DeflaterOutputStream; import java.util.zip.GZIPOutputStream; +import com.gpl.rpg.atcontentstudio.model.GameSource.Type; +import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet; + import tiled.core.AnimatedTile; import tiled.core.Map; import tiled.core.MapLayer; @@ -238,7 +241,11 @@ public class TMXMapWriter } else { w.startElement("tileset"); w.writeAttribute("firstgid", getFirstGidForTileset(set)); - w.writeAttribute("source", getRelativePath(wp, source)); + if (set.sheet.parent.getDataType() == Type.source) { + w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + set.getName()).replace("\\", "/")); + } else { + w.writeAttribute("source", getRelativePath(wp, source)); + } if (set.getBaseDir() != null) { w.writeAttribute("basedir", set.getBaseDir()); } @@ -279,7 +286,11 @@ public class TMXMapWriter if (tileBitmapFile != null) { w.startElement("image"); - w.writeAttribute("source", getRelativePath(wp, tileBitmapFile)); + if (set.sheet.parent.getDataType() == Type.source) { + w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + set.getName()).replace("\\", "/")); + } else { + w.writeAttribute("source", getRelativePath(wp, tileBitmapFile)); + } if (set.sheetDimensions != null) { w.writeAttribute("width", set.sheetDimensions.width); w.writeAttribute("height", set.sheetDimensions.height); diff --git a/src/com/gpl/rpg/atcontentstudio/model/Project.java b/src/com/gpl/rpg/atcontentstudio/model/Project.java index e8182ca..a6dab19 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/Project.java +++ b/src/com/gpl/rpg/atcontentstudio/model/Project.java @@ -11,6 +11,10 @@ import java.io.IOException; import java.io.Serializable; import java.io.StringReader; import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; @@ -74,7 +78,9 @@ import com.gpl.rpg.atcontentstudio.utils.FileUtils; public class Project implements ProjectTreeNode, Serializable { private static final long serialVersionUID = 4807454973303366758L; + private static final String drawablePath = TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE.replace("\\", "/"); + //Every instance field that is not transient will be saved in this file. public static final String SETTINGS_FILE = ".project"; @@ -1079,10 +1085,16 @@ public class Project implements ProjectTreeNode, Serializable { public void run() { Notification.addInfo("Exporting project \""+name+"\" as "+target.getAbsolutePath()); - File tmpDir = exportProjectToTmpDir(); + File tmpDir; + try { + tmpDir = exportProjectToTmpDir(); + FileUtils.writeToZip(tmpDir, target); + FileUtils.deleteDir(tmpDir); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } - FileUtils.writeToZip(tmpDir, target); - FileUtils.deleteDir(tmpDir); Notification.addSuccess("Project \""+name+"\" exported as "+target.getAbsolutePath()); } @@ -1096,10 +1108,16 @@ public class Project implements ProjectTreeNode, Serializable { public void run() { Notification.addInfo("Exporting project \""+name+"\" into "+target.getAbsolutePath()); - File tmpDir = exportProjectToTmpDir(); + File tmpDir; + try { + tmpDir = exportProjectToTmpDir(); + FileUtils.copyOver(tmpDir, target); + FileUtils.deleteDir(tmpDir); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } - FileUtils.copyOver(tmpDir, target); - FileUtils.deleteDir(tmpDir); Notification.addSuccess("Project \""+name+"\" exported into "+target.getAbsolutePath()); } @@ -1107,7 +1125,7 @@ public class Project implements ProjectTreeNode, Serializable { }); } - public File exportProjectToTmpDir() { + public File exportProjectToTmpDir() throws IOException { File tmpDir = new File(baseFolder, "tmp"); FileUtils.deleteDir(tmpDir); tmpDir.mkdir(); @@ -1139,12 +1157,12 @@ public class Project implements ProjectTreeNode, Serializable { writtenFiles = new LinkedList(); for (File createdMapFile : createdContent.gameMaps.mapFolder.listFiles()) { if (createdMapFile.getName().equalsIgnoreCase("worldmap.xml")) continue; - FileUtils.copyFile(createdMapFile, new File(tmpMapDir, createdMapFile.getName())); + copyTmxConverted(createdMapFile.toPath(), Paths.get(tmpMapDir.getAbsolutePath(), createdMapFile.getName())); writtenFiles.add(createdMapFile.getName()); } for (File alteredMapFile : alteredContent.gameMaps.mapFolder.listFiles()) { if (alteredMapFile.getName().equalsIgnoreCase("worldmap.xml")) continue; - FileUtils.copyFile(alteredMapFile, new File(tmpMapDir, alteredMapFile.getName())); + copyTmxConverted(alteredMapFile.toPath(), Paths.get(tmpMapDir.getAbsolutePath(), alteredMapFile.getName())); writtenFiles.add(alteredMapFile.getName()); } writtenFilesPerDataType.put(TMXMap.class, writtenFiles); @@ -1177,6 +1195,16 @@ public class Project implements ProjectTreeNode, Serializable { return tmpDir; } + private void copyTmxConverted(Path from, Path to) throws IOException { + String xml = new String(Files.readAllBytes(from), StandardCharsets.UTF_8); + xml = xml.replace("../../altered/spritesheets/", drawablePath); + xml = xml.replace("../../created/spritesheets/", drawablePath); + xml = xml.replace("../spritesheets/", drawablePath); + xml = xml.replace("../spritesheets/", drawablePath); + Files.write(to, xml.getBytes(StandardCharsets.UTF_8)); + } + + @SuppressWarnings("rawtypes") public List writeDataDeltaForDataType(GameDataCategory created, GameDataCategory altered, GameDataCategory source, Class gdeClass, File targetFolder) { List filenamesToWrite = new LinkedList(); diff --git a/src/com/gpl/rpg/atcontentstudio/model/maps/TMXMap.java b/src/com/gpl/rpg/atcontentstudio/model/maps/TMXMap.java index 4a2fe88..38da7fc 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/maps/TMXMap.java +++ b/src/com/gpl/rpg/atcontentstudio/model/maps/TMXMap.java @@ -258,7 +258,7 @@ public class TMXMap extends GameDataElement { if (getDataType() == GameSource.Type.source) { writer.writeMap(tmxMap, baos, tmxFile.getAbsolutePath()); } else { - writer.writeMap(tmxMap, baos, getProject().baseContent.gameMaps.mapFolder.getAbsolutePath()+File.separator+"placeholder.tmx"); + writer.writeMap(tmxMap, baos, ((TMXMapSet)this.parent).mapFolder.getAbsolutePath()+File.separator+"placeholder.tmx"); } } catch (Exception e) { Notification.addError("Error while converting map "+getDesc()+" to XML: "+e.getMessage()); From 7863b73edad3cc14a7fdaea42dab14704ce3b02c Mon Sep 17 00:00:00 2001 From: Gonk Date: Sun, 12 Apr 2020 21:12:19 +0200 Subject: [PATCH 10/11] fixed missing png extension --- hacked-libtiled/tiled/io/TMXMapWriter.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/hacked-libtiled/tiled/io/TMXMapWriter.java b/hacked-libtiled/tiled/io/TMXMapWriter.java index bda0076..1c42fa3 100644 --- a/hacked-libtiled/tiled/io/TMXMapWriter.java +++ b/hacked-libtiled/tiled/io/TMXMapWriter.java @@ -242,7 +242,11 @@ public class TMXMapWriter w.startElement("tileset"); w.writeAttribute("firstgid", getFirstGidForTileset(set)); if (set.sheet.parent.getDataType() == Type.source) { - w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + set.getName()).replace("\\", "/")); + String fileName = set.getName(); + if (fileName.length() > 3 && !(fileName.substring(fileName.length() - 4).equalsIgnoreCase(".png"))) { + fileName += ".png"; + } + w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + fileName).replace("\\", "/")); } else { w.writeAttribute("source", getRelativePath(wp, source)); } @@ -287,7 +291,11 @@ public class TMXMapWriter if (tileBitmapFile != null) { w.startElement("image"); if (set.sheet.parent.getDataType() == Type.source) { - w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + set.getName()).replace("\\", "/")); + String fileName = set.getName(); + if (fileName.length() > 3 && !(fileName.substring(fileName.length() - 4).equalsIgnoreCase(".png"))) { + fileName += ".png"; + } + w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + fileName).replace("\\", "/")); } else { w.writeAttribute("source", getRelativePath(wp, tileBitmapFile)); } From 1bab8dc42fd9eab52d6a3cb8426baba925c8af2d Mon Sep 17 00:00:00 2001 From: Gonk Date: Fri, 1 May 2020 20:17:29 +0200 Subject: [PATCH 11/11] Fix for ResourcesCompactor --- hacked-libtiled/tiled/io/TMXMapWriter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hacked-libtiled/tiled/io/TMXMapWriter.java b/hacked-libtiled/tiled/io/TMXMapWriter.java index 1c42fa3..775e759 100644 --- a/hacked-libtiled/tiled/io/TMXMapWriter.java +++ b/hacked-libtiled/tiled/io/TMXMapWriter.java @@ -241,7 +241,7 @@ public class TMXMapWriter } else { w.startElement("tileset"); w.writeAttribute("firstgid", getFirstGidForTileset(set)); - if (set.sheet.parent.getDataType() == Type.source) { + if (set.sheet != null && set.sheet.parent.getDataType() == Type.source) { String fileName = set.getName(); if (fileName.length() > 3 && !(fileName.substring(fileName.length() - 4).equalsIgnoreCase(".png"))) { fileName += ".png"; @@ -290,7 +290,7 @@ public class TMXMapWriter if (tileBitmapFile != null) { w.startElement("image"); - if (set.sheet.parent.getDataType() == Type.source) { + if (set.sheet != null && set.sheet.parent.getDataType() == Type.source) { String fileName = set.getName(); if (fileName.length() > 3 && !(fileName.substring(fileName.length() - 4).equalsIgnoreCase(".png"))) { fileName += ".png";