Compare commits

...

21 Commits

Author SHA1 Message Date
Zukero
5d802ed0e3 v0.6.6 released. 2017-08-18 22:19:29 +02:00
Zukero
33cbd059ec More bug fixes in Requirement management for Key and Replace areas.
Much better handling of the old school form, and smooth, automatic
transitionning from old school to new school, but only when necessary!
2017-08-18 17:22:06 +02:00
Zukero
6cb0941ca6 Replace areas can now use any type of requirement.
Many bug fix in Key Areas and Replace Areas, especially for the
requirements management.
2017-08-18 16:20:25 +02:00
Zukero
cfb38c33d6 Fixed bug preventing Quests with no quest stages from loading. 2017-08-18 11:51:48 +02:00
Zukero
ec3afaaf36 v0.6.5 released! 2017-08-11 22:32:54 +02:00
Zukero
9f978591ff Fixed XML-refreshing bug in TMX Map editor, and added area name editor
for key areas.
2017-08-11 22:16:08 +02:00
Zukero
7fff58d8f9 Merge branch 'master' of https://github.com/Zukero/ATCS.git 2017-08-11 21:31:57 +02:00
Zukero
6192bd8dce Fixed issue with symlinks creatipon in windows for paths containing
spaces.
2017-08-11 21:31:34 +02:00
Zukero
be43a2a5d4 Fixed display of incorrect default values when the underlying datais
null. Fixed KeyArea initialization.
2017-08-11 18:43:44 +02:00
Zukero
99524bf043 Introducing the help panel for Dialogue Sketches' editor's shortcuts. 2017-08-09 18:04:30 +02:00
Zukero
f2144ab446 Modified marker (*) handled for Dialogue Sketches too.
Typo fixed too, now displays "Dialogue sketches" instead of "Dialogue
sketchs"
2017-08-08 18:43:15 +02:00
Zukero
ada045a13b Fixed JSON import of existing element.
When an imported item was already present in the game sources, it wasnt
associated with the correct file, leading to trouble.
2017-08-08 18:25:01 +02:00
Zukero
4c4f7e5b92 Better management of scrolling in TMX Maps editor's Replacement
simulator.
2017-07-30 17:38:50 +02:00
Zukero
ef521207de v0.6.4 released. 2017-07-28 13:15:42 +02:00
Zukero
3ef0f7e0f1 Update checker now honors the "Use internet" setting. Another setting,
"check for updates" also controls this behavior.
2017-07-28 13:11:30 +02:00
Zukero
74808cdd3a Fixed a bug improperly restoring the state of WriteModeData (Dialogue
sketches) after loading it from disk. This created a risk of data loss
upon subsequent edition of dialogue sketches.
2017-07-27 20:50:10 +02:00
Zukero
1e8d08ee3a Added online version check, to warn of availability of a new version. 2017-07-27 01:07:01 +02:00
Zukero
8d8a1e122e v0.6.3 released! 2017-07-26 23:49:16 +02:00
Zukero
fe62c05b4b Fixed many bugs in the TMX Maps management. Added the
removeQuestProgress dialogue reward type. Initiallized the GDEVisitor
class to help with finding dependencies (through the Beanshell console
only for now).
2017-07-26 15:50:50 +02:00
Zukero
f93d03dbd3 Deleting a TMX Map also removes it from created/altered worldmaps, and
marks these as modified.
2017-07-25 19:16:35 +02:00
Zukero
7eb5c7c208 Fixed NPC editor bug where inflicted actor conditions weren't managed
correctly.
Fixed Worldmap saving and deletion (mostly the * management was crap)
Fixed multi-selection deletion.
2017-07-25 17:01:31 +02:00
32 changed files with 796 additions and 166 deletions

View File

@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="WINDOWS-1252" standalone="no"?>
<jardesc> <jardesc>
<jar path="ATContentStudio/ATCS_v0.6.2.jar"/> <jar path="ATCS/ATCS_v0.6.6.jar"/>
<options buildIfNeeded="true" compress="true" descriptionLocation="/ATContentStudio/ATCS_JAR.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/> <options buildIfNeeded="true" compress="true" descriptionLocation="/ATCS/ATCS_JAR.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
<storedRefactorings deprecationInfo="true" structuralOnly="false"/> <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/> <selectedProjects/>
<manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true"> <manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
<sealing sealJar="false"> <sealing sealJar="false">
<packagesToSeal/> <packagesToSeal/>
<packagesToUnSeal/> <packagesToUnSeal/>
</sealing> </sealing>
</manifest> </manifest>
<selectedElements exportClassFiles="true" exportJavaFiles="true" exportOutputFolder="false"> <selectedElements exportClassFiles="true" exportJavaFiles="true" exportOutputFolder="false">
<javaElement handleIdentifier="=ATContentStudio/siphash-zackehh\/src\/main\/java"/> <javaElement handleIdentifier="=ATCS/res"/>
<javaElement handleIdentifier="=ATContentStudio/res"/> <javaElement handleIdentifier="=ATCS/src"/>
<javaElement handleIdentifier="=ATContentStudio/src"/> <javaElement handleIdentifier="=ATCS/siphash-zackehh\/src\/main\/java"/>
<javaElement handleIdentifier="=ATContentStudio/hacked-libtiled"/> <javaElement handleIdentifier="=ATCS/hacked-libtiled"/>
</selectedElements> </selectedElements>
</jardesc> </jardesc>

View File

@@ -111,11 +111,14 @@ public class Map implements Iterable<MapLayer>
public MapLayer addLayer(MapLayer layer) { public MapLayer addLayer(MapLayer layer) {
layer.setMap(this); layer.setMap(this);
layers.add(layer);
if (layer instanceof TileLayer) { if (layer instanceof TileLayer) {
tileLayers.add((TileLayer) layer); tileLayers.add((TileLayer) layer);
layers.add(layer);
} else if (layer instanceof ObjectGroup) { } else if (layer instanceof ObjectGroup) {
layers.insertElementAt(layer, objectGroups.size());
objectGroups.add((ObjectGroup) layer); objectGroups.add((ObjectGroup) layer);
} else {
layers.add(layer);
} }
return layer; return layer;
} }

View File

@@ -181,7 +181,12 @@ public class TMXMapWriter
firstgid += tileset.getMaxTileId() + 1; firstgid += tileset.getMaxTileId() + 1;
} }
for (MapLayer layer : map) { for (MapLayer layer : map.getTileLayers()) {
writeMapLayer(layer, w, wp);
}
for (MapLayer layer : map.getObjectGroup()) {
if (map.getTileLayers().contains(layer)) continue;
writeMapLayer(layer, w, wp); writeMapLayer(layer, w, wp);
} }
firstGidPerTileset = null; firstGidPerTileset = null;

1
packaging/ATCS_latest Normal file
View File

@@ -0,0 +1 @@
v0.6.6

View File

@@ -1,6 +1,6 @@
!include MUI2.nsh !include MUI2.nsh
!define VERSION "0.6.2" !define VERSION "0.6.6"
!define TRAINER_VERSION "0.1.4" !define TRAINER_VERSION "0.1.4"
!define JAVA_BIN "javaw" !define JAVA_BIN "javaw"

View File

@@ -1,30 +1,47 @@
package com.gpl.rpg.atcontentstudio; package com.gpl.rpg.atcontentstudio;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.event.WindowAdapter; import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException; import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.HyperlinkEvent;
import prefuse.data.expression.parser.ExpressionParser; import javax.swing.event.HyperlinkListener;
import com.gpl.rpg.atcontentstudio.model.Workspace; import com.gpl.rpg.atcontentstudio.model.Workspace;
import com.gpl.rpg.atcontentstudio.ui.StudioFrame; import com.gpl.rpg.atcontentstudio.ui.StudioFrame;
import com.gpl.rpg.atcontentstudio.ui.WorkerDialog; import com.gpl.rpg.atcontentstudio.ui.WorkerDialog;
import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector; import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector;
import prefuse.data.expression.parser.ExpressionParser;
public class ATContentStudio { public class ATContentStudio {
public static final String APP_NAME = "Andor's Trail Content Studio"; public static final String APP_NAME = "Andor's Trail Content Studio";
public static final String APP_VERSION = "v0.6.2"; public static final String APP_VERSION = "v0.6.6";
public static final String CHECK_UPDATE_URL = "https://andorstrail.com/static/ATCS_latest";
public static final String DOWNLOAD_URL = "https://andorstrail.com/viewtopic.php?f=6&t=4806";
public static boolean STARTED = false; public static boolean STARTED = false;
public static StudioFrame frame = null; public static StudioFrame frame = null;
@@ -74,6 +91,11 @@ public class ATContentStudio {
WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable(){ WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable(){
public void run() { public void run() {
Workspace.setActive(workspaceRoot); Workspace.setActive(workspaceRoot);
if (Workspace.activeWorkspace.settings.useInternet.getCurrentValue() && Workspace.activeWorkspace.settings.checkUpdates.getCurrentValue()) {
new Thread() {
public void run() {checkUpdate();}
}.start();
}
frame = new StudioFrame(APP_NAME+" "+APP_VERSION); frame = new StudioFrame(APP_NAME+" "+APP_VERSION);
frame.setVisible(true); frame.setVisible(true);
frame.setDefaultCloseOperation(StudioFrame.DO_NOTHING_ON_CLOSE); frame.setDefaultCloseOperation(StudioFrame.DO_NOTHING_ON_CLOSE);
@@ -95,4 +117,65 @@ public class ATContentStudio {
}); });
} }
private static void checkUpdate() {
BufferedReader in = null;
try {
URL url = new URL(CHECK_UPDATE_URL);
in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine, lastLine = null;
while ((inputLine = in.readLine()) != null) {lastLine = inputLine;}
if (lastLine != null && !lastLine.equals(APP_VERSION)) {
// for copying style
JLabel label = new JLabel();
Font font = label.getFont();
Color color = label.getBackground();
// create some css from the label's font
StringBuffer style = new StringBuffer("font-family:" + font.getFamily() + ";");
style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";");
style.append("font-size:" + font.getSize() + "pt;");
style.append("background-color: rgb("+color.getRed()+","+color.getGreen()+","+color.getBlue()+");");
JEditorPane ep = new JEditorPane("text/html", "<html><body style=\"" + style + "\">"
+ "You are not running the latest ATCS version.<br/>"
+ "You can get the latest version ("+lastLine+") by clicking the link below.<br/>"
+ "<a href=\""+DOWNLOAD_URL+"\">"+DOWNLOAD_URL+"</a><br/>"
+ "<br/>"
+ "</body></html>");
ep.setEditable(false);
ep.setBorder(null);
ep.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
try {
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
Desktop.getDesktop().browse(e.getURL().toURI());
}
} catch (IOException e1) {
e1.printStackTrace();
} catch (URISyntaxException e1) {
e1.printStackTrace();
}
}
});
JOptionPane.showMessageDialog(null, ep, "Update available", JOptionPane.INFORMATION_MESSAGE);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }

View File

