Added support for the "revenge strike" feature in NPCs and Items.

Untested yet, and error-prone, because it was made with a LOT of
copy-paste-replacing.
This commit is contained in:
Zukero
2017-10-09 18:36:41 +02:00
parent 2aad37549c
commit 104029124b
4 changed files with 1938 additions and 156 deletions

View File

@@ -34,6 +34,7 @@ public class Item extends JSONElement {
public String category_id = null; public String category_id = null;
public String description = null; public String description = null;
public HitEffect hit_effect = null; public HitEffect hit_effect = null;
public HitReceivedEffect hit_received_effect = null;
public KillEffect kill_effect = null; public KillEffect kill_effect = null;
public EquipEffect equip_effect = null; public EquipEffect equip_effect = null;
@@ -58,6 +59,14 @@ public class Item extends JSONElement {
public List<TimedConditionEffect> conditions_target = null; public List<TimedConditionEffect> conditions_target = null;
} }
public static class HitReceivedEffect extends HitEffect {
//Available from parsed state
public Integer hp_boost_min_target = null;
public Integer hp_boost_max_target = null;
public Integer ap_boost_min_target = null;
public Integer ap_boost_max_target = null;
}
public static class EquipEffect { public static class EquipEffect {
//Available from parsed state //Available from parsed state
public Integer damage_boost_min = null; public Integer damage_boost_min = null;
@@ -246,6 +255,53 @@ public class Item extends JSONElement {
} }
} }
Map hitReceivedEffect = (Map) itemJson.get("hitReceivedEffect");
if (hitReceivedEffect != null) {
this.hit_received_effect = new HitReceivedEffect();
if (hitReceivedEffect.get("increaseCurrentHP") != null) {
this.hit_received_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentHP")).get("min")));
this.hit_received_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentHP")).get("max")));
}
if (hitReceivedEffect.get("increaseCurrentAP") != null) {
this.hit_received_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentAP")).get("min")));
this.hit_received_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentAP")).get("max")));
}
if (hitReceivedEffect.get("increaseAttackerCurrentHP") != null) {
this.hit_received_effect.hp_boost_min_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentHP")).get("min")));
this.hit_received_effect.hp_boost_max_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentHP")).get("max")));
}
if (hitReceivedEffect.get("increaseAttackerCurrentAP") != null) {
this.hit_received_effect.ap_boost_min_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentAP")).get("min")));
this.hit_received_effect.ap_boost_max_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentAP")).get("max")));
}
List conditionsSourceJson = (List) hitReceivedEffect.get("conditionsSource");
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) {
this.hit_received_effect.conditions_source = new ArrayList<Item.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsSourceJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_received_effect.conditions_source.add(condition);
}
}
List conditionsTargetJson = (List) hitReceivedEffect.get("conditionsTarget");
if (conditionsTargetJson != null && !conditionsTargetJson.isEmpty()) {
this.hit_received_effect.conditions_target = new ArrayList<Item.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsTargetJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_received_effect.conditions_target.add(condition);
}
}
}
Map killEffect = (Map) itemJson.get("killEffect"); Map killEffect = (Map) itemJson.get("killEffect");
if (killEffect == null) { if (killEffect == null) {
killEffect = (Map) itemJson.get("useEffect"); killEffect = (Map) itemJson.get("useEffect");
@@ -321,6 +377,18 @@ public class Item extends JSONElement {
if (ce.condition != null) ce.condition.addBacklink(this); if (ce.condition != null) ce.condition.addBacklink(this);
} }
} }
if (this.hit_received_effect != null && this.hit_received_effect.conditions_source != null) {
for (TimedConditionEffect ce : this.hit_received_effect.conditions_source) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
}
if (this.hit_received_effect != null && this.hit_received_effect.conditions_target != null) {
for (TimedConditionEffect ce : this.hit_received_effect.conditions_target) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
}
if (this.kill_effect != null && this.kill_effect.conditions_source != null) { if (this.kill_effect != null && this.kill_effect.conditions_source != null) {
for (TimedConditionEffect ce : this.kill_effect.conditions_source) { for (TimedConditionEffect ce : this.kill_effect.conditions_source) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id); if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
@@ -422,6 +490,47 @@ public class Item extends JSONElement {
} }
} }
} }
if (this.hit_received_effect != null) {
clone.hit_received_effect = new HitReceivedEffect();
clone.hit_received_effect.ap_boost_max = this.hit_received_effect.ap_boost_max;
clone.hit_received_effect.ap_boost_min = this.hit_received_effect.ap_boost_min;
clone.hit_received_effect.hp_boost_max = this.hit_received_effect.hp_boost_max;
clone.hit_received_effect.hp_boost_min = this.hit_received_effect.hp_boost_min;
clone.hit_received_effect.ap_boost_max_target = this.hit_received_effect.ap_boost_max_target;
clone.hit_received_effect.ap_boost_min_target = this.hit_received_effect.ap_boost_min_target;
clone.hit_received_effect.hp_boost_max_target = this.hit_received_effect.hp_boost_max_target;
clone.hit_received_effect.hp_boost_min_target = this.hit_received_effect.hp_boost_min_target;
if (this.hit_received_effect.conditions_source != null) {
clone.hit_received_effect.conditions_source = new ArrayList<Item.TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_received_effect.conditions_source) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_received_effect.conditions_source.add(cclone);
}
}
if (this.hit_received_effect.conditions_target != null) {
clone.hit_received_effect.conditions_target = new ArrayList<Item.TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_received_effect.conditions_target) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_received_effect.conditions_target.add(cclone);
}
}
}
if (this.kill_effect != null) { if (this.kill_effect != null) {
clone.kill_effect = new KillEffect(); clone.kill_effect = new KillEffect();
clone.kill_effect.ap_boost_max = this.kill_effect.ap_boost_max; clone.kill_effect.ap_boost_max = this.kill_effect.ap_boost_max;
@@ -600,6 +709,74 @@ public class Item extends JSONElement {
} }
} }
} }
if (this.hit_received_effect != null) {
Map hitReceivedEffectJson = new LinkedHashMap();
itemJson.put("hitReceivedEffect", hitReceivedEffectJson);
if (this.hit_received_effect.hp_boost_min != null || this.hit_received_effect.hp_boost_max != null) {
Map hpJson = new LinkedHashMap();
hitReceivedEffectJson.put("increaseCurrentHP", hpJson);
if (this.hit_received_effect.hp_boost_min != null) hpJson.put("min", this.hit_received_effect.hp_boost_min);
else hpJson.put("min", 0);
if (this.hit_received_effect.hp_boost_max != null) hpJson.put("max", this.hit_received_effect.hp_boost_max);
else hpJson.put("max", 0);
}
if (this.hit_received_effect.ap_boost_min != null || this.hit_received_effect.ap_boost_max != null) {
Map apJson = new LinkedHashMap();
hitReceivedEffectJson.put("increaseCurrentAP", apJson);
if (this.hit_received_effect.ap_boost_min != null) apJson.put("min", this.hit_received_effect.ap_boost_min);
else apJson.put("min", 0);
if (this.hit_received_effect.ap_boost_max != null) apJson.put("max", this.hit_received_effect.ap_boost_max);
else apJson.put("max", 0);
}
if (this.hit_received_effect.hp_boost_min_target != null || this.hit_received_effect.hp_boost_max_target != null) {
Map hpJson = new LinkedHashMap();
hitReceivedEffectJson.put("increaseAttackerCurrentHP", hpJson);
if (this.hit_received_effect.hp_boost_min_target != null) hpJson.put("min", this.hit_received_effect.hp_boost_min_target);
else hpJson.put("min", 0);
if (this.hit_received_effect.hp_boost_max_target != null) hpJson.put("max", this.hit_received_effect.hp_boost_max_target);
else hpJson.put("max", 0);
}
if (this.hit_received_effect.ap_boost_min_target != null || this.hit_received_effect.ap_boost_max_target != null) {
Map apJson = new LinkedHashMap();
hitReceivedEffectJson.put("increaseAttackerCurrentAP", apJson);
if (this.hit_received_effect.ap_boost_min_target != null) apJson.put("min", this.hit_received_effect.ap_boost_min_target);
else apJson.put("min", 0);
if (this.hit_received_effect.ap_boost_max_target != null) apJson.put("max", this.hit_received_effect.ap_boost_max_target);
else apJson.put("max", 0);
}
if (this.hit_received_effect.conditions_source != null) {
List conditionsSourceJson = new ArrayList();
hitReceivedEffectJson.put("conditionsSource", conditionsSourceJson);
for (TimedConditionEffect condition : this.hit_received_effect.conditions_source) {
Map conditionJson = new LinkedHashMap();
conditionsSourceJson.add(conditionJson);
if (condition.condition != null) {
conditionJson.put("condition", condition.condition.id);
} else if (condition.condition_id != null) {
conditionJson.put("condition", condition.condition_id);
}
if (condition.magnitude != null) conditionJson.put("magnitude", condition.magnitude);
if (condition.duration != null) conditionJson.put("duration", condition.duration);
if (condition.chance != null) conditionJson.put("chance", JSONElement.printJsonChance(condition.chance));
}
}
if (this.hit_received_effect.conditions_target != null) {
List conditionsTargetJson = new ArrayList();
hitReceivedEffectJson.put("conditionsTarget", conditionsTargetJson);
for (TimedConditionEffect condition : this.hit_received_effect.conditions_target) {
Map conditionJson = new LinkedHashMap();
conditionsTargetJson.add(conditionJson);
if (condition.condition != null) {
conditionJson.put("condition", condition.condition.id);
} else if (condition.condition_id != null) {
conditionJson.put("condition", condition.condition_id);
}
if (condition.magnitude != null) conditionJson.put("magnitude", condition.magnitude);
if (condition.duration != null) conditionJson.put("duration", condition.duration);
if (condition.chance != null) conditionJson.put("chance", JSONElement.printJsonChance(condition.chance));
}
}
}
if (this.kill_effect != null) { if (this.kill_effect != null) {
Map killEffectJson = new LinkedHashMap(); Map killEffectJson = new LinkedHashMap();
if (this.category != null && this.category.action_type != null && this.category.action_type == ItemCategory.ActionType.equip) { if (this.category != null && this.category.action_type != null && this.category.action_type == ItemCategory.ActionType.equip) {

View File

@@ -47,6 +47,8 @@ public class NPC extends JSONElement {
public Integer block_chance = null; public Integer block_chance = null;
public Integer damage_resistance = null; public Integer damage_resistance = null;
public HitEffect hit_effect = null; public HitEffect hit_effect = null;
public HitReceivedEffect hit_received_effect = null;
public DeathEffect death_effect = null;
//Available from linked state //Available from linked state
public Dialogue dialogue = null; public Dialogue dialogue = null;
@@ -70,17 +72,29 @@ public class NPC extends JSONElement {
protectSpawn, protectSpawn,
wholeMap wholeMap
} }
public static class HitEffect { public static class DeathEffect {
//Available from parsed state //Available from parsed state
public Integer hp_boost_min = null; public Integer hp_boost_min = null;
public Integer hp_boost_max = null; public Integer hp_boost_max = null;
public Integer ap_boost_min = null; public Integer ap_boost_min = null;
public Integer ap_boost_max = null; public Integer ap_boost_max = null;
public List<TimedConditionEffect> conditions_source = null; public List<TimedConditionEffect> conditions_source = null;
}
public static class HitEffect extends DeathEffect {
//Available from parsed state
public List<TimedConditionEffect> conditions_target = null; public List<TimedConditionEffect> conditions_target = null;
} }
public static class HitReceivedEffect extends HitEffect {
//Available from parsed state
public Integer hp_boost_min_target = null;
public Integer hp_boost_max_target = null;
public Integer ap_boost_min_target = null;
public Integer ap_boost_max_target = null;
}
public static class TimedConditionEffect { public static class TimedConditionEffect {
//Available from parsed state //Available from parsed state
public Integer magnitude = null; public Integer magnitude = null;
@@ -224,6 +238,79 @@ public class NPC extends JSONElement {
} }
} }
Map hitReceivedEffect = (Map) npcJson.get("hitReceivedEffect");
if (hitReceivedEffect != null) {
this.hit_received_effect = new HitReceivedEffect();
if (hitReceivedEffect.get("increaseCurrentHP") != null) {
this.hit_received_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentHP")).get("max")));
this.hit_received_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentHP")).get("min")));
}
if (hitReceivedEffect.get("increaseCurrentAP") != null) {
this.hit_received_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentAP")).get("max")));
this.hit_received_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentAP")).get("min")));
}
if (hitReceivedEffect.get("increaseAttackerCurrentHP") != null) {
this.hit_received_effect.hp_boost_max_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentHP")).get("max")));
this.hit_received_effect.hp_boost_min_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentHP")).get("min")));
}
if (hitReceivedEffect.get("increaseAttackerCurrentAP") != null) {
this.hit_received_effect.ap_boost_max_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentAP")).get("max")));
this.hit_received_effect.ap_boost_min_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentAP")).get("min")));
}
List conditionsSourceJson = (List) hitReceivedEffect.get("conditionsSource");
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) {
this.hit_received_effect.conditions_source = new ArrayList<NPC.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsSourceJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_received_effect.conditions_source.add(condition);
}
}
List conditionsTargetJson = (List) hitReceivedEffect.get("conditionsTarget");
if (conditionsTargetJson != null && !conditionsTargetJson.isEmpty()) {
this.hit_received_effect.conditions_target = new ArrayList<NPC.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsTargetJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_received_effect.conditions_target.add(condition);
}
}
}
Map deathEffect = (Map) npcJson.get("deathEffect");
if (deathEffect != null) {
this.death_effect = new HitEffect();
if (deathEffect.get("increaseCurrentHP") != null) {
this.death_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)deathEffect.get("increaseCurrentHP")).get("max")));
this.death_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)deathEffect.get("increaseCurrentHP")).get("min")));
}
if (deathEffect.get("increaseCurrentAP") != null) {
this.death_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)deathEffect.get("increaseCurrentAP")).get("max")));
this.death_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)deathEffect.get("increaseCurrentAP")).get("min")));
}
List conditionsSourceJson = (List) deathEffect.get("conditionsSource");
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) {
this.death_effect.conditions_source = new ArrayList<NPC.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsSourceJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.death_effect.conditions_source.add(condition);
}
}
}
} }
@Override @Override
@@ -267,6 +354,24 @@ public class NPC extends JSONElement {
if (ce.condition != null) ce.condition.addBacklink(this); if (ce.condition != null) ce.condition.addBacklink(this);
} }
} }
if (this.hit_received_effect != null && this.hit_received_effect.conditions_source != null) {
for (TimedConditionEffect ce : this.hit_received_effect.conditions_source) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
}
if (this.hit_received_effect != null && this.hit_received_effect.conditions_target != null) {
for (TimedConditionEffect ce : this.hit_received_effect.conditions_target) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
}
if (this.death_effect != null && this.death_effect.conditions_source != null) {
for (TimedConditionEffect ce : this.death_effect.conditions_source) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
}
this.state = State.linked; this.state = State.linked;
} }
@@ -343,6 +448,69 @@ public class NPC extends JSONElement {
} }
} }
} }
if (this.hit_received_effect != null) {
clone.hit_received_effect = new HitReceivedEffect();
clone.hit_received_effect.ap_boost_max = this.hit_received_effect.ap_boost_max;
clone.hit_received_effect.ap_boost_min = this.hit_received_effect.ap_boost_min;
clone.hit_received_effect.hp_boost_max = this.hit_received_effect.hp_boost_max;
clone.hit_received_effect.hp_boost_min = this.hit_received_effect.hp_boost_min;
clone.hit_received_effect.ap_boost_max_target = this.hit_received_effect.ap_boost_max_target;
clone.hit_received_effect.ap_boost_min_target = this.hit_received_effect.ap_boost_min_target;
clone.hit_received_effect.hp_boost_max_target = this.hit_received_effect.hp_boost_max_target;
clone.hit_received_effect.hp_boost_min_target = this.hit_received_effect.hp_boost_min_target;
if (this.hit_received_effect.conditions_source != null) {
clone.hit_received_effect.conditions_source = new ArrayList<TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_received_effect.conditions_source) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_received_effect.conditions_source.add(cclone);
}
}
if (this.hit_received_effect.conditions_target != null) {
clone.hit_received_effect.conditions_target = new ArrayList<TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_received_effect.conditions_target) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_received_effect.conditions_target.add(cclone);
}
}
}
if (this.death_effect != null) {
clone.death_effect = new DeathEffect();
clone.death_effect.ap_boost_max = this.death_effect.ap_boost_max;
clone.death_effect.ap_boost_min = this.death_effect.ap_boost_min;
clone.death_effect.hp_boost_max = this.death_effect.hp_boost_max;
clone.death_effect.hp_boost_min = this.death_effect.hp_boost_min;
if (this.death_effect.conditions_source != null) {
clone.death_effect.conditions_source = new ArrayList<TimedConditionEffect>();
for (TimedConditionEffect c : this.death_effect.conditions_source) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.death_effect.conditions_source.add(cclone);
}
}
}
clone.max_ap = this.max_ap; clone.max_ap = this.max_ap;
clone.max_hp = this.max_hp; clone.max_hp = this.max_hp;
clone.monster_class = this.monster_class; clone.monster_class = this.monster_class;
@@ -478,6 +646,110 @@ public class NPC extends JSONElement {
} }
} }
} }
if (this.hit_received_effect != null) {
Map hitReceivedEffectJson = new LinkedHashMap();
npcJson.put("hitReceivedEffect", hitReceivedEffectJson);
if (this.hit_received_effect.hp_boost_min != null || this.hit_received_effect.hp_boost_max != null) {
Map hpJson = new LinkedHashMap();
hitReceivedEffectJson.put("increaseCurrentHP", hpJson);
if (this.hit_received_effect.hp_boost_min != null) hpJson.put("min", this.hit_received_effect.hp_boost_min);
else hpJson.put("min", 0);
if (this.hit_received_effect.hp_boost_max != null) hpJson.put("max", this.hit_received_effect.hp_boost_max);
else hpJson.put("max", 0);
}
if (this.hit_received_effect.ap_boost_min != null || this.hit_received_effect.ap_boost_max != null) {
Map apJson = new LinkedHashMap();
hitReceivedEffectJson.put("increaseCurrentAP", apJson);
if (this.hit_received_effect.ap_boost_min != null) apJson.put("min", this.hit_received_effect.ap_boost_min);
else apJson.put("min", 0);
if (this.hit_received_effect.ap_boost_max != null) apJson.put("max", this.hit_received_effect.ap_boost_max);
else apJson.put("max", 0);
}
if (this.hit_received_effect.hp_boost_min_target != null || this.hit_received_effect.hp_boost_max_target != null) {
Map hpJson = new LinkedHashMap();
hitReceivedEffectJson.put("increaseAttackerCurrentHP", hpJson);
if (this.hit_received_effect.hp_boost_min_target != null) hpJson.put("min", this.hit_received_effect.hp_boost_min_target);
else hpJson.put("min", 0);
if (this.hit_received_effect.hp_boost_max_target != null) hpJson.put("max", this.hit_received_effect.hp_boost_max_target);
else hpJson.put("max", 0);
}
if (this.hit_received_effect.ap_boost_min_target != null || this.hit_received_effect.ap_boost_max_target != null) {
Map apJson = new LinkedHashMap();
hitReceivedEffectJson.put("increaseAttackerCurrentAP", apJson);
if (this.hit_received_effect.ap_boost_min_target != null) apJson.put("min", this.hit_received_effect.ap_boost_min_target);
else apJson.put("min", 0);
if (this.hit_received_effect.ap_boost_max_target != null) apJson.put("max", this.hit_received_effect.ap_boost_max_target);
else apJson.put("max", 0);
}
if (this.hit_received_effect.conditions_source != null) {
List conditionsSourceJson = new ArrayList();
hitReceivedEffectJson.put("conditionsSource", conditionsSourceJson);
for (TimedConditionEffect condition : this.hit_received_effect.conditions_source) {
Map conditionJson = new LinkedHashMap();
conditionsSourceJson.add(conditionJson);
if (condition.condition != null) {
conditionJson.put("condition", condition.condition.id);
} else if (condition.condition_id != null) {
conditionJson.put("condition", condition.condition_id);
}
if (condition.magnitude != null) conditionJson.put("magnitude", condition.magnitude);
if (condition.duration != null) conditionJson.put("duration", condition.duration);
if (condition.chance != null) conditionJson.put("chance", JSONElement.printJsonChance(condition.chance));
}
}
if (this.hit_received_effect.conditions_target != null) {
List conditionsTargetJson = new ArrayList();
hitReceivedEffectJson.put("conditionsTarget", conditionsTargetJson);
for (TimedConditionEffect condition : this.hit_received_effect.conditions_target) {
Map conditionJson = new LinkedHashMap();
conditionsTargetJson.add(conditionJson);
if (condition.condition != null) {
conditionJson.put("condition", condition.condition.id);
} else if (condition.condition_id != null) {
conditionJson.put("condition", condition.condition_id);
}
if (condition.magnitude != null) conditionJson.put("magnitude", condition.magnitude);
if (condition.duration != null) conditionJson.put("duration", condition.duration);
if (condition.chance != null) conditionJson.put("chance", JSONElement.printJsonChance(condition.chance));
}
}
}
if (this.death_effect != null) {
Map deathEffectJson = new LinkedHashMap();
npcJson.put("deathEffect", deathEffectJson);
if (this.death_effect.hp_boost_min != null || this.death_effect.hp_boost_max != null) {
Map hpJson = new LinkedHashMap();
deathEffectJson.put("increaseCurrentHP", hpJson);
if (this.death_effect.hp_boost_min != null) hpJson.put("min", this.death_effect.hp_boost_min);
else hpJson.put("min", 0);
if (this.death_effect.hp_boost_max != null) hpJson.put("max", this.death_effect.hp_boost_max);
else hpJson.put("max", 0);
}
if (this.death_effect.ap_boost_min != null || this.death_effect.ap_boost_max != null) {
Map apJson = new LinkedHashMap();
deathEffectJson.put("increaseCurrentAP", apJson);
if (this.death_effect.ap_boost_min != null) apJson.put("min", this.death_effect.ap_boost_min);
else apJson.put("min", 0);
if (this.death_effect.ap_boost_max != null) apJson.put("max", this.death_effect.ap_boost_max);
else apJson.put("max", 0);
}
if (this.death_effect.conditions_source != null) {
List conditionsSourceJson = new ArrayList();
deathEffectJson.put("conditionsSource", conditionsSourceJson);
for (TimedConditionEffect condition : this.death_effect.conditions_source) {
Map conditionJson = new LinkedHashMap();
conditionsSourceJson.add(conditionJson);
if (condition.condition != null) {
conditionJson.put("condition", condition.condition.id);
} else if (condition.condition_id != null) {
conditionJson.put("condition", condition.condition_id);
}
if (condition.magnitude != null) conditionJson.put("magnitude", condition.magnitude);
if (condition.duration != null) conditionJson.put("duration", condition.duration);
if (condition.chance != null) conditionJson.put("chance", JSONElement.printJsonChance(condition.chance));
}
}
}
return npcJson; return npcJson;
} }

