package com.iambookmaster.client.model;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.google.gwt.user.client.Window;
import com.iambookmaster.client.beans.AbstractParameter;
import com.iambookmaster.client.beans.Alchemy;
import com.iambookmaster.client.beans.Battle;
import com.iambookmaster.client.beans.Modificator;
import com.iambookmaster.client.beans.NPCParams;
import com.iambookmaster.client.beans.ObjectBean;
import com.iambookmaster.client.beans.Paragraph;
import com.iambookmaster.client.beans.ParagraphConnection;
import com.iambookmaster.client.beans.Parameter;
import com.iambookmaster.client.beans.Picture;
import com.iambookmaster.client.beans.Settings;
import com.iambookmaster.client.beans.Sound;
import com.iambookmaster.client.common.JSONParser;
import com.iambookmaster.client.exceptions.JSONException;
import com.iambookmaster.client.locale.AppConstants;
import com.iambookmaster.client.locale.AppMessages;
public class Model {
protected static final int EVENT_ADD_NEW = 0;
protected static final int EVENT_REFRESH_ALL = 1;
protected static final int EVENT_SELECTED = 2;
protected static final int EVENT_UNSELECT = 3;
protected static final int EVENT_UPDATE = 4;
protected static final int EVENT_EDIT = 5;
protected static final int EVENT_DELETE = 6;
protected static final int EVENT_SHOW_INFO = 7;
public static final int EXPORT_ALL = 0;
public static final int EXPORT_PLAY = 1;
protected static final String JSON_PARAGRAPHS = "locations";
protected static final String JSON_PARAGRAPH_CONNECTION = "connections";
protected static final String JSON_NEXT_ID = "next_id";
protected static final String JSON_START_PARAGRAPH = "start";
protected static final String JSON_PLOT = "plot";
protected static final String JSON_OBJECTS = "obj";
protected static final String JSON_NEXT_OBJ_ID = "next_obj_id";
public static final char CONNECTION_DELIMETER_FROM = '<';
public static final char CONNECTION_DELIMETER_TO = '>';
protected static final String CONNECTION_DELIMETER_FROM_STR = "<";
protected static final String CONNECTION_DELIMETER_TO_STR = ">";
protected static final String JSON_SOUNDS = "snds";
protected static final String JSON_IMAGES = "imgs";
protected static final String JSON_NEXT_CONTENT_ID = "next_content_id";
protected static final String JSON_SETTINGS = "set";
protected static final String JSON_VERSION = "vr";
protected static final String JSON_GAME_ID = "id";
protected static final String JSON_GAME_KEY = "k";
protected static final String JSON_PARAMETERS = "p";
protected static final String JSON_BOOK_RULES = "r";
protected static final String JSON_PLAYER_RULES = "s";
protected static final String JSON_COMMERCIAL_TEXT = "t";
protected static final String JSON_DEMO_INFO_TEXT = "u";
public static final String CONNECTION_ID_PREFIX = "c";
public static final String OBJECT_ID_PREFIX = "o";
public static final String ALCHEMY_PREFIX_FROM = "af";
public static final String ALCHEMY_PREFIX_TO = "at";
public static final String MODIFICATOR_PREFIX = "m";
public static final String BATTLE = "b";
public static final int STATUS_PROPOSAL = 0;
public static final int STATUS_DRAFT = 1;
public static final int STATUS_FINAL = 2;
public static final int HI_VERSION=1;
public static final int LO_VERSION=10;
public static final int PLAYER_LIST_TYPE_ALWAYS = 0;
public static final int PLAYER_LIST_TYPE_POPUP = 1;
public static final int PLAYER_LIST_TYPE_NONE = 2;
private static final int SOURCE_BOOK_PLOT = 0;
private static final int SOURCE_BOOK_RULES = 1;
private static final int SOURCE_PLAYER_RULES = 2;
private static final int SOURCE_COMMERCIAL_TEXT = 3;
private static final int SOURCE_DEMO_INFO_TEXT = 4;
protected int nextId;
private ArrayList<ParagraphListener> paragraphListeners = new ArrayList<ParagraphListener>();
private ArrayList<ParameterListener> parameterListeners = new ArrayList<ParameterListener>();
protected ArrayList<Paragraph> paragraphs = new ArrayList<Paragraph>();
protected ArrayList<ObjectBean> objects = new ArrayList<ObjectBean>();
private ArrayList<ParagraphConnectionListener> paragraphConnectionListeners = new ArrayList<ParagraphConnectionListener>();
private ArrayList<ObjectListener> objectListeners = new ArrayList<ObjectListener>();
private ArrayList<PlotListener> plotListeners = new ArrayList<PlotListener>();
private ArrayList<SettingsListener> settingsListener = new ArrayList<SettingsListener>();
protected ArrayList<ParagraphConnection> paragraphConnections = new ArrayList<ParagraphConnection>();
protected ArrayList<Picture> pictures = new ArrayList<Picture>();
protected ArrayList<Sound> sounds = new ArrayList<Sound>();
private ArrayList<ContentListener> contentListeners = new ArrayList<ContentListener>();
protected ArrayList<AbstractParameter> parameters = new ArrayList<AbstractParameter>();
private ContentPlayer contentPlayer;
protected Settings settings = new Settings();
private Paragraph currentParagraph;
protected Paragraph startParagraph;
protected String plot = "";
protected String bookRules = "";
protected String playerRules = "";
protected String commercialText="";
protected String demoInfoText="";
protected int nextObjId;
protected int nextContentId;
private int version;
private String gameId;
protected String gameKey;
private FullParagraphDescriptonBuilder descriptonBuilder = new FullParagraphDescriptonBuilder();
protected final AppConstants appConstants;
protected final AppMessages appMessages;
public String getDemoInfoText() {
return demoInfoText;
}
public String getBookRules() {
return bookRules;
}
public String getPlayerRules() {
return playerRules;
}
public String getCommercialText() {
return commercialText;
}
public void setCommercialText(String commercialText) {
this.commercialText = commercialText;
}
public Model(AppConstants appConstants, AppMessages appMessages) {
this.appConstants = appConstants;
this.appMessages = appMessages;
}
public Paragraph addNewParagraph(ParagraphListener sender) {
Paragraph paragraph = new Paragraph();
paragraph.setId(getNextParagraphId());
paragraph.setName(appConstants.modelNewParagraphName());
paragraphs.add(paragraph);
if (startParagraph==null) {
startParagraph = paragraph;
paragraph.setType(Paragraph.TYPE_START);
}
fireParagraphEvent(EVENT_ADD_NEW,paragraph,sender);
return paragraph;
}
protected String getNextParagraphId() {
return String.valueOf(nextId++);
}
protected void fireParametersEvent(int event, AbstractParameter parameter,ParameterListener sender) {
for (int i = 0; i < parameterListeners.size(); i++) {
ParameterListener listener = parameterListeners.get(i);
if (listener==sender) {
continue;
}
switch (event) {
case EVENT_ADD_NEW:
listener.addNewParameter(parameter);
break;
case EVENT_REFRESH_ALL:
listener.refreshAll();
break;
case EVENT_SELECTED:
listener.select(parameter);
break;
case EVENT_UNSELECT:
listener.select(parameter);
break;
case EVENT_UPDATE:
listener.update(parameter);
break;
case EVENT_DELETE:
listener.remove(parameter);
break;
case EVENT_SHOW_INFO:
listener.showInfo(parameter);
break;
}
}
}
protected void fireParagraphEvent(int event, Paragraph paragraph, ParagraphListener sender) {
for (int i = 0; i < paragraphListeners.size(); i++) {
ParagraphListener listener = paragraphListeners.get(i);
if (listener==sender) {
continue;
}
switch (event) {
case EVENT_ADD_NEW:
listener.addNewParagraph(paragraph);
break;
case EVENT_REFRESH_ALL:
listener.refreshAll();
break;
case EVENT_SELECTED:
listener.select(paragraph);
break;
case EVENT_UNSELECT:
listener.unselect(paragraph);
break;
case EVENT_UPDATE:
listener.update(paragraph);
break;
case EVENT_EDIT:
listener.edit(paragraph);
break;
case EVENT_DELETE:
listener.remove(paragraph);
break;
}
}
}
protected void fireParagraphConnectionEvent(int event, ParagraphConnection connection, ParagraphConnectionListener sender) {
for (int i = 0; i < paragraphConnectionListeners.size(); i++) {
ParagraphConnectionListener listener = paragraphConnectionListeners.get(i);
if (listener==sender) {
continue;
}
switch (event) {
case EVENT_REFRESH_ALL:
listener.refreshAll();
break;
case EVENT_SELECTED:
listener.select(connection);
break;
case EVENT_UNSELECT:
listener.unselect(connection);
break;
case EVENT_UPDATE:
listener.update(connection);
break;
case EVENT_DELETE:
listener.remove(connection);
break;
case EVENT_ADD_NEW:
listener.addNew(connection);
break;
}
}
}
private void firePlotEvent(int event, int source, PlotListener sender) {
for (int i = 0; i < plotListeners.size(); i++) {
PlotListener listener = plotListeners.get(i);
if (listener==sender) {
continue;
}
switch (event) {
case EVENT_REFRESH_ALL:
listener.refreshAll();
break;
case EVENT_UPDATE:
switch (source) {
case SOURCE_BOOK_RULES:
listener.updateBookRules(bookRules);
break;
case SOURCE_PLAYER_RULES:
listener.updatePlayerRules(playerRules);
break;
case SOURCE_COMMERCIAL_TEXT:
listener.updateCommercialText(commercialText);
break;
case SOURCE_DEMO_INFO_TEXT:
listener.updateDemoInfoText(demoInfoText);
break;
default:
listener.update(plot);
break;
}
break;
}
}
}
protected void fireObjectEvent(int event, ObjectBean object, ObjectListener sender) {
for (int i = 0; i < objectListeners.size(); i++) {
ObjectListener listener = objectListeners.get(i);
if (listener==sender) {
continue;
}
switch (event) {
case EVENT_REFRESH_ALL:
listener.refreshAll();
break;
case EVENT_UPDATE:
listener.update(object);
break;
case EVENT_SELECTED:
listener.select(object);
break;
case EVENT_UNSELECT:
listener.unselect(object);
break;
case EVENT_ADD_NEW:
listener.addNewObject(object);
break;
case EVENT_DELETE:
listener.remove(object);
break;
case EVENT_SHOW_INFO:
listener.showInfo(object);
break;
}
}
}
protected void firePictureEvent(int event, Picture picture, ContentListener sender) {
for (int i = 0; i < contentListeners.size(); i++) {
ContentListener listener = contentListeners.get(i);
if (listener==sender) {
continue;
}
switch (event) {
case EVENT_REFRESH_ALL:
listener.refreshAll();
break;
case EVENT_UPDATE:
listener.update(picture);
break;
case EVENT_ADD_NEW:
listener.addNew(picture);
break;
case EVENT_DELETE:
listener.remove(picture);
break;
case EVENT_SELECTED:
listener.select(picture);
break;
case EVENT_UNSELECT:
listener.unselect(picture);
break;
case EVENT_SHOW_INFO:
listener.showInfo(picture);
break;
}
}
}
protected void fireSoundEvent(int event, Sound sound, ContentListener sender) {
for (int i = 0; i < contentListeners.size(); i++) {
ContentListener listener = contentListeners.get(i);
if (listener==sender) {
continue;
}
switch (event) {
case EVENT_REFRESH_ALL:
listener.refreshAll();
break;
case EVENT_UPDATE:
listener.update(sound);
break;
case EVENT_ADD_NEW:
listener.addNew(sound);
break;
case EVENT_DELETE:
listener.remove(sound);
break;
case EVENT_SELECTED:
listener.select(sound);
break;
case EVENT_UNSELECT:
listener.unselect(sound);
break;
case EVENT_SHOW_INFO:
listener.showInfo(sound);
break;
}
}
}
public void addPicture(ContentListener sender) {
Picture picture = new Picture();
picture.setId(String.valueOf(nextContentId++));
picture.setName(appConstants.modelNewImageName());
pictures.add(picture);
firePictureEvent(EVENT_ADD_NEW, picture, sender);
}
public void addSound(ContentListener sender) {
Sound sound = new Sound();
sound.setId(String.valueOf(nextContentId++));
sound.setName(appConstants.modelNewSoundName());
sounds.add(sound);
fireSoundEvent(EVENT_ADD_NEW, sound, sender);
}
public void updatePicture(Picture picture,ContentListener sender) {
firePictureEvent(EVENT_UPDATE, picture, sender);
}
public void updateSound(Sound sound,ContentListener sender) {
fireSoundEvent(EVENT_UPDATE, sound, sender);
}
public boolean removePicture(Picture picture) {
for (Paragraph paragraph : paragraphs) {
if (paragraph.dependsOn(picture)) {
Window.alert(appMessages.pictureIsUsedInParagraph(paragraph.getName()));
return false;
}
}
pictures.remove(picture);
firePictureEvent(EVENT_DELETE, picture, null);
return true;
}
public boolean removeSound(Sound sound) {
for (Paragraph paragraph : paragraphs) {
if (paragraph.dependsOn(sound)) {
Window.alert(appMessages.soundIsUsedInParagraph(paragraph.getName()));
return false;
}
}
sounds.remove(sound);
fireSoundEvent(EVENT_DELETE, sound, null);
return true;
}
public void selectPicture(Picture object, ContentListener objectListener) {
firePictureEvent(EVENT_SELECTED, object, null);
}
public void unselectPicture(Picture object, ContentListener objectListener) {
firePictureEvent(EVENT_UNSELECT, object, null);
}
public void selectSound(Sound object, ContentListener objectListener) {
fireSoundEvent(EVENT_SELECTED, object, null);
}
public void unselectSound(Sound object, ContentListener objectListener) {
fireSoundEvent(EVENT_UNSELECT, object, null);
}
public void addContentListener(ContentListener listener) {
if (contentListeners.contains(listener)==false) {
contentListeners.add(listener);
}
}
public void removeContentListener(ContentListener listener) {
if (contentListeners.contains(listener)) {
contentListeners.remove(listener);
}
}
public void addParagraphConnection(ParagraphConnection connection,ParagraphConnectionListener sender) {
paragraphConnections.add(connection);
fireParagraphConnectionEvent(EVENT_ADD_NEW,connection,sender);
}
public void addParagraphListener(ParagraphListener listener) {
if (paragraphListeners.contains(listener)==false) {
paragraphListeners.add(listener);
}
}
public void removeParagraphListener(ParagraphListener listener) {
if (paragraphListeners.contains(listener)) {
paragraphListeners.remove(listener);
}
}
public void addParamaterListener(ParameterListener listener) {
if (parameterListeners.contains(listener)==false) {
parameterListeners.add(listener);
}
}
public void removeParamaterListener(ParameterListener listener) {
if (parameterListeners.contains(listener)) {
parameterListeners.remove(listener);
}
}
public void addParagraphConnectionListener(ParagraphConnectionListener listener) {
if (paragraphConnectionListeners.contains(listener)==false) {
paragraphConnectionListeners.add(listener);
}
}
public void removeParagraphConnectionListener(ParagraphConnectionListener listener) {
if (paragraphConnectionListeners.contains(listener)) {
paragraphConnectionListeners.remove(listener);
}
}
public void addPlotListener(PlotListener listener) {
if (plotListeners.contains(listener)==false) {
plotListeners.add(listener);
}
}
public void removePlotListener(PlotListener listener) {
if (plotListeners.contains(listener)) {
plotListeners.remove(listener);
}
}
public void addObjectsListener(ObjectListener listener) {
if (objectListeners.contains(listener)==false) {
objectListeners.add(listener);
}
}
public void removeObjectsListener(ObjectListener listener) {
if (objectListeners.contains(listener)==false) {
objectListeners.remove(listener);
}
}
public void updateSettings(SettingsListener sender) {
for (int i = 0; i < settingsListener.size(); i++) {
SettingsListener listener = settingsListener.get(i);
if (listener!=sender) {
listener.settingsWereUpated();
}
}
}
public void addSettingsListener(SettingsListener listener) {
if (settingsListener.contains(listener)==false) {
settingsListener.add(listener);
}
}
public void removeSettingsListener(SettingsListener listener) {
if (settingsListener.contains(listener)) {
settingsListener.remove(listener);
}
}
public boolean fromJSON(String model) {
try {
restore(JSONParser.eval((String)model),JSONParser.getInstance());
return true;
} catch (Exception e) {
String message = e.getMessage();
if (message.length()>300) {
Window.alert(appMessages.modelErrorParsingData(message.substring(0,300)+"\n..."));
} else {
Window.alert(appMessages.modelErrorParsingData(message));
}
e.printStackTrace();
return false;
}
}
public void restore(Object object,JSONParser parser) throws JSONException {
//restore sounds
Object obj = parser.property(object, JSON_SOUNDS);
if (obj==null) {
sounds.clear();
} else {
sounds = Sound.fromJSArray(obj,parser);
}
//restore images
obj = parser.property(object, JSON_IMAGES);
if (obj==null) {
pictures.clear();
} else {
pictures = Picture.fromJSArray(obj,parser);
}
//create map for fast searching
HashMap<String, Picture> pct = new HashMap<String, Picture>(pictures.size());
for (int i = 0; i < pictures.size(); i++) {
Picture picture = pictures.get(i);
pct.put(picture.getId(), picture);
}
HashMap<String, Sound> snd = new HashMap<String, Sound>(sounds.size());
for (int i = 0; i < sounds.size(); i++) {
Sound sound = sounds.get(i);
snd.put(sound.getId(), sound);
}
//restore parameters
obj = parser.propertyNoCheck(object, JSON_PARAMETERS);
if (obj == null) {
parameters = new ArrayList<AbstractParameter>();
} else {
parameters = AbstractParameter.fromJSArray(obj,parser,pct);
}
HashMap<String, AbstractParameter> parametersMap = new HashMap<String, AbstractParameter>();
for (AbstractParameter parameter : parameters) {
parametersMap.put(parameter.getId(), parameter);
}
//restore objects
obj = parser.propertyNoCheck(object, JSON_OBJECTS);
if (obj == null) {
objects = new ArrayList<ObjectBean>();
} else {
objects = ObjectBean.fromJSArray(obj,parser,pct);
}
//restore paragraphs
obj = parser.property(object, JSON_PARAGRAPHS);
if (obj==null) {
paragraphs.clear();
} else {
paragraphs = Paragraph.fromJSArray(obj,objects,pct,snd,parser,appMessages,parametersMap);
}
//restore connections
obj = parser.property(object, JSON_PARAGRAPH_CONNECTION);
if (obj==null) {
paragraphConnections.clear();
} else {
paragraphConnections = ParagraphConnection.fromJSArray(obj,paragraphs,objects,parser,appMessages,parametersMap);
}
nextId = parser.propertyNoCheckInt(object, JSON_NEXT_ID);
nextObjId = parser.propertyNoCheckInt(object, JSON_NEXT_OBJ_ID);
nextContentId = parser.propertyNoCheckInt(object, JSON_NEXT_CONTENT_ID);
String startId = parser.propertyNoCheckString(object, JSON_START_PARAGRAPH);
startParagraph = null;
for (int i = 0; i < paragraphs.size(); i++) {
Paragraph paragraph = paragraphs.get(i);
if (paragraph.getType()==Paragraph.TYPE_START) {
if (startId == null) {
startParagraph = paragraph;
continue;
} else if (startId.equals(paragraph.getId())) {
//the same
startParagraph = paragraph;
continue;
}
//error, correct it
paragraph.setType(Paragraph.TYPE_NORMAL);
} else if (paragraph.getId().equals(startId) && startParagraph==null) {
startParagraph = paragraph;
}
}
String plot = parser.propertyNoCheckString(object, JSON_PLOT);
if (plot == null) {
this.plot = "";
} else {
this.plot = plot;
}
plot = parser.propertyNoCheckString(object, JSON_BOOK_RULES);
if (plot == null) {
this.bookRules = "";
} else {
this.bookRules = plot;
}
plot = parser.propertyNoCheckString(object, JSON_PLAYER_RULES);
if (plot == null) {
this.playerRules = "";
} else {
this.playerRules = plot;
}
plot = parser.propertyNoCheckString(object, JSON_COMMERCIAL_TEXT);
if (plot == null) {
this.commercialText = "";
} else {
this.commercialText = plot;
}
plot = parser.propertyNoCheckString(object, JSON_DEMO_INFO_TEXT);
if (plot == null) {
this.demoInfoText = "";
} else {
this.demoInfoText = plot;
}
obj = parser.property(object, JSON_SETTINGS);
if (obj != null) {
settings = Settings.fromJS(obj,parser);
} else {
settings = new Settings();
}
version = parser.propertyNoCheckInt(object, JSON_VERSION);
gameId = parser.propertyNoCheckString(object, JSON_GAME_ID);
gameKey = parser.propertyNoCheckString(object, JSON_GAME_KEY);
firePlotEvent(EVENT_REFRESH_ALL, SOURCE_BOOK_PLOT, null);
fireSoundEvent(EVENT_REFRESH_ALL, null, null);
firePictureEvent(EVENT_REFRESH_ALL, null, null);
fireParagraphEvent(EVENT_REFRESH_ALL,null,null);
fireObjectEvent(EVENT_REFRESH_ALL, null, null);
fireParametersEvent(EVENT_REFRESH_ALL, null, null);
updateSettings(null);
}
public void updateParagraph(Paragraph paragraph,ParagraphListener sender) {
fireParagraphEvent(EVENT_UPDATE,paragraph,sender);
}
public ArrayList<Paragraph> getParagraphs() {
return paragraphs;
}
public ArrayList<ParagraphConnection> getParagraphConnections() {
return paragraphConnections;
}
public ArrayList<ObjectBean> getObjects() {
return objects;
}
public void apply(Model model) {
paragraphConnections = model.paragraphConnections;
objects = model.objects;
paragraphs = model.paragraphs;
nextId = model.nextId;
nextObjId = model.nextObjId;
nextContentId = model.nextContentId;
startParagraph = model.startParagraph;
plot = model.plot;
bookRules = model.bookRules;
playerRules = model.playerRules;
settings = model.settings;
sounds = model.sounds;
pictures = model.pictures;
version = model.version;
gameId = model.gameId;
parameters = model.parameters;
commercialText = model.commercialText;
demoInfoText = model.demoInfoText;
bookRules = model.bookRules;
playerRules = model.playerRules;
refreshAll();
}
protected void refreshAll() {
firePlotEvent(EVENT_REFRESH_ALL, SOURCE_BOOK_PLOT, null);
fireSoundEvent(EVENT_REFRESH_ALL, null, null);
firePictureEvent(EVENT_REFRESH_ALL, null, null);
fireObjectEvent(EVENT_REFRESH_ALL, null, null);
fireParagraphEvent(EVENT_REFRESH_ALL,null,null);
fireParagraphConnectionEvent(EVENT_REFRESH_ALL,null,null);
fireParametersEvent(EVENT_REFRESH_ALL,null,null);
updateSettings(null);
}
public void selectParagraph(Paragraph paragraph, ParagraphListener sender) {
if (currentParagraph!=paragraph) {
if (currentParagraph != null) {
fireParagraphEvent(EVENT_UNSELECT,currentParagraph,sender);
}
currentParagraph = paragraph;
fireParagraphEvent(EVENT_SELECTED,paragraph,sender);
}
}
public void makeParagraphAsStart(Paragraph paragraph) {
if (paragraph==startParagraph) {
//already start
paragraph.setType(Paragraph.TYPE_START);
return;
}
if (paragraph.isFail()) {
Window.alert(appConstants.modelParagraphIsFailMakeNormal());
return;
}
if (startParagraph != null) {
makeParagraphAsNormal(startParagraph);
}
startParagraph = paragraph;
paragraph.setType(Paragraph.TYPE_START);
updateParagraph(paragraph, null);
}
public void makeParagraphAsNormal(Paragraph paragraph) {
if (startParagraph==paragraph) {
startParagraph = null;
}
paragraph.setType(Paragraph.TYPE_NORMAL);
updateParagraph(paragraph, null);
}
public void makeParagraphAsFail(Paragraph paragraph) {
if (startParagraph==paragraph) {
Window.alert(appConstants.modelParagraphIsStartCannotBeFail());
return;
}
paragraph.setType(Paragraph.TYPE_FAIL);
updateParagraph(paragraph, null);
}
public void makeParagraphAsCommercial(Paragraph paragraph) {
if (startParagraph==paragraph) {
Window.alert(appConstants.modelParagraphIsStartCannotBeCommercial());
return;
}
paragraph.setType(Paragraph.TYPE_COMMERCIAL);
updateParagraph(paragraph, null);
}
public void makeParagraphAsSuccess(Paragraph paragraph) {
if (startParagraph==paragraph) {
Window.alert(appConstants.modelParagraphIsStartCannotBeSuccess());
return;
}
paragraph.setType(Paragraph.TYPE_SUCCESS);
updateParagraph(paragraph, null);
}
public Paragraph getStartParagraph() {
return startParagraph;
}
public ArrayList<ParagraphConnection> getOutputParagraphConnections(Paragraph paragraph) {
ArrayList<ParagraphConnection> result = new ArrayList<ParagraphConnection>();
int l = paragraphConnections.size();
for (int i = 0; i < l; i++) {
ParagraphConnection connection = paragraphConnections.get(i);
if (connection.getFrom()==paragraph || (connection.isBothDirections() && connection.getTo()==paragraph)) {
result.add(connection);
}
}
return result;
}
public ArrayList<ParagraphConnection> getInputParagraphConnections(Paragraph paragraph) {
ArrayList<ParagraphConnection> result = new ArrayList<ParagraphConnection>();
int l = paragraphConnections.size();
for (int i = 0; i < l; i++) {
ParagraphConnection connection = paragraphConnections.get(i);
if (connection.getTo()==paragraph || (connection.isBothDirections() && connection.getFrom()==paragraph)) {
result.add(connection);
}
}
return result;
}
public void editParagraph(Paragraph paragraph, ParagraphListener sender) {
fireParagraphEvent(EVENT_EDIT, paragraph, sender);
}
public void updateParagraphConnection(ParagraphConnection connection, ParagraphConnectionListener sender) {
fireParagraphConnectionEvent(EVENT_UPDATE, connection, sender);
}
public void selectParagraphConnection(ParagraphConnection connection, ParagraphConnectionListener sender) {
fireParagraphConnectionEvent(EVENT_SELECTED, connection, sender);
}
public void unselectParagraphConnection(ParagraphConnection connection, ParagraphConnectionListener sender) {
fireParagraphConnectionEvent(EVENT_UNSELECT, connection, sender);
}
public void unselectParagraph(Paragraph paragraph, ParagraphListener sender) {
fireParagraphEvent(EVENT_UNSELECT, paragraph, sender);
if (currentParagraph==paragraph) {
currentParagraph = null;
}
}
public String getPlot() {
return plot;
}
public void updateBookRules(String rules, PlotListener sender) {
bookRules = rules;
firePlotEvent(EVENT_UPDATE,SOURCE_BOOK_RULES,sender);
}
public void updatePlayerRules(String rules, PlotListener sender) {
playerRules = rules;
firePlotEvent(EVENT_UPDATE,SOURCE_PLAYER_RULES,sender);
}
public void updatePlot(String plot,PlotListener sender) {
this.plot = plot;
firePlotEvent(EVENT_UPDATE,SOURCE_BOOK_PLOT,sender);
}
public void selectObject(ObjectBean object, ObjectListener sender) {
fireObjectEvent(EVENT_SELECTED, object, sender);
}
public void unselectObject(ObjectBean object, ObjectListener sender) {
fireObjectEvent(EVENT_UNSELECT, object, sender);
}
public ObjectBean addNewObject(ObjectListener sender) {
ObjectBean objectBean = new ObjectBean();
objectBean.setId(String.valueOf(nextObjId++));
objectBean.setName(appConstants.newObjectName());
objects.add(objectBean);
fireObjectEvent(EVENT_ADD_NEW, objectBean, sender);
return objectBean;
}
public void updateObject(ObjectBean object, ObjectListener sender) {
fireObjectEvent(EVENT_UPDATE, object, sender);
}
public void removeParagraphConnection(ParagraphConnection connection) {
paragraphConnections.remove(connection);
fireParagraphConnectionEvent(EVENT_DELETE, connection,null);
}
public void removeParagraph(Paragraph paragraph) {
if (startParagraph==paragraph) {
Window.alert(appConstants.modelParagraphIsStartCannotBeDeleted());
return;
}
ArrayList<ParagraphConnection> list = getAllParagraphConnections(paragraph);
if (list.size()>0) {
Window.alert(appMessages.modelParagraphStillHasConnections(paragraph.getName()));
return;
}
paragraphs.remove(paragraph);
fireParagraphEvent(EVENT_DELETE, paragraph,null);
}
public ArrayList<Paragraph> getAllSuccessParagraphs() {
ArrayList<Paragraph> result = new ArrayList<Paragraph>();
int l = paragraphs.size();
for (int i = 0; i < l; i++) {
Paragraph paragraph = paragraphs.get(i);
if (paragraph.isSuccess()) {
result.add(paragraph);
}
}
return result;
}
public ArrayList<ParagraphConnection> getAllParagraphConnections(Paragraph paragraph) {
ArrayList<ParagraphConnection> result = new ArrayList<ParagraphConnection>();
int l = paragraphConnections.size();
for (int i = 0; i < l; i++) {
ParagraphConnection connection = paragraphConnections.get(i);
if (connection.getFrom()==paragraph || connection.getTo()==paragraph) {
result.add(connection);
}
}
return result;
}
public void removeObjects(ObjectBean objectBean) {
int l = paragraphConnections.size();
for (int i = 0; i < l; i++) {
ParagraphConnection connection = paragraphConnections.get(i);
if (connection.getObject()==objectBean) {
Window.alert(appMessages.modelObjectCannotBeRemoved(objectBean.getName(),connection.getFrom().getName(),connection.getTo().getName()));
return;
}
}
l = paragraphs.size();
for (int i = 0; i < l; i++) {
Paragraph paragraph = paragraphs.get(i);
if (paragraph.getGotObjects().contains(objectBean)) {
Window.alert(appMessages.modelObjectCannotBeRemoved2(objectBean.getName(),paragraph.getName()));
return;
}
}
objects.remove(objectBean);
fireObjectEvent(EVENT_DELETE, objectBean,null);
}
public Settings getSettings() {
return settings;
}
public String getFullParagraphDescripton(Paragraph paragraph,ArrayList<Paragraph> ids,ArrayList<String> errors) throws IllegalArgumentException {
return descriptonBuilder.getFullParagraphDescripton(paragraph, ids, errors, null);
}
public String getFullParagraphDescripton(Paragraph paragraph,ArrayList<Paragraph> ids,ArrayList<String> errors,Paragraph preSelect) throws IllegalArgumentException {
return descriptonBuilder.getFullParagraphDescripton(paragraph, ids, errors, preSelect);
}
public ArrayList<Picture> getPictures() {
return pictures;
}
public ArrayList<Sound> getSounds() {
return sounds;
}
public void previewURL(String url) {
if (contentPlayer != null) {
contentPlayer.openURL(url);
}
}
public void playSound(String url,boolean loop) {
if (contentPlayer != null) {
contentPlayer.playSound(url,loop);
}
}
public ContentPlayer getContentPlayer() {
return contentPlayer;
}
public void setContentPlayer(ContentPlayer contentPlayer) {
this.contentPlayer = contentPlayer;
}
public void previewImage(Picture picture) {
previewURL(picture.getUrl());
}
public void playSound(Sound sound) {
playSound(sound.getUrl(),false);
}
public class FullParagraphDescriptonBuilder {
private String connectionPattern;
private String connectionMarkedPattern;
private ParagraphDescriptionLinkProvider linkProvider;
private SecretKeyDescriptionProvider secretKeyProvider;
private ParagraphParsingHandler paragraphParsingHandler;
private Set<ObjectBean> objects;
private Map<Parameter,Integer> parameters;
private Set<Modificator> modificators;
private boolean hiddenUsingObjects;
private boolean emptyConditionIsError=true;
private boolean playerMode;
private boolean checkSecretKeys;
public boolean isCheckSecretKeys() {
return checkSecretKeys;
}
public void setCheckSecretKeys(boolean checkSecretKeys) {
this.checkSecretKeys = checkSecretKeys;
}
public boolean isPlayerMode() {
return playerMode;
}
public void setPlayerMode(boolean playerMode) {
this.playerMode = playerMode;
}
public boolean isEmptyConditionIsError() {
return emptyConditionIsError;
}
public void setEmptyConditionIsError(boolean emptyConditionIsError) {
this.emptyConditionIsError = emptyConditionIsError;
}
public FullParagraphDescriptonBuilder() {
connectionPattern = "<span></span>";
connectionMarkedPattern = "<span></span>";
hiddenUsingObjects = settings.isHiddenUsingObjects();
}
public ParagraphParsingHandler getParagraphParsingHandler() {
return paragraphParsingHandler;
}
public void setParagraphParsingHandler(
ParagraphParsingHandler paragraphParsingHandler) {
this.paragraphParsingHandler = paragraphParsingHandler;
}
public String getConnectionMarkedPattern() {
return connectionMarkedPattern;
}
public void setConnectionMarkedPattern(String connectionMarkedPattern) {
this.connectionMarkedPattern = connectionMarkedPattern;
}
public String getConnectionPattern() {
return connectionPattern;
}
public void setConnectionPattern(String connectionPattern) {
this.connectionPattern = connectionPattern;
}
public String getFullParagraphDescripton(Paragraph paragraph,ArrayList<Paragraph> ids) throws IllegalArgumentException {
return getFullParagraphDescripton(paragraph,ids,null,null,null);
}
public String getFullParagraphDescripton(Paragraph paragraph,ArrayList<Paragraph> ids,ArrayList<ParagraphConnection> connections) throws IllegalArgumentException {
return getFullParagraphDescripton(paragraph,ids,null,null,connections);
}
public String getFullParagraphDescripton(Paragraph paragraph,ArrayList<Paragraph> ids,ArrayList<String> errors,Paragraph preSelect) throws IllegalArgumentException {
return getFullParagraphDescripton(paragraph,ids,errors,preSelect,null);
}
public String getFullParagraphDescripton(Paragraph paragraph,ArrayList<Paragraph> ids,ArrayList<String> errors,Paragraph preSelect,ArrayList<ParagraphConnection> connections) throws IllegalArgumentException {
if (connections==null) {
connections = getOutputParagraphConnections(paragraph);
} else {
//make a copy
ArrayList<ParagraphConnection> conn = new ArrayList<ParagraphConnection>(connections.size());
conn.addAll(connections);
connections = conn;
}
if (errors != null && paragraph.getType()==Paragraph.TYPE_START && paragraph.isCommercial()) {
errors.add(appConstants.modelParagraphIsStartCannotBeCommercial());
}
StringBuffer buffer = new StringBuffer();
StringBuffer postBuffer= null;
buffer.append(paragraph.getDescription());
int pos=0;
int condition=-1;
int objectDetected=0;
boolean scanAchemy=true;
boolean battleFound=false;
ArrayList<Modificator> mustUseModificators=null;
if (paragraph.getChangeModificators() != null && paragraph.getChangeModificators().size()>0) {
mustUseModificators = new ArrayList<Modificator>();
for (Modificator modificator : paragraph.getChangeModificators().keySet()) {
if (modificator.isAbsolute() || settings.isAddModificatorNamesToText()) {
mustUseModificators.add(modificator);
}
}
}
ArrayList<Alchemy> mustFromAlchemy=null;
ArrayList<Alchemy> mustToAlchemy=null;
if (paragraph.getAlchemy() != null) {
mustToAlchemy = new ArrayList<Alchemy>(paragraph.getAlchemy().size());
if (settings.isAddAlchemyToText()) {
mustFromAlchemy = new ArrayList<Alchemy>(paragraph.getAlchemy().size());
}
for (Alchemy alchemy : paragraph.getAlchemy().keySet()) {
boolean value = paragraph.getAlchemy().get(alchemy);
if (value) {
if (settings.isAddAlchemyToText()) {
mustFromAlchemy.add(alchemy);
}
mustToAlchemy.add(alchemy);
}
}
}
if (settings.isAddModificatorNamesToText()) {
for (ParagraphConnection connection : connections) {
if (connection.getType()==ParagraphConnection.TYPE_MODIFICATOR || connection.getType()==ParagraphConnection.TYPE_NO_MODIFICATOR) {
if (connection.getFrom()==paragraph) {
if (mustUseModificators==null) {
mustUseModificators = new ArrayList<Modificator>();
}
if (connection.getModificator()==null) {
if (errors != null) {
errors.add(appMessages.modelParagraphHasConnectionWithoutModificator(connection.getFrom().getName(),connection.getTo().getName()));
}
} else {
mustUseModificators.add(connection.getModificator());
}
}
}
}
}
next_step:
while (true) {
int start = buffer.indexOf(CONNECTION_DELIMETER_FROM_STR,pos);
if (start<0) {
if (paragraphParsingHandler !=null) {
if (pos==0) {
paragraphParsingHandler.addText(paragraph,buffer.toString());
} else if (pos<buffer.length()) {
paragraphParsingHandler.addText(paragraph,buffer.substring(pos));
}
}
break;
}
if (start>0 && condition<0 && paragraphParsingHandler !=null) {
paragraphParsingHandler.addText(paragraph,buffer.substring(pos, start));
}
pos = start;
int end = buffer.indexOf(CONNECTION_DELIMETER_TO_STR,start);
if (end<0) {
if (errors != null) {
errors.add(appConstants.modelWrongParagraphStructure());
}
}
String id = buffer.substring(start+1, end);
buffer.replace(start, end+1, "");
if (id.length()==0) {
//marker - <>
if (condition>=0) {
//second marker started - wrong!
if (errors != null) {
errors.add(appConstants.modelParagraphHave2DelimSiquence());
}
} else {
condition = start;
}
continue;
}
if (id.startsWith(OBJECT_ID_PREFIX)) {
//object
if (condition>=0 && errors != null) {
errors.add(appConstants.modelParagraphObjectWithConditionPrefix());
}
ObjectBean objectBean=null;
if (paragraph.getGotObjects().size()==0) {
if (errors != null) {
errors.add(appConstants.modelParagraphUnknownReferenceItemText());
}
} else {
//check it
for (ObjectBean bean : paragraph.getGotObjects()) {
if (id.substring(1).equals(bean.getId())){
objectBean = bean;
break;
}
}
// if (objectBean==null) {
// for (ObjectBean bean : paragraph.getLostObjects()) {
// if (id.substring(1).equals(bean.getId())){
// objectBean = bean;
// break;
// }
// }
// }
if (objectBean == null && errors != null) {
errors.add(appConstants.modelParagraphHasReferenceToOtherItemText());
}
}
if (objectBean != null) {
objectDetected++;
if (hiddenUsingObjects) {
//use secret keys
if (objectBean.getKey() == 0) {
//key not set
if (checkSecretKeys && errors != null) {
errors.add(appMessages.modelSecretKeyIsNotSet(objectBean.getName()));
}
} else {
String key;
if (secretKeyProvider == null) {
key = "("+(objectBean.getKey()>0 ? "+":"")+objectBean.getKey()+")";
} else {
key = secretKeyProvider.getObjectSecretKey(objectBean);
}
if (paragraphParsingHandler == null) {
if (playerMode==false) {
buffer.insert(start,key);
}
} else {
paragraphParsingHandler.addObject(paragraph,objectBean,key);
}
}
}
}
continue;
}
if (id.startsWith(MODIFICATOR_PREFIX)) {
//modificator
if (condition>=0 && errors != null) {
errors.add(appConstants.modelParagraphObjectWithConditionPrefix());
}
if (mustUseModificators==null || mustUseModificators.size()==0) {
if (errors != null) {
errors.add(appConstants.modelParagraphMustNotHaveModificatorsInText());
}
} else {
String idM = id.substring(1);
for (Iterator<Modificator> iterator = mustUseModificators.iterator(); iterator.hasNext();) {
Modificator modificator = (Modificator) iterator.next();
if (modificator.getId().equals(idM)) {
//found
if (paragraph.getChangeModificators()!= null && paragraph.getChangeModificators().containsKey(modificator)) {
if (modificator.isAbsolute() && paragraph.getChangeModificators().get(modificator)) {
//set absolute modificator
if (playerMode==false) {
//only for book mode
String num=null;
if (linkProvider == null) {
for (ParagraphConnection connection : paragraphConnections) {
if (connection.getType()==ParagraphConnection.TYPE_MODIFICATOR && connection.getModificator()==modificator) {
//found
num = String.valueOf(connection.getTo().getNumber());
break;
}
}
} else {
num = linkProvider.getModificatorValue(modificator);
}
if (num == null) {
if (errors != null) {
errors.add(appMessages.modelParagraphHasUnusedAbsModificator(modificator.getName()));
}
} else if (num.length()>0){
//we got number
buffer.insert(start,num);
if (settings.isAddModificatorNamesToText()) {
buffer.insert(start,'=');
}
}
}
}
}
if (settings.isAddModificatorNamesToText()) {
if (paragraphParsingHandler == null) {
buffer.insert(start,modificator.getName());
} else {
paragraphParsingHandler.addText(paragraph, modificator.getName());
}
}
iterator.remove();
continue next_step;
}
}
//not found
if (errors != null) {
errors.add(appMessages.modelParagraphHasUnknownModificator(idM));
}
}
}
if (id.startsWith(ALCHEMY_PREFIX_FROM) || id.startsWith(ALCHEMY_PREFIX_TO)) {
//alchemy
if (condition>=0 && errors != null) {
errors.add(appConstants.modelParagraphObjectWithConditionPrefix());
}
if (paragraph.getAlchemy()==null) {
if (errors != null) {
errors.add(appConstants.modelParagraphUnknownReferenceAlchemyText());
}
} else {
String alId = id.substring(2);
Alchemy found=null;
for (Alchemy alchemy : paragraph.getAlchemy().keySet()) {
boolean value = paragraph.getAlchemy().get(alchemy);
if (scanAchemy && errors != null) {
//validate all alchemy in the paragraph
if (value) {
if (alchemy.isOnDemand()==false) {
errors.add(appMessages.modelParagraphHasNonDemandAlchemy(alchemy.getName()));
}
} else {
if (alchemy.isOnDemand()) {
errors.add(appMessages.modelParagraphHasDisabledOnDemandAlchemy(alchemy.getName()));
}
}
if (alchemy.getPlace()==Alchemy.PLACE_BATTLE) {
if (paragraph.getBattle()==null) {
errors.add(appMessages.modelParagraphPeasfulHasBattleAlchemy(alchemy.getName()));
}
} else if (alchemy.isWeapon()) {
errors.add(appMessages.modelParagraphHasNonBattleWeaponAlchemy(alchemy.getName()));
}
}
if (value && alchemy.getId().equals(alId)) {
//found
found = alchemy;
if (scanAchemy==false) {
break;
}
}
}
scanAchemy = false;
if (found==null) {
if (errors != null) {
errors.add(appConstants.modelParagraphUnknownReferenceAlchemyText());
}
} else if (found.isOnDemand()){
//for found.isOnDemand()=false error is already reported
if (id.startsWith(ALCHEMY_PREFIX_FROM)) {
//from
if (settings.isAddAlchemyToText()) {
String from = String.valueOf(found.getFromValue());
if (paragraphParsingHandler == null) {
buffer.insert(start,from);
} else {
//add just value
paragraphParsingHandler.addAlchemyFromValue(paragraph,from);
}
if (mustFromAlchemy != null) {
if (mustFromAlchemy.contains(found)) {
mustFromAlchemy.remove(found);
} else {
if (errors != null) {
errors.add(appMessages.modelParagraphMultyReferenceAlchemyFrom(found.getName()));
}
}
}
} else {
if (errors != null) {
errors.add(appConstants.modelParagraphReferenceAlchemyDisabled());
}
}
} else {
//to
String to = settings.isAddAlchemyToText() ? found.getToValue().toString() : "";
if (paragraphParsingHandler == null) {
buffer.insert(start,to);
} else {
//add value and link
paragraphParsingHandler.addAlchemy(paragraph,to,found);
}
if (mustToAlchemy != null) {
if (mustToAlchemy.contains(found)) {
mustToAlchemy.remove(found);
} else {
if (errors != null) {
errors.add(appMessages.modelParagraphMultyReferenceToAlchemyTo(found.getName()));
}
}
}
}
}
}
continue;
}
if (BATTLE.equals(id)) {
//insert battle description in the test and skip it
if (condition>=0 && errors != null) {
errors.add(appConstants.modelParagraphObjectWithConditionPrefix());
}
if (paragraph.getBattle()==null) {
if (errors != null) {
errors.add(appConstants.modelParagraphNoBattleSet());
}
} else if (battleFound){
if (errors != null) {
errors.add(appConstants.modelParagraphDoubleBattleRef());
}
} else {
//normal
Battle battle = paragraph.getBattle();
if (paragraph.getEnemies()==null || paragraph.getEnemies().size()==0) {
if (errors != null) {
errors.add(appConstants.modelParagraphBattleNoEnemies());
}
} else if (playerMode) {
paragraphParsingHandler.addBattle(battle,paragraph);
} else {
StringBuilder builder = new StringBuilder('\n');
builder.append(battle.getName());
builder.append('\n');
for (NPCParams npc : paragraph.getEnemies()) {
//TODO Rounds and Friends
builder.append(npc.getNpc().getName());
builder.append(' ');
HashMap<Parameter,Integer> values = npc.getValues();
boolean add=false;
for (Parameter parameter : values.keySet()) {
if (battle.dependsOn(parameter)) {
if (add) {
builder.append(", ");
}
add = true;
builder.append(parameter.getName());
builder.append(':');
builder.append(values.get(parameter));
}
}
builder.append('\n');
}
buffer.insert(start,builder.toString());
pos = start + builder.length();
}
battleFound = true;
}
continue;
}
//paragraph number
for (int i = 0; i < connections.size(); i++) {
ParagraphConnection connection = connections.get(i);
String url;
Paragraph next;
if (paragraph==connection.getFrom() && connection.getToId().equals(id)) {
next = connection.getTo();
} else if (paragraph==connection.getTo() && connection.getFromId().equals(id) && connection.isBothDirections()) {
//to it, bi-direction
next = connection.getFrom();
} else {
continue;
}
if (connection.isConditional()) {
//connection with condition
if (condition<0 && settings.isHiddenUsingObjects()==false) {
if (errors != null) {
errors.add(appMessages.modelConnectionNoCoditionDescriptor(id));
}
connections.remove(i);
continue next_step;
} else if (connection.getType() != ParagraphConnection.TYPE_NORMAL) {
//model condition
boolean draw=!settings.isHideNonMatchedParameterConnections();
switch (connection.getType()) {
case ParagraphConnection.TYPE_MODIFICATOR:
if (connection.getModificator()==null) {
if (errors != null) {
errors.add(appConstants.modificatorNotSetInParagraph());
}
} else if (modificators == null || modificators.contains(connection.getModificator())) {
//draw it
draw = true;
} else if (playerMode==false && connection.getModificator().isAbsolute()==false) {
draw = true;
}
break;
case ParagraphConnection.TYPE_NO_MODIFICATOR:
if (connection.getModificator()==null) {
if (errors != null) {
errors.add(appConstants.modificatorNotSetInParagraph());
}
} else if (modificators == null || !modificators.contains(connection.getModificator())) {
//draw it
draw = true;
}
break;
case ParagraphConnection.TYPE_PARAMETER_LESS:
if (connection.getParameter()==null) {
if (errors != null) {
errors.add(appConstants.parameterNotSetInParagraph());
}
} else if (connection.getParameterValue()==null){
if (errors != null) {
errors.add(appConstants.parameterValueNotSetInParagraph());
}
} else if (parameters == null) {
draw = true;
} else if (parameters.containsKey(connection.getParameter()) &&
parameters.get(connection.getParameter())<connection.getParameterValue().calculate()) {
draw = true;
}
break;
case ParagraphConnection.TYPE_PARAMETER_MORE:
if (connection.getParameter()==null) {
if (errors != null) {
errors.add(appConstants.parameterNotSetInParagraph());
}
} else if (connection.getParameterValue()==null){
if (errors != null) {
errors.add(appConstants.parameterValueNotSetInParagraph());
}
} else if (parameters == null) {
draw = true;
} else if (parameters.containsKey(connection.getParameter()) &&
parameters.get(connection.getParameter())>connection.getParameterValue().calculate()) {
//draw it
draw = true;
}
break;
case ParagraphConnection.TYPE_VITAL_LESS:
draw = true;
if (connection.getStrictness()==ParagraphConnection.STRICTNESS_MUST_NOT && errors != null) {
errors.add(appConstants.modelMustNotVitalConnectionMakesNoSense());
}
break;
case ParagraphConnection.TYPE_ENEMY_VITAL_LESS:
draw = true;
if (connection.getStrictness()==ParagraphConnection.STRICTNESS_MUST_NOT && errors != null) {
errors.add(appConstants.modelMustNotVitalConnectionMakesNoSense());
}
break;
case ParagraphConnection.TYPE_BATTLE_ROUND_MORE:
draw = true;
break;
default:
if (errors != null) {
errors.add("Unsupported type of connection "+connection.getType());
}
break;
}
if (draw==false && connection.getStrictness()==ParagraphConnection.STRICTNESS_MUST_NOT) {
//reverse condition
draw = true;
}
if (draw) {
if (paragraphParsingHandler !=null) {
if (condition>=0) {
paragraphParsingHandler.addText(paragraph,buffer.substring(condition, start));
}
}
condition = -1;
} else {
if (condition>=0) {
buffer.replace(condition, start, "");
pos = pos - start + condition;
condition = -1;
}
connections.remove(i);
continue next_step;
}
} else if (hiddenUsingObjects && connection.getStrictness()!=ParagraphConnection.STRICTNESS_MUST_NOT) {
//just remove description
if (condition>=0) {
buffer.replace(condition, start, "");
pos = pos - start + condition;
condition = -1;
}
connections.remove(i);
if (preSelect != null && next==preSelect) {
//mark it at the end
if (postBuffer ==null) {
postBuffer = new StringBuffer();
}
postBuffer.append(connection.getObject().getName());
postBuffer.append(' ');
if (linkProvider==null) {
postBuffer.append(connectionMarkedPattern);
} else {
postBuffer.append(linkProvider.getLinkTo(paragraph,next,connection));
}
postBuffer.append('\n');
if (objects != null && !objects.contains(connection.getObject()) && errors != null) {
errors.add(appMessages.modelPlayerDoesNotHaveRequieredObject(connection.getObject().getName(),preSelect.getName()));
}
}
continue next_step;
} else if (objects != null){
//add link only of necessary object exists
boolean reverce = connection.getStrictness() != ParagraphConnection.STRICTNESS_MUST_NOT;
if (objects.contains(connection.getObject())==reverce) {
//player has this object
if (paragraphParsingHandler !=null) {
if (condition>=0) {
paragraphParsingHandler.addText(paragraph,buffer.substring(condition, start));
} else if (pos>start){
paragraphParsingHandler.addText(paragraph,buffer.substring(start, pos));
}
}
condition = -1;
} else {
//does not have
if (condition>=0) {
buffer.replace(condition, start, "");
pos = pos - start + condition;
condition = -1;
}
connections.remove(i);
continue next_step;
}
} else {
//just add link
// String link = buffer.substring(condition,start).trim();
// if (emptyConditionIsError && link.length()==0 && errors != null) {
// errors.add(appConstants.modelTextOfUsingIsEmpty());
// }
condition = -1;
}
} else if (condition>=0 && errors != null) {
errors.add(appMessages.modelConnectionNonConditionalHasCondtionDescriptor(id));
}
if (ids != null) {
ids.add(next);
}
if (linkProvider==null) {
if (next==preSelect) {
url = connectionMarkedPattern;
} else {
url = connectionPattern ;
}
} else {
url = linkProvider.getLinkTo(paragraph,next,connection);
}
if (paragraphParsingHandler == null) {
pos = start+url.length();
buffer.insert(start,url);
} else {
paragraphParsingHandler.addLinkTo(paragraph,next,connection);
}
connections.remove(i);
continue next_step;
}
if (errors != null) {
errors.add(appMessages.modelUnknownConnectionId(id));
}
}
for (int i = 0; i < connections.size(); i++) {
//not used connections
ParagraphConnection connection = connections.get(i);
if (connection.getObject()==null) {
//missed link
if (errors != null) {
errors.add(appMessages.modelConnectionMissedInText(connection.getFrom().getName(),connection.getTo().getName()));
}
} else if (settings.isHiddenUsingObjects()) {
//condition, leave "as is"
} else {
//missed link
if (errors != null) {
errors.add(appMessages.modelConnectionMissedInText(connection.getFrom().getName(),connection.getTo().getName()));
}
}
}
if (errors != null) {
if (paragraph.getBattle() != null && battleFound==false) {
errors.add(appConstants.modelParagraphNoBattleRef());
}
if (mustUseModificators != null && mustUseModificators.size()>0) {
errors.add(appConstants.modelParagraphUnreferredModificators());
}
}
if (postBuffer != null) {
buffer.append('\n');
buffer.append('\n');
buffer.append(postBuffer);
}
if (errors != null && (paragraph.getGotObjects().size() != objectDetected)) {
errors.add(appConstants.modelDiffentQuantitiesItemsInTextAndData());
}
return buffer.toString();//.replace("\n","<br/>");
}
public ParagraphDescriptionLinkProvider getLinkProvider() {
return linkProvider;
}
public void setLinkProvider(ParagraphDescriptionLinkProvider linkProvider) {
this.linkProvider = linkProvider;
}
public Set<ObjectBean> getObjects() {
return objects;
}
public void setObjects(Set<ObjectBean> objects) {
this.objects = objects;
}
public boolean isHiddenUsingObjects() {
return hiddenUsingObjects;
}
public void setHiddenUsingObjects(boolean hiddenUsingObjects) {
this.hiddenUsingObjects = hiddenUsingObjects;
}
public Map<Parameter, Integer> getParameters() {
return parameters;
}
public void setParameters(Map<Parameter, Integer> parameters) {
this.parameters = parameters;
}
public Set<Modificator> getModificators() {
return modificators;
}
public void setModificators(Set<Modificator> modificators) {
this.modificators = modificators;
}
}
public FullParagraphDescriptonBuilder getFullParagraphDescriptonBuilder() {
return new FullParagraphDescriptonBuilder();
}
public int getVersion() {
return version==0 ? 100 : version;
}
public int getModelVersion() {
return HI_VERSION*100+LO_VERSION;
}
public int getVersionHi() {
return (int)(getVersion()/100);
}
public int getVersionLo() {
return getVersion() % 100;
}
public String getGameId() {
if (gameId==null) {
gameId = String.valueOf(new Date().getTime());
}
return gameId;
}
public void setGameId(String gameId) {
this.gameId = gameId;
}
public Paragraph getParagrapByID(String id) {
for (int i = 0; i < paragraphs.size(); i++) {
Paragraph paragraph = paragraphs.get(i);
if (paragraph.getId().equals(id)) {
return paragraph;
}
}
return null;
}
public ObjectBean getObjectById(String id) {
for (int i = 0; i < objects.size(); i++) {
ObjectBean bean = objects.get(i);
if (bean.getId().equals(id)) {
return bean;
}
}
return null;
}
public Picture getPictureByID(String id) {
for (int i = 0; i < pictures.size(); i++) {
Picture bean = pictures.get(i);
if (bean.getId().equals(id)) {
return bean;
}
}
return null;
}
public void stopSound() {
if (contentPlayer != null) {
contentPlayer.stopSound();
}
}
public void stopBackgroundSound() {
if (contentPlayer != null) {
contentPlayer.stopBackgroundSound();
}
}
public void playBackground(Sound sound) {
if (contentPlayer != null) {
contentPlayer.playBackgroundSound(sound.getUrl());
}
}
public Sound getSoundByID(String id) {
for (int i = 0; i < sounds.size(); i++) {
Sound bean = sounds.get(i);
if (bean.getId().equals(id)) {
return bean;
}
}
return null;
}
public Paragraph getCurrentParagraph() {
return currentParagraph;
}
public void refreshParagraphs() {
fireParagraphEvent(EVENT_REFRESH_ALL, null, null);
}
public String getGameKey() {
return gameKey;
}
public void showInfo(AbstractParameter parameter) {
fireParametersEvent(EVENT_SHOW_INFO, parameter, null);
}
public void showInfo(ObjectBean object) {
fireObjectEvent(EVENT_SHOW_INFO, object, null);
}
public void showInfo(Picture object) {
firePictureEvent(EVENT_SHOW_INFO, object, null);
}
public void showInfo(Sound object) {
fireSoundEvent(EVENT_SHOW_INFO, object, null);
}
public ArrayList<AbstractParameter> getParameters() {
return parameters;
}
public boolean removeParameter(AbstractParameter parameter, ParameterListener sender) {
for (AbstractParameter par : parameters) {
if (par !=parameter && par.dependsOn(parameter)) {
Window.alert(appMessages.cannotRemoveParameter(parameter.getName(),par.getName()));
return false;
}
}
for (Paragraph paragraph : paragraphs) {
if (paragraph.dependsOn(parameter)) {
Window.alert(appMessages.parameterIsUsedInParagraph(paragraph.getName()));
return false;
}
}
for (ParagraphConnection connection : paragraphConnections) {
if (connection.dependsOn(parameter)) {
Window.alert(appMessages.parameterIsUsedInParagraphConnection(connection.getFrom().getName(),connection.getTo().getName()));
return false;
}
}
parameters.remove(parameter);
fireParametersEvent(EVENT_DELETE, parameter, sender);
return true;
}
public void updateParameter(AbstractParameter parameter, ParameterListener sender) {
fireParametersEvent(EVENT_UPDATE, parameter, sender);
}
public void selectParameter(AbstractParameter parameter, ParameterListener sender) {
fireParametersEvent(EVENT_SELECTED, parameter, sender);
}
public void refreshParameters() {
fireParametersEvent(EVENT_REFRESH_ALL, null, null);
}
public void updateCommercialText(String text, PlotListener listener) {
commercialText = text;
firePlotEvent(EVENT_UPDATE,SOURCE_COMMERCIAL_TEXT,listener);
}
public void updateFirstPageDemoInfoText(String text, PlotListener listener) {
demoInfoText = text;
firePlotEvent(EVENT_UPDATE,SOURCE_DEMO_INFO_TEXT,listener);
}
public void refreshObjects() {
fireObjectEvent(EVENT_REFRESH_ALL, null, null);
}
public void refreshPictures() {
firePictureEvent(EVENT_REFRESH_ALL, null, null);
}
public void refreshSounds() {
fireSoundEvent(EVENT_REFRESH_ALL, null, null);
}
}