Compare commits

...

8 Commits

Author SHA1 Message Date
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
22 changed files with 599 additions and 108 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.4.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;

View File

@@ -1,6 +1,6 @@
!include MUI2.nsh !include MUI2.nsh
!define VERSION "0.6.2" !define VERSION "0.6.4"
!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.4";
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

@@ -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

@@ -12,7 +12,7 @@ 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;
@@ -26,14 +26,12 @@ public class ReplaceArea extends MapObject {
// 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 //Replace areas only support questProgress requirements ATM
@@ -45,6 +43,7 @@ public class ReplaceArea extends MapObject {
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())));
} }

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

@@ -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());
} }
} }
}); });

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) {

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

@@ -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

@@ -260,7 +260,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 +275,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 +288,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 +376,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 +389,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 +402,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 +415,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 +428,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 +441,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 +454,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 +467,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 +480,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();
} }
}); });
@@ -514,6 +563,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} else if (selected instanceof ReplaceArea) { } else if (selected instanceof ReplaceArea) {
//Replace areas only use questProgress requirements ATM //Replace areas only use questProgress requirements ATM
//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);
areaField = addTextField(pane, "Area ID: ", ((ReplaceArea)selected).name, ((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);
@@ -1593,6 +1643,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 +1735,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);
@@ -2005,11 +2062,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>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
} }
updateXmlViewText(map.toXml());
} }
} }
} }

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

@@ -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";