package com.iambookmaster.client.beans; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Set; import com.iambookmaster.client.common.JSONBuilder; import com.iambookmaster.client.common.JSONParser; import com.iambookmaster.client.exceptions.JSONException; import com.iambookmaster.client.locale.AppMessages; import com.iambookmaster.client.model.Model; public class Paragraph implements Serializable{ private static final long serialVersionUID = 1L; private static final String JSON_BACKGROUND_IMAGES = "imgs"; private static final String JSON_BACKGROUND_SOUNDS = "snds"; private static final String JSON_SOUNDS = "snd"; private static final String JSON_TOP_IMAGES = "tp"; private static final String JSON_BOTTOM_IMAGES = "bt"; private static final String JSON_BATTLE = "a"; @Deprecated private static final String JSON_ENEMIES = "b"; private static final String JSON_MODIFICATORS = "c"; private static final String JSON_PARAMETERS = "d"; private static final String JSON_ALCHEMY = "e"; private static final String JSON_SPRITES = "f"; private static final String JSON_NUMBER = "n"; private static final String JSON_ENEMIES_EXT = "k"; private static final String JSON_OBJECT_LOST_ID = "l"; private static final String JSON_FIGHT_TOGETHER = "m"; private static final String JSON_X = "x"; private static final String JSON_Y = "y"; private static final String JSON_ID = "id"; private static final String JSON_NAME = "name"; private static final String JSON_TYPE = "type"; private static final String JSON_DESCRIPTION = "text"; private static final String JSON_OBJECT_ID = "obj"; private static final String JSON_STATUS = "stat"; private static final String JSON_COMMERCIAL = "j"; public static final char CHAR_ID_SUBJECT = '#'; public static final int TYPE_NORMAL = 0; public static final int TYPE_FAIL = 1; public static final int TYPE_SUCCESS = 2; public static final int TYPE_START = 3; public static final int TYPE_COMMERCIAL = 4; private String id; private String name; private Paragraph owner; private int x; private int y; private int type; private String description; private int status; private int number; private HashSet<ObjectBean> gotObjects; private HashSet<ObjectBean> lostObjects; private ArrayList<Picture> backgroundImages; private ArrayList<Picture> topImages; private ArrayList<Picture> bottomImages; private ArrayList<Sound> backgroundSounds; private ArrayList<Sound> sounds; private ArrayList<NPCParams> enemies; private Battle battle; private LinkedHashMap<Parameter,ParametersCalculation> changeParameters; private LinkedHashMap<Modificator,Boolean> changeModificators; private LinkedHashMap<Alchemy,Boolean> alchemy; private boolean commercial; public boolean isCommercial() { return commercial; } public void setCommercial(boolean commercial) { this.commercial = commercial; } // public ArrayList<Integer> getEnemyRounds() { // if (enemies == null) { // enemyRounds = null; // } else if (enemyRounds == null) { // enemyRounds = new ArrayList<Integer>(); // for (int i = 0; i < enemies.size(); i++) { // enemyRounds.add(0); // } // } else if (enemies.size() > enemyRounds.size()) { // while (enemies.size() > enemyRounds.size()) { // enemyRounds.add(0); // } // } else if (enemies.size() < enemyRounds.size()) { // while (enemies.size() < enemyRounds.size()) { // enemyRounds.remove(enemyRounds.size()-1); // } // } // return enemyRounds; // } public boolean dependsOn(AbstractParameter parameter) { if (changeParameters != null && changeParameters.containsKey(parameter)) { return true; } if (changeModificators != null && changeModificators.containsKey(parameter)) { return true; } if (alchemy != null && alchemy.containsKey(parameter)) { return true; } if (enemies != null) { for (NPCParams enemy : enemies) { if (enemy.getNpc().equals(parameter)) { return true; } } } if (battle==parameter) { return true; } return false; } private transient int nextBackgroundImageCounter; private transient int nextTopImageCounter; private transient int nextBottomImageCounter; private transient int nextSoundCounter; private transient int nextBackgroundSoundCounter; private ArrayList<Sprite> sprites; private boolean fightTogether; public boolean dependsOn(Sound sound) { return (sounds != null && sounds.contains(sound)) || (backgroundSounds != null && backgroundSounds.contains(sound)); } public boolean dependsOn(Picture picture) { return (backgroundImages != null && backgroundImages.contains(picture)) || (topImages != null && topImages.contains(picture)) || (bottomImages != null && bottomImages.contains(picture)); } public Set<ObjectBean> getGotObjects() { if (gotObjects==null) { gotObjects = new HashSet<ObjectBean>(); } return gotObjects; } public void setGotObjects(HashSet<ObjectBean> gotObjects) { this.gotObjects = gotObjects; } public void setLostObjects(HashSet<ObjectBean> lostObjects) { this.lostObjects = lostObjects; } public Set<ObjectBean> getLostObjects() { if (lostObjects==null) { lostObjects = new HashSet<ObjectBean>(); } return lostObjects; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Paragraph getOwner() { return owner; } public void setOwner(Paragraph owner) { this.owner = owner; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getX() { return x; } public void setX(int x) { if (x==0) { x = 0; } this.x = x; } public boolean isFail() { return type==TYPE_FAIL; } public boolean isSuccess() { return type==TYPE_SUCCESS; } public void setType(int type) { this.type = type; } public void toJSON(JSONBuilder builder, int export) { builder.newRow(); builder.field(JSON_ID, id); if (gotObjects != null && gotObjects.size()>0) { if (gotObjects.size()==1) { builder.field(JSON_OBJECT_ID, gotObjects.iterator().next().getId()); } else { StringBuilder buffer = new StringBuilder(); for (ObjectBean object : gotObjects) { if (buffer.length()>0) { buffer.append(','); } buffer.append(object.getId()); } builder.field(JSON_OBJECT_ID, buffer.toString()); } } if (lostObjects != null && lostObjects.size()>0) { if (lostObjects.size()==1) { builder.field(JSON_OBJECT_LOST_ID, lostObjects.iterator().next().getId()); } else { StringBuilder buffer = new StringBuilder(); for (ObjectBean object : lostObjects) { if (buffer.length()>0) { buffer.append(','); } buffer.append(object.getId()); } builder.field(JSON_OBJECT_LOST_ID, buffer.toString()); } } if (type != TYPE_NORMAL) { builder.field(JSON_TYPE, type); } if (export==Model.EXPORT_ALL) { builder.field(JSON_NAME, name); builder.field(JSON_X, x); builder.field(JSON_Y, y); builder.field(JSON_NUMBER, number); builder.field(JSON_STATUS, status); } if (hasBackgroundImages()) { if (backgroundImages.size()==1) { builder.field(JSON_BACKGROUND_IMAGES, backgroundImages.get(0).getId()); } else { StringBuilder buffer = new StringBuilder(); for (int i = 0; i < backgroundImages.size(); i++) { if (buffer.length()>0) { buffer.append(','); } buffer.append(backgroundImages.get(i).getId()); } builder.field(JSON_BACKGROUND_IMAGES, buffer.toString()); } } if (hasTopImages()) { if (topImages.size()==1) { builder.field(JSON_TOP_IMAGES, topImages.get(0).getId()); } else { StringBuilder buffer = new StringBuilder(); for (int i = 0; i < topImages.size(); i++) { if (buffer.length()>0) { buffer.append(','); } buffer.append(topImages.get(i).getId()); } builder.field(JSON_TOP_IMAGES, buffer.toString()); } } if (hasBottomImages()) { if (bottomImages.size()==1) { builder.field(JSON_BOTTOM_IMAGES, bottomImages.get(0).getId()); } else { StringBuilder buffer = new StringBuilder(); for (int i = 0; i < bottomImages.size(); i++) { if (buffer.length()>0) { buffer.append(','); } buffer.append(bottomImages.get(i).getId()); } builder.field(JSON_BOTTOM_IMAGES, buffer.toString()); } } if (backgroundSounds != null && backgroundSounds.size()>0) { if (backgroundSounds.size()==1) { builder.field(JSON_BACKGROUND_SOUNDS, backgroundSounds.get(0).getId()); } else { StringBuilder buffer = new StringBuilder(); for (int i = 0; i < backgroundSounds.size(); i++) { if (buffer.length()>0) { buffer.append(','); } buffer.append(backgroundSounds.get(i).getId()); } builder.field(JSON_BACKGROUND_SOUNDS, buffer.toString()); } } if (sounds != null && sounds.size()>0) { if (sounds.size()==1) { builder.field(JSON_SOUNDS, sounds .get(0).getId()); } else { StringBuilder buffer = new StringBuilder(); for (int i = 0; i < sounds.size(); i++) { if (buffer.length()>0) { buffer.append(','); } buffer.append(sounds.get(i).getId()); } builder.field(JSON_SOUNDS, buffer.toString()); } } if (battle != null) { builder.field(JSON_BATTLE, battle.getId()); } if (enemies != null && enemies.size()>0) { JSONBuilder jsonBuilder = builder.getInstance(); for (int i = 0; i < enemies.size(); i++) { enemies.get(i).toJSON(jsonBuilder,export); } builder.childArray(JSON_ENEMIES_EXT, jsonBuilder); if (fightTogether) { builder.field(JSON_FIGHT_TOGETHER, 1); } } if (changeModificators != null && changeModificators.size() > 0) { //save Modificators StringBuilder buffer = new StringBuilder(); for (Modificator modificator : changeModificators.keySet()) { if (buffer.length()>0) { buffer.append(','); } boolean value = changeModificators.get(modificator); buffer.append(value ? '+':'-'); buffer.append(modificator.getId()); } builder.field(JSON_MODIFICATORS, buffer.toString()); } if (alchemy != null && alchemy.size()>0) { //save Alchemy StringBuilder buffer = new StringBuilder(); for (Alchemy alc : alchemy.keySet()) { if (buffer.length()>0) { buffer.append(','); } boolean value = alchemy.get(alc); buffer.append(value ? '+':'-'); buffer.append(alc.getId()); } builder.field(JSON_ALCHEMY, buffer.toString()); } if (sprites != null && sprites.size()>0) { //save Sprites JSONBuilder subBuilder = builder.getInstance(); for (Sprite sprite : sprites) { sprite.toJSON(subBuilder, export); } builder.childArray(JSON_SPRITES, subBuilder); } if (changeParameters != null && changeParameters.size() > 0) { //save Parameters JSONBuilder subBuilder = builder.getInstance(); for (Parameter parameter : changeParameters.keySet()) { ParametersCalculation calculation = changeParameters.get(parameter); calculation.toJSON(subBuilder, export); subBuilder.field(ParametersCalculation.JSON_ACCEPTOR, parameter.getId()); } builder.childArray(JSON_PARAMETERS, subBuilder); } builder.field(JSON_DESCRIPTION, getDescription()); if (commercial) { builder.field(JSON_COMMERCIAL, 1); } } public static ArrayList<Paragraph> fromJSArray(Object object,ArrayList<ObjectBean> objects,HashMap<String,Picture> pictures,HashMap<String,Sound> sounds,JSONParser parser,AppMessages appMessages, HashMap<String, AbstractParameter> parametersMap) throws JSONException{ int l = parser.length(object); ArrayList<Paragraph> list = new ArrayList<Paragraph>(); for (int i = 0; i < l; i++) { Object row = parser.getRow(object, i); list.add(fromJS(row,objects,pictures,sounds,parser,appMessages,parametersMap)); } return list; } public static Paragraph fromJS(Object object,ArrayList<ObjectBean> objects,HashMap<String,Picture> pictures,HashMap<String,Sound> sounds,JSONParser parser, AppMessages appMessages, HashMap<String, AbstractParameter> parametersMap) throws JSONException{ Paragraph paragraph = new Paragraph(); paragraph.id = parser.propertyString(object, JSON_ID); paragraph.name = parser.propertyNoCheckString(object, JSON_NAME); paragraph.x = parser.propertyNoCheckInt(object, JSON_X); paragraph.number = parser.propertyNoCheckInt(object, JSON_NUMBER); paragraph.y = parser.propertyNoCheckInt(object, JSON_Y); paragraph.type = parser.propertyNoCheckInt(object, JSON_TYPE); paragraph.status = parser.propertyNoCheckInt(object, JSON_STATUS); paragraph.description = parser.propertyNoCheckString(object, JSON_DESCRIPTION); paragraph.commercial = parser.propertyNoCheckInt(object, JSON_COMMERCIAL)>0; if (paragraph.description==null) { paragraph.description = ""; } String objectId = parser.propertyNoCheckString(object, JSON_OBJECT_ID); if (objectId != null) { String ids[] = objectId.split(","); scan_obj1: for (ObjectBean bean:objects) { for (String id : ids) { if (bean.getId().equals(id)) { //found if (paragraph.gotObjects==null) { paragraph.gotObjects = new HashSet<ObjectBean>(ids.length); } paragraph.gotObjects.add(bean); if (paragraph.gotObjects.size()==ids.length) { //found all break scan_obj1; } break; } } } if (paragraph.gotObjects==null || paragraph.gotObjects.size()<ids.length) { throw new JSONException(appMessages.modelUnknownObjectsIDs(objectId)); } } objectId = parser.propertyNoCheckString(object, JSON_OBJECT_LOST_ID); if (objectId != null) { String ids[] = objectId.split(","); scan_obj1: for (ObjectBean bean:objects) { for (String id : ids) { if (bean.getId().equals(id)) { //found if (paragraph.lostObjects==null) { paragraph.lostObjects = new HashSet<ObjectBean>(ids.length); } paragraph.lostObjects.add(bean); if (paragraph.lostObjects.size()==ids.length) { //found all break scan_obj1; } break; } } } if (paragraph.lostObjects==null || paragraph.lostObjects.size()<ids.length) { throw new JSONException(appMessages.modelUnknownObjectsIDs(objectId)); } } //restore background images objectId = parser.propertyNoCheckString(object, JSON_BACKGROUND_IMAGES); if (objectId != null) { paragraph.backgroundImages = new ArrayList<Picture>(); String[] ids = objectId.split(","); for (String id : ids) { Picture bean = pictures.get(id); if (bean == null) { throw new JSONException("Unknown Image with ID="+id); } else { //found paragraph.backgroundImages.add(bean); } } } //restore top images objectId = parser.propertyNoCheckString(object, JSON_TOP_IMAGES); if (objectId != null) { paragraph.topImages = new ArrayList<Picture>(); String[] ids = objectId.split(","); for (String id : ids) { Picture bean = pictures.get(id); if (bean == null) { throw new JSONException("Unknown Image with ID="+id); } else { //found paragraph.topImages.add(bean); } } } //restore bottom images objectId = parser.propertyNoCheckString(object, JSON_BOTTOM_IMAGES); if (objectId != null) { paragraph.bottomImages = new ArrayList<Picture>(); String[] ids = objectId.split(","); for (String id : ids) { Picture bean = pictures.get(id); if (bean == null) { throw new JSONException("Unknown Image with ID="+id); } else { //found paragraph.bottomImages.add(bean); } } } //restore sprites Object rows = parser.propertyNoCheck(object, JSON_SPRITES); if (rows != null) { int l = parser.length(rows); paragraph.sprites = new ArrayList<Sprite>(l); for (int i = 0; i < l; i++) { Object row = parser.getRow(rows, i); Sprite sprite = new Sprite(); sprite.fromJSON(row, parser, pictures); paragraph.sprites.add(sprite); } } //restore sounds objectId = parser.propertyNoCheckString(object, JSON_BACKGROUND_SOUNDS); if (objectId != null) { paragraph.backgroundSounds = new ArrayList<Sound>(); String[] ids = objectId.split(","); for (String id : ids) { Sound bean = sounds.get(id); if (bean == null) { throw new JSONException("Unknown Sound with ID="+id); } else { //found paragraph.backgroundSounds.add(bean); } } } //restore effects objectId = parser.propertyNoCheckString(object, JSON_SOUNDS); if (objectId != null) { paragraph.sounds = new ArrayList<Sound>(); String[] ids = objectId.split(","); for (String id : ids) { Sound bean = sounds.get(id); if (bean != null) { //found paragraph.sounds.add(bean); } } } //battle objectId = parser.propertyNoCheckString(object, JSON_BATTLE); if (objectId != null) { AbstractParameter parameter = parametersMap.get(objectId); if (parameter instanceof Battle) { paragraph.battle = (Battle) parameter; } else { throw new JSONException("Does not exist Battle with ID="+objectId); } } //restore enemies Object data = parser.propertyNoCheck(object, JSON_ENEMIES_EXT); if (data==null) { //old version objectId = parser.propertyNoCheckString(object, JSON_ENEMIES); if (objectId != null) { paragraph.enemies = new ArrayList<NPCParams>(); String[] ids = objectId.split(","); for (String id : ids) { AbstractParameter parameter = parametersMap.get(id); if (parameter instanceof NPC) { //found paragraph.enemies.add(new NPCParams((NPC)parameter)); } else { throw new JSONException("Unknown NPC with ID="+id); } } } } else { //new version int l = parser.length(data); paragraph.enemies = new ArrayList<NPCParams>(l); for (int i = 0; i < l; i++) { Object row = parser.getRow(data, i); paragraph.enemies.add(NPCParams.fromJS(row,parser,parametersMap)); } } paragraph.fightTogether = parser.propertyNoCheckInt(object,JSON_FIGHT_TOGETHER) > 0; //restore modificators objectId = parser.propertyNoCheckString(object, JSON_MODIFICATORS); if (objectId != null) { paragraph.changeModificators = new LinkedHashMap<Modificator, Boolean>(); String[] ids = objectId.split(","); for (String id : ids) { char val = id.charAt(0); id = id.substring(1); AbstractParameter parameter = parametersMap.get(id); if (parameter instanceof Modificator) { //found paragraph.changeModificators.put((Modificator) parameter,val=='+'); } else { throw new JSONException("Unknown Modificator with ID="+id); } } } //restore alchemy objectId = parser.propertyNoCheckString(object, JSON_ALCHEMY); if (objectId != null) { paragraph.alchemy = new LinkedHashMap<Alchemy, Boolean>(); String[] ids = objectId.split(","); for (String id : ids) { char val = id.charAt(0); id = id.substring(1); AbstractParameter parameter = parametersMap.get(id); if (parameter instanceof Alchemy) { //found paragraph.alchemy.put((Alchemy) parameter,val=='+'); } else { throw new JSONException("Unknown Alchemy with ID="+id); } } } //restore parameters rows = parser.propertyNoCheck(object, JSON_PARAMETERS); if (rows != null) { int l = parser.length(rows); paragraph.changeParameters = new LinkedHashMap<Parameter, ParametersCalculation>(l); for (int i = 0; i < l; i++) { Object row = parser.getRow(rows, i); ParametersCalculation calculation = new ParametersCalculation(); calculation.fromJSON(row, parser, parametersMap); objectId = parser.propertyString(row, ParametersCalculation.JSON_ACCEPTOR); AbstractParameter parameter = parametersMap.get(objectId); if (parameter instanceof Parameter) { //found paragraph.changeParameters.put((Parameter) parameter,calculation); } else { throw new JSONException("Unknown Parameter with ID="+objectId); } } } return paragraph; } public int getType() { return type; } public String getDescription() { if (description==null) { return ""; } else { return description; } } public void setDescription(String description) { this.description = description; } public void setStatus(int status) { this.status = status; } public int getStatus() { return status; } public ArrayList<Picture> getBackgroundImages() { if (backgroundImages==null) { backgroundImages = new ArrayList<Picture>(); } return backgroundImages; } public void setBackgroundImages(ArrayList<Picture> backgroundImages) { this.backgroundImages = backgroundImages; } public ArrayList<Sound> getBackgroundSounds() { if (backgroundSounds==null) { backgroundSounds = new ArrayList<Sound>(); } return backgroundSounds; } public void setBackgroundSounds(ArrayList<Sound> backgroundSounds) { this.backgroundSounds = backgroundSounds; } public ArrayList<Sound> getSounds() { if (sounds==null) { sounds = new ArrayList<Sound>(); } return sounds; } public void setSounds(ArrayList<Sound> sounds) { this.sounds = sounds; } public boolean hasBackgroundImages() { return backgroundImages != null && backgroundImages.size()>0; } public boolean hasSounds() { return sounds != null && sounds.size()>0; } public boolean hasBottomImages() { return bottomImages != null && bottomImages.size()>0; } public ArrayList<Picture> getBottomImages() { if (bottomImages == null) { bottomImages = new ArrayList<Picture>(); } return bottomImages; } public void setBottomImages(ArrayList<Picture> bottomImages) { this.bottomImages = bottomImages; } public ArrayList<Sprite> getSprites() { if (sprites == null) { sprites = new ArrayList<Sprite>(); } return sprites; } public void setSprites(ArrayList<Sprite> sprites) { this.sprites = sprites; } public boolean hasTopImages() { return topImages != null && topImages.size()>0; } public ArrayList<Picture> getTopImages() { if (topImages == null) { topImages = new ArrayList<Picture>(); } return topImages; } public void setTopImages(ArrayList<Picture> topImages) { this.topImages = topImages; } public boolean hasBackgroundSounds() { return backgroundSounds != null && backgroundSounds.size()>0; } public Picture getNextBackgroundImage() { int s = backgroundImages.size(); if (s==1) { return backgroundImages.get(0); } if (nextBackgroundImageCounter>=s) { nextBackgroundImageCounter=0; } return backgroundImages.get(nextBackgroundImageCounter++); } public Picture getNextTopImage() { int s = topImages.size(); if (s==1) { return topImages.get(0); } if (nextTopImageCounter>=s) { nextTopImageCounter=0; } return topImages.get(nextTopImageCounter++); } public Picture getNextBottomImage() { int s = bottomImages.size(); if (s==1) { return bottomImages.get(0); } if (nextBottomImageCounter>=s) { nextBottomImageCounter=0; } return bottomImages.get(nextBottomImageCounter++); } public Sound getNextSound() { int s = sounds.size(); if (s==1) { return sounds.get(0); } if (nextSoundCounter>=s) { nextSoundCounter=0; } return sounds.get(nextSoundCounter++); } public Sound getNextBackgroundSound() { int s = backgroundSounds.size(); if (s==1) { return backgroundSounds.get(0); } if (nextBackgroundSoundCounter>=s) { nextBackgroundSoundCounter=0; } return backgroundSounds.get(nextBackgroundSoundCounter++); } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public Battle getBattle() { return battle; } public void setBattle(Battle battle) { this.battle = battle; } public ArrayList<NPCParams> getEnemies() { return enemies; } public void setEnemies(ArrayList<NPCParams> enemies) { this.enemies = enemies; } public LinkedHashMap<Parameter, ParametersCalculation> getChangeParameters() { return changeParameters; } public void setChangeParameters(LinkedHashMap<Parameter, ParametersCalculation> changeParameters) { this.changeParameters = changeParameters; } public LinkedHashMap<Modificator, Boolean> getChangeModificators() { return changeModificators; } public LinkedHashMap<Alchemy, Boolean> getAlchemy() { return alchemy; } public void setChangeModificators(LinkedHashMap<Modificator, Boolean> changeModificators) { this.changeModificators = changeModificators; } public void addChangeModificator(Modificator modificator, boolean value) { if (changeModificators==null) { changeModificators = new LinkedHashMap<Modificator, Boolean>(); } changeModificators.put(modificator,value); } public void addAlchemy(Alchemy alc, boolean value) { if (alchemy==null) { alchemy = new LinkedHashMap<Alchemy, Boolean>(); } alchemy.put(alc,value); } public void addChangeParameter(Parameter parameter, ParametersCalculation calculation) { if (changeParameters==null) { changeParameters = new LinkedHashMap<Parameter, ParametersCalculation>(); } changeParameters.put(parameter,calculation); } public boolean hasChangeModificator(Modificator modificator) { return changeModificators != null && changeModificators.containsKey(modificator); } public boolean hasChangeParameter(Parameter parameter) { return changeParameters != null && changeParameters.containsKey(parameter); } public boolean hasAlchemy(Alchemy alc) { return alchemy != null && alchemy.containsKey(alc); } public void setAlchemy(LinkedHashMap<Alchemy, Boolean> alchemy) { this.alchemy = alchemy; } public boolean hasSprites() { return sprites != null && sprites.size()>0; } public boolean dependsOn(ObjectBean object) { return (gotObjects != null && gotObjects.contains(object)) || (lostObjects != null && lostObjects.contains(object)); } public void setFightTogether(boolean fightTogether) { this.fightTogether = fightTogether; } public boolean isFightTogether() { return fightTogether; } }