View File

@@ -57,7 +57,9 @@ public class ItemEditor extends JSONElementEditor {
private Item.TimedConditionEffect selectedHitEffectSourceCondition; private Item.TimedConditionEffect selectedHitEffectSourceCondition;
private Item.TimedConditionEffect selectedHitEffectTargetCondition; private Item.TimedConditionEffect selectedHitEffectTargetCondition;
private Item.TimedConditionEffect selectedKillEffectCondition; private Item.TimedConditionEffect selectedKillEffectCondition;
private Item.TimedConditionEffect selectedHitReceivedEffectSourceCondition;
private Item.TimedConditionEffect selectedHitReceivedEffectTargetCondition;
private JButton itemIcon; private JButton itemIcon;
private JTextField idField; private JTextField idField;
@@ -143,6 +145,40 @@ public class ItemEditor extends JSONElementEditor {
private JRadioButton killSourceConditionForever; private JRadioButton killSourceConditionForever;
private JSpinner killSourceConditionDuration; private JSpinner killSourceConditionDuration;
private CollapsiblePanel hitReceivedEffectPane;
private Item.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) { public ItemEditor(Item item) {
super(item, item.getDesc(), item.getIcon()); super(item, item.getDesc(), item.getIcon());
@@ -459,6 +495,142 @@ public class ItemEditor extends JSONElementEditor {
} }
pane.add(killEffectPane, JideBoxLayout.FIX); pane.add(killEffectPane, JideBoxLayout.FIX);
hitReceivedEffectPane = new CollapsiblePanel("Effect on every received hit: ");
hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS));
if (item.hit_received_effect == null) {
hitReceivedEffect = new Item.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 = (Item.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) {
Item.TimedConditionEffect condition = new Item.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 = (Item.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) {
Item.TimedConditionEffect condition = new Item.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) { if (item.category == null || item.category.action_type == null || item.category.action_type == ItemCategory.ActionType.none) {
equipEffectPane.setVisible(false); equipEffectPane.setVisible(false);
hitEffectPane.setVisible(false); hitEffectPane.setVisible(false);
@@ -817,6 +989,199 @@ public class ItemEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateHitReceivedSourceTimedConditionEditorPane(JPanel pane, Item.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(Item.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, Item.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(Item.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 implements ListModel<Item.TimedConditionEffect> { public static class SourceTimedConditionsListModel implements ListModel<Item.TimedConditionEffect> {
Item.KillEffect source; Item.KillEffect source;
@@ -1102,13 +1467,28 @@ public class ItemEditor extends JSONElementEditor {
return true; return true;
} }
public static boolean isNull(Item.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 { public class ItemFieldUpdater implements FieldUpdateListener {
@Override @Override
public void valueChanged(JComponent source, Object value) { public void valueChanged(JComponent source, Object value) {
Item item = (Item)target; Item item = (Item)target;
boolean updatePrice, updateEquip, updateHit, updateKill; boolean updatePrice, updateEquip, updateHit, updateKill, updateHitReceived;
updatePrice = updateEquip = updateHit = updateKill = false; updatePrice = updateEquip = updateHit = updateKill = updateHitReceived = false;
if (source == idField) { if (source == idField) {
//Events caused by cancel an ID edition. Dismiss. //Events caused by cancel an ID edition. Dismiss.
if (skipNext) { if (skipNext) {
@@ -1177,6 +1557,8 @@ public class ItemEditor extends JSONElementEditor {
item.hit_effect = null; item.hit_effect = null;
killEffectPane.setVisible(false); killEffectPane.setVisible(false);
item.kill_effect = null; item.kill_effect = null;
hitReceivedEffectPane.setVisible(false);
item.hit_received_effect = null;
ItemEditor.this.revalidate(); ItemEditor.this.revalidate();
ItemEditor.this.repaint(); ItemEditor.this.repaint();
} else if (item.category.action_type == ItemCategory.ActionType.use) { } else if (item.category.action_type == ItemCategory.ActionType.use) {
@@ -1186,6 +1568,8 @@ public class ItemEditor extends JSONElementEditor {
item.hit_effect = null; item.hit_effect = null;
killEffectPane.setVisible(true); killEffectPane.setVisible(true);
updateKill = true; updateKill = true;
hitReceivedEffectPane.setVisible(false);
item.hit_received_effect = null;
killEffectPane.setTitle(useLabel); killEffectPane.setTitle(useLabel);
ItemEditor.this.revalidate(); ItemEditor.this.revalidate();
ItemEditor.this.repaint(); ItemEditor.this.repaint();
@@ -1196,6 +1580,8 @@ public class ItemEditor extends JSONElementEditor {
updateEquip = true; updateEquip = true;
killEffectPane.setVisible(true); killEffectPane.setVisible(true);
updateKill = true; updateKill = true;
hitReceivedEffectPane.setVisible(true);
updateEquip = true;
killEffectPane.setTitle(killLabel); killEffectPane.setTitle(killLabel);
ItemEditor.this.revalidate(); ItemEditor.this.revalidate();
ItemEditor.this.repaint(); ItemEditor.this.repaint();
@@ -1502,6 +1888,166 @@ public class ItemEditor extends JSONElementEditor {
selectedKillEffectCondition.chance = (Double) value; selectedKillEffectCondition.chance = (Double) value;
killSourceConditionsModel.itemChanged(selectedKillEffectCondition); killSourceConditionsModel.itemChanged(selectedKillEffectCondition);
updateKill = true; 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 (updateEquip) {
@@ -1525,6 +2071,13 @@ public class ItemEditor extends JSONElementEditor {
item.kill_effect = killEffect; item.kill_effect = killEffect;
} }
} }
if (updateHitReceived) {
if (isNull(hitReceivedEffect)) {
item.hit_received_effect = null;
} else {
item.hit_received_effect = hitReceivedEffect;
}
}
if (updatePrice && !manualPriceBox.isSelected()) { if (updatePrice && !manualPriceBox.isSelected()) {
baseCostField.setValue(item.computePrice()); baseCostField.setValue(item.computePrice());
} }