@@ -42,6 +42,8 @@ public class WorkspaceSettings {
public Setting<String> translatorLanguage = new NullDefaultPrimitiveSetting<String>("translatorLanguage"); public Setting<String> translatorLanguage = new NullDefaultPrimitiveSetting<String>("translatorLanguage");
public static Boolean DEFAULT_ALLOW_INTERNET = true; public static Boolean DEFAULT_ALLOW_INTERNET = true;
public Setting<Boolean> useInternet = new PrimitiveSetting<Boolean>("useInternet", DEFAULT_ALLOW_INTERNET); public Setting<Boolean> useInternet = new PrimitiveSetting<Boolean>("useInternet", DEFAULT_ALLOW_INTERNET);
public static Boolean DEFAULT_CHECK_UPDATE = true;
public Setting<Boolean> checkUpdates = new PrimitiveSetting<Boolean>("checkUpdates", DEFAULT_CHECK_UPDATE);
public List<Setting<? extends Object>> settings = new ArrayList<Setting<? extends Object>>(); public List<Setting<? extends Object>> settings = new ArrayList<Setting<? extends Object>>();
@@ -55,6 +57,7 @@ public class WorkspaceSettings {
settings.add(imageEditorCommand); settings.add(imageEditorCommand);
settings.add(translatorLanguage); settings.add(translatorLanguage);
settings.add(useInternet); settings.add(useInternet);
settings.add(checkUpdates);
file = new File(parent.baseFolder, FILENAME); file = new File(parent.baseFolder, FILENAME);
if (file.exists()) { if (file.exists()) {
load(file); load(file);

View File

@@ -214,6 +214,9 @@ public class ActorCondition extends JSONElement {
} }
if (this.icon_id != null) { if (this.icon_id != null) {
String spritesheetId = this.icon_id.split(":")[0]; String spritesheetId = this.icon_id.split(":")[0];
if (getProject().getSpritesheet(spritesheetId) == null) {
System.out.println(this.id);
}
getProject().getSpritesheet(spritesheetId).addBacklink(this); getProject().getSpritesheet(spritesheetId).addBacklink(this);
} }

View File

@@ -54,6 +54,7 @@ public class Dialogue extends JSONElement {
public enum RewardType { public enum RewardType {
questProgress, questProgress,
removeQuestProgress,
dropList, dropList,
skillIncrease, skillIncrease,
actorCondition, actorCondition,
@@ -264,6 +265,7 @@ public class Dialogue extends JSONElement {
reward.reward_obj = proj.getItem(reward.reward_obj_id); reward.reward_obj = proj.getItem(reward.reward_obj_id);
break; break;
case questProgress: case questProgress:
case removeQuestProgress:
reward.reward_obj = proj.getQuest(reward.reward_obj_id); reward.reward_obj = proj.getQuest(reward.reward_obj_id);
if (reward.reward_obj != null && reward.reward_value != null) { if (reward.reward_obj != null && reward.reward_value != null) {
QuestStage stage = ((Quest)reward.reward_obj).getStage(reward.reward_value); QuestStage stage = ((Quest)reward.reward_obj).getStage(reward.reward_value);

View File

@@ -99,8 +99,8 @@ public class Quest extends JSONElement {
public void parse(Map questJson) { public void parse(Map questJson) {
this.visible_in_log = JSONElement.getInteger((Number) questJson.get("showInLog")); this.visible_in_log = JSONElement.getInteger((Number) questJson.get("showInLog"));
List questStagesJson = (List) questJson.get("stages"); List questStagesJson = (List) questJson.get("stages");
this.stages = new ArrayList<QuestStage>();
if (questStagesJson != null && !questStagesJson.isEmpty()) { if (questStagesJson != null && !questStagesJson.isEmpty()) {
this.stages = new ArrayList<QuestStage>();
for (Object questStageJsonObj : questStagesJson) { for (Object questStageJsonObj : questStagesJson) {
Map questStageJson = (Map)questStageJsonObj; Map questStageJson = (Map)questStageJsonObj;
QuestStage questStage = new QuestStage(this); QuestStage questStage = new QuestStage(this);

View File

@@ -19,20 +19,20 @@ public class KeyArea extends MapObject {
String requireType = obj.getProperties().getProperty("requireType"); String requireType = obj.getProperties().getProperty("requireType");
String requireId = obj.getProperties().getProperty("requireId"); String requireId = obj.getProperties().getProperty("requireId");
String requireValue = obj.getProperties().getProperty("requireValue"); String requireValue = obj.getProperties().getProperty("requireValue");
if (requireId == null) { oldSchoolRequirement = false;
if (requireType == null) {
String[] fields = obj.getName().split(":"); String[] fields = obj.getName().split(":");
if (fields.length == 2) { if (fields.length == 2) {
requireType = Requirement.RequirementType.questProgress.toString(); requireType = Requirement.RequirementType.questProgress.toString();
requireValue = fields[1]; requireValue = fields[1];
requireId = fields[0]; requireId = fields[0];
oldSchoolRequirement = true;
} else if (fields.length == 3) { } else if (fields.length == 3) {
requireValue = fields[2]; requireValue = fields[2];
requireType = fields[0]; requireType = fields[0];
requireId = fields[1]; requireId = fields[1];
oldSchoolRequirement = true;
} }
oldSchoolRequirement = true;
} else {
oldSchoolRequirement = false;
} }
requirement = new Requirement(); requirement = new Requirement();
if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType); if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType);
@@ -76,7 +76,7 @@ public class KeyArea extends MapObject {
} }
if (requirement != null) { if (requirement != null) {
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) { if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
tmxObject.setName(requirement.required_obj_id+":"+Integer.toString(requirement.required_value)); tmxObject.setName(requirement.required_obj_id+":"+((requirement.required_value == null) ? "" : Integer.toString(requirement.required_value)));
} else { } else {
if (requirement.type != null) { if (requirement.type != null) {
tmxObject.getProperties().setProperty("requireType", requirement.type.toString()); tmxObject.getProperties().setProperty("requireType", requirement.type.toString());
@@ -89,13 +89,16 @@ public class KeyArea extends MapObject {
if (requirement.required_value != null) { if (requirement.required_value != null) {
tmxObject.getProperties().setProperty("requireValue", requirement.required_value.toString()); tmxObject.getProperties().setProperty("requireValue", requirement.required_value.toString());
} }
if (requirement.negated != null) {
tmxObject.getProperties().setProperty("requireNegation", Boolean.toString(requirement.negated));
}
} }
} }
} }
public void updateNameFromRequirementChange() { public void updateNameFromRequirementChange() {
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) { if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
name = requirement.required_obj_id+":"+Integer.toString(requirement.required_value); name = requirement.required_obj_id+":"+((requirement.required_value == null) ? "" : Integer.toString(requirement.required_value));
} else if (oldSchoolRequirement) { } else if (oldSchoolRequirement) {
int i = 0; int i = 0;
String futureName = requirement.type.toString() + "#" + Integer.toString(i); String futureName = requirement.type.toString() + "#" + Integer.toString(i);

View File

@@ -12,39 +12,36 @@ import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
public class ReplaceArea extends MapObject { public class ReplaceArea extends MapObject {
public Requirement requirement = null; public Requirement requirement = null;
public boolean oldSchoolRequirement = true; public boolean oldSchoolRequirement = false;
public List<ReplaceArea.Replacement> replacements = null; public List<ReplaceArea.Replacement> replacements = null;
public ReplaceArea(tiled.core.MapObject obj) { public ReplaceArea(tiled.core.MapObject obj) {
// String requireType = obj.getProperties().getProperty("requireType"); String requireType = obj.getProperties().getProperty("requireType");
String requireId = obj.getProperties().getProperty("requireId"); String requireId = obj.getProperties().getProperty("requireId");
String requireValue = obj.getProperties().getProperty("requireValue"); String requireValue = obj.getProperties().getProperty("requireValue");
if (requireId == null) { if (requireType == null) {
String[] fields = obj.getName().split(":"); String[] fields = obj.getName().split(":");
if (fields.length == 2) { if (fields.length == 2) {
// requireType = Requirement.RequirementType.questProgress.toString(); requireType = Requirement.RequirementType.questProgress.toString();
requireValue = fields[1]; requireValue = fields[1];
requireId = fields[0]; requireId = fields[0];
oldSchoolRequirement = true;
} /*else if (fields.length == 3) { } /*else if (fields.length == 3) {
requireValue = fields[2]; requireValue = fields[2];
requireType = fields[0]; requireType = fields[0];
requireId = fields[1]; requireId = fields[1];
}*/ }*/
oldSchoolRequirement = true;
} else {
oldSchoolRequirement = false;
} }
requirement = new Requirement(); requirement = new Requirement();
//Replace areas only support questProgress requirements ATM if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType);
//requirement.type = Requirement.RequirementType.valueOf(requireType);
requirement.type = Requirement.RequirementType.questProgress;
requirement.required_obj_id = requireId; requirement.required_obj_id = requireId;
if (requireValue != null) requirement.required_value = Integer.parseInt(requireValue); if (requireValue != null) requirement.required_value = Integer.parseInt(requireValue);
requirement.state = GameDataElement.State.parsed; requirement.state = GameDataElement.State.parsed;
for (Object s : obj.getProperties().keySet()) { for (Object s : obj.getProperties().keySet()) {
if (!TMXMap.isPaintedLayerName(s.toString())) continue;
if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>(); if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>();
replacements.add(new Replacement(s.toString(), obj.getProperties().getProperty(s.toString()))); replacements.add(new Replacement(s.toString(), obj.getProperties().getProperty(s.toString())));
} }
@@ -94,7 +91,7 @@ public class ReplaceArea extends MapObject {
} }
if (requirement != null) { if (requirement != null) {
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) { if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
tmxObject.setName(requirement.required_obj_id+":"+Integer.toString(requirement.required_value)); tmxObject.setName(requirement.required_obj_id+":"+((requirement.required_value == null) ? "" : Integer.toString(requirement.required_value)));
} else { } else {
tmxObject.getProperties().setProperty("requireType", requirement.type.toString()); tmxObject.getProperties().setProperty("requireType", requirement.type.toString());
if (requirement.required_obj != null) { if (requirement.required_obj != null) {
@@ -105,6 +102,9 @@ public class ReplaceArea extends MapObject {
if (requirement.required_value != null) { if (requirement.required_value != null) {
tmxObject.getProperties().setProperty("requireValue", requirement.required_value.toString()); tmxObject.getProperties().setProperty("requireValue", requirement.required_value.toString());
} }
if (requirement.negated != null) {
tmxObject.getProperties().setProperty("requireNegation", Boolean.toString(requirement.negated));
}
} }
} }
} }
@@ -112,7 +112,7 @@ public class ReplaceArea extends MapObject {
//Don't use yet ! //Don't use yet !
public void updateNameFromRequirementChange() { public void updateNameFromRequirementChange() {
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) { if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
name = requirement.required_obj_id+":"+Integer.toString(requirement.required_value); name = requirement.required_obj_id+":"+((requirement.required_value == null) ? "" : Integer.toString(requirement.required_value));
} else if (oldSchoolRequirement) { } else if (oldSchoolRequirement) {
int i = 0; int i = 0;
String futureName = requirement.type.toString() + "#" + Integer.toString(i); String futureName = requirement.type.toString() + "#" + Integer.toString(i);

View File

@@ -273,11 +273,12 @@ public class TMXMap extends GameDataElement {
public void save() { public void save() {
if (writable) { if (writable) {
String xml = toXml();
try { try {
//TODO: check in fileutils, to test the workspace's filesystem once at startup, and figure out how many of these can occur, instead of hard-coded '2' //TODO: check in fileutils, to test the workspace's filesystem once at startup, and figure out how many of these can occur, instead of hard-coded '2'
dismissNextChangeNotif += 2; dismissNextChangeNotif += 2;
FileWriter w = new FileWriter(tmxFile); FileWriter w = new FileWriter(tmxFile);
w.write(toXml()); w.write(xml);
w.close(); w.close();
this.state = State.saved; this.state = State.saved;
changedOnDisk = false; changedOnDisk = false;

View File

@@ -35,6 +35,7 @@ import org.w3c.dom.NodeList;
import org.xml.sax.InputSource; import org.xml.sax.InputSource;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
import com.gpl.rpg.atcontentstudio.model.GameSource; import com.gpl.rpg.atcontentstudio.model.GameSource;
import com.gpl.rpg.atcontentstudio.model.GameSource.Type; import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
import com.gpl.rpg.atcontentstudio.model.Project; import com.gpl.rpg.atcontentstudio.model.Project;
@@ -222,6 +223,7 @@ public class Worldmap extends ArrayList<WorldmapSegment> implements ProjectTreeN
for (WorldmapSegment segment : this) { for (WorldmapSegment segment : this) {
root.appendChild(segment.toXmlElement(doc)); root.appendChild(segment.toXmlElement(doc));
segment.state = GameDataElement.State.saved;
} }
saveDocToFile(doc, worldmapFile); saveDocToFile(doc, worldmapFile);

View File

@@ -24,6 +24,7 @@ import org.w3c.dom.Element;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.GameDataElement;
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
import com.gpl.rpg.atcontentstudio.model.SaveEvent; import com.gpl.rpg.atcontentstudio.model.SaveEvent;
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet; import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons; import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
@@ -104,8 +105,28 @@ public class WorldmapSegment extends GameDataElement {
@Override @Override
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) { public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
boolean modified = false;
if (newOne == null && writable) {
//A referenced map may have been deleted.
if (mapLocations.containsKey(oldOne.id)) {
mapLocations.remove(oldOne.id);
modified = true;
}
for (String label : labelledMaps.keySet()) {
if (labelledMaps.get(label).contains(oldOne.id)) {
labelledMaps.get(label).remove(oldOne.id);
modified = true;
}
}
}
oldOne.removeBacklink(this); oldOne.removeBacklink(this);
if(newOne != null) newOne.addBacklink(this); if(newOne != null) newOne.addBacklink(this);
if (modified) {
this.state = GameDataElement.State.modified;
childrenChanged(new ArrayList<ProjectTreeNode>());
}
} }
@Override @Override

View File

@@ -167,6 +167,9 @@ public class WriterModeData extends GameDataElement {
this.id = (String) json.get("id"); this.id = (String) json.get("id");
this.index = ((Number)json.get("index")).intValue(); this.index = ((Number)json.get("index")).intValue();
this.id_prefix = (String) json.get("id_prefix"); this.id_prefix = (String) json.get("id_prefix");
if (threadsNextIndex.get(id_prefix) == null || threadsNextIndex.get(id_prefix) <= index) {
threadsNextIndex.put(id_prefix, index+1);
}
this.text = (String) json.get("text"); this.text = (String) json.get("text");
this.dialogue_id = (String) json.get("dialogue"); this.dialogue_id = (String) json.get("dialogue");
if (json.get("begin") != null && ((Boolean)json.get("begin"))) begin = this; if (json.get("begin") != null && ((Boolean)json.get("begin"))) begin = this;
@@ -541,6 +544,7 @@ public class WriterModeData extends GameDataElement {
nodesById.put(dialogue.getID(), dialogue); nodesById.put(dialogue.getID(), dialogue);
} }
} }
this.state = State.parsed; this.state = State.parsed;
} }
@@ -557,6 +561,11 @@ public class WriterModeData extends GameDataElement {
this.parse(); this.parse();
} }
if (this.state == State.parsed) { if (this.state == State.parsed) {
for (String prefix : threadsNextIndex.keySet()) {
while (getProject().getDialogue(prefix+threadsNextIndex.get(prefix)) != null) {
threadsNextIndex.put(prefix, threadsNextIndex.get(prefix)+1);
}
}
for (WriterDialogue dialogue : nodesById.values()) { for (WriterDialogue dialogue : nodesById.values()) {
if (dialogue.dialogue_id != null) { if (dialogue.dialogue_id != null) {
dialogue.dialogue = getProject().getDialogue(dialogue.dialogue_id); dialogue.dialogue = getProject().getDialogue(dialogue.dialogue_id);
@@ -571,32 +580,34 @@ public class WriterModeData extends GameDataElement {
} }
} }
//TODO Seriously, this is failure-prone by design. Can't do much better though... //TODO Seriously, this is failure-prone by design. Can't do much better though...
List<Dialogue.Reply> linked = new ArrayList<Dialogue.Reply>(dialogue.dialogue.replies.size()); if (dialogue.dialogue != null) {
if (dialogue.dialogue != null && dialogue.dialogue.replies != null) { List<Dialogue.Reply> linked = new ArrayList<Dialogue.Reply>(dialogue.dialogue.replies.size());
//Try to hook to existing replies... not as easy when there's no ID. if (dialogue.dialogue != null && dialogue.dialogue.replies != null) {
Dialogue.Reply best = null; //Try to hook to existing replies... not as easy when there's no ID.
int score, maxScore = 0; Dialogue.Reply best = null;
for (Dialogue.Reply dReply : dialogue.dialogue.replies) { int score, maxScore = 0;
//Never link twice to the same... for (Dialogue.Reply dReply : dialogue.dialogue.replies) {
if (linked.contains(dReply)) continue; //Never link twice to the same...
score = 0; if (linked.contains(dReply)) continue;
//Arbitrary values... hopefully this gives good results. score = 0;
//Same target gives good hope of preserving at least the structure. //Arbitrary values... hopefully this gives good results.
if (dReply.next_phrase_id != null && dReply.next_phrase_id.equals(reply.next_dialogue_id)) score +=50; //Same target gives good hope of preserving at least the structure.
//Same text is almost as good as an ID, but there may be duplicates due to requirements system... if (dReply.next_phrase_id != null && dReply.next_phrase_id.equals(reply.next_dialogue_id)) score +=50;
if (dReply.text != null && dReply.text.equals(reply.text)) score +=40; //Same text is almost as good as an ID, but there may be duplicates due to requirements system...
//Same slot in the list. That's not so bad if all else fails, and could help sort duplicates with same text. if (dReply.text != null && dReply.text.equals(reply.text)) score +=40;
if (dialogue.dialogue.replies.indexOf(dReply) == dialogue.replies.indexOf(reply)) score +=20; //Same slot in the list. That's not so bad if all else fails, and could help sort duplicates with same text.
//Both have null text. It's not much, but it's something.... if (dialogue.dialogue.replies.indexOf(dReply) == dialogue.replies.indexOf(reply)) score +=20;
if (dReply.text == null && reply.text == null) score += 10; //Both have null text. It's not much, but it's something....
if (score > maxScore) { if (dReply.text == null && reply.text == null) score += 10;
maxScore = score; if (score > maxScore) {
best = dReply; maxScore = score;
} best = dReply;
} }
if (maxScore > 0) { }
reply.reply = best; if (maxScore > 0) {
linked.add(best); reply.reply = best;
linked.add(best);
}
} }
} }
} }

View File

@@ -109,7 +109,7 @@ public class WriterModeDataSet implements ProjectTreeNode, Serializable {
@Override @Override
public String getDesc() { public String getDesc() {
return (needsSaving() ? "*" : "")+"Dialogue sketchs"; return (needsSaving() ? "*" : "")+"Dialogue sketches";
} }
@Override @Override

View File

@@ -316,11 +316,15 @@ public abstract class Editor extends JPanel implements ProjectElementListener {
// } // }
public static JSpinner addIntegerField(JPanel pane, String label, Integer initialValue, boolean allowNegatives, boolean editable, final FieldUpdateListener listener) { public static JSpinner addIntegerField(JPanel pane, String label, Integer initialValue, boolean allowNegatives, boolean editable, final FieldUpdateListener listener) {
return addIntegerField(pane, label, initialValue, 0, allowNegatives, editable, listener);
}
public static JSpinner addIntegerField(JPanel pane, String label, Integer initialValue, Integer defaultValue, boolean allowNegatives, boolean editable, final FieldUpdateListener listener) {
JPanel tfPane = new JPanel(); JPanel tfPane = new JPanel();
tfPane.setLayout(new JideBoxLayout(tfPane, JideBoxLayout.LINE_AXIS, 6)); tfPane.setLayout(new JideBoxLayout(tfPane, JideBoxLayout.LINE_AXIS, 6));
JLabel tfLabel = new JLabel(label); JLabel tfLabel = new JLabel(label);
tfPane.add(tfLabel, JideBoxLayout.FIX); tfPane.add(tfLabel, JideBoxLayout.FIX);
final JSpinner spinner = new JSpinner(new SpinnerNumberModel(initialValue != null ? initialValue.intValue() : 0, allowNegatives ? Integer.MIN_VALUE : 0, Integer.MAX_VALUE, 1)); final JSpinner spinner = new JSpinner(new SpinnerNumberModel(initialValue != null ? initialValue.intValue() : defaultValue.intValue(), allowNegatives ? Integer.MIN_VALUE : 0, Integer.MAX_VALUE, 1));
((JSpinner.DefaultEditor)spinner.getEditor()).getTextField().setHorizontalAlignment(JTextField.LEFT); ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField().setHorizontalAlignment(JTextField.LEFT);
spinner.setEnabled(editable); spinner.setEnabled(editable);
((DefaultFormatter)((NumberEditor)spinner.getEditor()).getTextField().getFormatter()).setCommitsOnValidEdit(true); ((DefaultFormatter)((NumberEditor)spinner.getEditor()).getTextField().getFormatter()).setCommitsOnValidEdit(true);

View File

@@ -338,6 +338,7 @@ public class JSONImportWizard extends JDialog {
} else if (existingNode.getDataType() == GameSource.Type.altered) { } else if (existingNode.getDataType() == GameSource.Type.altered) {
errors.add("An item with id "+node.id+" is already altered in this project."); errors.add("An item with id "+node.id+" is already altered in this project.");
} else { } else {
node.jsonFile = existingNode.jsonFile;
warnings.add("An item with id "+node.id+" exists in the used game source. This one will be inserted as \"altered\""); warnings.add("An item with id "+node.id+" exists in the used game source. This one will be inserted as \"altered\"");
} }
existingNode = null; existingNode = null;
@@ -412,7 +413,7 @@ public class JSONImportWizard extends JDialog {
proj.createElements(created); proj.createElements(created);
JSONElement lastNode = created.get(created.size() - 1); JSONElement lastNode = created.get(created.size() - 1);
if (lastNode != null) { if (lastNode != null) {
lastNode.save(); // lastNode.save();
ATContentStudio.frame.selectInTree(lastNode); ATContentStudio.frame.selectInTree(lastNode);
} }
JSONImportWizard.this.setVisible(false); JSONImportWizard.this.setVisible(false);

View File

@@ -140,14 +140,14 @@ public class ProjectsTree extends JPanel {
projectsTree.addTreeSelectionListener(new TreeSelectionListener() { projectsTree.addTreeSelectionListener(new TreeSelectionListener() {
@Override @Override
public void valueChanged(TreeSelectionEvent e) { public void valueChanged(TreeSelectionEvent e) {
List<TreePath> newPaths = new ArrayList<TreePath>(); // List<TreePath> newPaths = new ArrayList<TreePath>();
for (TreePath path : e.getPaths()) { // for (TreePath path : e.getPaths()) {
if (e.isAddedPath(path)) newPaths.add(path); // if (e.isAddedPath(path)) newPaths.add(path);
} // }
if (e.getPath() == null) { if (e.getPath() == null) {
ATContentStudio.frame.actions.selectionChanged(null, newPaths.toArray(new TreePath[newPaths.size()])); ATContentStudio.frame.actions.selectionChanged(null, projectsTree.getSelectionPaths());
} else { } else {
ATContentStudio.frame.actions.selectionChanged((ProjectTreeNode) e.getPath().getLastPathComponent(), newPaths.toArray(new TreePath[newPaths.size()])); ATContentStudio.frame.actions.selectionChanged((ProjectTreeNode) e.getPath().getLastPathComponent(), projectsTree.getSelectionPaths());
} }
} }
}); });
@@ -242,17 +242,17 @@ public class ProjectsTree extends JPanel {
addNextSeparator = false; addNextSeparator = false;
} }
if (actions.testWriter.isEnabled()) { if (actions.createWriter.isEnabled()) {
addNextSeparator = true; addNextSeparator = true;
popupMenu.add(new JMenuItem(actions.testWriter)); popupMenu.add(new JMenuItem(actions.createWriter));
} }
// if (actions.testCommitWriter.isEnabled()) { // if (actions.testCommitWriter.isEnabled()) {
// addNextSeparator = true; // addNextSeparator = true;
// popupMenu.add(new JMenuItem(actions.testCommitWriter)); // popupMenu.add(new JMenuItem(actions.testCommitWriter));
// } // }
if (actions.createWriter.isEnabled()) { if (actions.generateWriter.isEnabled()) {
addNextSeparator = true; addNextSeparator = true;
popupMenu.add(new JMenuItem(actions.createWriter)); popupMenu.add(new JMenuItem(actions.generateWriter));
} }
if (addNextSeparator) { if (addNextSeparator) {
popupMenu.add(new JSeparator()); popupMenu.add(new JSeparator());

View File

@@ -31,8 +31,12 @@ import com.gpl.rpg.atcontentstudio.model.Workspace;
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue; import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataCategory; import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataCategory;
import com.gpl.rpg.atcontentstudio.model.gamedata.JSONElement; import com.gpl.rpg.atcontentstudio.model.gamedata.JSONElement;
import com.gpl.rpg.atcontentstudio.model.gamedata.Quest;
import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage;
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap; import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet; import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
import com.gpl.rpg.atcontentstudio.model.maps.Worldmap;
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
import com.gpl.rpg.atcontentstudio.model.saves.SavedGamesSet; import com.gpl.rpg.atcontentstudio.model.saves.SavedGamesSet;
import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeData; import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeData;
import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeDataSet; import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeDataSet;
@@ -122,19 +126,45 @@ public class WorkspaceActions {
ATContentStudio.frame.closeEditor(element); ATContentStudio.frame.closeEditor(element);
element.childrenRemoved(new ArrayList<ProjectTreeNode>()); element.childrenRemoved(new ArrayList<ProjectTreeNode>());
if (element instanceof JSONElement) { if (element instanceof JSONElement) {
@SuppressWarnings("unchecked") if (element.getParent() instanceof GameDataCategory<?>) {
GameDataCategory<JSONElement> category = (GameDataCategory<JSONElement>) element.getParent(); @SuppressWarnings("unchecked")
category.remove(element); GameDataCategory<JSONElement> category = (GameDataCategory<JSONElement>) element.getParent();
if (impactedCategories.get(category) == null) { category.remove(element);
impactedCategories.put(category, new HashSet<File>()); if (impactedCategories.get(category) == null) {
impactedCategories.put(category, new HashSet<File>());
}
GameDataElement newOne = element.getProject().getGameDataElement(((JSONElement)element).getClass(), element.id);
if (element instanceof Quest) {
for (QuestStage oldStage : ((Quest) element).stages) {
QuestStage newStage = newOne != null ? ((Quest) newOne).getStage(oldStage.progress) : null;
for (GameDataElement backlink : oldStage.getBacklinks()) {
backlink.elementChanged(oldStage, newStage);
}
}
}
for (GameDataElement backlink : element.getBacklinks()) {
backlink.elementChanged(element, newOne);
}
impactedCategories.get(category).add(((JSONElement) element).jsonFile);
} }
impactedCategories.get(category).add(((JSONElement) element).jsonFile);
} else if (element instanceof TMXMap) { } else if (element instanceof TMXMap) {
TMXMapSet parent = (TMXMapSet) element.getParent(); ((TMXMap)element).delete();
parent.tmxMaps.remove(element); GameDataElement newOne = element.getProject().getMap(element.id);
for (GameDataElement backlink : element.getBacklinks()) {
backlink.elementChanged(element, newOne);
}
} else if (element instanceof WriterModeData) { } else if (element instanceof WriterModeData) {
WriterModeDataSet parent = (WriterModeDataSet) element.getParent(); WriterModeDataSet parent = (WriterModeDataSet) element.getParent();
parent.writerModeDataList.remove(element); parent.writerModeDataList.remove(element);
} else if (element instanceof WorldmapSegment) {
if (element.getParent() instanceof Worldmap) {
((Worldmap)element.getParent()).remove(element);
element.save();
for (GameDataElement backlink : element.getBacklinks()) {
backlink.elementChanged(element, element.getProject().getWorldmapSegment(element.id));
}
}
} }
} }
new Thread() { new Thread() {
@@ -165,20 +195,52 @@ public class WorkspaceActions {
@Override @Override
public void run() { public void run() {
node.childrenRemoved(new ArrayList<ProjectTreeNode>()); node.childrenRemoved(new ArrayList<ProjectTreeNode>());
if (node.getParent() instanceof GameDataCategory<?>) { if (node instanceof JSONElement) {
((GameDataCategory<?>)node.getParent()).remove(node); if (node.getParent() instanceof GameDataCategory<?>) {
List<SaveEvent> events = node.attemptSave(); ((GameDataCategory<?>)node.getParent()).remove(node);
if (events == null || events.isEmpty()) { List<SaveEvent> events = node.attemptSave();
node.save(); if (events == null || events.isEmpty()) {
} else { node.save();
new SaveItemsWizard(events, null).setVisible(true); } else {
new SaveItemsWizard(events, null).setVisible(true);
}
GameDataElement newOne = node.getProject().getGameDataElement(((JSONElement)node).getClass(), node.id);
if (node instanceof Quest) {
for (QuestStage oldStage : ((Quest) node).stages) {
QuestStage newStage = newOne != null ? ((Quest) newOne).getStage(oldStage.progress) : null;
for (GameDataElement backlink : oldStage.getBacklinks()) {
backlink.elementChanged(oldStage, newStage);
}
}
}
for (GameDataElement backlink : node.getBacklinks()) {
backlink.elementChanged(node, newOne);
}
} }
// ((GameDataCategory<?>)node.getParent()).remove(node);
// List<SaveEvent> events = node.attemptSave();
// if (events == null || events.isEmpty()) {
// node.save();
// } else {
// new SaveItemsWizard(events, null).setVisible(true);
// }
} else if (node instanceof TMXMap) { } else if (node instanceof TMXMap) {
TMXMapSet parent = (TMXMapSet) node.getParent(); ((TMXMap)node).delete();
parent.tmxMaps.remove(node); GameDataElement newOne = node.getProject().getMap(node.id);
for (GameDataElement backlink : node.getBacklinks()) {
backlink.elementChanged(node, newOne);
}
} else if (node instanceof WriterModeData) { } else if (node instanceof WriterModeData) {
WriterModeDataSet parent = (WriterModeDataSet) node.getParent(); WriterModeDataSet parent = (WriterModeDataSet) node.getParent();
parent.writerModeDataList.remove(node); parent.writerModeDataList.remove(node);
} else if (node instanceof WorldmapSegment) {
if (node.getParent() instanceof Worldmap) {
((Worldmap)node.getParent()).remove(node);
node.save();
for (GameDataElement backlink : node.getBacklinks()) {
backlink.elementChanged(node, node.getProject().getWorldmapSegment(node.id));
}
}
} }
} }
}.start(); }.start();
@@ -192,12 +254,9 @@ public class WorkspaceActions {
for (TreePath selected : selectedPaths) { for (TreePath selected : selectedPaths) {
if (selected.getLastPathComponent() instanceof GameDataElement && ((GameDataElement)selected.getLastPathComponent()).writable) { if (selected.getLastPathComponent() instanceof GameDataElement && ((GameDataElement)selected.getLastPathComponent()).writable) {
elementsToDelete.add((GameDataElement) selected.getLastPathComponent()); elementsToDelete.add((GameDataElement) selected.getLastPathComponent());
multiMode = true;
} else {
multiMode = false;
break;
} }
} }
multiMode = elementsToDelete.size() > 1;
putValue(Action.NAME, "Delete all selected elements"); putValue(Action.NAME, "Delete all selected elements");
setEnabled(multiMode); setEnabled(multiMode);
} else if (selectedNode instanceof GameDataElement && ((GameDataElement)selectedNode).writable) { } else if (selectedNode instanceof GameDataElement && ((GameDataElement)selectedNode).writable) {
@@ -340,7 +399,7 @@ public class WorkspaceActions {
}; };
}; };
public ATCSAction testWriter = new ATCSAction("Create dialogue sketch", "Create a dialogue sketch for fast dialogue edition"){ public ATCSAction createWriter = new ATCSAction("Create dialogue sketch", "Create a dialogue sketch for fast dialogue edition"){
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
if (selectedNode == null || selectedNode.getProject() == null) return; if (selectedNode == null || selectedNode.getProject() == null) return;
new WriterSketchCreationWizard(selectedNode.getProject()).setVisible(true); new WriterSketchCreationWizard(selectedNode.getProject()).setVisible(true);
@@ -375,7 +434,7 @@ public class WorkspaceActions {
} }
};*/ };*/
public ATCSAction createWriter = new ATCSAction("Generate dialogue sketch", "Generates a dialogue sketch from this dialogue and its tree.") { public ATCSAction generateWriter = new ATCSAction("Generate dialogue sketch", "Generates a dialogue sketch from this dialogue and its tree.") {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
if (selectedNode == null || selectedNode.getProject() == null || !(selectedNode instanceof Dialogue)) return; if (selectedNode == null || selectedNode.getProject() == null || !(selectedNode instanceof Dialogue)) return;
new WriterSketchCreationWizard(selectedNode.getProject(), (Dialogue)selectedNode).setVisible(true); new WriterSketchCreationWizard(selectedNode.getProject(), (Dialogue)selectedNode).setVisible(true);
@@ -413,9 +472,9 @@ public class WorkspaceActions {
actions.add(exportProject); actions.add(exportProject);
actions.add(showAbout); actions.add(showAbout);
actions.add(exitATCS); actions.add(exitATCS);
actions.add(testWriter);
// actions.add(testCommitWriter);
actions.add(createWriter); actions.add(createWriter);
// actions.add(testCommitWriter);
actions.add(generateWriter);
actions.add(editWorkspaceSettings); actions.add(editWorkspaceSettings);
selectionChanged(null, null); selectionChanged(null, null);
} }

View File

@@ -31,9 +31,10 @@ public class WorkspaceSettingsEditor extends JDialog {
JRadioButton useSystemDefaultImageViewerButton, useSystemDefaultImageEditorButton, useCustomImageEditorButton; JRadioButton useSystemDefaultImageViewerButton, useSystemDefaultImageEditorButton, useCustomImageEditorButton;
JTextField imageEditorCommandField; JTextField imageEditorCommandField;
JCheckBox useInternetBox;
JCheckBox translatorModeBox; JCheckBox translatorModeBox;
JComboBox<String> translatorLanguagesBox; JComboBox<String> translatorLanguagesBox;
JCheckBox useInternetBox; JCheckBox checkUpdatesBox;
@@ -53,7 +54,7 @@ public class WorkspaceSettingsEditor extends JDialog {
pane.add(getExternalToolsPane(), JideBoxLayout.FIX); pane.add(getExternalToolsPane(), JideBoxLayout.FIX);
pane.add(getTranslatorModePane(), JideBoxLayout.FIX); pane.add(getInternetPane(), JideBoxLayout.FIX);
pane.add(new JPanel(), JideBoxLayout.VARY); pane.add(new JPanel(), JideBoxLayout.VARY);
buttonPane.add(new JPanel(), JideBoxLayout.VARY); buttonPane.add(new JPanel(), JideBoxLayout.VARY);
@@ -155,10 +156,14 @@ public class WorkspaceSettingsEditor extends JDialog {
return pane; return pane;
} }
public JPanel getTranslatorModePane() { public JPanel getInternetPane() {
CollapsiblePanel pane = new CollapsiblePanel("Translator options");
CollapsiblePanel pane = new CollapsiblePanel("Internet options");
pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.PAGE_AXIS)); pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.PAGE_AXIS));
useInternetBox = new JCheckBox("Allow connecting to internet to retrieve data from weblate and check for updates.");
pane.add(useInternetBox, JideBoxLayout.FIX);
translatorModeBox = new JCheckBox("Activate translator mode"); translatorModeBox = new JCheckBox("Activate translator mode");
pane.add(translatorModeBox, JideBoxLayout.FIX); pane.add(translatorModeBox, JideBoxLayout.FIX);
@@ -171,14 +176,15 @@ public class WorkspaceSettingsEditor extends JDialog {
pane.add(new JLabel("If your language isn't here, complain on the forums at https://andorstrail.com/"), JideBoxLayout.FIX); pane.add(new JLabel("If your language isn't here, complain on the forums at https://andorstrail.com/"), JideBoxLayout.FIX);
useInternetBox = new JCheckBox("Allow connecting to internet to retrieve data from weblate."); checkUpdatesBox = new JCheckBox("Check for ATCS updates at startup");
pane.add(useInternetBox, JideBoxLayout.FIX); pane.add(checkUpdatesBox, JideBoxLayout.FIX);
translatorModeBox.addActionListener(new ActionListener() { useInternetBox.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
translatorLanguagesBox.setEnabled(translatorModeBox.isSelected()); translatorLanguagesBox.setEnabled(useInternetBox.isSelected());
useInternetBox.setEnabled(translatorModeBox.isSelected()); translatorModeBox.setEnabled(useInternetBox.isSelected());
checkUpdatesBox.setEnabled(useInternetBox.isSelected());
} }
}); });
@@ -196,19 +202,20 @@ public class WorkspaceSettingsEditor extends JDialog {
useSystemDefaultImageEditorButton.setSelected(settings.useSystemDefaultImageEditor.getCurrentValue()); useSystemDefaultImageEditorButton.setSelected(settings.useSystemDefaultImageEditor.getCurrentValue());
useCustomImageEditorButton.setSelected(!(settings.useSystemDefaultImageViewer.getCurrentValue() || settings.useSystemDefaultImageEditor.getCurrentValue())); useCustomImageEditorButton.setSelected(!(settings.useSystemDefaultImageViewer.getCurrentValue() || settings.useSystemDefaultImageEditor.getCurrentValue()));
imageEditorCommandField.setText(settings.imageEditorCommand.getCurrentValue()); imageEditorCommandField.setText(settings.imageEditorCommand.getCurrentValue());
//Translator //Internet
useInternetBox.setSelected(settings.useInternet.getCurrentValue());
if (settings.translatorLanguage.getCurrentValue() != null) { if (settings.translatorLanguage.getCurrentValue() != null) {
translatorModeBox.setSelected(true); translatorModeBox.setSelected(true);
translatorLanguagesBox.setSelectedItem(settings.translatorLanguage.getCurrentValue()); translatorLanguagesBox.setSelectedItem(settings.translatorLanguage.getCurrentValue());
translatorLanguagesBox.setEnabled(true); translatorLanguagesBox.setEnabled(useInternetBox.isSelected());
useInternetBox.setEnabled(true);
} else { } else {
translatorModeBox.setSelected(false); translatorModeBox.setSelected(false);
translatorLanguagesBox.setSelectedItem(null); translatorLanguagesBox.setSelectedItem(null);
translatorLanguagesBox.setEnabled(false); translatorLanguagesBox.setEnabled(false);
useInternetBox.setEnabled(false);
} }
useInternetBox.setSelected(settings.useInternet.getCurrentValue()); translatorModeBox.setEnabled(useInternetBox.isSelected());
checkUpdatesBox.setSelected(settings.checkUpdates.getCurrentValue());
checkUpdatesBox.setEnabled(useInternetBox.isSelected());
} }
public void pushToModel() { public void pushToModel() {
@@ -219,13 +226,14 @@ public class WorkspaceSettingsEditor extends JDialog {
settings.useSystemDefaultImageViewer.setCurrentValue(useSystemDefaultImageViewerButton.isSelected()); settings.useSystemDefaultImageViewer.setCurrentValue(useSystemDefaultImageViewerButton.isSelected());
settings.useSystemDefaultImageEditor.setCurrentValue(useSystemDefaultImageEditorButton.isSelected()); settings.useSystemDefaultImageEditor.setCurrentValue(useSystemDefaultImageEditorButton.isSelected());
settings.imageEditorCommand.setCurrentValue(imageEditorCommandField.getText()); settings.imageEditorCommand.setCurrentValue(imageEditorCommandField.getText());
//Translator //Internet
settings.useInternet.setCurrentValue(useInternetBox.isSelected());
if (translatorModeBox.isSelected()) { if (translatorModeBox.isSelected()) {
settings.translatorLanguage.setCurrentValue((String)translatorLanguagesBox.getSelectedItem()); settings.translatorLanguage.setCurrentValue((String)translatorLanguagesBox.getSelectedItem());
} else { } else {
settings.translatorLanguage.resetDefault(); settings.translatorLanguage.resetDefault();
} }
settings.useInternet.setCurrentValue(useInternetBox.isSelected()); settings.checkUpdates.setCurrentValue(checkUpdatesBox.isSelected());
settings.save(); settings.save();
} }

View File

@@ -417,6 +417,7 @@ public class DialogueEditor extends JSONElementEditor {
rewardObj = addItemBox(pane, ((Dialogue)target).getProject(), "Item: ", (Item) reward.reward_obj, writable, listener); rewardObj = addItemBox(pane, ((Dialogue)target).getProject(), "Item: ", (Item) reward.reward_obj, writable, listener);
rewardValue = addIntegerField(pane, "Quantity: ", reward.reward_value, false, writable, listener); rewardValue = addIntegerField(pane, "Quantity: ", reward.reward_value, false, writable, listener);
break; break;
case removeQuestProgress:
case questProgress: case questProgress:
rewardMap = null; rewardMap = null;
rewardObjId = null; rewardObjId = null;
@@ -826,6 +827,10 @@ public class DialogueEditor extends JSONElementEditor {
label.setText("Give quest progress "+rewardObjDesc+":"+reward.reward_value); label.setText("Give quest progress "+rewardObjDesc+":"+reward.reward_value);
if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon())); if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon()));
break; break;
case removeQuestProgress:
label.setText("Removes quest progress "+rewardObjDesc+":"+reward.reward_value);
if (reward.reward_obj != null) label.setIcon(new ImageIcon(reward.reward_obj.getIcon()));
break;
case removeSpawnArea: case removeSpawnArea:
label.setText("Remove all monsters in spawnarea area "+rewardObjDesc+" on map "+reward.map_name); label.setText("Remove all monsters in spawnarea area "+rewardObjDesc+" on map "+reward.map_name);
label.setIcon(new ImageIcon(DefaultIcons.getNPCIcon())); label.setIcon(new ImageIcon(DefaultIcons.getNPCIcon()));

View File

@@ -487,7 +487,7 @@ public class ItemEditor extends JSONElementEditor {
hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener);
hitSourceConditionApply = new JRadioButton("Apply new condition"); hitSourceConditionApply = new JRadioButton("Apply new condition");
pane.add(hitSourceConditionApply, JideBoxLayout.FIX); pane.add(hitSourceConditionApply, JideBoxLayout.FIX);
hitSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, false, writable, listener); hitSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener);
hitSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); hitSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener);
hitSourceConditionClear = new JRadioButton("Clear active condition"); hitSourceConditionClear = new JRadioButton("Clear active condition");
pane.add(hitSourceConditionClear, JideBoxLayout.FIX); pane.add(hitSourceConditionClear, JideBoxLayout.FIX);
@@ -543,7 +543,7 @@ public class ItemEditor extends JSONElementEditor {
hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener);
hitTargetConditionApply = new JRadioButton("Apply new condition"); hitTargetConditionApply = new JRadioButton("Apply new condition");
pane.add(hitTargetConditionApply, JideBoxLayout.FIX); pane.add(hitTargetConditionApply, JideBoxLayout.FIX);
hitTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, false, writable, listener); hitTargetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener);
hitTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); hitTargetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener);
hitTargetConditionClear = new JRadioButton("Clear active condition"); hitTargetConditionClear = new JRadioButton("Clear active condition");
pane.add(hitTargetConditionClear, JideBoxLayout.FIX); pane.add(hitTargetConditionClear, JideBoxLayout.FIX);
@@ -599,7 +599,7 @@ public class ItemEditor extends JSONElementEditor {
killSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); killSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener);
killSourceConditionApply = new JRadioButton("Apply new condition"); killSourceConditionApply = new JRadioButton("Apply new condition");
pane.add(killSourceConditionApply, JideBoxLayout.FIX); pane.add(killSourceConditionApply, JideBoxLayout.FIX);
killSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, false, writable, listener); killSourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude == null ? null : condition.magnitude >= 0 ? condition.magnitude : 0, 1, false, writable, listener);
killSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); killSourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener);
killSourceConditionClear = new JRadioButton("Clear active condition"); killSourceConditionClear = new JRadioButton("Clear active condition");
pane.add(killSourceConditionClear, JideBoxLayout.FIX); pane.add(killSourceConditionClear, JideBoxLayout.FIX);
@@ -651,7 +651,7 @@ public class ItemEditor extends JSONElementEditor {
Project proj = ((Item)target).getProject(); Project proj = ((Item)target).getProject();
equipConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); equipConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener);
equipConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, false, writable, listener); equipConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, 1, false, writable, listener);
pane.revalidate(); pane.revalidate();
pane.repaint(); pane.repaint();

View File

@@ -181,12 +181,12 @@ public class NPCEditor extends JSONElementEditor {
moveTypeBox = addEnumValueBox(pane, "Movement type: ", NPC.MovementType.values(), npc.movement_type, npc.writable, listener); moveTypeBox = addEnumValueBox(pane, "Movement type: ", NPC.MovementType.values(), npc.movement_type, npc.writable, listener);
combatTraitPane = new CollapsiblePanel("Combat traits: "); combatTraitPane = new CollapsiblePanel("Combat traits: ");
combatTraitPane.setLayout(new JideBoxLayout(combatTraitPane, JideBoxLayout.PAGE_AXIS, 6)); combatTraitPane.setLayout(new JideBoxLayout(combatTraitPane, JideBoxLayout.PAGE_AXIS, 6));
maxHP = addIntegerField(combatTraitPane, "Max HP: ", npc.max_hp, false, npc.writable, listener); maxHP = addIntegerField(combatTraitPane, "Max HP: ", npc.max_hp, 1, false, npc.writable, listener);
maxAP = addIntegerField(combatTraitPane, "Max AP: ", npc.max_ap, false, npc.writable, listener); maxAP = addIntegerField(combatTraitPane, "Max AP: ", npc.max_ap, 10, false, npc.writable, listener);
moveCost = addIntegerField(combatTraitPane, "Move cost: ", npc.move_cost, false, npc.writable, listener); moveCost = addIntegerField(combatTraitPane, "Move cost: ", npc.move_cost, 10, false, npc.writable, listener);
atkDmgMin = addIntegerField(combatTraitPane, "Attack Damage min: ", npc.attack_damage_min, false, npc.writable, listener); atkDmgMin = addIntegerField(combatTraitPane, "Attack Damage min: ", npc.attack_damage_min, false, npc.writable, listener);
atkDmgMax = addIntegerField(combatTraitPane, "Attack Damage max: ", npc.attack_damage_max, false, npc.writable, listener); atkDmgMax = addIntegerField(combatTraitPane, "Attack Damage max: ", npc.attack_damage_max, false, npc.writable, listener);
atkCost = addIntegerField(combatTraitPane, "Attack cost: ", npc.attack_cost, false, npc.writable, listener); atkCost = addIntegerField(combatTraitPane, "Attack cost: ", npc.attack_cost, 10, false, npc.writable, listener);
atkChance = addIntegerField(combatTraitPane, "Attack chance: ", npc.attack_chance, false, npc.writable, listener); atkChance = addIntegerField(combatTraitPane, "Attack chance: ", npc.attack_chance, false, npc.writable, listener);
critSkill = addIntegerField(combatTraitPane, "Critical skill: ", npc.critical_skill, false, npc.writable, listener); critSkill = addIntegerField(combatTraitPane, "Critical skill: ", npc.critical_skill, false, npc.writable, listener);
critMult = addDoubleField(combatTraitPane, "Critical multiplier: ", npc.critical_multiplier, npc.writable, listener); critMult = addDoubleField(combatTraitPane, "Critical multiplier: ", npc.critical_multiplier, npc.writable, listener);
@@ -323,7 +323,7 @@ public class NPCEditor extends JSONElementEditor {
Project proj = ((NPC)target).getProject(); Project proj = ((NPC)target).getProject();
sourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); sourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener);
sourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, false, writable, listener); sourceConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, 1, false, writable, listener);
sourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); sourceConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener);
sourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); sourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener);
@@ -341,7 +341,7 @@ public class NPCEditor extends JSONElementEditor {
Project proj = ((NPC)target).getProject(); Project proj = ((NPC)target).getProject();
targetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); targetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener);
targetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, false, writable, listener); targetConditionMagnitude = addIntegerField(pane, "Magnitude: ", condition.magnitude, 1, false, writable, listener);
targetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener); targetConditionDuration = addIntegerField(pane, "Duration: ", condition.duration, false, writable, listener);
targetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); targetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener);
@@ -606,7 +606,7 @@ public class NPCEditor extends JSONElementEditor {
hitEffect.ap_boost_max = (Integer) value; hitEffect.ap_boost_max = (Integer) value;
updateHit = true; updateHit = true;
} else if (source == hitSourceConditionsList) { } else if (source == hitSourceConditionsList) {
//TODO updateHit = true;
} else if (source == sourceConditionBox) { } else if (source == sourceConditionBox) {
if (selectedHitEffectSourceCondition.condition != null) { if (selectedHitEffectSourceCondition.condition != null) {
selectedHitEffectSourceCondition.condition.removeBacklink(npc); selectedHitEffectSourceCondition.condition.removeBacklink(npc);
@@ -629,7 +629,7 @@ public class NPCEditor extends JSONElementEditor {
selectedHitEffectSourceCondition.chance = (Double) value; selectedHitEffectSourceCondition.chance = (Double) value;
hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition); hitSourceConditionsListModel.itemChanged(selectedHitEffectSourceCondition);
} else if (source == hitTargetConditionsList) { } else if (source == hitTargetConditionsList) {
//TODO updateHit = true;
} else if (source == targetConditionBox) { } else if (source == targetConditionBox) {
if (selectedHitEffectTargetCondition.condition != null) { if (selectedHitEffectTargetCondition.condition != null) {
selectedHitEffectTargetCondition.condition.removeBacklink(npc); selectedHitEffectTargetCondition.condition.removeBacklink(npc);

View File

@@ -206,11 +206,12 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
JScrollPane tmxScroller = new JScrollPane(getTmxEditorPane(), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); JScrollPane tmxScroller = new JScrollPane(getTmxEditorPane(), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JScrollPane xmlScroller = new JScrollPane(getXmlEditorPane(), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); JScrollPane xmlScroller = new JScrollPane(getXmlEditorPane(), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JScrollPane replScroller = new JScrollPane(getReplacementSimulatorPane(), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //JScrollPane replScroller = new JScrollPane(getReplacementSimulatorPane(), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
xmlScroller.getVerticalScrollBar().setUnitIncrement(16); xmlScroller.getVerticalScrollBar().setUnitIncrement(16);
editorTabsHolder.add("TMX", tmxScroller); editorTabsHolder.add("TMX", tmxScroller);
editorTabsHolder.add("XML", xmlScroller); editorTabsHolder.add("XML", xmlScroller);
editorTabsHolder.add("Replacements", replScroller); //editorTabsHolder.add("Replacements", replScroller);
editorTabsHolder.add("Replacements", getReplacementSimulatorPane());
} }
@@ -260,7 +261,12 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addTileLayer.addActionListener(new ActionListener() { addTileLayer.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
layerListModel.addObject(new tiled.core.TileLayer()); tiled.core.TileLayer layer = new tiled.core.TileLayer(map.tmxMap.getWidth(), map.tmxMap.getHeight());
layerListModel.addObject(layer);
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
addObjectGroup = new JButton(new ImageIcon(DefaultIcons.getCreateObjectGroupIcon())); addObjectGroup = new JButton(new ImageIcon(DefaultIcons.getCreateObjectGroupIcon()));
@@ -270,6 +276,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
layerListModel.addObject(new tiled.core.ObjectGroup()); layerListModel.addObject(new tiled.core.ObjectGroup());
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
deleteLayer = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); deleteLayer = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
@@ -279,6 +289,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
layerListModel.removeObject(selectedLayer); layerListModel.removeObject(selectedLayer);
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
JPanel layersButtonsPane = new JPanel(); JPanel layersButtonsPane = new JPanel();
@@ -363,6 +377,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newMapchange(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addObject(MapObject.newMapchange(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
addSpawn = new JButton(new ImageIcon(DefaultIcons.getCreateSpawnareaIcon())); addSpawn = new JButton(new ImageIcon(DefaultIcons.getCreateSpawnareaIcon()));
@@ -372,6 +390,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newSpawnArea(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addObject(MapObject.newSpawnArea(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
addRest = new JButton(new ImageIcon(DefaultIcons.getCreateRestIcon())); addRest = new JButton(new ImageIcon(DefaultIcons.getCreateRestIcon()));
@@ -381,6 +403,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newRest(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addObject(MapObject.newRest(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
addKey = new JButton(new ImageIcon(DefaultIcons.getCreateKeyIcon())); addKey = new JButton(new ImageIcon(DefaultIcons.getCreateKeyIcon()));
@@ -390,6 +416,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newKey(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addObject(MapObject.newKey(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
addReplace = new JButton(new ImageIcon(DefaultIcons.getCreateReplaceIcon())); addReplace = new JButton(new ImageIcon(DefaultIcons.getCreateReplaceIcon()));
@@ -399,6 +429,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newReplace(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addObject(MapObject.newReplace(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
addScript = new JButton(new ImageIcon(DefaultIcons.getCreateScriptIcon())); addScript = new JButton(new ImageIcon(DefaultIcons.getCreateScriptIcon()));
@@ -408,6 +442,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newScript(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addObject(MapObject.newScript(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
addContainer = new JButton(new ImageIcon(DefaultIcons.getCreateContainerIcon())); addContainer = new JButton(new ImageIcon(DefaultIcons.getCreateContainerIcon()));
@@ -417,6 +455,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newContainer(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addObject(MapObject.newContainer(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
addSign = new JButton(new ImageIcon(DefaultIcons.getCreateSignIcon())); addSign = new JButton(new ImageIcon(DefaultIcons.getCreateSignIcon()));
@@ -426,6 +468,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newSign(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addObject(MapObject.newSign(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
deleteObject = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); deleteObject = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
@@ -435,6 +481,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.removeObject(selectedMapObject); groupObjectsListModel.removeObject(selectedMapObject);
map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this);
targetUpdated();
} }
}); });
@@ -474,6 +524,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
if (selected instanceof ContainerArea) { if (selected instanceof ContainerArea) {
droplistBox = addDroplistBox(pane, ((TMXMap)target).getProject(), "Droplist: ", ((ContainerArea)selected).droplist, ((TMXMap)target).writable, listener); droplistBox = addDroplistBox(pane, ((TMXMap)target).getProject(), "Droplist: ", ((ContainerArea)selected).droplist, ((TMXMap)target).writable, listener);
} else if (selected instanceof KeyArea) { } else if (selected instanceof KeyArea) {
areaField = addTextField(pane, "Area ID: ", ((KeyArea)selected).name, ((TMXMap)target).writable, listener);
dialogueBox = addDialogueBox(pane, ((TMXMap)target).getProject(), "Message when locked: ", ((KeyArea)selected).dialogue, ((TMXMap)target).writable, listener); dialogueBox = addDialogueBox(pane, ((TMXMap)target).getProject(), "Message when locked: ", ((KeyArea)selected).dialogue, ((TMXMap)target).writable, listener);
requirementTypeCombo = addEnumValueBox(pane, "Requirement type: ", Requirement.RequirementType.values(), ((KeyArea)selected).requirement.type, ((TMXMap)target).writable, listener); requirementTypeCombo = addEnumValueBox(pane, "Requirement type: ", Requirement.RequirementType.values(), ((KeyArea)selected).requirement.type, ((TMXMap)target).writable, listener);
requirementParamsPane = new JPanel(); requirementParamsPane = new JPanel();
@@ -512,8 +563,8 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
}); });
pane.add(tACPane, JideBoxLayout.FIX); pane.add(tACPane, JideBoxLayout.FIX);
} else if (selected instanceof ReplaceArea) { } else if (selected instanceof ReplaceArea) {
//Replace areas only use questProgress requirements ATM areaField = addTextField(pane, "Area ID: ", ((ReplaceArea)selected).name, ((TMXMap)target).writable, listener);
//requirementTypeCombo = addEnumValueBox(pane, "Requirement type: ", Requirement.RequirementType.values(), ((ReplaceArea)selected).requirement.type, ((TMXMap)target).writable, listener); requirementTypeCombo = addEnumValueBox(pane, "Requirement type: ", Requirement.RequirementType.values(), ((ReplaceArea)selected).requirement.type, ((TMXMap)target).writable, listener);
requirementParamsPane = new JPanel(); requirementParamsPane = new JPanel();
requirementParamsPane.setLayout(new JideBoxLayout(requirementParamsPane, JideBoxLayout.PAGE_AXIS, 6)); requirementParamsPane.setLayout(new JideBoxLayout(requirementParamsPane, JideBoxLayout.PAGE_AXIS, 6));
pane.add(requirementParamsPane, JideBoxLayout.FIX); pane.add(requirementParamsPane, JideBoxLayout.FIX);
@@ -735,7 +786,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
activateAndViewPane.setLayout(new JideBoxLayout(activateAndViewPane, JideBoxLayout.LINE_AXIS)); activateAndViewPane.setLayout(new JideBoxLayout(activateAndViewPane, JideBoxLayout.LINE_AXIS));
activateAndViewPane.add(areasActivationPane, JideBoxLayout.FIX); activateAndViewPane.add(areasActivationPane, JideBoxLayout.FIX);
activateAndViewPane.add(viewer, JideBoxLayout.VARY); activateAndViewPane.add(new JScrollPane(viewer), JideBoxLayout.VARY);
replacementSimulator.add(walkableVisibleBox, JideBoxLayout.FIX); replacementSimulator.add(walkableVisibleBox, JideBoxLayout.FIX);
replacementSimulator.add(activateAndViewPane, JideBoxLayout.VARY); replacementSimulator.add(activateAndViewPane, JideBoxLayout.VARY);
@@ -1593,6 +1644,9 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
public void targetUpdated() { public void targetUpdated() {
this.name = ((TMXMap)target).getDesc(); this.name = ((TMXMap)target).getDesc();
updateMessage(); updateMessage();
updateXmlViewText(((TMXMap)target).toXml());
tmxViewer.repaint();
tmxViewer.revalidate();
} }
@@ -1682,6 +1736,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
ATContentStudio.frame.closeEditor(map); ATContentStudio.frame.closeEditor(map);
map.childrenRemoved(new ArrayList<ProjectTreeNode>()); map.childrenRemoved(new ArrayList<ProjectTreeNode>());
map.delete(); map.delete();
GameDataElement newOne = map.getProject().getMap(map.id);
for (GameDataElement backlink : map.getBacklinks()) {
backlink.elementChanged(map, newOne);
}
} }
}); });
savePane.add(delete, JideBoxLayout.FIX); savePane.add(delete, JideBoxLayout.FIX);
@@ -1755,6 +1813,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
private int skipAreaFieldEvents = 0;
public class MapFieldUpdater implements FieldUpdateListener { public class MapFieldUpdater implements FieldUpdateListener {
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({ "unchecked", "rawtypes" })
@@ -1790,8 +1849,22 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
tmxViewer.revalidate(); tmxViewer.revalidate();
tmxViewer.repaint(); tmxViewer.repaint();
} else if (source == areaField) { } else if (source == areaField) {
selectedMapObject.name = (String) value; if (skipAreaFieldEvents > 0) skipAreaFieldEvents--;
groupObjectsListModel.objectChanged(selectedMapObject); else {
selectedMapObject.name = (String) value;
if (selectedMapObject instanceof KeyArea) {
KeyArea area = (KeyArea) selectedMapObject;
if (area.oldSchoolRequirement) {
area.oldSchoolRequirement = false;
}
} else if (selectedMapObject instanceof ReplaceArea) {
ReplaceArea area = (ReplaceArea) selectedMapObject;
if (area.oldSchoolRequirement) {
area.oldSchoolRequirement = false;
}
}
groupObjectsListModel.objectChanged(selectedMapObject);
}
} else if (source == spawngroupField) { } else if (source == spawngroupField) {
if (selectedMapObject instanceof SpawnArea) { if (selectedMapObject instanceof SpawnArea) {
SpawnArea area = (SpawnArea)selectedMapObject; SpawnArea area = (SpawnArea)selectedMapObject;
@@ -1915,7 +1988,20 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
KeyArea area = (KeyArea) selectedMapObject; KeyArea area = (KeyArea) selectedMapObject;
area.requirement.changeType((Requirement.RequirementType)requirementTypeCombo.getSelectedItem()); area.requirement.changeType((Requirement.RequirementType)requirementTypeCombo.getSelectedItem());
updateRequirementParamsPane(requirementParamsPane, area.requirement, this); updateRequirementParamsPane(requirementParamsPane, area.requirement, this);
if (area.oldSchoolRequirement) area.updateNameFromRequirementChange(); if (area.oldSchoolRequirement) {
area.updateNameFromRequirementChange();
skipAreaFieldEvents+=2;
areaField.setText(area.name);
}
} else if (selectedMapObject instanceof ReplaceArea) {
ReplaceArea area = (ReplaceArea) selectedMapObject;
area.requirement.changeType((Requirement.RequirementType)requirementTypeCombo.getSelectedItem());
updateRequirementParamsPane(requirementParamsPane, area.requirement, this);
if (area.oldSchoolRequirement) {
area.updateNameFromRequirementChange();
skipAreaFieldEvents+=2;
areaField.setText(area.name);
}
} }
} else if (source == requirementObj) { } else if (source == requirementObj) {
if (selectedMapObject instanceof KeyArea) { if (selectedMapObject instanceof KeyArea) {
@@ -1926,7 +2012,11 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} else { } else {
area.requirement.required_obj_id = null; area.requirement.required_obj_id = null;
} }
if (area.oldSchoolRequirement) area.updateNameFromRequirementChange(); if (area.oldSchoolRequirement) {
area.updateNameFromRequirementChange();
skipAreaFieldEvents+=2;
areaField.setText(area.name);
}
} else if (selectedMapObject instanceof ReplaceArea) { } else if (selectedMapObject instanceof ReplaceArea) {
ReplaceArea area = (ReplaceArea) selectedMapObject; ReplaceArea area = (ReplaceArea) selectedMapObject;
area.requirement.required_obj = (GameDataElement) value; area.requirement.required_obj = (GameDataElement) value;
@@ -1935,17 +2025,31 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} else { } else {
area.requirement.required_obj_id = null; area.requirement.required_obj_id = null;
} }
if (area.oldSchoolRequirement) area.updateNameFromRequirementChange(); if (area.oldSchoolRequirement) {
area.updateNameFromRequirementChange();
skipAreaFieldEvents+=2;
areaField.setText(area.name);
}
} }
} else if (source == requirementObjId) { } else if (source == requirementObjId) {
if (selectedMapObject instanceof KeyArea) { if (selectedMapObject instanceof KeyArea) {
KeyArea area = (KeyArea) selectedMapObject; KeyArea area = (KeyArea) selectedMapObject;
area.requirement.required_obj_id = (String) value; area.requirement.required_obj_id = (String) value;
area.requirement.required_obj = null; area.requirement.required_obj = null;
if (area.oldSchoolRequirement) {
area.updateNameFromRequirementChange();
skipAreaFieldEvents+=2;
areaField.setText(area.name);
}
} else if (selectedMapObject instanceof ReplaceArea) { } else if (selectedMapObject instanceof ReplaceArea) {
ReplaceArea area = (ReplaceArea) selectedMapObject; ReplaceArea area = (ReplaceArea) selectedMapObject;
area.requirement.required_obj_id = (String) value; area.requirement.required_obj_id = (String) value;
area.requirement.required_obj = null; area.requirement.required_obj = null;
if (area.oldSchoolRequirement) {
area.updateNameFromRequirementChange();
skipAreaFieldEvents+=2;
areaField.setText(area.name);
}
} }
} else if (source == requirementValue) { } else if (source == requirementValue) {
if (selectedMapObject instanceof KeyArea) { if (selectedMapObject instanceof KeyArea) {
@@ -1964,7 +2068,11 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
stage = quest.getStage(area.requirement.required_value); stage = quest.getStage(area.requirement.required_value);
if (stage != null) stage.addBacklink(map); if (stage != null) stage.addBacklink(map);
} }
if (area.oldSchoolRequirement) area.updateNameFromRequirementChange(); if (area.oldSchoolRequirement) {
area.updateNameFromRequirementChange();
skipAreaFieldEvents+=2;
areaField.setText(area.name);
}
} else if (selectedMapObject instanceof ReplaceArea) { } else if (selectedMapObject instanceof ReplaceArea) {
ReplaceArea area = (ReplaceArea) selectedMapObject; ReplaceArea area = (ReplaceArea) selectedMapObject;
Quest quest = null; Quest quest = null;
@@ -1981,17 +2089,29 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
stage = quest.getStage(area.requirement.required_value); stage = quest.getStage(area.requirement.required_value);
if (stage != null) stage.addBacklink(map); if (stage != null) stage.addBacklink(map);
} }
if (area.oldSchoolRequirement) area.updateNameFromRequirementChange(); if (area.oldSchoolRequirement) {
area.updateNameFromRequirementChange();
skipAreaFieldEvents+=2;
areaField.setText(area.name);
}
} }
} else if (source == requirementNegated) { } else if (source == requirementNegated) {
if (selectedMapObject instanceof KeyArea) { if (selectedMapObject instanceof KeyArea) {
KeyArea area = (KeyArea) selectedMapObject; KeyArea area = (KeyArea) selectedMapObject;
area.requirement.negated = (Boolean) value; area.requirement.negated = (Boolean) value;
if (area.oldSchoolRequirement) area.updateNameFromRequirementChange(); if (area.oldSchoolRequirement) {
area.updateNameFromRequirementChange();
skipAreaFieldEvents+=2;
areaField.setText(area.name);
}
} else if (selectedMapObject instanceof ReplaceArea) { } else if (selectedMapObject instanceof ReplaceArea) {
ReplaceArea area = (ReplaceArea) selectedMapObject; ReplaceArea area = (ReplaceArea) selectedMapObject;
area.requirement.negated = (Boolean) value; area.requirement.negated = (Boolean) value;
if (area.oldSchoolRequirement) area.updateNameFromRequirementChange(); if (area.oldSchoolRequirement) {
area.updateNameFromRequirementChange();
skipAreaFieldEvents+=2;
areaField.setText(area.name);
}
} }
} else if (source == sourceLayer) { } else if (source == sourceLayer) {
selectedReplacement.sourceLayer = (String)value; selectedReplacement.sourceLayer = (String)value;
@@ -2005,11 +2125,9 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
if (modified) { if (modified) {
if (map.state != GameDataElement.State.modified) { if (map.state != GameDataElement.State.modified) {
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
TMXMapEditor.this.name = map.getDesc();
map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
} }
updateXmlViewText(map.toXml()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
} }
} }
} }

View File

@@ -98,7 +98,7 @@ public class WorldMapEditor extends Editor implements FieldUpdateListener {
public WorldMapEditor(WorldmapSegment worldmap) { public WorldMapEditor(WorldmapSegment worldmap) {
target = worldmap; target = worldmap;
this.name = worldmap.id; this.name = worldmap.getDesc();
this.icon = new ImageIcon(worldmap.getIcon()); this.icon = new ImageIcon(worldmap.getIcon());
setLayout(new BorderLayout()); setLayout(new BorderLayout());
@@ -117,8 +117,10 @@ public class WorldMapEditor extends Editor implements FieldUpdateListener {
@Override @Override
public void targetUpdated() { public void targetUpdated() {
// TODO Auto-generated method stub this.name = ((GameDataElement)target).getDesc();
updateMessage();
updateXmlViewText(((WorldmapSegment)target).toXml());
mapView.updateFromModel();
} }
public JPanel getXmlEditorPane() { public JPanel getXmlEditorPane() {
@@ -1016,7 +1018,6 @@ public class WorldMapEditor extends Editor implements FieldUpdateListener {
public void notifyModelModified() { public void notifyModelModified() {
target.state = GameDataElement.State.modified; target.state = GameDataElement.State.modified;
this.name = ((WorldmapSegment)target).getDesc();
target.childrenChanged(new ArrayList<ProjectTreeNode>()); target.childrenChanged(new ArrayList<ProjectTreeNode>());
} }

View File

@@ -496,6 +496,9 @@ public class WorldMapView extends JComponent implements Scrollable {
public void pushToModel() { public void pushToModel() {
worldmap.segmentX = offsetX / TILE_SIZE; worldmap.segmentX = offsetX / TILE_SIZE;
worldmap.segmentY = offsetY / TILE_SIZE; worldmap.segmentY = offsetY / TILE_SIZE;
for (String id : worldmap.mapLocations.keySet()) {
worldmap.getProject().getMap(id).removeBacklink(worldmap);
}
worldmap.mapLocations.clear(); worldmap.mapLocations.clear();
for (String s : mapLocations.keySet()) { for (String s : mapLocations.keySet()) {
int x = mapLocations.get(s).x / TILE_SIZE; int x = mapLocations.get(s).x / TILE_SIZE;
@@ -504,6 +507,10 @@ public class WorldMapView extends JComponent implements Scrollable {
worldmap.mapLocations.put(s, new Point(x, y)); worldmap.mapLocations.put(s, new Point(x, y));
} }
for (String id : worldmap.mapLocations.keySet()) {
worldmap.getProject().getMap(id).addBacklink(worldmap);
}
List<String> toRemove = new ArrayList<String>(); List<String> toRemove = new ArrayList<String>();
for (String s : worldmap.labels.keySet()) { for (String s : worldmap.labels.keySet()) {
if (!mapLocations.containsKey(s)) { if (!mapLocations.containsKey(s)) {

View File

@@ -0,0 +1,223 @@
package com.gpl.rpg.atcontentstudio.ui.tools;
import java.util.ArrayList;
import java.util.List;
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
import com.gpl.rpg.atcontentstudio.model.GameSource;
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
import com.gpl.rpg.atcontentstudio.model.gamedata.Item;
import com.gpl.rpg.atcontentstudio.model.gamedata.ItemCategory;
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
import com.gpl.rpg.atcontentstudio.model.gamedata.Quest;
import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement;
import com.gpl.rpg.atcontentstudio.model.maps.ContainerArea;
import com.gpl.rpg.atcontentstudio.model.maps.KeyArea;
import com.gpl.rpg.atcontentstudio.model.maps.MapChange;
import com.gpl.rpg.atcontentstudio.model.maps.MapObject;
import com.gpl.rpg.atcontentstudio.model.maps.MapObjectGroup;
import com.gpl.rpg.atcontentstudio.model.maps.ReplaceArea;
import com.gpl.rpg.atcontentstudio.model.maps.RestArea;
import com.gpl.rpg.atcontentstudio.model.maps.ScriptArea;
import com.gpl.rpg.atcontentstudio.model.maps.SignArea;
import com.gpl.rpg.atcontentstudio.model.maps.SpawnArea;
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
public class GDEVisitor {
public static List<GameDataElement> findDependencies(GameDataElement origin, boolean includeSource) {
List<GameDataElement> visited = new ArrayList<GameDataElement>();
visit(origin, visited, includeSource);
return visited;
}
private static void visit(GameDataElement element, List<GameDataElement> visited, boolean includeSource) {
if (element == null) return;
if (visited.contains(element)) return;
if (!(includeSource || element.getDataType() != GameSource.Type.source)) return;
visited.add(element);
element.link();
if (element instanceof ActorCondition) {
visitActorCondition((ActorCondition)element, visited, includeSource);
} else if (element instanceof Dialogue) {
visitDialogue((Dialogue)element, visited, includeSource);
} else if (element instanceof Droplist) {
visitDroplist((Droplist)element, visited, includeSource);
} else if (element instanceof Item) {
visitItem((Item)element, visited, includeSource);
} else if (element instanceof ItemCategory) {
visitItemCategory((ItemCategory)element, visited, includeSource);
} else if (element instanceof NPC) {
visitNPC((NPC)element, visited, includeSource);
} else if (element instanceof Quest) {
visitQuest((Quest)element, visited, includeSource);
} else if (element instanceof TMXMap) {
visitTMXMap((TMXMap)element, visited, includeSource);
} else if (element instanceof Spritesheet) {
visitSpritesheet((Spritesheet)element, visited, includeSource);
}
}
private static void visitActorCondition(ActorCondition element, List<GameDataElement> visited, boolean includeSource) {
if (element.icon_id != null) visit(element.getProject().getSpritesheet(element.icon_id.split(":")[0]), visited, includeSource);
for (GameDataElement backlink : element.getBacklinks()) {
visit(backlink, visited, includeSource);
}
}
private static void visitDialogue(Dialogue element, List<GameDataElement> visited, boolean includeSource) {
visit(element.switch_to_npc, visited, includeSource);
if (element.replies != null) {
for (Dialogue.Reply reply : element.replies) {
visit(reply.next_phrase, visited, includeSource);
if (reply.requirements != null) {
for (Requirement req : reply.requirements) {
visit(req.required_obj, visited, includeSource);
}
}
}
}
if (element.rewards != null) {
for (Dialogue.Reward reward : element.rewards) {
visit(reward.reward_obj, visited, includeSource);
visit(reward.map, visited, includeSource);
}
}
for (GameDataElement backlink : element.getBacklinks()) {
visit(backlink, visited, includeSource);
}
}
private static void visitDroplist(Droplist element, List<GameDataElement> visited, boolean includeSource) {
if (element.dropped_items != null) {
for (Droplist.DroppedItem droppedItem : element.dropped_items) {
visit(droppedItem.item, visited, includeSource);
}
}
for (GameDataElement backlink : element.getBacklinks()) {
visit(backlink, visited, includeSource);
}
}
private static void visitItem(Item element, List<GameDataElement> visited, boolean includeSource) {
visit(element.category, visited, includeSource);
if (element.icon_id != null) visit(element.getProject().getSpritesheet(element.icon_id.split(":")[0]), visited, includeSource);
if (element.equip_effect != null && element.equip_effect.conditions != null) {
for (Item.ConditionEffect condEffect : element.equip_effect.conditions) {
visit(condEffect.condition, visited, includeSource);
}
}
if (element.hit_effect != null) {
if (element.hit_effect.conditions_source != null) {
for (Item.ConditionEffect condEffect : element.hit_effect.conditions_source) {
visit(condEffect.condition, visited, includeSource);
}
}
if (element.hit_effect.conditions_target != null) {
for (Item.ConditionEffect condEffect : element.hit_effect.conditions_target) {
visit(condEffect.condition, visited, includeSource);
}
}
}
for (GameDataElement backlink : element.getBacklinks()) {
visit(backlink, visited, includeSource);
}
}
private static void visitItemCategory(ItemCategory element, List<GameDataElement> visited, boolean includeSource) {
//Nothing to visit
}
private static void visitNPC(NPC element, List<GameDataElement> visited, boolean includeSource) {
visit(element.dialogue, visited, includeSource);
visit(element.droplist, visited, includeSource);
if (element.icon_id != null) visit(element.getProject().getSpritesheet(element.icon_id.split(":")[0]), visited, includeSource);
if (element.hit_effect != null) {
if (element.hit_effect.conditions_source != null) {
for (NPC.TimedConditionEffect condEffect : element.hit_effect.conditions_source) {
visit(condEffect.condition, visited, includeSource);
}
}
if (element.hit_effect.conditions_target != null) {
for (NPC.TimedConditionEffect condEffect : element.hit_effect.conditions_target) {
visit(condEffect.condition, visited, includeSource);
}
}
}
for (GameDataElement backlink : element.getBacklinks()) {
visit(backlink, visited, includeSource);
}
}
private static void visitQuest(Quest element, List<GameDataElement> visited, boolean includeSource) {
//Nothing to visit
for (GameDataElement backlink : element.getBacklinks()) {
visit(backlink, visited, includeSource);
}
}
private static void visitTMXMap(TMXMap element, List<GameDataElement> visited, boolean includeSource) {
// TODO Auto-generated method stub
if (element.groups != null) {
for (MapObjectGroup group : element.groups) {
if (group.mapObjects != null) {
for (MapObject obj : group.mapObjects) {
if (obj instanceof ContainerArea) {
visit(((ContainerArea)obj).droplist, visited, includeSource);
} else if (obj instanceof KeyArea) {
visit(((KeyArea)obj).dialogue, visited, includeSource);
if (((KeyArea)obj).requirement != null) {
visit(((KeyArea)obj).requirement.required_obj, visited, includeSource);
}
} else if (obj instanceof MapChange) {
visit(((MapChange)obj).map, visited, includeSource);
} else if (obj instanceof ReplaceArea) {
if (((ReplaceArea)obj).requirement != null) {
visit(((ReplaceArea)obj).requirement.required_obj, visited, includeSource);
}
} else if (obj instanceof RestArea) {
//Nothing to visit
} else if (obj instanceof ScriptArea) {
visit(((ScriptArea)obj).dialogue, visited, includeSource);
} else if (obj instanceof SignArea) {
visit(((SignArea)obj).dialogue, visited, includeSource);
} else if (obj instanceof SpawnArea) {
if (((SpawnArea)obj).spawnGroup != null) {
for (NPC npc : ((SpawnArea)obj).spawnGroup) {
visit(npc, visited, includeSource);
}
}
}
}
}
}
}
for (GameDataElement backlink : element.getBacklinks()) {
visit(backlink, visited, includeSource);
}
}
private static void visitSpritesheet(Spritesheet element, List<GameDataElement> visited, boolean includeSource) {
//Nothing to visit
//Not even the backlinks. Makes no sense.
}
}

View File

@@ -10,14 +10,18 @@ import java.awt.event.FocusListener;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction; import javax.swing.AbstractAction;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JInternalFrame; import javax.swing.JInternalFrame;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
@@ -57,6 +61,9 @@ import prefuse.visual.EdgeItem;
import prefuse.visual.VisualItem; import prefuse.visual.VisualItem;
import prefuse.visual.expression.InGroupPredicate; import prefuse.visual.expression.InGroupPredicate;
import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue; import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeData; import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeData;
import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeData.EmptyReply; import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeData.EmptyReply;
@@ -71,8 +78,19 @@ import com.jidesoft.swing.JideBoxLayout;
public class WriterModeEditor extends Editor { public class WriterModeEditor extends Editor {
private static final long serialVersionUID = -6591631891278528494L; private static final long serialVersionUID = -6591631891278528494L;
private static final String HELP_TEXT =
"<html><body><table>"
+ "<tr><td valign=\"middle\">(Esc.)</td><td valign=\"middle\"> Cancel edition</td></tr>"
+ "<tr><td valign=\"middle\">(Ctrl+Enter)</td><td valign=\"middle\"> Confirm changes</td></tr>"
+ "<tr><td valign=\"middle\">(Shift+Enter)</td><td valign=\"middle\"> Create next of same kind</td></tr>"
+ "<tr><td valign=\"middle\">(Alt+Enter)</td><td valign=\"middle\"> Create next of other kind</td></tr>"
+ "</table></body></html>";
private JComponent overlay = null; private JComponent overlay = null;
private JComponent helpWindow = null;
private Display view; private Display view;
final private WriterModeData data; final private WriterModeData data;
@@ -87,12 +105,19 @@ public class WriterModeEditor extends Editor {
selected = data.begin; selected = data.begin;
view = new WriterGraphView(); view = new WriterGraphView();
view.setLocation(0, 0); view.setLocation(0, 0);
setLayout(new BorderLayout()); setLayout(new BorderLayout());
add(createButtonPane(), BorderLayout.NORTH); add(createButtonPane(), BorderLayout.NORTH);
add(view, BorderLayout.CENTER); add(view, BorderLayout.CENTER);
} }
public void dataAltered() {
data.state = GameDataElement.State.modified;
data.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(this);
}
public JPanel createButtonPane() { public JPanel createButtonPane() {
JPanel pane = new JPanel(); JPanel pane = new JPanel();
pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.LINE_AXIS)); pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.LINE_AXIS));
@@ -102,6 +127,8 @@ public class WriterModeEditor extends Editor {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
data.save(); data.save();
data.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(WriterModeEditor.this);
} }
}); });
export.addActionListener(new ActionListener() { export.addActionListener(new ActionListener() {
@@ -111,6 +138,8 @@ public class WriterModeEditor extends Editor {
data.getProject().createElements(created); data.getProject().createElements(created);
//data.begin.dialogue.save(); //data.begin.dialogue.save();
data.save(); data.save();
data.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(WriterModeEditor.this);
} }
}); });
pane.add(save, JideBoxLayout.FIX); pane.add(save, JideBoxLayout.FIX);
@@ -135,6 +164,22 @@ public class WriterModeEditor extends Editor {
} }
private void createHelpWindow() {
JInternalFrame window = new JInternalFrame("Help", true, true);
window.setLayout(new BorderLayout());
JEditorPane area = new JEditorPane();
area.setContentType("text/html");
area.setText(HELP_TEXT);
area.setEditable(false);
window.add(new JScrollPane(area));
window.setSize(350, 250);
window.setLocation(0, 0);
view.add(window);
helpWindow = window;
}
public static final String GRAPH = "graph"; public static final String GRAPH = "graph";
public static final String NODES = "graph.nodes"; public static final String NODES = "graph.nodes";
public static final String NULL_NODES = "graph.nullNodes"; public static final String NULL_NODES = "graph.nullNodes";
@@ -587,6 +632,7 @@ public class WriterModeEditor extends Editor {
addEdge(selected, target); addEdge(selected, target);
} }
} }
dataAltered();
} }
static final String disposeEditorString = "disposeEditor"; static final String disposeEditorString = "disposeEditor";
@@ -612,6 +658,7 @@ public class WriterModeEditor extends Editor {
revalidate(); revalidate();
repaint(); repaint();
disposeOverlay(); disposeOverlay();
dataAltered();
} }
}; };
@@ -654,6 +701,7 @@ public class WriterModeEditor extends Editor {
revalidate(); revalidate();
repaint(); repaint();
} }
dataAltered();
} }
}; };
@@ -695,7 +743,7 @@ public class WriterModeEditor extends Editor {
revalidate(); revalidate();
repaint(); repaint();
} }
dataAltered();
} }
}; };
@@ -721,7 +769,20 @@ public class WriterModeEditor extends Editor {
revalidate(); revalidate();
repaint(); repaint();
} }
dataAltered();
}
};
static final String showHelpString = "showHelp";
final AbstractAction showHelp = new AbstractAction("Show help window") {
private static final long serialVersionUID = 1658086056088672748L;
@Override
public void actionPerformed(ActionEvent e) {
if (helpWindow == null) {
createHelpWindow();
}
helpWindow.setVisible(true);
} }
}; };
@@ -812,6 +873,8 @@ public class WriterModeEditor extends Editor {
area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.ALT_DOWN_MASK, true), commitAndCreateNextDefaultNodeString); area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.ALT_DOWN_MASK, true), commitAndCreateNextDefaultNodeString);
area.getActionMap().put(commitAndCreateNextDefaultNodeString, commitAndCreateNextDefaultNode); area.getActionMap().put(commitAndCreateNextDefaultNodeString, commitAndCreateNextDefaultNode);
area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0, true), showHelpString);
area.getActionMap().put(showHelpString, showHelp);
if (selected instanceof WriterDialogue) { if (selected instanceof WriterDialogue) {
area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.SHIFT_DOWN_MASK, true), createContinueTalkingNodeString); area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.SHIFT_DOWN_MASK, true), createContinueTalkingNodeString);
@@ -1081,8 +1144,8 @@ public class WriterModeEditor extends Editor {
@Override @Override
public void targetUpdated() { public void targetUpdated() {
// TODO Auto-generated method stub this.icon = new ImageIcon(((GameDataElement)target).getIcon());
this.name = ((GameDataElement)target).getDesc();
} }
} }

