mirror of
https://github.com/OMGeeky/ATCS.git
synced 2025-12-26 23:57:25 +01:00
main changes are: - Modified marker (* character before name) goes up the project tree by marking all parents of a modified object as modified. - Impact management when changing an object's ID. Allows for some refactoring to occur, while marking the impacted elements as modified, or aven creating "altered" versions if imapcted element was only in game source.
349 lines
15 KiB
Java
349 lines
15 KiB
Java
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
|
|
|
import java.awt.Image;
|
|
import java.io.File;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
import org.json.simple.parser.JSONParser;
|
|
import org.json.simple.parser.ParseException;
|
|
|
|
import com.gpl.rpg.atcontentstudio.Notification;
|
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
|
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
|
|
|
|
|
public class ActorCondition extends JSONElement {
|
|
|
|
private static final long serialVersionUID = -3969824899972048507L;
|
|
|
|
public static final Integer CLEAR_AC_MAGNITUDE = -99;
|
|
|
|
// Available from init state
|
|
//public String id; inherited.
|
|
public String icon_id;
|
|
public String display_name;
|
|
|
|
// Available from parsed state
|
|
public ACCategory category = null;
|
|
public Integer positive = null;
|
|
public Integer stacking = null;
|
|
public RoundEffect round_effect = null;
|
|
public RoundEffect full_round_effect = null;
|
|
public AbilityEffect constant_ability_effect = null;
|
|
|
|
public enum ACCategory {
|
|
spiritual,
|
|
mental,
|
|
physical,
|
|
blood
|
|
}
|
|
|
|
public static class RoundEffect implements Cloneable {
|
|
// Available from parsed state
|
|
public String visual_effect = null;
|
|
public Integer hp_boost_min = null;
|
|
public Integer hp_boost_max = null;
|
|
public Integer ap_boost_min = null;
|
|
public Integer ap_boost_max = null;
|
|
|
|
public Object clone() {
|
|
try {
|
|
return super.clone();
|
|
} catch (CloneNotSupportedException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static class AbilityEffect implements Cloneable {
|
|
// Available from parsed state
|
|
public Integer max_hp_boost = null;
|
|
public Integer max_ap_boost = null;
|
|
public Integer increase_move_cost = null;
|
|
public Integer increase_use_cost = null;
|
|
public Integer increase_reequip_cost = null;
|
|
public Integer increase_attack_cost = null;
|
|
public Integer increase_attack_chance = null;
|
|
public Integer increase_damage_min = null;
|
|
public Integer increase_damage_max = null;
|
|
public Integer increase_critical_skill = null;
|
|
public Integer increase_block_chance = null;
|
|
public Integer increase_damage_resistance = null;
|
|
|
|
public Object clone() {
|
|
try {
|
|
return super.clone();
|
|
} catch (CloneNotSupportedException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String getDesc() {
|
|
return (needsSaving() ? "*" : "")+display_name+" ("+id+")";
|
|
}
|
|
|
|
@SuppressWarnings("rawtypes")
|
|
public static void fromJson(File jsonFile, GameDataCategory<ActorCondition> category) {
|
|
JSONParser parser = new JSONParser();
|
|
FileReader reader = null;
|
|
try {
|
|
reader = new FileReader(jsonFile);
|
|
List actorConditions = (List) parser.parse(reader);
|
|
for (Object obj : actorConditions) {
|
|
Map aCondJson = (Map)obj;
|
|
ActorCondition aCond = fromJson(aCondJson);
|
|
aCond.jsonFile = jsonFile;
|
|
aCond.parent = category;
|
|
if (aCond.getDataType() == GameSource.Type.created || aCond.getDataType() == GameSource.Type.altered) {
|
|
aCond.writable = true;
|
|
}
|
|
category.add(aCond);
|
|
}
|
|
} catch (FileNotFoundException e) {
|
|
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
|
e.printStackTrace();
|
|
} catch (IOException e) {
|
|
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
|
e.printStackTrace();
|
|
} catch (ParseException e) {
|
|
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
|
e.printStackTrace();
|
|
} finally {
|
|
if (reader != null)
|
|
try {
|
|
reader.close();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("rawtypes")
|
|
public static ActorCondition fromJson(String jsonString) throws ParseException {
|
|
Map aCondJson = (Map) new JSONParser().parse(jsonString);
|
|
ActorCondition aCond = fromJson(aCondJson);
|
|
aCond.parse(aCondJson);
|
|
return aCond;
|
|
}
|
|
|
|
@SuppressWarnings("rawtypes")
|
|
public static ActorCondition fromJson(Map aCondJson) {
|
|
ActorCondition aCond = new ActorCondition();
|
|
aCond.icon_id = (String) aCondJson.get("iconID");
|
|
aCond.id = (String) aCondJson.get("id");
|
|
aCond.display_name = (String) aCondJson.get("name");
|
|
return aCond;
|
|
}
|
|
|
|
@SuppressWarnings("rawtypes")
|
|
@Override
|
|
public void parse(Map aCondJson) {
|
|
|
|
if (aCondJson.get("category") != null) this.category = ACCategory.valueOf((String) aCondJson.get("category"));
|
|
this.positive = JSONElement.getInteger((Number) aCondJson.get("isPositive"));
|
|
Map abilityEffect = (Map) aCondJson.get("abilityEffect");
|
|
if (abilityEffect != null) {
|
|
this.constant_ability_effect = new AbilityEffect();
|
|
this.constant_ability_effect.increase_attack_chance = JSONElement.getInteger((Number) abilityEffect.get("increaseAttackChance"));
|
|
if (abilityEffect.get("increaseAttackDamage") != null) {
|
|
this.constant_ability_effect.increase_damage_min = JSONElement.getInteger((Number) (((Map)abilityEffect.get("increaseAttackDamage")).get("min")));
|
|
this.constant_ability_effect.increase_damage_max = JSONElement.getInteger((Number) (((Map)abilityEffect.get("increaseAttackDamage")).get("max")));
|
|
}
|
|
this.constant_ability_effect.max_hp_boost = JSONElement.getInteger((Number) abilityEffect.get("increaseMaxHP"));
|
|
this.constant_ability_effect.max_ap_boost = JSONElement.getInteger((Number) abilityEffect.get("increaseMaxAP"));
|
|
this.constant_ability_effect.increase_move_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseMoveCost"));
|
|
this.constant_ability_effect.increase_use_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseUseItemCost"));
|
|
this.constant_ability_effect.increase_reequip_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseReequipCost"));
|
|
this.constant_ability_effect.increase_attack_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseAttackCost"));
|
|
this.constant_ability_effect.increase_critical_skill = JSONElement.getInteger((Number) abilityEffect.get("increaseCriticalSkill"));
|
|
this.constant_ability_effect.increase_block_chance = JSONElement.getInteger((Number) abilityEffect.get("increaseBlockChance"));
|
|
this.constant_ability_effect.increase_damage_resistance = JSONElement.getInteger((Number) abilityEffect.get("increaseDamageResistance"));
|
|
}
|
|
this.stacking = JSONElement.getInteger((Number) aCondJson.get("isStacking"));
|
|
Map roundEffect = (Map) aCondJson.get("roundEffect");
|
|
if (roundEffect != null) {
|
|
this.round_effect = new RoundEffect();
|
|
if (roundEffect.get("increaseCurrentHP") != null) {
|
|
this.round_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentHP")).get("max")));
|
|
this.round_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentHP")).get("min")));
|
|
}
|
|
if (roundEffect.get("increaseCurrentAP") != null) {
|
|
this.round_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentAP")).get("max")));
|
|
this.round_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentAP")).get("min")));
|
|
}
|
|
this.round_effect.visual_effect = (String) roundEffect.get("visualEffectID");
|
|
}
|
|
Map fullRoundEffect = (Map) aCondJson.get("fullRoundEffect");
|
|
if (fullRoundEffect != null) {
|
|
this.full_round_effect = new RoundEffect();
|
|
if (fullRoundEffect.get("increaseCurrentHP") != null) {
|
|
this.full_round_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)fullRoundEffect.get("increaseCurrentHP")).get("max")));
|
|
this.full_round_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)fullRoundEffect.get("increaseCurrentHP")).get("min")));
|
|
}
|
|
if (fullRoundEffect.get("increaseCurrentAP") != null) {
|
|
this.full_round_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)fullRoundEffect.get("increaseCurrentAP")).get("max")));
|
|
this.full_round_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)fullRoundEffect.get("increaseCurrentAP")).get("min")));
|
|
}
|
|
this.full_round_effect.visual_effect = (String) fullRoundEffect.get("visualEffectID");
|
|
}
|
|
this.state = State.parsed;
|
|
|
|
}
|
|
|
|
@Override
|
|
public void link() {
|
|
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
|
//This type of state is unrelated to parsing/linking.
|
|
return;
|
|
}
|
|
if (this.state == State.init) {
|
|
//Not parsed yet.
|
|
this.parse();
|
|
} else if (this.state == State.linked) {
|
|
//Already linked.
|
|
return;
|
|
}
|
|
if (this.icon_id != null) {
|
|
String spritesheetId = this.icon_id.split(":")[0];
|
|
getProject().getSpritesheet(spritesheetId).addBacklink(this);
|
|
}
|
|
|
|
this.state = State.linked;
|
|
}
|
|
|
|
|
|
public static String getStaticDesc() {
|
|
return "Actor Conditions";
|
|
}
|
|
|
|
|
|
@Override
|
|
public Image getIcon() {
|
|
return getProject().getIcon(icon_id);
|
|
}
|
|
|
|
public Image getImage() {
|
|
return getProject().getImage(icon_id);
|
|
}
|
|
|
|
@Override
|
|
public JSONElement clone() {
|
|
ActorCondition clone = new ActorCondition();
|
|
clone.jsonFile = this.jsonFile;
|
|
clone.state = this.state;
|
|
clone.id = this.id;
|
|
clone.display_name = this.display_name;
|
|
clone.icon_id = this.icon_id;
|
|
clone.category = this.category;
|
|
clone.positive = this.positive;
|
|
clone.stacking = this.stacking;
|
|
if (this.round_effect != null) {
|
|
clone.round_effect = (RoundEffect) this.round_effect.clone();
|
|
}
|
|
if (this.constant_ability_effect != null) {
|
|
clone.constant_ability_effect = (AbilityEffect) constant_ability_effect.clone();
|
|
}
|
|
if (this.full_round_effect != null) {
|
|
clone.full_round_effect = (RoundEffect) this.full_round_effect.clone();
|
|
}
|
|
return clone;
|
|
}
|
|
|
|
@Override
|
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
|
//Nothing to link to.
|
|
}
|
|
|
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
|
@Override
|
|
public Map toJson() {
|
|
Map jsonAC = new LinkedHashMap();
|
|
jsonAC.put("id", this.id);
|
|
if (this.icon_id != null) jsonAC.put("iconID", this.icon_id);
|
|
if (this.display_name != null) jsonAC.put("name", this.display_name);
|
|
if (this.category != null) jsonAC.put("category", this.category.toString());
|
|
if (this.positive != null && this.positive == 1) jsonAC.put("isPositive", this.positive);
|
|
if (this.stacking != null && this.stacking == 1) jsonAC.put("isStacking", this.stacking);
|
|
if (this.round_effect != null) {
|
|
Map jsonRound = new LinkedHashMap();
|
|
if (this.round_effect.visual_effect != null) jsonRound.put("visualEffectID", this.round_effect.visual_effect);
|
|
if (this.round_effect.hp_boost_min != null || this.round_effect.hp_boost_max != null) {
|
|
Map jsonHP = new LinkedHashMap();
|
|
if (this.round_effect.hp_boost_min != null) jsonHP.put("min", this.round_effect.hp_boost_min);
|
|
else jsonHP.put("min", 0);
|
|
if (this.round_effect.hp_boost_max != null) jsonHP.put("max", this.round_effect.hp_boost_max);
|
|
else jsonHP.put("max", 0);
|
|
jsonRound.put("increaseCurrentHP", jsonHP);
|
|
}
|
|
if (this.round_effect.ap_boost_min != null || this.round_effect.ap_boost_max != null) {
|
|
Map jsonAP = new LinkedHashMap();
|
|
if (this.round_effect.ap_boost_min != null) jsonAP.put("min", this.round_effect.ap_boost_min);
|
|
else jsonAP.put("min", 0);
|
|
if (this.round_effect.ap_boost_max != null) jsonAP.put("max", this.round_effect.ap_boost_max);
|
|
else jsonAP.put("max", 0);
|
|
jsonRound.put("increaseCurrentAP", jsonAP);
|
|
}
|
|
jsonAC.put("roundEffect", jsonRound);
|
|
}
|
|
if (this.full_round_effect != null) {
|
|
Map jsonFullRound = new LinkedHashMap();
|
|
if (this.full_round_effect.visual_effect != null) jsonFullRound.put("visualEffectID", this.full_round_effect.visual_effect);
|
|
if (this.full_round_effect.hp_boost_min != null || this.full_round_effect.hp_boost_max != null) {
|
|
Map jsonHP = new LinkedHashMap();
|
|
if (this.full_round_effect.hp_boost_min != null) jsonHP.put("min", this.full_round_effect.hp_boost_min);
|
|
else jsonHP.put("min", 0);
|
|
if (this.full_round_effect.hp_boost_max != null) jsonHP.put("max", this.full_round_effect.hp_boost_max);
|
|
else jsonHP.put("max", 0);
|
|
jsonFullRound.put("increaseCurrentHP", jsonHP);
|
|
}
|
|
if (this.full_round_effect.ap_boost_min != null || this.full_round_effect.ap_boost_max != null) {
|
|
Map jsonAP = new LinkedHashMap();
|
|
if (this.full_round_effect.ap_boost_min != null) jsonAP.put("min", this.full_round_effect.ap_boost_min);
|
|
else jsonAP.put("min", 0);
|
|
if (this.full_round_effect.ap_boost_max != null) jsonAP.put("max", this.full_round_effect.ap_boost_max);
|
|
else jsonAP.put("max", 0);
|
|
jsonFullRound.put("increaseCurrentAP", jsonAP);
|
|
}
|
|
jsonAC.put("fullRoundEffect", jsonFullRound);
|
|
}
|
|
if (this.constant_ability_effect != null) {
|
|
Map jsonAbility = new LinkedHashMap();
|
|
if (this.constant_ability_effect.increase_attack_chance != null) jsonAbility.put("increaseAttackChance", this.constant_ability_effect.increase_attack_chance);
|
|
if (this.constant_ability_effect.increase_damage_min != null || this.constant_ability_effect.increase_damage_max != null) {
|
|
Map jsonAD = new LinkedHashMap();
|
|
if (this.constant_ability_effect.increase_damage_min != null) jsonAD.put("min", this.constant_ability_effect.increase_damage_min);
|
|
else jsonAD.put("min", 0);
|
|
if (this.constant_ability_effect.increase_damage_max != null) jsonAD.put("max", this.constant_ability_effect.increase_damage_max);
|
|
else jsonAD.put("max", 0);
|
|
jsonAbility.put("increaseAttackDamage", jsonAD);
|
|
}
|
|
if (this.constant_ability_effect.max_hp_boost != null) jsonAbility.put("increaseMaxHP", this.constant_ability_effect.max_hp_boost);
|
|
if (this.constant_ability_effect.max_ap_boost != null) jsonAbility.put("increaseMaxAP", this.constant_ability_effect.max_ap_boost);
|
|
if (this.constant_ability_effect.increase_move_cost != null) jsonAbility.put("increaseMoveCost", this.constant_ability_effect.increase_move_cost);
|
|
if (this.constant_ability_effect.increase_use_cost != null) jsonAbility.put("increaseUseItemCost", this.constant_ability_effect.increase_use_cost);
|
|
if (this.constant_ability_effect.increase_reequip_cost != null) jsonAbility.put("increaseReequipCost", this.constant_ability_effect.increase_reequip_cost);
|
|
if (this.constant_ability_effect.increase_attack_cost != null) jsonAbility.put("increaseAttackCost", this.constant_ability_effect.increase_attack_cost);
|
|
if (this.constant_ability_effect.increase_critical_skill != null) jsonAbility.put("increaseCriticalSkill", this.constant_ability_effect.increase_critical_skill);
|
|
if (this.constant_ability_effect.increase_block_chance != null) jsonAbility.put("increaseBlockChance", this.constant_ability_effect.increase_block_chance);
|
|
if (this.constant_ability_effect.increase_damage_resistance != null) jsonAbility.put("increaseDamageResistance", this.constant_ability_effect.increase_damage_resistance);
|
|
jsonAC.put("abilityEffect", jsonAbility);
|
|
}
|
|
return jsonAC;
|
|
}
|
|
|
|
@Override
|
|
public String getProjectFilename() {
|
|
return "actorconditions_"+getProject().name+".json";
|
|
}
|
|
|
|
}
|