View File

@@ -128,13 +128,13 @@ public class FileUtils {
case Windows: case Windows:
System.err.println("Trying the Windows way with mklink"); System.err.println("Trying the Windows way with mklink");
try { try {
Runtime.getRuntime().exec("cmd.exe /C mklink "+(targetFile.isDirectory() ? "/J " : "")+linkFile.getAbsolutePath()+" "+targetFile.getAbsolutePath()); Runtime.getRuntime().exec("cmd.exe /C mklink "+(targetFile.isDirectory() ? "/J " : "")+"\""+linkFile.getAbsolutePath()+"\" \""+targetFile.getAbsolutePath()+"\"");
} catch (IOException e1) { } catch (IOException e1) {
e1.printStackTrace(); e1.printStackTrace();
} }
System.err.println("Attempting UAC elevation through VBS script.");
if (!linkFile.exists()) { if (!linkFile.exists()) {
runWithUac("cmd.exe /C mklink "+(targetFile.isDirectory() ? "/J " : "")+linkFile.getAbsolutePath()+" "+targetFile.getAbsolutePath(), 3, linkFile); System.err.println("Attempting UAC elevation through VBS script.");
runWithUac("cmd.exe /C mklink "+(targetFile.isDirectory() ? "/J " : "")+"\""+linkFile.getAbsolutePath()+"\" \""+targetFile.getAbsolutePath()+"\"", 3, linkFile);
} }
break; break;
case MacOS: case MacOS:

View File

@@ -60,6 +60,9 @@ public class WeblateIntegration {
if (!Workspace.activeWorkspace.settings.useInternet.getCurrentValue()) { if (!Workspace.activeWorkspace.settings.useInternet.getCurrentValue()) {
unit.status = Status.notAllowed; unit.status = Status.notAllowed;
unit.translatedText = "Allow internet connection in the workspace settings to get translation status"; unit.translatedText = "Allow internet connection in the workspace settings to get translation status";
} else if (Workspace.activeWorkspace.settings.translatorLanguage == null) {
unit.status = Status.notAllowed;
unit.translatedText = "Select a target language in the workspace settings to get translation status";
} else { } else {
unit.status = Status.absent; unit.status = Status.absent;
unit.translatedText = "Cannot find this on weblate"; unit.translatedText = "Cannot find this on weblate";