Compare commits

...

45 Commits

Author SHA1 Message Date
OMGeeky
775aba3a3f refactor: improve bounds checking in getElementAt method in CommonEditor 2025-06-18 13:53:49 +02:00
OMGeeky
bec4ddb71c refactor: update object handling in ReplaceArea and TMXMapEditor for consistency 2025-06-18 13:53:31 +02:00
OMGeeky
58603d32a1 add todo 2025-06-16 12:38:12 +02:00
OMGeeky
829bb336b8 cleanup 2025-06-16 12:38:00 +02:00
OMGeeky
57cf71da17 refactor: simplify panel creation for rewards and conditions in DialogueEditor & NPCEditor 2025-06-16 12:33:35 +02:00
OMGeeky
84dbca6ce1 refactor: encapsulate death effect panel creation in CommonEditor 2025-06-16 12:12:25 +02:00
OMGeeky
d6d742feac cleanup 2025-06-16 11:46:54 +02:00
OMGeeky
b775be08fc refactor: update createListPanel to return a result object containing both panel and list 2025-06-16 11:46:22 +02:00
OMGeeky
63d6397da5 refactor: streamline list panel creation in DroplistEditor & ItemEditor 2025-06-16 11:16:12 +02:00
OMGeeky
ee6907efdd refactor: streamline requirements panel creation in DialogueEditor 2025-06-16 10:50:32 +02:00
OMGeeky
02210d7581 refactor: clean up formatting and remove unnecessary line breaks in editor classes 2025-06-16 10:45:01 +02:00
OMGeeky
8a7ad08aa7 refactor: add navigation handling for replies in CommonEditor and DialogueEditor 2025-06-16 10:44:44 +02:00
OMGeeky
0081c325bb refactor: simplify stages panel creation in QuestEditor 2025-06-16 10:25:50 +02:00
OMGeeky
e10bcfe20f refactor: remove isCollapsed parameter and handle collapsing logic in DialogueEditor 2025-06-16 10:17:30 +02:00
OMGeeky
9deac7047f formatting 2025-06-16 10:11:41 +02:00
OMGeeky
0befc5563b refactor: change more ListModel implementations to AtListModel 2025-06-16 10:11:06 +02:00
OMGeeky
f747c40520 refactor: change StagesListModel to AtListModel 2025-06-16 09:57:17 +02:00
OMGeeky
92be506c11 refactor: add option to enable up down buttons or not 2025-06-16 09:56:40 +02:00
OMGeeky
64ea5377bf refactor: extract common ListModel implementation to AtListModel
and use that for moving elements up and down
2025-06-16 09:46:14 +02:00
OMGeeky
719be70744 refactor: extract replies panel creation to CommonEditor 2025-06-16 09:28:21 +02:00
OMGeeky
8f846c6098 add lambda call interfaces for single and multiple arguments 2025-06-16 09:27:19 +02:00
OMGeeky
975d13f36f extract wordWrap function to common class 2025-06-16 08:31:22 +02:00
OMGeeky
0a1fef4198 refactor: simplify link method by extracting parsing/linking logic 2025-06-16 08:23:43 +02:00
OMGeeky
5809d33bb4 refactor: remove unnecessary blank lines in multiple classes 2025-06-16 08:23:31 +02:00
OMGeeky
d8797fa826 add .output.txt to .gitignore 2025-06-16 07:49:46 +02:00
OMGeeky
70055be6d2 improve usings 2025-05-03 20:16:57 +02:00
OMGeeky
286d95d83d improve imports 2025-05-03 20:14:45 +02:00
OMGeeky
04b704daf0 more de-duplication 2025-05-03 20:10:36 +02:00
OMGeeky
3f1f988808 fix missed null check 2025-05-03 20:07:28 +02:00
OMGeeky
e232c33339 more de-duplication 2025-05-03 20:07:28 +02:00
OMGeeky
4239beb825 de-dupe code 2025-05-03 20:07:28 +02:00
Nut.andor
e2fdf08fec new spritesheets index 2025-02-15 23:48:39 +01:00
Nut.andor
1555bd63db Version with actor condition description is 21 2025-02-15 17:04:23 +01:00
Nut.andor
56fff8a730 nsi 2025-02-15 16:53:27 +01:00
Nut.andor
dd7b3d5300 version nbr 2025-02-15 16:44:40 +01:00
Nut.andor
68affdde8c misc 2025-02-15 16:44:13 +01:00
Nut.andor
6cec8b835e nsi 2025-02-15 16:36:45 +01:00
Nut.andor
aa43382296 Merge branch 'pulls/1195352/7' 2025-02-15 16:34:58 +01:00
Nut.andor
ec346e9c98 command parameters 2025-02-15 16:33:12 +01:00
Nut.andor
61d5af822c Build scripts 2025-02-15 16:12:38 +01:00
Nut.andor
c2d05b2bff Pull Request #7: Build scripts 2025-02-15 16:03:43 +01:00
Nut.andor
6578236775 Merge branch 'pulls/1195352/6' 2025-02-15 14:38:30 +01:00
Nut.andor
5550b257ca add description field to actor conditions 2024-12-28 14:53:02 +01:00
Nut.andor
619aa1075f Pull Request #6: add description field to actor conditions 2024-12-27 13:05:53 +01:00
OMGeeky
38a3ad85c8 add description field to actor conditions 2024-12-27 10:12:48 +01:00
36 changed files with 7131 additions and 8394 deletions

4
.gitignore vendored
View File

@@ -8,3 +8,7 @@ packaging/common/ATCS.jar
packaging/ATCS_*.zip packaging/ATCS_*.zip
ATCS_v*.tar.gz ATCS_v*.tar.gz
ATCS.jar ATCS.jar
/packaging/common/ATCS.env.bat
/packaging/common/ATCS.env
/packaging/common/ATCS_v*.zip
/.output.txt

2
.idea/misc.xml generated
View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK" /> <component name="ProjectRootManager" version="2" default="true" />
</project> </project>

View File

@@ -1 +1 @@
v0.6.19 v0.6.21

View File

@@ -1,8 +1,9 @@
!include MUI2.nsh !include MUI2.nsh
!define VERSION "0.6.20" !define VERSION "0.6.21"
!define TRAINER_VERSION "0.1.5" !define TRAINER_VERSION "0.1.5"
!define JAVA_BIN "java" !define JAVA_BIN "java"
!define ATCS_SOURCE_DIR "C:\ATCS"
Name "Andor's Trail Content Studio v${VERSION}" Name "Andor's Trail Content Studio v${VERSION}"
OutFile "ATCS_v${VERSION}_Setup.exe" OutFile "ATCS_v${VERSION}_Setup.exe"
@@ -13,8 +14,8 @@ InstallDir "$PROGRAMFILES\ATCS\"
Var StartMenuFolder Var StartMenuFolder
!define MUI_WELCOMEPAGE_TITLE "Welcome to Andor's Trail Content Studio installer" !define MUI_WELCOMEPAGE_TITLE "Welcome to Andor's Trail Content Studio installer"
!define MUI_WELCOMEPAGE_TEXT "This will install Andor's Trail Content Studio v${VERSION} installer" !define MUI_WELCOMEPAGE_TEXT "This will install Andor's Trail Content Studio v${VERSION}"
!define MUI_FINISHPAGE_TEXT "Andor's Trail Content Studio v${VERSION} install completed !" !define MUI_FINISHPAGE_TEXT "Andor's Trail Content Studio v${VERSION} - Install completed !"
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Andor's Trail Content Studio" !define MUI_STARTMENUPAGE_DEFAULTFOLDER "Andor's Trail Content Studio"
!define MUI_PAGE_HEADER_TEXT "Installing Andor's Trail Content Studio v${VERSION}" !define MUI_PAGE_HEADER_TEXT "Installing Andor's Trail Content Studio v${VERSION}"
@@ -46,24 +47,26 @@ Var StartMenuFolder
!insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "English"
;------------------------------------------------------------------------------------
Section install Section install
;--- Create in ...\packaging\common\ ATCS.cmd ATCT.ico ATCS.jar
SetOutPath $INSTDIR SetOutPath $INSTDIR
file "ATCS.ico" file "ATCS.ico"
file "${ATCS_SOURCE_DIR}\packaging\common\ATCS.jar"
Delete "$INSTDIR\lib\*"
Call GetJRE Call GetJRE
Pop $R0 Pop $R0
; file "${ATCS_SOURCE_DIR}\packaging\common\ATCS.cmd"
; !insertmacro _ReplaceInFile "ATCS.cmd" "java.exe" "$R0" (It was too much work this way)
FileOpen $9 "ATCS.cmd" w FileOpen $9 "ATCS.cmd" w
FileWrite $9 '@echo off$\r$\n' FileWrite $9 '@echo off$\r$\n'
FileWrite $9 '$\r$\n' FileWrite $9 '$\r$\n'
FileWrite $9 'set "ATCS_DIR=%~dp0"$\r$\n' FileWrite $9 'set "ATCS_DIR=%~dp0"$\r$\n'
FileWrite $9 'set "MAX_MEM=512M"$\r$\n' FileWrite $9 'set "MAX_MEM=1024M"$\r$\n'
FileWrite $9 'set "CP=%ATCS_DIR%lib\*"$\r$\n' FileWrite $9 'set "CP=%ATCS_DIR%lib\*"$\r$\n'
FileWrite $9 'set "JAVA=$R0"$\r$\n' FileWrite $9 'set "JAVA=$R0"$\r$\n'
FileWrite $9 'set "JAVA_OPTS="$\r$\n' FileWrite $9 'set "JAVA_OPTS="$\r$\n'
@@ -79,29 +82,15 @@ Section install
FileWrite $9 ' echo.>>"%ENV_FILE%"$\r$\n' FileWrite $9 ' echo.>>"%ENV_FILE%"$\r$\n'
FileWrite $9 ')$\r$\n' FileWrite $9 ')$\r$\n'
FileWrite $9 '$\r$\n' FileWrite $9 '$\r$\n'
FileWrite $9 'start "" "%JAVA%" %JAVA_OPTS% -Xmx%MAX_MEM% -cp "%CP%" %MAIN_CLASS%$\r$\n' FileWrite $9 'start "" "%JAVA%" %JAVA_OPTS% -Xmx%MAX_MEM% -jar ATCS.jar$\r$\n'
FileClose $9 FileClose $9
SetOutPath "$INSTDIR\lib\"
file "C:\AT\ATCS_source\lib\jide-oss.jar"
file "C:\AT\ATCS_source\lib\ui.jar"
file "C:\AT\ATCS_source\lib\AndorsTrainer_v${TRAINER_VERSION}.jar"
file "C:\AT\ATCS_source\lib\junit-4.10.jar"
file "C:\AT\ATCS_source\lib\json_simple-1.1.jar"
file "C:\AT\temp\ATCS_v0.6.20\ATCS_v${VERSION}.jar"
file "C:\AT\ATCS_source\lib\rsyntaxtextarea.jar"
file "C:\AT\ATCS_source\lib\prefuse.jar"
file "C:\AT\ATCS_source\lib\bsh-2.0b4.jar"
file "C:\AT\ATCS_source\lib\jsoup-1.10.2.jar"
SetOutPath $INSTDIR
WriteUninstaller "$INSTDIR\Uninstall.exe" WriteUninstaller "$INSTDIR\Uninstall.exe"
!insertmacro MUI_STARTMENU_WRITE_BEGIN "ATCS" !insertmacro MUI_STARTMENU_WRITE_BEGIN "ATCS"
;Create shortcuts ;--- Create shortcuts
CreateDirectory "$SMPROGRAMS\$StartMenuFolder" CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Andor's Trail Content Studio.lnk" "$INSTDIR\ATCS.cmd" "" "$INSTDIR\ATCS.ico" CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Andor's Trail Content Studio.lnk" "$INSTDIR\ATCS.cmd" "" "$INSTDIR\ATCS.ico"
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe" CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
@@ -110,6 +99,8 @@ Section install
SectionEnd SectionEnd
;------------------------------------------------------------------------------------
Section uninstall Section uninstall
Delete "$INSTDIR\lib\jide-oss.jar" Delete "$INSTDIR\lib\jide-oss.jar"
@@ -117,18 +108,17 @@ Section uninstall
Delete "$INSTDIR\lib\junit-4.10.jar" Delete "$INSTDIR\lib\junit-4.10.jar"
Delete "$INSTDIR\lib\json_simple-1.1.jar" Delete "$INSTDIR\lib\json_simple-1.1.jar"
Delete "$INSTDIR\lib\AndorsTrainer_v${TRAINER_VERSION}.jar" Delete "$INSTDIR\lib\AndorsTrainer_v${TRAINER_VERSION}.jar"
Delete "$INSTDIR\lib\ATCS_v${VERSION}.jar"
Delete "$INSTDIR\lib\rsyntaxtextarea.jar" Delete "$INSTDIR\lib\rsyntaxtextarea.jar"
Delete "$INSTDIR\lib\prefuse.jar" Delete "$INSTDIR\lib\prefuse.jar"
Delete "$INSTDIR\lib\bsh-2.0b4.jar" Delete "$INSTDIR\lib\bsh-2.0b4.jar"
Delete "$INSTDIR\lib\jsoup-1.10.2.jar" Delete "$INSTDIR\lib\jsoup-1.10.2.jar"
RMDir "$INSTDIR\lib\" RMDir "$INSTDIR\lib\"
Delete "$INSTDIR\ATCS.ico" Delete "$INSTDIR\ATCS.ico"
Delete "$INSTDIR\ATCS.cmd" Delete "$INSTDIR\ATCS.cmd"
Delete "$INSTDIR\ATCS.env.bat" Delete "$INSTDIR\ATCS.env.bat"
Delete "$INSTDIR\ATCS.jar"
Delete "$INSTDIR\Uninstall.exe" Delete "$INSTDIR\Uninstall.exe"
RMDir "$INSTDIR" RMDir "$INSTDIR"
!insertmacro MUI_STARTMENU_GETFOLDER "ATCS" $StartMenuFolder !insertmacro MUI_STARTMENU_GETFOLDER "ATCS" $StartMenuFolder
@@ -140,19 +130,20 @@ Section uninstall
SectionEnd SectionEnd
;------------------------------------------------------------------------------------
Function GetJRE Function GetJRE
; ;
; Find JRE (javaw.exe) ; Find JRE (java.exe)
; DISABLED 1 - in .\jre directory (JRE Installed with application) ; DISABLED 1 - in .\jre directory (JRE Installed with application)
; 2 - in JAVA_HOME environment variable ; 2 - in JAVA_HOME environment variable
; 3 - in the registry ; 3 - in the registry
; 4 - assume javaw.exe in current dir or PATH ; 4 - assume java.exe in current dir or PATH
Push $R0 Push $R0
Push $R1 Push $R1
;ClearErrors ;ClearErrors
;StrCpy $R0 "$EXEDIR\jre\bin\javaw.exe" ;StrCpy $R0 "$EXEDIR\jre\bin\java.exe"
;IfFileExists $R0 JreFound ;IfFileExists $R0 JreFound
;StrCpy $R0 "" ;StrCpy $R0 ""

View File

@@ -1,8 +1,8 @@
@echo off @echo off
set "ATCS_DIR=%~dp0" set "ATCS_DIR=%~dp0"
set "MAX_MEM=512M" set "MAX_MEM=1024M"
set "JAVA=javaw.exe" set "JAVA=java.exe"
set "JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true" set "JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true"
set "ENV_FILE=%ATCS_DIR%ATCS.env.bat" set "ENV_FILE=%ATCS_DIR%ATCS.env.bat"

View File

@@ -1,4 +0,0 @@
#MAX_MEM=512M
#JAVA=java
#JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true

View File

@@ -1,6 +1,7 @@
atcs.spritesheet.actorconditions_1.category=actorcondition atcs.spritesheet.actorconditions_1.category=actorcondition
atcs.spritesheet.actorconditions_2.category=actorcondition atcs.spritesheet.actorconditions_2.category=actorcondition
atcs.spritesheet.actorconditions_japozero.category=actorcondition atcs.spritesheet.actorconditions_japozero.category=actorcondition
atcs.spritesheet.actorconditions_newb.category=actorcondition
atcs.spritesheet.actorconditions_omi1.category=actorcondition atcs.spritesheet.actorconditions_omi1.category=actorcondition
atcs.spritesheet.actorconditions_omi2.category=actorcondition atcs.spritesheet.actorconditions_omi2.category=actorcondition
@@ -60,6 +61,7 @@ atcs.spritesheet.monsters_gisons.category=monster
atcs.spritesheet.monsters_guynmart.category=monster atcs.spritesheet.monsters_guynmart.category=monster
atcs.spritesheet.monsters_insects.category=monster atcs.spritesheet.monsters_insects.category=monster
atcs.spritesheet.monsters_johny.category=monster
atcs.spritesheet.monsters_karvis1.category=monster atcs.spritesheet.monsters_karvis1.category=monster
atcs.spritesheet.monsters_karvis2.category=monster atcs.spritesheet.monsters_karvis2.category=monster
atcs.spritesheet.monsters_ld1.category=monster atcs.spritesheet.monsters_ld1.category=monster

View File

@@ -42,7 +42,7 @@ import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector;
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.20"; public static final String APP_VERSION = "v0.6.21";
public static final String CHECK_UPDATE_URL = "https://andorstrail.com/static/ATCS_latest"; 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 final String DOWNLOAD_URL = "https://andorstrail.com/viewtopic.php?f=6&t=4806";

View File

@@ -190,4 +190,30 @@ public abstract class GameDataElement implements ProjectTreeNode, Serializable {
public abstract List<SaveEvent> attemptSave(); public abstract List<SaveEvent> attemptSave();
/**
* Checks if the current state indicates that parsing/linking should be skipped.
* @return true if the operation should be skipped, false otherwise
*/
protected boolean shouldSkipParseOrLink() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
//This type of state is unrelated to parsing/linking.
return true;
}
if (this.state == State.linked) {
//Already linked.
return true;
}
return false;
}
/**
* Ensures the element is parsed if needed based on its current state.
*/
protected void ensureParseIfNeeded() {
if (this.state == State.init) {
//Not parsed yet.
this.parse();
}
}
} }

View File

@@ -29,6 +29,7 @@ public class ActorCondition extends JSONElement {
//public String id; inherited. //public String id; inherited.
public String icon_id; public String icon_id;
public String display_name; public String display_name;
public String description;
// Available from parsed state // Available from parsed state
public ACCategory category = null; public ACCategory category = null;
@@ -157,6 +158,7 @@ public class ActorCondition extends JSONElement {
@Override @Override
public void parse(Map aCondJson) { public void parse(Map aCondJson) {
if (aCondJson.get("description") != null) this.description = (String) aCondJson.get("description");
if (aCondJson.get("category") != null) this.category = ACCategory.valueOf((String) aCondJson.get("category")); if (aCondJson.get("category") != null) this.category = ACCategory.valueOf((String) aCondJson.get("category"));
this.positive = JSONElement.getInteger((Number) aCondJson.get("isPositive")); this.positive = JSONElement.getInteger((Number) aCondJson.get("isPositive"));
Map abilityEffect = (Map) aCondJson.get("abilityEffect"); Map abilityEffect = (Map) aCondJson.get("abilityEffect");
@@ -222,17 +224,10 @@ public class ActorCondition extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
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) { if (getProject().getSpritesheet(spritesheetId) == null) {
@@ -271,6 +266,7 @@ public class ActorCondition extends JSONElement {
clone.state = this.state; clone.state = this.state;
clone.id = this.id; clone.id = this.id;
clone.display_name = this.display_name; clone.display_name = this.display_name;
clone.description = this.description;
clone.icon_id = this.icon_id; clone.icon_id = this.icon_id;
clone.category = this.category; clone.category = this.category;
clone.positive = this.positive; clone.positive = this.positive;
@@ -299,6 +295,7 @@ public class ActorCondition extends JSONElement {
jsonAC.put("id", this.id); jsonAC.put("id", this.id);
if (this.icon_id != null) jsonAC.put("iconID", this.icon_id); if (this.icon_id != null) jsonAC.put("iconID", this.icon_id);
if (this.display_name != null) jsonAC.put("name", this.display_name); if (this.display_name != null) jsonAC.put("name", this.display_name);
if (this.description != null) jsonAC.put("description", this.description);
if (this.category != null) jsonAC.put("category", this.category.toString()); if (this.category != null) jsonAC.put("category", this.category.toString());
if (this.positive != null && this.positive == 1) jsonAC.put("isPositive", this.positive); if (this.positive != null && this.positive == 1) jsonAC.put("isPositive", this.positive);
if (this.stacking != null && this.stacking == 1) jsonAC.put("isStacking", this.stacking); if (this.stacking != null && this.stacking == 1) jsonAC.put("isStacking", this.stacking);

View File

@@ -0,0 +1,184 @@
package com.gpl.rpg.atcontentstudio.model.gamedata;
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
import com.gpl.rpg.atcontentstudio.model.Project;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public final class Common {
public static void linkConditions(List<?extends ConditionEffect> conditions, Project proj, GameDataElement backlink) {
if (conditions != null) {
for (ConditionEffect ce : conditions) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(backlink);
}
}
}
public static class TimedConditionEffect extends ConditionEffect {
//Available from parsed state
public Integer duration = null;
public Double chance = null;
public TimedConditionEffect createClone() {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = this.magnitude;
cclone.condition_id = this.condition_id;
cclone.condition = this.condition;
cclone.chance = this.chance;
cclone.duration = this.duration;
return cclone;
}
}
public static class ConditionEffect {
//Available from parsed state
public Integer magnitude = null;
public String condition_id = null;
//Available from linked state
public ActorCondition condition = null;
}
@SuppressWarnings("rawtypes")
public static ArrayList<TimedConditionEffect> parseTimedConditionEffects(List conditionsSourceJson) {
ArrayList<TimedConditionEffect> conditions_source;
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) {
conditions_source = new ArrayList<>();
for (Object conditionJsonObj : conditionsSourceJson) {
Map conditionJson = (Map) conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
readConditionEffect(condition, conditionJson);
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null)
condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
conditions_source.add(condition);
}
} else {
conditions_source = null;
}
return conditions_source;
}
@SuppressWarnings("rawtypes")
private static void readConditionEffect(ConditionEffect condition, Map conditionJson) {
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
}
@SuppressWarnings("rawtypes")
public static Common.DeathEffect parseDeathEffect(Map killEffect) {
Common.DeathEffect kill_effect = new Common.DeathEffect();
readDeathEffect(killEffect, kill_effect);
return kill_effect;
}
@SuppressWarnings("rawtypes")
public static HitEffect parseHitEffect(Map hitEffect) {
Common.HitEffect hit_effect = new Common.HitEffect();
readHitEffect(hitEffect, hit_effect);
return hit_effect;
}
@SuppressWarnings("rawtypes")
public static HitReceivedEffect parseHitReceivedEffect(Map hitReceivedEffect) {
HitReceivedEffect hit_received_effect = new Common.HitReceivedEffect();
readHitEffect(hitReceivedEffect, hit_received_effect);
if (hitReceivedEffect.get("increaseAttackerCurrentHP") != null) {
hit_received_effect.hp_boost_max_target = JSONElement.getInteger((Number) (((Map) hitReceivedEffect.get("increaseAttackerCurrentHP")).get("max")));
hit_received_effect.hp_boost_min_target = JSONElement.getInteger((Number) (((Map) hitReceivedEffect.get("increaseAttackerCurrentHP")).get("min")));
}
if (hitReceivedEffect.get("increaseAttackerCurrentAP") != null) {
hit_received_effect.ap_boost_max_target = JSONElement.getInteger((Number) (((Map) hitReceivedEffect.get("increaseAttackerCurrentAP")).get("max")));
hit_received_effect.ap_boost_min_target = JSONElement.getInteger((Number) (((Map) hitReceivedEffect.get("increaseAttackerCurrentAP")).get("min")));
}
return hit_received_effect;
}
@SuppressWarnings("rawtypes")
private static void readDeathEffect(Map killEffect, DeathEffect kill_effect) {
if (killEffect.get("increaseCurrentHP") != null) {
kill_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map) killEffect.get("increaseCurrentHP")).get("min")));
kill_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map) killEffect.get("increaseCurrentHP")).get("max")));
}
if (killEffect.get("increaseCurrentAP") != null) {
kill_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map) killEffect.get("increaseCurrentAP")).get("min")));
kill_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map) killEffect.get("increaseCurrentAP")).get("max")));
}
List conditionsSourceJson = (List) killEffect.get("conditionsSource");
kill_effect.conditions_source = parseTimedConditionEffects(conditionsSourceJson);
}
@SuppressWarnings("rawtypes")
private static void readHitEffect(Map hitEffect, HitEffect hit_effect) {
readDeathEffect(hitEffect, hit_effect);
List conditionsTargetJson = (List) hitEffect.get("conditionsTarget");
hit_effect.conditions_target = parseTimedConditionEffects(conditionsTargetJson);
}
public static class DeathEffect {
//Available from parsed state
public Integer hp_boost_min = null;
public Integer hp_boost_max = null;
public Integer ap_boost_min = null;
public Integer ap_boost_max = null;
public List<TimedConditionEffect> conditions_source = null;
}
public static class HitEffect extends DeathEffect {
//Available from parsed state
public List<TimedConditionEffect> conditions_target = null;
}
public static class HitReceivedEffect extends Common.HitEffect {
//Available from parsed state
public Integer hp_boost_min_target = null;
public Integer hp_boost_max_target = null;
public Integer ap_boost_min_target = null;
public Integer ap_boost_max_target = null;
}
public static void copyDeathEffectValues(Common.DeathEffect target, Common.DeathEffect source, GameDataElement backlink) {
target.ap_boost_max = source.ap_boost_max;
target.ap_boost_min = source.ap_boost_min;
target.hp_boost_max = source.hp_boost_max;
target.hp_boost_min = source.hp_boost_min;
if (source.conditions_source != null) {
target.conditions_source = new ArrayList<>();
for (Common.TimedConditionEffect c : source.conditions_source) {
Common.TimedConditionEffect cclone = c.createClone();
if (cclone.condition != null) {
cclone.condition.addBacklink(backlink);
}
target.conditions_source.add(cclone);
}
}
}
public static void copyHitEffectValues(Common.HitEffect target, Common.HitEffect source, GameDataElement backlink) {
copyDeathEffectValues(target, source, backlink);
if (source.conditions_target != null) {
target.conditions_target = new ArrayList<>();
for (Common.TimedConditionEffect c : source.conditions_target) {
Common.TimedConditionEffect cclone = c.createClone();
if (cclone.condition != null) {
cclone.condition.addBacklink(backlink);
}
target.conditions_target.add(cclone);
}
}
}
public static void copyHitReceivedEffectValues(Common.HitReceivedEffect target, Common.HitReceivedEffect source, GameDataElement backlink) {
copyHitEffectValues(target, source, backlink);
target.ap_boost_max_target = source.ap_boost_max_target;
target.ap_boost_min_target = source.ap_boost_min_target;
target.hp_boost_max_target = source.hp_boost_max_target;
target.hp_boost_min_target = source.hp_boost_min_target;
}
}

View File

@@ -206,17 +206,10 @@ public class Dialogue extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
Project proj = getProject(); Project proj = getProject();
if (proj == null) { if (proj == null) {
Notification.addError("Error linking dialogue "+id+". No parent project found."); Notification.addError("Error linking dialogue "+id+". No parent project found.");

View File

@@ -129,17 +129,10 @@ public class Droplist extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
Project proj = getProject(); Project proj = getProject();
if (proj == null) { if (proj == null) {
Notification.addError("Error linking droplist "+id+". No parent project found."); Notification.addError("Error linking droplist "+id+". No parent project found.");

View File

@@ -18,6 +18,8 @@ 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.Project; import com.gpl.rpg.atcontentstudio.model.Project;
import static com.gpl.rpg.atcontentstudio.model.gamedata.Common.*;
public class Item extends JSONElement { public class Item extends JSONElement {
private static final long serialVersionUID = -516874303672548638L; private static final long serialVersionUID = -516874303672548638L;
@@ -35,38 +37,13 @@ public class Item extends JSONElement {
public String description = null; public String description = null;
public HitEffect hit_effect = null; public HitEffect hit_effect = null;
public HitReceivedEffect hit_received_effect = null; public HitReceivedEffect hit_received_effect = null;
public KillEffect kill_effect = null; public DeathEffect kill_effect = null;
public EquipEffect equip_effect = null; public EquipEffect equip_effect = null;
//Available from linked state //Available from linked state
public ItemCategory category = null; public ItemCategory category = null;
public static class KillEffect {
//Available from parsed state
public Integer hp_boost_min = null;
public Integer hp_boost_max = null;
public Integer ap_boost_min = null;
public Integer ap_boost_max = null;
public List<TimedConditionEffect> conditions_source = null;
}
//Inheritance for code compactness, not semantically correct.
public static class HitEffect extends KillEffect {
//Available from parsed state
public List<TimedConditionEffect> conditions_target = null;
}
public static class HitReceivedEffect extends HitEffect {
//Available from parsed state
public Integer hp_boost_min_target = null;
public Integer hp_boost_max_target = null;
public Integer ap_boost_min_target = null;
public Integer ap_boost_max_target = null;
}
public static class EquipEffect { public static class EquipEffect {
//Available from parsed state //Available from parsed state
public Integer damage_boost_min = null; public Integer damage_boost_min = null;
@@ -86,20 +63,6 @@ public class Item extends JSONElement {
public Integer damage_modifier = null; public Integer damage_modifier = null;
} }
public static class ConditionEffect {
//Available from parsed state
public Integer magnitude = null;
public String condition_id = null;
//Available from linked state
public ActorCondition condition = null;
}
public static class TimedConditionEffect extends ConditionEffect {
//Available from parsed state
public Integer duration = null;
public Double chance = null;
}
public static enum DisplayType { public static enum DisplayType {
ordinary, ordinary,
@@ -207,7 +170,7 @@ public class Item extends JSONElement {
List conditionsJson = (List) equipEffect.get("addedConditions"); List conditionsJson = (List) equipEffect.get("addedConditions");
if (conditionsJson != null && !conditionsJson.isEmpty()) { if (conditionsJson != null && !conditionsJson.isEmpty()) {
this.equip_effect.conditions = new ArrayList<Item.ConditionEffect>(); this.equip_effect.conditions = new ArrayList<>();
for (Object conditionJsonObj : conditionsJson) { for (Object conditionJsonObj : conditionsJson) {
Map conditionJson = (Map)conditionJsonObj; Map conditionJson = (Map)conditionJsonObj;
ConditionEffect condition = new ConditionEffect(); ConditionEffect condition = new ConditionEffect();
@@ -221,88 +184,12 @@ public class Item extends JSONElement {
Map hitEffect = (Map) itemJson.get("hitEffect"); Map hitEffect = (Map) itemJson.get("hitEffect");
if (hitEffect != null) { if (hitEffect != null) {
this.hit_effect = new HitEffect(); this.hit_effect = parseHitEffect(hitEffect);
if (hitEffect.get("increaseCurrentHP") != null) {
this.hit_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)hitEffect.get("increaseCurrentHP")).get("min")));
this.hit_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)hitEffect.get("increaseCurrentHP")).get("max")));
}
if (hitEffect.get("increaseCurrentAP") != null) {
this.hit_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)hitEffect.get("increaseCurrentAP")).get("min")));
this.hit_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)hitEffect.get("increaseCurrentAP")).get("max")));
}
List conditionsSourceJson = (List) hitEffect.get("conditionsSource");
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) {
this.hit_effect.conditions_source = new ArrayList<Item.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsSourceJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_effect.conditions_source.add(condition);
}
}
List conditionsTargetJson = (List) hitEffect.get("conditionsTarget");
if (conditionsTargetJson != null && !conditionsTargetJson.isEmpty()) {
this.hit_effect.conditions_target = new ArrayList<Item.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsTargetJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_effect.conditions_target.add(condition);
}
}
} }
Map hitReceivedEffect = (Map) itemJson.get("hitReceivedEffect"); Map hitReceivedEffect = (Map) itemJson.get("hitReceivedEffect");
if (hitReceivedEffect != null) { if (hitReceivedEffect != null) {
this.hit_received_effect = new HitReceivedEffect(); this.hit_received_effect = parseHitReceivedEffect(hitReceivedEffect);
if (hitReceivedEffect.get("increaseCurrentHP") != null) {
this.hit_received_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentHP")).get("min")));
this.hit_received_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentHP")).get("max")));
}
if (hitReceivedEffect.get("increaseCurrentAP") != null) {
this.hit_received_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentAP")).get("min")));
this.hit_received_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentAP")).get("max")));
}
if (hitReceivedEffect.get("increaseAttackerCurrentHP") != null) {
this.hit_received_effect.hp_boost_min_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentHP")).get("min")));
this.hit_received_effect.hp_boost_max_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentHP")).get("max")));
}
if (hitReceivedEffect.get("increaseAttackerCurrentAP") != null) {
this.hit_received_effect.ap_boost_min_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentAP")).get("min")));
this.hit_received_effect.ap_boost_max_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentAP")).get("max")));
}
List conditionsSourceJson = (List) hitReceivedEffect.get("conditionsSource");
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) {
this.hit_received_effect.conditions_source = new ArrayList<Item.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsSourceJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_received_effect.conditions_source.add(condition);
}
}
List conditionsTargetJson = (List) hitReceivedEffect.get("conditionsTarget");
if (conditionsTargetJson != null && !conditionsTargetJson.isEmpty()) {
this.hit_received_effect.conditions_target = new ArrayList<Item.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsTargetJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_received_effect.conditions_target.add(condition);
}
}
} }
Map killEffect = (Map) itemJson.get("killEffect"); Map killEffect = (Map) itemJson.get("killEffect");
@@ -310,46 +197,19 @@ public class Item extends JSONElement {
killEffect = (Map) itemJson.get("useEffect"); killEffect = (Map) itemJson.get("useEffect");
} }
if (killEffect != null) { if (killEffect != null) {
this.kill_effect = new KillEffect(); this.kill_effect = parseDeathEffect(killEffect);
if (killEffect.get("increaseCurrentHP") != null) {
this.kill_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)killEffect.get("increaseCurrentHP")).get("min")));
this.kill_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)killEffect.get("increaseCurrentHP")).get("max")));
}
if (killEffect.get("increaseCurrentAP") != null) {
this.kill_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)killEffect.get("increaseCurrentAP")).get("min")));
this.kill_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)killEffect.get("increaseCurrentAP")).get("max")));
}
List conditionsSourceJson = (List) killEffect.get("conditionsSource");
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) {
this.kill_effect.conditions_source = new ArrayList<Item.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsSourceJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.kill_effect.conditions_source.add(condition);
}
}
} }
this.state = State.parsed; this.state = State.parsed;
} }
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
Project proj = getProject(); Project proj = getProject();
if (proj == null) { if (proj == null) {
Notification.addError("Error linking item "+id+". No parent project found."); Notification.addError("Error linking item "+id+". No parent project found.");
@@ -363,40 +223,21 @@ public class Item extends JSONElement {
if (this.category_id != null) this.category = proj.getItemCategory(this.category_id); if (this.category_id != null) this.category = proj.getItemCategory(this.category_id);
if (this.category != null) this.category.addBacklink(this); if (this.category != null) this.category.addBacklink(this);
if (this.equip_effect != null && this.equip_effect.conditions != null) { if (this.equip_effect != null && this.equip_effect.conditions != null) {
for (ConditionEffect ce : this.equip_effect.conditions) { linkConditions(this.equip_effect.conditions, proj, this);
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
} }
if (this.hit_effect != null && this.hit_effect.conditions_source != null) {
for (TimedConditionEffect ce : this.hit_effect.conditions_source) { if (this.hit_effect != null) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id); linkConditions(this.hit_effect.conditions_source, proj, this);
if (ce.condition != null) ce.condition.addBacklink(this); linkConditions(this.hit_effect.conditions_target, proj, this);
}
} }
if (this.hit_effect != null && this.hit_effect.conditions_target != null) {
for (TimedConditionEffect ce : this.hit_effect.conditions_target) { if (this.hit_received_effect != null) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id); linkConditions(this.hit_received_effect.conditions_source, proj, this);
if (ce.condition != null) ce.condition.addBacklink(this); linkConditions(this.hit_received_effect.conditions_target, proj, this);
}
} }
if (this.hit_received_effect != null && this.hit_received_effect.conditions_source != null) {
for (TimedConditionEffect ce : this.hit_received_effect.conditions_source) { if (this.kill_effect != null) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id); linkConditions(this.kill_effect.conditions_source, proj, this);
if (ce.condition != null) ce.condition.addBacklink(this);
}
}
if (this.hit_received_effect != null && this.hit_received_effect.conditions_target != null) {
for (TimedConditionEffect ce : this.hit_received_effect.conditions_target) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
}
if (this.kill_effect != null && this.kill_effect.conditions_source != null) {
for (TimedConditionEffect ce : this.kill_effect.conditions_source) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
} }
this.state = State.linked; this.state = State.linked;
} }
@@ -444,7 +285,7 @@ public class Item extends JSONElement {
clone.equip_effect.max_ap_boost = this.equip_effect.max_ap_boost; clone.equip_effect.max_ap_boost = this.equip_effect.max_ap_boost;
clone.equip_effect.max_hp_boost = this.equip_effect.max_hp_boost; clone.equip_effect.max_hp_boost = this.equip_effect.max_hp_boost;
if (this.equip_effect.conditions != null) { if (this.equip_effect.conditions != null) {
clone.equip_effect.conditions = new ArrayList<Item.ConditionEffect>(); clone.equip_effect.conditions = new ArrayList<>();
for (ConditionEffect c : this.equip_effect.conditions) { for (ConditionEffect c : this.equip_effect.conditions) {
ConditionEffect cclone = new ConditionEffect(); ConditionEffect cclone = new ConditionEffect();
cclone.magnitude = c.magnitude; cclone.magnitude = c.magnitude;
@@ -459,103 +300,15 @@ public class Item extends JSONElement {
} }
if (this.hit_effect != null) { if (this.hit_effect != null) {
clone.hit_effect = new HitEffect(); clone.hit_effect = new HitEffect();
clone.hit_effect.ap_boost_max = this.hit_effect.ap_boost_max; copyHitEffectValues(clone.hit_effect, this.hit_effect, clone);
clone.hit_effect.ap_boost_min = this.hit_effect.ap_boost_min;
clone.hit_effect.hp_boost_max = this.hit_effect.hp_boost_max;
clone.hit_effect.hp_boost_min = this.hit_effect.hp_boost_min;
if (this.hit_effect.conditions_source != null) {
clone.hit_effect.conditions_source = new ArrayList<Item.TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_effect.conditions_source) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_effect.conditions_source.add(cclone);
}
}
if (this.hit_effect.conditions_target != null) {
clone.hit_effect.conditions_target = new ArrayList<Item.TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_effect.conditions_target) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_effect.conditions_target.add(cclone);
}
}
} }
if (this.hit_received_effect != null) { if (this.hit_received_effect != null) {
clone.hit_received_effect = new HitReceivedEffect(); clone.hit_received_effect = new HitReceivedEffect();
clone.hit_received_effect.ap_boost_max = this.hit_received_effect.ap_boost_max; copyHitReceivedEffectValues(clone.hit_received_effect, this.hit_received_effect, clone);
clone.hit_received_effect.ap_boost_min = this.hit_received_effect.ap_boost_min;
clone.hit_received_effect.hp_boost_max = this.hit_received_effect.hp_boost_max;
clone.hit_received_effect.hp_boost_min = this.hit_received_effect.hp_boost_min;
clone.hit_received_effect.ap_boost_max_target = this.hit_received_effect.ap_boost_max_target;
clone.hit_received_effect.ap_boost_min_target = this.hit_received_effect.ap_boost_min_target;
clone.hit_received_effect.hp_boost_max_target = this.hit_received_effect.hp_boost_max_target;
clone.hit_received_effect.hp_boost_min_target = this.hit_received_effect.hp_boost_min_target;
if (this.hit_received_effect.conditions_source != null) {
clone.hit_received_effect.conditions_source = new ArrayList<Item.TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_received_effect.conditions_source) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_received_effect.conditions_source.add(cclone);
}
}
if (this.hit_received_effect.conditions_target != null) {
clone.hit_received_effect.conditions_target = new ArrayList<Item.TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_received_effect.conditions_target) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_received_effect.conditions_target.add(cclone);
}
}
} }
if (this.kill_effect != null) { if (this.kill_effect != null) {
clone.kill_effect = new KillEffect(); clone.kill_effect = new DeathEffect();
clone.kill_effect.ap_boost_max = this.kill_effect.ap_boost_max; copyDeathEffectValues(clone.kill_effect, this.kill_effect, clone);
clone.kill_effect.ap_boost_min = this.kill_effect.ap_boost_min;
clone.kill_effect.hp_boost_max = this.kill_effect.hp_boost_max;
clone.kill_effect.hp_boost_min = this.kill_effect.hp_boost_min;
if (this.kill_effect.conditions_source != null) {
clone.kill_effect.conditions_source = new ArrayList<Item.TimedConditionEffect>();
for (TimedConditionEffect c : this.kill_effect.conditions_source) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.kill_effect.conditions_source.add(cclone);
}
}
} }
return clone; return clone;
} }

View File

@@ -171,17 +171,10 @@ public class ItemCategory extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
//Nothing to link to :D //Nothing to link to :D
this.state = State.linked; this.state = State.linked;

View File

@@ -26,8 +26,7 @@ public abstract class JSONElement extends GameDataElement {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public void parse() { public void parse() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return; return;
} }
JSONParser parser = new JSONParser(); JSONParser parser = new JSONParser();

View File

@@ -18,6 +18,8 @@ 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.Project; import com.gpl.rpg.atcontentstudio.model.Project;
import static com.gpl.rpg.atcontentstudio.model.gamedata.Common.*;
public class NPC extends JSONElement { public class NPC extends JSONElement {
private static final long serialVersionUID = 1093728879485491933L; private static final long serialVersionUID = 1093728879485491933L;
@@ -73,40 +75,6 @@ public class NPC extends JSONElement {
wholeMap wholeMap
} }
public static class DeathEffect {
//Available from parsed state
public Integer hp_boost_min = null;
public Integer hp_boost_max = null;
public Integer ap_boost_min = null;
public Integer ap_boost_max = null;
public List<TimedConditionEffect> conditions_source = null;
}
public static class HitEffect extends DeathEffect {
//Available from parsed state
public List<TimedConditionEffect> conditions_target = null;
}
public static class HitReceivedEffect extends HitEffect {
//Available from parsed state
public Integer hp_boost_min_target = null;
public Integer hp_boost_max_target = null;
public Integer ap_boost_min_target = null;
public Integer ap_boost_max_target = null;
}
public static class TimedConditionEffect {
//Available from parsed state
public Integer magnitude = null;
public String condition_id = null;
public Integer duration = null;
public Double chance = null;
//Available from linked state
public ActorCondition condition = null;
}
@Override @Override
public String getDesc() { public String getDesc() {
return (needsSaving() ? "*" : "")+name+" ("+id+")"; return (needsSaving() ? "*" : "")+name+" ("+id+")";
@@ -211,78 +179,14 @@ public class NPC extends JSONElement {
this.hit_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)hitEffect.get("increaseCurrentAP")).get("min"))); this.hit_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)hitEffect.get("increaseCurrentAP")).get("min")));
} }
List conditionsSourceJson = (List) hitEffect.get("conditionsSource"); List conditionsSourceJson = (List) hitEffect.get("conditionsSource");
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) { this.hit_effect.conditions_source = parseTimedConditionEffects(conditionsSourceJson);
this.hit_effect.conditions_source = new ArrayList<NPC.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsSourceJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_effect.conditions_source.add(condition);
}
}
List conditionsTargetJson = (List) hitEffect.get("conditionsTarget"); List conditionsTargetJson = (List) hitEffect.get("conditionsTarget");
if (conditionsTargetJson != null && !conditionsTargetJson.isEmpty()) { this.hit_effect.conditions_target = parseTimedConditionEffects(conditionsTargetJson);
this.hit_effect.conditions_target = new ArrayList<NPC.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsTargetJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_effect.conditions_target.add(condition);
}
}
} }
Map hitReceivedEffect = (Map) npcJson.get("hitReceivedEffect"); Map hitReceivedEffect = (Map) npcJson.get("hitReceivedEffect");
if (hitReceivedEffect != null) { if (hitReceivedEffect != null) {
this.hit_received_effect = new HitReceivedEffect(); this.hit_received_effect = parseHitReceivedEffect(hitReceivedEffect);
if (hitReceivedEffect.get("increaseCurrentHP") != null) {
this.hit_received_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentHP")).get("max")));
this.hit_received_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentHP")).get("min")));
}
if (hitReceivedEffect.get("increaseCurrentAP") != null) {
this.hit_received_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentAP")).get("max")));
this.hit_received_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseCurrentAP")).get("min")));
}
if (hitReceivedEffect.get("increaseAttackerCurrentHP") != null) {
this.hit_received_effect.hp_boost_max_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentHP")).get("max")));
this.hit_received_effect.hp_boost_min_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentHP")).get("min")));
}
if (hitReceivedEffect.get("increaseAttackerCurrentAP") != null) {
this.hit_received_effect.ap_boost_max_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentAP")).get("max")));
this.hit_received_effect.ap_boost_min_target = JSONElement.getInteger((Number) (((Map)hitReceivedEffect.get("increaseAttackerCurrentAP")).get("min")));
}
List conditionsSourceJson = (List) hitReceivedEffect.get("conditionsSource");
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) {
this.hit_received_effect.conditions_source = new ArrayList<NPC.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsSourceJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_received_effect.conditions_source.add(condition);
}
}
List conditionsTargetJson = (List) hitReceivedEffect.get("conditionsTarget");
if (conditionsTargetJson != null && !conditionsTargetJson.isEmpty()) {
this.hit_received_effect.conditions_target = new ArrayList<NPC.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsTargetJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.hit_received_effect.conditions_target.add(condition);
}
}
} }
Map deathEffect = (Map) npcJson.get("deathEffect"); Map deathEffect = (Map) npcJson.get("deathEffect");
@@ -297,35 +201,17 @@ public class NPC extends JSONElement {
this.death_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)deathEffect.get("increaseCurrentAP")).get("min"))); this.death_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)deathEffect.get("increaseCurrentAP")).get("min")));
} }
List conditionsSourceJson = (List) deathEffect.get("conditionsSource"); List conditionsSourceJson = (List) deathEffect.get("conditionsSource");
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) { this.death_effect.conditions_source = parseTimedConditionEffects(conditionsSourceJson);
this.death_effect.conditions_source = new ArrayList<NPC.TimedConditionEffect>();
for (Object conditionJsonObj : conditionsSourceJson) {
Map conditionJson = (Map)conditionJsonObj;
TimedConditionEffect condition = new TimedConditionEffect();
condition.condition_id = (String) conditionJson.get("condition");
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
if (conditionJson.get("chance") != null) condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
this.death_effect.conditions_source.add(condition);
}
}
} }
} }
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
Project proj = getProject(); Project proj = getProject();
if (proj == null) { if (proj == null) {
Notification.addError("Error linking item "+id+". No parent project found."); Notification.addError("Error linking item "+id+". No parent project found.");
@@ -342,35 +228,16 @@ public class NPC extends JSONElement {
if (this.droplist_id != null) this.droplist = proj.getDroplist(this.droplist_id); if (this.droplist_id != null) this.droplist = proj.getDroplist(this.droplist_id);
if (this.droplist != null) this.droplist.addBacklink(this); if (this.droplist != null) this.droplist.addBacklink(this);
if (this.hit_effect != null && this.hit_effect.conditions_source != null) { if (this.hit_effect != null) {
for (TimedConditionEffect ce : this.hit_effect.conditions_source) { linkConditions(this.hit_effect.conditions_source, proj, this);
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id); linkConditions(this.hit_effect.conditions_target, proj, this);
if (ce.condition != null) ce.condition.addBacklink(this);
}
} }
if (this.hit_effect != null && this.hit_effect.conditions_target != null) { if (this.hit_received_effect != null) {
for (TimedConditionEffect ce : this.hit_effect.conditions_target) { linkConditions(this.hit_received_effect.conditions_source, proj, this);
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id); linkConditions(this.hit_received_effect.conditions_target, proj, this);
if (ce.condition != null) ce.condition.addBacklink(this);
}
} }
if (this.hit_received_effect != null && this.hit_received_effect.conditions_source != null) { if (this.death_effect != null) {
for (TimedConditionEffect ce : this.hit_received_effect.conditions_source) { linkConditions(this.death_effect.conditions_source, proj, this);
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
}
if (this.hit_received_effect != null && this.hit_received_effect.conditions_target != null) {
for (TimedConditionEffect ce : this.hit_received_effect.conditions_target) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
}
if (this.death_effect != null && this.death_effect.conditions_source != null) {
for (TimedConditionEffect ce : this.death_effect.conditions_source) {
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
if (ce.condition != null) ce.condition.addBacklink(this);
}
} }
this.state = State.linked; this.state = State.linked;
} }
@@ -413,103 +280,15 @@ public class NPC extends JSONElement {
clone.faction_id = this.faction_id; clone.faction_id = this.faction_id;
if (this.hit_effect != null) { if (this.hit_effect != null) {
clone.hit_effect = new HitEffect(); clone.hit_effect = new HitEffect();
clone.hit_effect.ap_boost_max = this.hit_effect.ap_boost_max; copyHitEffectValues(clone.hit_effect, this.hit_effect, clone);
clone.hit_effect.ap_boost_min = this.hit_effect.ap_boost_min;
clone.hit_effect.hp_boost_max = this.hit_effect.hp_boost_max;
clone.hit_effect.hp_boost_min = this.hit_effect.hp_boost_min;
if (this.hit_effect.conditions_source != null) {
clone.hit_effect.conditions_source = new ArrayList<TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_effect.conditions_source) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_effect.conditions_source.add(cclone);
}
}
if (this.hit_effect.conditions_target != null) {
clone.hit_effect.conditions_target = new ArrayList<TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_effect.conditions_target) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_effect.conditions_target.add(cclone);
}
}
} }
if (this.hit_received_effect != null) { if (this.hit_received_effect != null) {
clone.hit_received_effect = new HitReceivedEffect(); clone.hit_received_effect = new HitReceivedEffect();
clone.hit_received_effect.ap_boost_max = this.hit_received_effect.ap_boost_max; copyHitReceivedEffectValues(clone.hit_received_effect, this.hit_received_effect, clone);
clone.hit_received_effect.ap_boost_min = this.hit_received_effect.ap_boost_min;
clone.hit_received_effect.hp_boost_max = this.hit_received_effect.hp_boost_max;
clone.hit_received_effect.hp_boost_min = this.hit_received_effect.hp_boost_min;
clone.hit_received_effect.ap_boost_max_target = this.hit_received_effect.ap_boost_max_target;
clone.hit_received_effect.ap_boost_min_target = this.hit_received_effect.ap_boost_min_target;
clone.hit_received_effect.hp_boost_max_target = this.hit_received_effect.hp_boost_max_target;
clone.hit_received_effect.hp_boost_min_target = this.hit_received_effect.hp_boost_min_target;
if (this.hit_received_effect.conditions_source != null) {
clone.hit_received_effect.conditions_source = new ArrayList<TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_received_effect.conditions_source) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_received_effect.conditions_source.add(cclone);
}
}
if (this.hit_received_effect.conditions_target != null) {
clone.hit_received_effect.conditions_target = new ArrayList<TimedConditionEffect>();
for (TimedConditionEffect c : this.hit_received_effect.conditions_target) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.hit_received_effect.conditions_target.add(cclone);
}
}
} }
if (this.death_effect != null) { if (this.death_effect != null) {
clone.death_effect = new DeathEffect(); clone.death_effect = new DeathEffect();
clone.death_effect.ap_boost_max = this.death_effect.ap_boost_max; copyDeathEffectValues(clone.death_effect, this.death_effect, clone);
clone.death_effect.ap_boost_min = this.death_effect.ap_boost_min;
clone.death_effect.hp_boost_max = this.death_effect.hp_boost_max;
clone.death_effect.hp_boost_min = this.death_effect.hp_boost_min;
if (this.death_effect.conditions_source != null) {
clone.death_effect.conditions_source = new ArrayList<TimedConditionEffect>();
for (TimedConditionEffect c : this.death_effect.conditions_source) {
TimedConditionEffect cclone = new TimedConditionEffect();
cclone.magnitude = c.magnitude;
cclone.condition_id = c.condition_id;
cclone.condition = c.condition;
cclone.chance = c.chance;
cclone.duration = c.duration;
if (cclone.condition != null) {
cclone.condition.addBacklink(clone);
}
clone.death_effect.conditions_source.add(cclone);
}
}
} }
clone.max_ap = this.max_ap; clone.max_ap = this.max_ap;
clone.max_hp = this.max_hp; clone.max_hp = this.max_hp;
@@ -675,7 +454,7 @@ public class NPC extends JSONElement {
} }
if (this.hit_received_effect.ap_boost_min_target != null || this.hit_received_effect.ap_boost_max_target != null) { if (this.hit_received_effect.ap_boost_min_target != null || this.hit_received_effect.ap_boost_max_target != null) {
Map apJson = new LinkedHashMap(); Map apJson = new LinkedHashMap();
hitReceivedEffectJson.put("increaseAttackerCurrentAP", apJson); hitReceivedEffectJson.put("increaseAttackerCurrentAP", apJson);
if (this.hit_received_effect.ap_boost_min_target != null) apJson.put("min", this.hit_received_effect.ap_boost_min_target); if (this.hit_received_effect.ap_boost_min_target != null) apJson.put("min", this.hit_received_effect.ap_boost_min_target);
else apJson.put("min", 0); else apJson.put("min", 0);
if (this.hit_received_effect.ap_boost_max_target != null) apJson.put("max", this.hit_received_effect.ap_boost_max_target); if (this.hit_received_effect.ap_boost_max_target != null) apJson.put("max", this.hit_received_effect.ap_boost_max_target);

View File

@@ -113,17 +113,10 @@ public class Quest extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
for (QuestStage stage : stages) { for (QuestStage stage : stages) {
stage.link(); stage.link();

View File

@@ -59,17 +59,10 @@ public class QuestStage extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
//Nothing to link to :D //Nothing to link to :D
this.state = State.linked; this.state = State.linked;

View File

@@ -71,6 +71,9 @@ public class ReplaceArea extends MapObject {
addReplacement(repl); addReplacement(repl);
return repl; return repl;
} }
public ReplaceArea.Replacement createReplacement(String source, String target) {
return new Replacement(source, target);
}
public void addReplacement(ReplaceArea.Replacement repl) { public void addReplacement(ReplaceArea.Replacement repl) {
if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>(); if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>();

View File

@@ -28,6 +28,7 @@ public class PotGenerator {
for (ActorCondition ac : gsrc.gameData.actorConditions) { for (ActorCondition ac : gsrc.gameData.actorConditions) {
pushString(stringsResources, resourcesStrings, ac.display_name, getPotContextComment(ac)); pushString(stringsResources, resourcesStrings, ac.display_name, getPotContextComment(ac));
pushString(stringsResources, resourcesStrings, ac.description, getPotContextComment(ac)+":description");
} }
for (Dialogue d : gsrc.gameData.dialogues ) { for (Dialogue d : gsrc.gameData.dialogues ) {

View File

@@ -30,6 +30,7 @@ public class ActorConditionEditor extends JSONElementEditor {
private JButton acIcon; private JButton acIcon;
private JTextField idField; private JTextField idField;
private JTextField nameField; private JTextField nameField;
private JTextField descriptionField;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private JComboBox categoryBox; private JComboBox categoryBox;
private IntegerBasedCheckBox positiveBox; private IntegerBasedCheckBox positiveBox;
@@ -81,6 +82,7 @@ public class ActorConditionEditor extends JSONElementEditor {
idField = addTextField(pane, "Internal ID: ", ac.id, ac.writable, listener); idField = addTextField(pane, "Internal ID: ", ac.id, ac.writable, listener);
nameField = addTranslatableTextField(pane, "Display name: ", ac.display_name, ac.writable, listener); nameField = addTranslatableTextField(pane, "Display name: ", ac.display_name, ac.writable, listener);
descriptionField = addTranslatableTextField(pane, "Description: ", ac.description, ac.writable, listener);
categoryBox = addEnumValueBox(pane, "Category: ", ActorCondition.ACCategory.values(), ac.category, ac.writable, listener); categoryBox = addEnumValueBox(pane, "Category: ", ActorCondition.ACCategory.values(), ac.category, ac.writable, listener);
positiveBox = addIntegerBasedCheckBox(pane, "Positive", ac.positive, ac.writable, listener); positiveBox = addIntegerBasedCheckBox(pane, "Positive", ac.positive, ac.writable, listener);
stackingBox = addIntegerBasedCheckBox(pane, "Stacking", ac.stacking, ac.writable, listener); stackingBox = addIntegerBasedCheckBox(pane, "Stacking", ac.stacking, ac.writable, listener);
@@ -172,6 +174,10 @@ public class ActorConditionEditor extends JSONElementEditor {
ActorConditionEditor.this.name = aCond.getDesc(); ActorConditionEditor.this.name = aCond.getDesc();
aCond.childrenChanged(new ArrayList<ProjectTreeNode>()); aCond.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(ActorConditionEditor.this); ATContentStudio.frame.editorChanged(ActorConditionEditor.this);
}else if (source == descriptionField) {
aCond.description = (String) value;
aCond.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(ActorConditionEditor.this);
} else if (source == acIcon) { } else if (source == acIcon) {
aCond.icon_id = (String) value; aCond.icon_id = (String) value;
aCond.childrenChanged(new ArrayList<ProjectTreeNode>()); aCond.childrenChanged(new ArrayList<ProjectTreeNode>());

View File

@@ -6,13 +6,8 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.ItemEvent; import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.ButtonGroup; import javax.swing.ButtonGroup;
import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListCellRenderer;
@@ -28,10 +23,7 @@ import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextArea; import javax.swing.JTextArea;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel; import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionListener;
@@ -54,6 +46,8 @@ import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.OverlayIcon; import com.gpl.rpg.atcontentstudio.ui.OverlayIcon;
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView; import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import com.gpl.rpg.atcontentstudio.utils.lambda.CallWithSingleArg;
import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideBoxLayout;
public class DialogueEditor extends JSONElementEditor { public class DialogueEditor extends JSONElementEditor {
@@ -178,163 +172,62 @@ public class DialogueEditor extends JSONElementEditor {
messageField = addTranslatableTextArea(pane, "Message: ", dialogue.message, dialogue.writable, listener); messageField = addTranslatableTextArea(pane, "Message: ", dialogue.message, dialogue.writable, listener);
switchToNpcBox = addNPCBox(pane, dialogue.getProject(), "Switch active NPC to: ", dialogue.switch_to_npc, dialogue.writable, listener); switchToNpcBox = addNPCBox(pane, dialogue.getProject(), "Switch active NPC to: ", dialogue.switch_to_npc, dialogue.writable, listener);
CollapsiblePanel rewards = new CollapsiblePanel("Reaching this phrase gives the following rewards: "); String rewardsTitle = "Reaching this phrase gives the following rewards: ";
rewards.setLayout(new JideBoxLayout(rewards, JideBoxLayout.PAGE_AXIS)); RewardsCellRenderer rewardsCellRenderer = new RewardsCellRenderer();
rewardsListModel = new RewardsListModel(dialogue); rewardsListModel = new RewardsListModel(dialogue);
rewardsList = new JList(rewardsListModel); final boolean rewardsMoveUpDownEnabled = false;
rewardsList.setCellRenderer(new RewardsCellRenderer());
rewardsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Dialogue.Reward> rewardsResult = CommonEditor.createListPanel(
rewards.add(new JScrollPane(rewardsList), JideBoxLayout.FIX); rewardsTitle,
final JPanel rewardsEditorPane = new JPanel(); rewardsCellRenderer,
final JButton createReward = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); rewardsListModel,
final JButton deleteReward = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); dialogue.writable,
deleteReward.setEnabled(false); rewardsMoveUpDownEnabled,
rewardsList.addListSelectionListener(new ListSelectionListener() { (e) -> selectedReward = e,
@Override () -> selectedReward,
public void valueChanged(ListSelectionEvent e) { this::updateRewardsEditorPane,
selectedReward = (Dialogue.Reward) rewardsList.getSelectedValue(); listener,
if (selectedReward == null) { Dialogue.Reward::new);
deleteReward.setEnabled(false); CollapsiblePanel rewards = rewardsResult.panel;
} else { rewardsList = rewardsResult.list;
deleteReward.setEnabled(true);
}
updateRewardsEditorPane(rewardsEditorPane, selectedReward, listener);
}
});
if (dialogue.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createReward.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Dialogue.Reward reward = new Dialogue.Reward();
rewardsListModel.addItem(reward);
rewardsList.setSelectedValue(reward, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteReward.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedReward != null) {
rewardsListModel.removeItem(selectedReward);
selectedReward = null;
rewardsList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createReward, JideBoxLayout.FIX);
listButtonsPane.add(deleteReward, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
rewards.add(listButtonsPane, JideBoxLayout.FIX);
}
if (dialogue.rewards == null || dialogue.rewards.isEmpty()) { if (dialogue.rewards == null || dialogue.rewards.isEmpty()) {
rewards.collapse(); rewards.collapse();
} }
rewardsEditorPane.setLayout(new JideBoxLayout(rewardsEditorPane, JideBoxLayout.PAGE_AXIS));
rewards.add(rewardsEditorPane, JideBoxLayout.FIX);
pane.add(rewards, JideBoxLayout.FIX); pane.add(rewards, JideBoxLayout.FIX);
CollapsiblePanel replies = new CollapsiblePanel("Replies / Next Phrase: "); String title = "Replies / Next Phrase: ";
replies.setLayout(new JideBoxLayout(replies, JideBoxLayout.PAGE_AXIS)); RepliesCellRenderer cellRenderer = new RepliesCellRenderer();
repliesListModel = new RepliesListModel(dialogue);
repliesList = new JList(repliesListModel); repliesListModel = new DialogueEditor.RepliesListModel(dialogue);
repliesList.setCellRenderer(new RepliesCellRenderer()); boolean moveUpDownEnabled = true;
repliesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CallWithSingleArg<Dialogue.Reply> selectedReplyChanged = e -> {
replies.add(new JScrollPane(repliesList), JideBoxLayout.FIX); selectedReply = e;
final JPanel repliesEditorPane = new JPanel(); if (selectedReply != null && !Dialogue.Reply.GO_NEXT_TEXT.equals(selectedReply.text)) {
final JButton createReply = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); replyTextCache = selectedReply.text;
final JButton deleteReply = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); } else {
final JButton moveReplyUp = new JButton(new ImageIcon(DefaultIcons.getArrowUpIcon())); replyTextCache = null;
final JButton moveReplyDown = new JButton(new ImageIcon(DefaultIcons.getArrowDownIcon()));
deleteReply.setEnabled(false);
moveReplyUp.setEnabled(false);
moveReplyDown.setEnabled(false);
repliesList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedReply = (Dialogue.Reply) repliesList.getSelectedValue();
if (selectedReply != null && !Dialogue.Reply.GO_NEXT_TEXT.equals(selectedReply.text)) {
replyTextCache = selectedReply.text;
} else {
replyTextCache = null;
}
if (selectedReply != null) {
deleteReply.setEnabled(true);
moveReplyUp.setEnabled(repliesList.getSelectedIndex() > 0);
moveReplyDown.setEnabled(repliesList.getSelectedIndex() < (repliesListModel.getSize() - 1));
} else {
deleteReply.setEnabled(false);
moveReplyUp.setEnabled(false);
moveReplyDown.setEnabled(false);
}
updateRepliesEditorPane(repliesEditorPane, selectedReply, listener);
} }
}); };
if (dialogue.writable) { CollapsiblePanel replies = CommonEditor.createListPanel(
JPanel listButtonsPane = new JPanel(); title,
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); cellRenderer,
createReply.addActionListener(new ActionListener() { repliesListModel,
@Override dialogue.writable,
public void actionPerformed(ActionEvent e) { moveUpDownEnabled,
Dialogue.Reply reply = new Dialogue.Reply(); selectedReplyChanged,
repliesListModel.addItem(reply); ()->selectedReply,
repliesList.setSelectedValue(reply, true); this::updateRepliesEditorPane,
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. listener,
} Dialogue.Reply::new).panel;
});
deleteReply.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedReply != null) {
repliesListModel.removeItem(selectedReply);
selectedReply = null;
repliesList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
moveReplyUp.addActionListener(new ActionListener() {
@Override boolean isEmpty = dialogue.replies == null || dialogue.replies.isEmpty();
public void actionPerformed(ActionEvent e) { if (isEmpty) {
if (selectedReply != null) {
repliesListModel.moveUp(selectedReply);
repliesList.setSelectedValue(selectedReply, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
moveReplyDown.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedReply != null) {
repliesListModel.moveDown(selectedReply);
repliesList.setSelectedValue(selectedReply, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createReply, JideBoxLayout.FIX);
listButtonsPane.add(deleteReply, JideBoxLayout.FIX);
listButtonsPane.add(moveReplyUp, JideBoxLayout.FIX);
listButtonsPane.add(moveReplyDown, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
replies.add(listButtonsPane, JideBoxLayout.FIX);
}
if (dialogue.replies == null || dialogue.replies.isEmpty()) {
replies.collapse(); replies.collapse();
} }
repliesEditorPane.setLayout(new JideBoxLayout(repliesEditorPane, JideBoxLayout.PAGE_AXIS));
replies.add(repliesEditorPane, JideBoxLayout.FIX);
pane.add(replies, JideBoxLayout.FIX); pane.add(replies, JideBoxLayout.FIX);
} }
public void updateRewardsEditorPane(final JPanel pane, final Dialogue.Reward reward, final FieldUpdateListener listener) { public void updateRewardsEditorPane(final JPanel pane, final Dialogue.Reward reward, final FieldUpdateListener listener) {
@@ -586,80 +479,24 @@ public class DialogueEditor extends JSONElementEditor {
updateRepliesParamsEditorPane(repliesParamsPane, reply, listener); updateRepliesParamsEditorPane(repliesParamsPane, reply, listener);
pane.add(repliesParamsPane, JideBoxLayout.FIX); pane.add(repliesParamsPane, JideBoxLayout.FIX);
CollapsiblePanel requirementsPane = new CollapsiblePanel("Requirements the player must fulfill to select this reply: "); ReplyRequirementsCellRenderer cellRenderer = new ReplyRequirementsCellRenderer();
requirementsPane.setLayout(new JideBoxLayout(requirementsPane, JideBoxLayout.PAGE_AXIS)); String title = "Requirements the player must fulfill to select this reply: ";
requirementsListModel = new ReplyRequirementsListModel(reply); requirementsListModel = new ReplyRequirementsListModel(reply);
requirementsList = new JList(requirementsListModel);
requirementsList.setCellRenderer(new ReplyRequirementsCellRenderer());
requirementsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
requirementsPane.add(new JScrollPane(requirementsList), JideBoxLayout.FIX);
final JPanel requirementsEditorPane = new JPanel();
final JButton createReq = new JButton(new ImageIcon(DefaultIcons.getCreateIcon()));
final JButton deleteReq = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
deleteReq.setEnabled(false);
requirementsList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedRequirement = (Requirement) requirementsList.getSelectedValue();
if (selectedRequirement != null) {
deleteReq.setEnabled(true);
} else {
deleteReq.setEnabled(false);
}
updateRequirementsEditorPane(requirementsEditorPane, selectedRequirement, listener);
}
});
requirementsList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
if (requirementsList.getSelectedValue() != null && ((Requirement)requirementsList.getSelectedValue()).required_obj != null) {
ATContentStudio.frame.openEditor(((Requirement)requirementsList.getSelectedValue()).required_obj);
ATContentStudio.frame.selectInTree(((Requirement)requirementsList.getSelectedValue()).required_obj);
}
}
}
});
requirementsList.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
ATContentStudio.frame.openEditor(((Requirement)requirementsList.getSelectedValue()).required_obj);
ATContentStudio.frame.selectInTree(((Requirement)requirementsList.getSelectedValue()).required_obj);
}
}
});
if (((Dialogue)target).writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createReq.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Requirement req = new Requirement();
requirementsListModel.addItem(req);
requirementsList.setSelectedValue(req, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteReq.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedRequirement != null) {
requirementsListModel.removeItem(selectedRequirement);
selectedRequirement = null;
requirementsList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createReq, JideBoxLayout.FIX); final boolean moveUpDownEnabled = false;
listButtonsPane.add(deleteReq, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); CollapsiblePanel requirementsPane = CommonEditor.createListPanel(
requirementsPane.add(listButtonsPane, JideBoxLayout.FIX); title,
} cellRenderer,
requirementsEditorPane.setLayout(new JideBoxLayout(requirementsEditorPane, JideBoxLayout.PAGE_AXIS)); requirementsListModel,
requirementsPane.add(requirementsEditorPane, JideBoxLayout.FIX); target.writable,
moveUpDownEnabled,
(e)->selectedRequirement=e,
()->selectedRequirement,
this::updateRequirementsEditorPane,
listener,
Requirement::new).panel;
if (reply.requirements == null || reply.requirements.isEmpty()) { if (reply.requirements == null || reply.requirements.isEmpty()) {
requirementsPane.collapse(); requirementsPane.collapse();
} }
@@ -812,67 +649,23 @@ public class DialogueEditor extends JSONElementEditor {
} }
public static class RewardsListModel implements ListModel<Dialogue.Reward> { public static class RewardsListModel extends CommonEditor.AtListModel<Dialogue.Reward, Dialogue> {
Dialogue source;
public RewardsListModel(Dialogue dialogue) { public RewardsListModel(Dialogue dialogue) {
this.source = dialogue; super(dialogue);
} }
@Override @Override
public int getSize() { protected List<Dialogue.Reward> getInner() {
if (source.rewards == null) return 0; return source.rewards;
return source.rewards.size();
} }
@Override @Override
public Dialogue.Reward getElementAt(int index) { protected void setInner(List<Dialogue.Reward> value) {
if (source.rewards == null) return null; source.rewards = value;
return source.rewards.get(index);
} }
public void addItem(Dialogue.Reward item) { }
if (source.rewards == null) {
source.rewards = new ArrayList<Dialogue.Reward>();
}
source.rewards.add(item);
int index = source.rewards.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Dialogue.Reward item) {
int index = source.rewards.indexOf(item);
source.rewards.remove(item);
if (source.rewards.isEmpty()) {
source.rewards = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Dialogue.Reward item) {
int index = source.rewards.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class RewardsCellRenderer extends DefaultListCellRenderer { public static class RewardsCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;
@@ -981,88 +774,21 @@ public class DialogueEditor extends JSONElementEditor {
} }
public static class RepliesListModel implements ListModel<Dialogue.Reply> { public static class RepliesListModel extends CommonEditor.AtListModel<Dialogue.Reply, Dialogue> {
Dialogue source;
public RepliesListModel(Dialogue dialogue) { public RepliesListModel(Dialogue dialogue) {
this.source = dialogue; super(dialogue);
}
@Override
public int getSize() {
if (source.replies == null) return 0;
return source.replies.size();
} }
@Override @Override
public Dialogue.Reply getElementAt(int index) { protected List<Dialogue.Reply> getInner() {
if (source.replies == null) return null; return source.replies;
return source.replies.get(index);
}
public void addItem(Dialogue.Reply item) {
if (source.replies == null) {
source.replies = new ArrayList<Dialogue.Reply>();
}
source.replies.add(item);
int index = source.replies.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Dialogue.Reply item) {
int index = source.replies.indexOf(item);
source.replies.remove(item);
if (source.replies.isEmpty()) {
source.replies = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Dialogue.Reply item) {
int index = source.replies.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
public void moveUp(Dialogue.Reply item) {
int index = source.replies.indexOf(item);
Dialogue.Reply exchanged = source.replies.get(index - 1);
source.replies.set(index, exchanged);
source.replies.set(index - 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index - 1, index));
}
}
public void moveDown(Dialogue.Reply item) {
int index = source.replies.indexOf(item);
Dialogue.Reply exchanged = source.replies.get(index + 1);
source.replies.set(index, exchanged);
source.replies.set(index + 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index + 1));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
} }
@Override @Override
public void removeListDataListener(ListDataListener l) { protected void setInner(List<Dialogue.Reply> value) {
listeners.remove(l); source.replies = value;
} }
} }
public static class RepliesCellRenderer extends DefaultListCellRenderer { public static class RepliesCellRenderer extends DefaultListCellRenderer {
@@ -1115,70 +841,27 @@ public class DialogueEditor extends JSONElementEditor {
} }
} }
public static class ReplyRequirementsListModel implements ListModel<Requirement> { public static class ReplyRequirementsListModel extends CommonEditor.AtListModel<Requirement, Dialogue.Reply> {
Dialogue.Reply reply; public ReplyRequirementsListModel(Dialogue.Reply reply) {
super(reply);
}
public ReplyRequirementsListModel(Dialogue.Reply reply) { @Override
this.reply = reply; protected List<Requirement> getInner() {
} return source.requirements;
}
@Override @Override
public int getSize() { protected void setInner(List<Requirement> value) {
if (reply.requirements == null) return 0; source.requirements = value;
return reply.requirements.size(); }
}
@Override @Override
public Requirement getElementAt(int index) { protected GameDataElement getNavigationElement(Requirement element) {
if (reply.requirements == null) return null; return element != null ? element.required_obj : null;
return reply.requirements.get(index); }
} }
public void addItem(Requirement item) {
if (reply.requirements == null) {
reply.requirements = new ArrayList<Requirement>();
}
reply.requirements.add(item);
int index = reply.requirements.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Requirement item) {
int index = reply.requirements.indexOf(item);
reply.requirements.remove(item);
if (reply.requirements.isEmpty()) {
reply.requirements = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Requirement item) {
int index = reply.requirements.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class ReplyRequirementsCellRenderer extends DefaultListCellRenderer { public static class ReplyRequirementsCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;

View File

@@ -1,28 +1,17 @@
package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; package com.gpl.rpg.atcontentstudio.ui.gamedataeditors;
import java.awt.Component; import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.GameDataElement;
@@ -32,8 +21,8 @@ import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist.DroppedItem; import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist.DroppedItem;
import com.gpl.rpg.atcontentstudio.model.gamedata.Item; import com.gpl.rpg.atcontentstudio.model.gamedata.Item;
import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel; import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel;
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideBoxLayout;
public class DroplistEditor extends JSONElementEditor { public class DroplistEditor extends JSONElementEditor {
@@ -58,7 +47,6 @@ public class DroplistEditor extends JSONElementEditor {
addEditorTab(json_view_id, getJSONView()); addEditorTab(json_view_id, getJSONView());
} }
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override @Override
public void insertFormViewDataField(JPanel pane) { public void insertFormViewDataField(JPanel pane) {
@@ -69,60 +57,23 @@ public class DroplistEditor extends JSONElementEditor {
idField = addTextField(pane, "Droplist ID: ", droplist.id, droplist.writable, listener); idField = addTextField(pane, "Droplist ID: ", droplist.id, droplist.writable, listener);
CollapsiblePanel itemsPane = new CollapsiblePanel("Items in this droplist: "); String title = "Items in this droplist: ";
itemsPane.setLayout(new JideBoxLayout(itemsPane, JideBoxLayout.PAGE_AXIS)); DroppedItemsCellRenderer cellRenderer = new DroppedItemsCellRenderer();
droppedItemsListModel = new DroppedItemsListModel(droplist); droppedItemsListModel = new DroppedItemsListModel(droplist);
final JList itemsList = new JList(droppedItemsListModel); final boolean moveUpDownEnabled = false;
itemsList.setCellRenderer(new DroppedItemsCellRenderer());
itemsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CollapsiblePanel itemsPane = CommonEditor.createListPanel(
itemsPane.add(new JScrollPane(itemsList), JideBoxLayout.FIX); title,
final JPanel droppedItemsEditorPane = new JPanel(); cellRenderer,
final JButton createDroppedItem = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); droppedItemsListModel,
final JButton deleteDroppedItem = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); droplist.writable,
deleteDroppedItem.setEnabled(false); moveUpDownEnabled,
itemsList.addListSelectionListener(new ListSelectionListener() { (e) -> selectedItem = e,
@Override () -> selectedItem,
public void valueChanged(ListSelectionEvent e) { this::updateDroppedItemsEditorPane,
selectedItem = (Droplist.DroppedItem) itemsList.getSelectedValue(); listener,
if (selectedItem == null) { Droplist.DroppedItem::new).panel;
deleteDroppedItem.setEnabled(false);
} else {
deleteDroppedItem.setEnabled(true);
}
updateDroppedItemsEditorPane(droppedItemsEditorPane, selectedItem, listener);
}
});
if (droplist.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createDroppedItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Droplist.DroppedItem tempItem = new Droplist.DroppedItem();
droppedItemsListModel.addItem(tempItem);
itemsList.setSelectedValue(tempItem, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteDroppedItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedItem != null) {
droppedItemsListModel.removeItem(selectedItem);
selectedItem = null;
itemsList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createDroppedItem, JideBoxLayout.FIX);
listButtonsPane.add(deleteDroppedItem, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
itemsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
droppedItemsEditorPane.setLayout(new JideBoxLayout(droppedItemsEditorPane, JideBoxLayout.PAGE_AXIS));
itemsPane.add(droppedItemsEditorPane, JideBoxLayout.FIX);
if (droplist.dropped_items == null || droplist.dropped_items.isEmpty()) { if (droplist.dropped_items == null || droplist.dropped_items.isEmpty()) {
itemsPane.collapse(); itemsPane.collapse();
} }
@@ -132,8 +83,8 @@ public class DroplistEditor extends JSONElementEditor {
} }
public void updateDroppedItemsEditorPane(JPanel pane, DroppedItem di, FieldUpdateListener listener) { public void updateDroppedItemsEditorPane(JPanel pane, DroppedItem di, FieldUpdateListener listener) {
boolean writable = ((Droplist)target).writable; boolean writable = target.writable;
Project proj = ((Droplist)target).getProject(); Project proj = target.getProject();
pane.removeAll(); pane.removeAll();
if (itemCombo != null) { if (itemCombo != null) {
removeElementListener(itemCombo); removeElementListener(itemCombo);
@@ -148,65 +99,20 @@ public class DroplistEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public class DroppedItemsListModel implements ListModel<Droplist.DroppedItem> { public static class DroppedItemsListModel extends CommonEditor.AtListModel<Droplist.DroppedItem, Droplist> {
Droplist source;
public DroppedItemsListModel(Droplist droplist) { public DroppedItemsListModel(Droplist droplist) {
this.source = droplist; super(droplist);
} }
@Override @Override
public int getSize() { protected List<Droplist.DroppedItem> getInner() {
if (source.dropped_items == null) return 0; return source.dropped_items;
return source.dropped_items.size();
} }
@Override @Override
public Droplist.DroppedItem getElementAt(int index) { protected void setInner(List<Droplist.DroppedItem> value) {
if (source.dropped_items == null) return null; source.dropped_items = value;
return source.dropped_items.get(index);
}
public void addItem(Droplist.DroppedItem item) {
if (source.dropped_items == null) {
source.dropped_items = new ArrayList<Droplist.DroppedItem>();
}
source.dropped_items.add(item);
int index = source.dropped_items.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Droplist.DroppedItem item) {
int index = source.dropped_items.indexOf(item);
source.dropped_items.remove(item);
if (source.dropped_items.isEmpty()) {
source.dropped_items = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Droplist.DroppedItem item) {
int index = source.dropped_items.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
} }
} }
@@ -214,7 +120,7 @@ public class DroplistEditor extends JSONElementEditor {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;
@Override @Override
public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (c instanceof JLabel) { if (c instanceof JLabel) {
JLabel label = ((JLabel)c); JLabel label = ((JLabel)c);
@@ -253,12 +159,12 @@ public class DroplistEditor extends JSONElementEditor {
skipNext = false; skipNext = false;
return; return;
} }
if (target.id.equals((String) value)) return; if (target.id.equals(value)) return;
if (idChanging()) { if (idChanging()) {
droplist.id = (String) value; droplist.id = (String) value;
DroplistEditor.this.name = droplist.getDesc(); DroplistEditor.this.name = droplist.getDesc();
droplist.childrenChanged(new ArrayList<ProjectTreeNode>()); droplist.childrenChanged(new ArrayList<>());
ATContentStudio.frame.editorChanged(DroplistEditor.this); ATContentStudio.frame.editorChanged(DroplistEditor.this);
} else { } else {
cancelIdEdit(idField); cancelIdEdit(idField);
@@ -290,7 +196,7 @@ public class DroplistEditor extends JSONElementEditor {
if (droplist.state != GameDataElement.State.modified) { if (droplist.state != GameDataElement.State.modified) {
droplist.state = GameDataElement.State.modified; droplist.state = GameDataElement.State.modified;
DroplistEditor.this.name = droplist.getDesc(); DroplistEditor.this.name = droplist.getDesc();
droplist.childrenChanged(new ArrayList<ProjectTreeNode>()); droplist.childrenChanged(new ArrayList<>());
ATContentStudio.frame.editorChanged(DroplistEditor.this); ATContentStudio.frame.editorChanged(DroplistEditor.this);
} }
updateJsonViewText(droplist.toJsonString()); updateJsonViewText(droplist.toJsonString());

View File

@@ -5,7 +5,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.ButtonGroup; import javax.swing.ButtonGroup;
import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListCellRenderer;
@@ -17,21 +16,15 @@ import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JRadioButton; import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.GameDataElement;
import com.gpl.rpg.atcontentstudio.model.Project; import com.gpl.rpg.atcontentstudio.model.Project;
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition; import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
import com.gpl.rpg.atcontentstudio.model.gamedata.Common;
import com.gpl.rpg.atcontentstudio.model.gamedata.Item; import com.gpl.rpg.atcontentstudio.model.gamedata.Item;
import com.gpl.rpg.atcontentstudio.model.gamedata.ItemCategory; import com.gpl.rpg.atcontentstudio.model.gamedata.ItemCategory;
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet; import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
@@ -40,6 +33,7 @@ import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox; import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox;
import com.gpl.rpg.atcontentstudio.ui.OverlayIcon; import com.gpl.rpg.atcontentstudio.ui.OverlayIcon;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideBoxLayout;
public class ItemEditor extends JSONElementEditor { public class ItemEditor extends JSONElementEditor {
@@ -53,12 +47,12 @@ public class ItemEditor extends JSONElementEditor {
private static final String useLabel = "Effect on use: "; private static final String useLabel = "Effect on use: ";
private Item.ConditionEffect selectedEquipEffectCondition; private Common.ConditionEffect selectedEquipEffectCondition;
private Item.TimedConditionEffect selectedHitEffectSourceCondition; private Common.TimedConditionEffect selectedHitEffectSourceCondition;
private Item.TimedConditionEffect selectedHitEffectTargetCondition; private Common.TimedConditionEffect selectedHitEffectTargetCondition;
private Item.TimedConditionEffect selectedKillEffectCondition; private Common.TimedConditionEffect selectedKillEffectCondition;
private Item.TimedConditionEffect selectedHitReceivedEffectSourceCondition; private Common.TimedConditionEffect selectedHitReceivedEffectSourceCondition;
private Item.TimedConditionEffect selectedHitReceivedEffectTargetCondition; private Common.TimedConditionEffect selectedHitReceivedEffectTargetCondition;
private JButton itemIcon; private JButton itemIcon;
@@ -97,7 +91,7 @@ public class ItemEditor extends JSONElementEditor {
private JSpinner equipConditionMagnitude; private JSpinner equipConditionMagnitude;
private CollapsiblePanel hitEffectPane; private CollapsiblePanel hitEffectPane;
private Item.HitEffect hitEffect; private Common.HitEffect hitEffect;//TODO: Check if this was set anywhere before my changes
private JSpinner hitHPMin; private JSpinner hitHPMin;
private JSpinner hitHPMax; private JSpinner hitHPMax;
private JSpinner hitAPMin; private JSpinner hitAPMin;
@@ -128,7 +122,7 @@ public class ItemEditor extends JSONElementEditor {
private JSpinner hitTargetConditionDuration; private JSpinner hitTargetConditionDuration;
private CollapsiblePanel killEffectPane; private CollapsiblePanel killEffectPane;
private Item.KillEffect killEffect; private Common.DeathEffect killEffect;
private JSpinner killHPMin; private JSpinner killHPMin;
private JSpinner killHPMax; private JSpinner killHPMax;
private JSpinner killAPMin; private JSpinner killAPMin;
@@ -147,7 +141,7 @@ public class ItemEditor extends JSONElementEditor {
private JSpinner killSourceConditionDuration; private JSpinner killSourceConditionDuration;
private CollapsiblePanel hitReceivedEffectPane; private CollapsiblePanel hitReceivedEffectPane;
private Item.HitReceivedEffect hitReceivedEffect; private Common.HitReceivedEffect hitReceivedEffect;
private JSpinner hitReceivedHPMin; private JSpinner hitReceivedHPMin;
private JSpinner hitReceivedHPMax; private JSpinner hitReceivedHPMax;
private JSpinner hitReceivedAPMin; private JSpinner hitReceivedAPMin;
@@ -230,59 +224,25 @@ public class ItemEditor extends JSONElementEditor {
equipIncUseCost = addIntegerField(equipEffectPane, "Increase item use cost: ", equipEffect.increase_use_item_cost, true, item.writable, listener); equipIncUseCost = addIntegerField(equipEffectPane, "Increase item use cost: ", equipEffect.increase_use_item_cost, true, item.writable, listener);
equipIncReequipCost = addIntegerField(equipEffectPane, "Increase reequip cost: ", equipEffect.increase_reequip_cost, true, item.writable, listener); equipIncReequipCost = addIntegerField(equipEffectPane, "Increase reequip cost: ", equipEffect.increase_reequip_cost, true, item.writable, listener);
equipIncAttackCost = addIntegerField(equipEffectPane, "Increase attack cost: ", equipEffect.increase_attack_cost, true, item.writable, listener); equipIncAttackCost = addIntegerField(equipEffectPane, "Increase attack cost: ", equipEffect.increase_attack_cost, true, item.writable, listener);
CollapsiblePanel equipConditionsPane = new CollapsiblePanel("Actor Conditions applied when equipped: "); String title = "Actor Conditions applied when equipped: ";
equipConditionsPane.setLayout(new JideBoxLayout(equipConditionsPane, JideBoxLayout.PAGE_AXIS)); ConditionsCellRenderer cellRenderer = new ConditionsCellRenderer();
equipConditionsModel = new ConditionsListModel(equipEffect); equipConditionsModel = new ConditionsListModel(equipEffect);
equipConditionsList = new JList(equipConditionsModel); final boolean moveUpDownEnabled = false;
equipConditionsList.setCellRenderer(new ConditionsCellRenderer());
equipConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.ConditionEffect> equipConditionsCreation = CommonEditor.createListPanel(
equipConditionsPane.add(new JScrollPane(equipConditionsList), JideBoxLayout.FIX); title,
final JPanel equipConditionsEditorPane = new JPanel(); cellRenderer,
final JButton createEquipCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); equipConditionsModel,
final JButton deleteEquipCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); item.writable,
equipConditionsList.addListSelectionListener(new ListSelectionListener() { moveUpDownEnabled,
@Override (e) -> selectedEquipEffectCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedEquipEffectCondition,
selectedEquipEffectCondition = (Item.ConditionEffect) equipConditionsList.getSelectedValue(); this::updateEquipConditionEditorPane,
if (selectedEquipEffectCondition == null) { listener,
deleteEquipCondition.setEnabled(false); Common.ConditionEffect::new);
} else { CollapsiblePanel equipConditionsPane = equipConditionsCreation.panel;
deleteEquipCondition.setEnabled(true); equipConditionsList = equipConditionsCreation.list;
}
updateEquipConditionEditorPane(equipConditionsEditorPane, selectedEquipEffectCondition, listener);
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createEquipCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Item.ConditionEffect condition = new Item.ConditionEffect();
equipConditionsModel.addItem(condition);
equipConditionsList.setSelectedValue(condition, true);
listener.valueChanged(equipConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteEquipCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedEquipEffectCondition != null) {
equipConditionsModel.removeItem(selectedEquipEffectCondition);
selectedEquipEffectCondition = null;
equipConditionsList.clearSelection();
listener.valueChanged(equipConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createEquipCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteEquipCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
equipConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
equipConditionsEditorPane.setLayout(new JideBoxLayout(equipConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
equipConditionsPane.add(equipConditionsEditorPane, JideBoxLayout.FIX);
if (item.equip_effect == null || item.equip_effect.conditions == null || item.equip_effect.conditions.isEmpty()) { if (item.equip_effect == null || item.equip_effect.conditions == null || item.equip_effect.conditions.isEmpty()) {
equipConditionsPane.collapse(); equipConditionsPane.collapse();
} }
@@ -292,127 +252,55 @@ public class ItemEditor extends JSONElementEditor {
equipEffectPane.collapse(); equipEffectPane.collapse();
} }
hitEffectPane = new CollapsiblePanel("Effect on every hit: "); CommonEditor.CreateDeathEffectPanelResult hitEffectPanelResult = CommonEditor.createDeathEffectPanel(item.hit_effect, item.writable, listener, "Effect on every hit: ");
hitEffectPane.setLayout(new JideBoxLayout(hitEffectPane, JideBoxLayout.PAGE_AXIS)); hitEffectPane = hitEffectPanelResult.panel;
if (item.hit_effect == null) { hitHPMin = hitEffectPanelResult.HPMin;
hitEffect = new Item.HitEffect(); hitHPMax = hitEffectPanelResult.HPMax;
} else { hitAPMax = hitEffectPanelResult.APMax;
hitEffect = item.hit_effect; hitAPMin = hitEffectPanelResult.APMin;
}
hitHPMin = addIntegerField(hitEffectPane, "HP bonus min: ", hitEffect.hp_boost_min, true, item.writable, listener); String hitSourceTitle = "Actor Conditions applied to the source: ";
hitHPMax = addIntegerField(hitEffectPane, "HP bonus max: ", hitEffect.hp_boost_max, true, item.writable, listener); TimedConditionsCellRenderer hitSourceCellRenderer = new TimedConditionsCellRenderer();
hitAPMin = addIntegerField(hitEffectPane, "AP bonus min: ", hitEffect.ap_boost_min, true, item.writable, listener); hitSourceConditionsModel = new SourceTimedConditionsListModel(hitEffect);
hitAPMax = addIntegerField(hitEffectPane, "AP bonus max: ", hitEffect.ap_boost_max, true, item.writable, listener); final boolean hitSourceMoveUpDownEnabled = false;
final CollapsiblePanel hitSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: ");
hitSourceConditionsPane.setLayout(new JideBoxLayout(hitSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitSourceConditionsCreation = CommonEditor.createListPanel(
hitSourceConditionsModel = new SourceTimedConditionsListModel(hitEffect); hitSourceTitle,
hitSourceConditionsList = new JList(hitSourceConditionsModel); hitSourceCellRenderer,
hitSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); hitSourceConditionsModel,
hitSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); item.writable,
hitSourceConditionsPane.add(new JScrollPane(hitSourceConditionsList), JideBoxLayout.FIX); hitSourceMoveUpDownEnabled,
final JPanel sourceTimedConditionsEditorPane = new JPanel(); (e) -> selectedHitEffectSourceCondition = e,
final JButton createHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); () -> selectedHitEffectSourceCondition,
final JButton deleteHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); this::updateHitSourceTimedConditionEditorPane,
hitSourceConditionsList.addListSelectionListener(new ListSelectionListener() { listener,
@Override Common.TimedConditionEffect::new);
public void valueChanged(ListSelectionEvent e) { final CollapsiblePanel hitSourceConditionsPane = hitSourceConditionsCreation.panel;
selectedHitEffectSourceCondition = (Item.TimedConditionEffect) hitSourceConditionsList.getSelectedValue(); hitSourceConditionsList = hitSourceConditionsCreation.list;
updateHitSourceTimedConditionEditorPane(sourceTimedConditionsEditorPane, selectedHitEffectSourceCondition, listener);
if (selectedHitEffectSourceCondition == null) {
deleteHitSourceCondition.setEnabled(false);
} else {
deleteHitSourceCondition.setEnabled(true);
}
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Item.TimedConditionEffect condition = new Item.TimedConditionEffect();
hitSourceConditionsModel.addItem(condition);
hitSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitEffectSourceCondition != null) {
hitSourceConditionsModel.removeItem(selectedHitEffectSourceCondition);
selectedHitEffectSourceCondition = null;
hitSourceConditionsList.clearSelection();
listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
sourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(sourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitSourceConditionsPane.add(sourceTimedConditionsEditorPane, JideBoxLayout.FIX);
if (item.hit_effect == null || item.hit_effect.conditions_source == null || item.hit_effect.conditions_source.isEmpty()) { if (item.hit_effect == null || item.hit_effect.conditions_source == null || item.hit_effect.conditions_source.isEmpty()) {
hitSourceConditionsPane.collapse(); hitSourceConditionsPane.collapse();
} }
hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX); hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX);
final CollapsiblePanel hitTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the target: "); String hitTargetTitle = "Actor Conditions applied to the target: ";
hitTargetConditionsPane.setLayout(new JideBoxLayout(hitTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitTargetCellRenderer = new TimedConditionsCellRenderer();
hitTargetConditionsModel = new TargetTimedConditionsListModel(hitEffect); hitTargetConditionsModel = new TargetTimedConditionsListModel(hitEffect);
hitTargetConditionsList = new JList(hitTargetConditionsModel); final boolean hitTargetMoveUpDownEnabled = false;
hitTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> listPanel2 = CommonEditor.createListPanel(
hitTargetConditionsPane.add(new JScrollPane(hitTargetConditionsList), JideBoxLayout.FIX); hitTargetTitle,
final JPanel targetTimedConditionsEditorPane = new JPanel(); hitTargetCellRenderer,
final JButton createHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitTargetConditionsModel,
final JButton deleteHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); item.writable,
hitTargetConditionsList.addListSelectionListener(new ListSelectionListener() { hitTargetMoveUpDownEnabled,
@Override (e) -> selectedHitEffectTargetCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitEffectTargetCondition,
selectedHitEffectTargetCondition = (Item.TimedConditionEffect) hitTargetConditionsList.getSelectedValue(); this::updateHitTargetTimedConditionEditorPane,
updateHitTargetTimedConditionEditorPane(targetTimedConditionsEditorPane, selectedHitEffectTargetCondition, listener); listener,
if (selectedHitEffectTargetCondition == null) { Common.TimedConditionEffect::new);
deleteHitTargetCondition.setEnabled(false); final CollapsiblePanel hitTargetConditionsPane = (CollapsiblePanel) listPanel2.panel;
} else { hitTargetConditionsList = listPanel2.list;
deleteHitTargetCondition.setEnabled(true);
}
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Item.TimedConditionEffect condition = new Item.TimedConditionEffect();
hitTargetConditionsModel.addItem(condition);
hitTargetConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitEffectTargetCondition != null) {
hitTargetConditionsModel.removeItem(selectedHitEffectTargetCondition);
selectedHitEffectTargetCondition = null;
hitTargetConditionsList.clearSelection();
listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
targetTimedConditionsEditorPane.setLayout(new JideBoxLayout(targetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitTargetConditionsPane.add(targetTimedConditionsEditorPane, JideBoxLayout.FIX);
if (item.hit_effect == null || item.hit_effect.conditions_target == null || item.hit_effect.conditions_target.isEmpty()) { if (item.hit_effect == null || item.hit_effect.conditions_target == null || item.hit_effect.conditions_target.isEmpty()) {
hitTargetConditionsPane.collapse(); hitTargetConditionsPane.collapse();
} }
@@ -423,71 +311,38 @@ public class ItemEditor extends JSONElementEditor {
pane.add(hitEffectPane, JideBoxLayout.FIX); pane.add(hitEffectPane, JideBoxLayout.FIX);
killEffectPane = new CollapsiblePanel(killLabel);
killEffectPane.setLayout(new JideBoxLayout(killEffectPane, JideBoxLayout.PAGE_AXIS));
if (item.kill_effect == null) { if (item.kill_effect == null) {
killEffect = new Item.KillEffect(); killEffect = new Common.DeathEffect();
} else { } else {
killEffect = item.kill_effect; killEffect = item.kill_effect;
} }
killHPMin = addIntegerField(killEffectPane, "HP bonus min: ", killEffect.hp_boost_min, true, item.writable, listener);
killHPMax = addIntegerField(killEffectPane, "HP bonus max: ", killEffect.hp_boost_max, true, item.writable, listener);
killAPMin = addIntegerField(killEffectPane, "AP bonus min: ", killEffect.ap_boost_min, true, item.writable, listener);
killAPMax = addIntegerField(killEffectPane, "AP bonus max: ", killEffect.ap_boost_max, true, item.writable, listener);
final CollapsiblePanel killSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: ");
killSourceConditionsPane.setLayout(new JideBoxLayout(killSourceConditionsPane, JideBoxLayout.PAGE_AXIS));
killSourceConditionsModel = new SourceTimedConditionsListModel(killEffect);
killSourceConditionsList = new JList(killSourceConditionsModel);
killSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
killSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
killSourceConditionsPane.add(new JScrollPane(killSourceConditionsList), JideBoxLayout.FIX);
final JPanel killSourceTimedConditionsEditorPane = new JPanel();
final JButton createKillSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon()));
final JButton deleteKillSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
killSourceConditionsList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedKillEffectCondition = (Item.TimedConditionEffect) killSourceConditionsList.getSelectedValue();
updateKillSourceTimedConditionEditorPane(killSourceTimedConditionsEditorPane, selectedKillEffectCondition, listener);
if (selectedKillEffectCondition == null) {
deleteKillSourceCondition.setEnabled(false);
} else {
deleteKillSourceCondition.setEnabled(true);
}
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createKillSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Item.TimedConditionEffect condition = new Item.TimedConditionEffect();
killSourceConditionsModel.addItem(condition);
killSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(killSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteKillSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedKillEffectCondition != null) {
killSourceConditionsModel.removeItem(selectedKillEffectCondition);
selectedKillEffectCondition = null;
killSourceConditionsList.clearSelection();
listener.valueChanged(killSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createKillSourceCondition, JideBoxLayout.FIX); CommonEditor.CreateDeathEffectPanelResult x = CommonEditor.createDeathEffectPanel(killEffect, item.writable, listener, killLabel);
listButtonsPane.add(deleteKillSourceCondition, JideBoxLayout.FIX); killEffectPane = x.panel;
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); killHPMin = x.HPMin;
killSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); killHPMax = x.HPMax;
} killAPMin = x.APMin;
killSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(killSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); killAPMax = x.APMax;
killSourceConditionsPane.add(killSourceTimedConditionsEditorPane, JideBoxLayout.FIX);
String killSourceTitle = "Actor Conditions applied to the source: ";
TimedConditionsCellRenderer killSourceCellRenderer = new TimedConditionsCellRenderer();
killSourceConditionsModel = new SourceTimedConditionsListModel(killEffect);
final boolean killSourceMoveUpDownEnabled = false;
CommonEditor.PanelCreateResult<Common.TimedConditionEffect> listPanel = CommonEditor.createListPanel(
killSourceTitle,
killSourceCellRenderer,
killSourceConditionsModel,
item.writable,
killSourceMoveUpDownEnabled,
(e) -> selectedKillEffectCondition = e,
() -> selectedKillEffectCondition,
this::updateKillSourceTimedConditionEditorPane,
listener,
Common.TimedConditionEffect::new);
final CollapsiblePanel killSourceConditionsPane = listPanel.panel;
killSourceConditionsList = listPanel.list;
if (item.kill_effect == null || item.kill_effect.conditions_source == null || item.kill_effect.conditions_source.isEmpty()) { if (item.kill_effect == null || item.kill_effect.conditions_source == null || item.kill_effect.conditions_source.isEmpty()) {
killSourceConditionsPane.collapse(); killSourceConditionsPane.collapse();
} }
@@ -498,13 +353,14 @@ public class ItemEditor extends JSONElementEditor {
pane.add(killEffectPane, JideBoxLayout.FIX); pane.add(killEffectPane, JideBoxLayout.FIX);
hitReceivedEffectPane = new CollapsiblePanel("Effect on every hit received: ");
hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS));
if (item.hit_received_effect == null) { if (item.hit_received_effect == null) {
hitReceivedEffect = new Item.HitReceivedEffect(); hitReceivedEffect = new Common.HitReceivedEffect();
} else { } else {
hitReceivedEffect = item.hit_received_effect; hitReceivedEffect = item.hit_received_effect;
} }
String titleHitReceived = "Effect on every hit received: ";
hitReceivedEffectPane = new CollapsiblePanel(titleHitReceived);
hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS));
hitReceivedHPMin = addIntegerField(hitReceivedEffectPane, "Player HP bonus min: ", hitReceivedEffect.hp_boost_min, true, item.writable, listener); hitReceivedHPMin = addIntegerField(hitReceivedEffectPane, "Player HP bonus min: ", hitReceivedEffect.hp_boost_min, true, item.writable, listener);
hitReceivedHPMax = addIntegerField(hitReceivedEffectPane, "Player HP bonus max: ", hitReceivedEffect.hp_boost_max, true, item.writable, listener); hitReceivedHPMax = addIntegerField(hitReceivedEffectPane, "Player HP bonus max: ", hitReceivedEffect.hp_boost_max, true, item.writable, listener);
hitReceivedAPMin = addIntegerField(hitReceivedEffectPane, "Player AP bonus min: ", hitReceivedEffect.ap_boost_min, true, item.writable, listener); hitReceivedAPMin = addIntegerField(hitReceivedEffectPane, "Player AP bonus min: ", hitReceivedEffect.ap_boost_min, true, item.writable, listener);
@@ -513,116 +369,48 @@ public class ItemEditor extends JSONElementEditor {
hitReceivedHPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus max: ", hitReceivedEffect.hp_boost_max_target, true, item.writable, listener); hitReceivedHPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus max: ", hitReceivedEffect.hp_boost_max_target, true, item.writable, listener);
hitReceivedAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, item.writable, listener); hitReceivedAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, item.writable, listener);
hitReceivedAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, item.writable, listener); hitReceivedAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, item.writable, listener);
final CollapsiblePanel hitReceivedSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the player: "); String hitReceivedSourceTitle = "Actor Conditions applied to the player: ";
hitReceivedSourceConditionsPane.setLayout(new JideBoxLayout(hitReceivedSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitReceivedSourceCellRenderer = new TimedConditionsCellRenderer();
hitReceivedSourceConditionsModel = new SourceTimedConditionsListModel(hitReceivedEffect); hitReceivedSourceConditionsModel = new SourceTimedConditionsListModel(hitReceivedEffect);
hitReceivedSourceConditionsList = new JList(hitReceivedSourceConditionsModel); final boolean hitReceivedSourceMoveUpDownEnabled = false;
hitReceivedSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitReceivedSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> listPanel1 = CommonEditor.createListPanel(
hitReceivedSourceConditionsPane.add(new JScrollPane(hitReceivedSourceConditionsList), JideBoxLayout.FIX); hitReceivedSourceTitle,
final JPanel hitReceivedSourceTimedConditionsEditorPane = new JPanel(); hitReceivedSourceCellRenderer,
final JButton createHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitReceivedSourceConditionsModel,
final JButton deleteHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); item.writable,
hitReceivedSourceConditionsList.addListSelectionListener(new ListSelectionListener() { hitReceivedSourceMoveUpDownEnabled,
@Override (e) -> selectedHitReceivedEffectSourceCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitReceivedEffectSourceCondition,
selectedHitReceivedEffectSourceCondition = (Item.TimedConditionEffect) hitReceivedSourceConditionsList.getSelectedValue(); this::updateHitReceivedSourceTimedConditionEditorPane,
updateHitReceivedSourceTimedConditionEditorPane(hitReceivedSourceTimedConditionsEditorPane, selectedHitReceivedEffectSourceCondition, listener); listener,
if (selectedHitReceivedEffectSourceCondition == null) { Common.TimedConditionEffect::new);
deleteHitReceivedSourceCondition.setEnabled(false); final CollapsiblePanel hitReceivedSourceConditionsPane = listPanel1.panel;
} else { hitReceivedSourceConditionsList = listPanel1.list;
deleteHitReceivedSourceCondition.setEnabled(true);
}
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitReceivedSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Item.TimedConditionEffect condition = new Item.TimedConditionEffect();
hitReceivedSourceConditionsModel.addItem(condition);
hitReceivedSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitReceivedSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitReceivedEffectSourceCondition != null) {
hitReceivedSourceConditionsModel.removeItem(selectedHitReceivedEffectSourceCondition);
selectedHitReceivedEffectSourceCondition = null;
hitReceivedSourceConditionsList.clearSelection();
listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitReceivedSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitReceivedSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitReceivedSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitReceivedSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitReceivedSourceConditionsPane.add(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.FIX);
if (item.hit_received_effect == null || item.hit_received_effect.conditions_source == null || item.hit_received_effect.conditions_source.isEmpty()) { if (item.hit_received_effect == null || item.hit_received_effect.conditions_source == null || item.hit_received_effect.conditions_source.isEmpty()) {
hitReceivedSourceConditionsPane.collapse(); hitReceivedSourceConditionsPane.collapse();
} }
hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX); hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX);
final CollapsiblePanel hitReceivedTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the attacker: "); String hitReceivedTargetTitle = "Actor Conditions applied to the attacker: ";
hitReceivedTargetConditionsPane.setLayout(new JideBoxLayout(hitReceivedTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitReceivedTargetCellRenderer = new TimedConditionsCellRenderer();
hitReceivedTargetConditionsModel = new TargetTimedConditionsListModel(hitReceivedEffect); hitReceivedTargetConditionsModel = new TargetTimedConditionsListModel(hitReceivedEffect);
hitReceivedTargetConditionsList = new JList(hitReceivedTargetConditionsModel); final boolean hitReceivedTargetMoveUpDownEnabled = false;
hitReceivedTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitReceivedTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitReceivedTargetResult = CommonEditor.createListPanel(
hitReceivedTargetConditionsPane.add(new JScrollPane(hitReceivedTargetConditionsList), JideBoxLayout.FIX); hitReceivedTargetTitle,
final JPanel hitReceivedTargetTimedConditionsEditorPane = new JPanel(); hitReceivedTargetCellRenderer,
final JButton createHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitReceivedTargetConditionsModel,
final JButton deleteHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); item.writable,
hitReceivedTargetConditionsList.addListSelectionListener(new ListSelectionListener() { hitReceivedTargetMoveUpDownEnabled,
@Override (e) -> selectedHitReceivedEffectTargetCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitReceivedEffectTargetCondition,
selectedHitReceivedEffectTargetCondition = (Item.TimedConditionEffect) hitReceivedTargetConditionsList.getSelectedValue(); this::updateHitReceivedTargetTimedConditionEditorPane,
updateHitReceivedTargetTimedConditionEditorPane(hitReceivedTargetTimedConditionsEditorPane, selectedHitReceivedEffectTargetCondition, listener); listener,
if (selectedHitReceivedEffectTargetCondition == null) { Common.TimedConditionEffect::new);
deleteHitReceivedTargetCondition.setEnabled(false); final CollapsiblePanel hitReceivedTargetConditionsPane = hitReceivedTargetResult.panel;
} else { hitReceivedTargetConditionsList = hitReceivedTargetResult.list;
deleteHitReceivedTargetCondition.setEnabled(true);
}
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitReceivedTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Item.TimedConditionEffect condition = new Item.TimedConditionEffect();
hitReceivedTargetConditionsModel.addItem(condition);
hitReceivedTargetConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitReceivedTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitReceivedEffectTargetCondition != null) {
hitReceivedTargetConditionsModel.removeItem(selectedHitReceivedEffectTargetCondition);
selectedHitReceivedEffectTargetCondition = null;
hitReceivedTargetConditionsList.clearSelection();
listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitReceivedTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitReceivedTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitReceivedTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitReceivedTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitReceivedTargetConditionsPane.add(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.FIX);
if (item.hit_received_effect == null || item.hit_received_effect.conditions_target == null || item.hit_received_effect.conditions_target.isEmpty()) { if (item.hit_received_effect == null || item.hit_received_effect.conditions_target == null || item.hit_received_effect.conditions_target.isEmpty()) {
hitReceivedTargetConditionsPane.collapse(); hitReceivedTargetConditionsPane.collapse();
} }
@@ -655,7 +443,7 @@ public class ItemEditor extends JSONElementEditor {
} }
public void updateHitSourceTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, final FieldUpdateListener listener) { public void updateHitSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (hitSourceConditionBox != null) { if (hitSourceConditionBox != null) {
removeElementListener(hitSourceConditionBox); removeElementListener(hitSourceConditionBox);
@@ -666,8 +454,8 @@ public class ItemEditor extends JSONElementEditor {
return; return;
} }
boolean writable = ((Item)target).writable; boolean writable = target.writable;
Project proj = ((Item)target).getProject(); Project proj = target.getProject();
hitSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); hitSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener);
hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener);
@@ -733,7 +521,7 @@ public class ItemEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateHitSourceTimedConditionWidgets(Item.TimedConditionEffect condition) { public void updateHitSourceTimedConditionWidgets(Common.TimedConditionEffect condition) {
boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE);
boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE);
@@ -751,7 +539,7 @@ public class ItemEditor extends JSONElementEditor {
hitSourceConditionForever.setEnabled(!clear); hitSourceConditionForever.setEnabled(!clear);
} }
public void updateHitTargetTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, final FieldUpdateListener listener) { public void updateHitTargetTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (hitTargetConditionBox != null) { if (hitTargetConditionBox != null) {
removeElementListener(hitTargetConditionBox); removeElementListener(hitTargetConditionBox);
@@ -762,8 +550,8 @@ public class ItemEditor extends JSONElementEditor {
return; return;
} }
boolean writable = ((Item)target).writable; boolean writable = target.writable;
Project proj = ((Item)target).getProject(); Project proj = target.getProject();
hitTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); hitTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener);
hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener);
@@ -829,7 +617,7 @@ public class ItemEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateHitTargetTimedConditionWidgets(Item.TimedConditionEffect condition) { public void updateHitTargetTimedConditionWidgets(Common.TimedConditionEffect condition) {
boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE);
boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE);
@@ -847,7 +635,7 @@ public class ItemEditor extends JSONElementEditor {
hitTargetConditionForever.setEnabled(!clear); hitTargetConditionForever.setEnabled(!clear);
} }
public void updateKillSourceTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, final FieldUpdateListener listener) { public void updateKillSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (killSourceConditionBox != null) { if (killSourceConditionBox != null) {
removeElementListener(killSourceConditionBox); removeElementListener(killSourceConditionBox);
@@ -925,7 +713,7 @@ public class ItemEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateKillSourceTimedConditionWidgets(Item.TimedConditionEffect condition) { public void updateKillSourceTimedConditionWidgets(Common.TimedConditionEffect condition) {
boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE);
boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE);
@@ -943,7 +731,7 @@ public class ItemEditor extends JSONElementEditor {
killSourceConditionForever.setEnabled(!clear); killSourceConditionForever.setEnabled(!clear);
} }
public void updateEquipConditionEditorPane(JPanel pane, Item.ConditionEffect condition, final FieldUpdateListener listener) { public void updateEquipConditionEditorPane(JPanel pane, Common.ConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (equipConditionBox != null) { if (equipConditionBox != null) {
removeElementListener(equipConditionBox); removeElementListener(equipConditionBox);
@@ -991,7 +779,7 @@ public class ItemEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateHitReceivedSourceTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, final FieldUpdateListener listener) { public void updateHitReceivedSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (hitReceivedSourceConditionBox != null) { if (hitReceivedSourceConditionBox != null) {
removeElementListener(hitReceivedSourceConditionBox); removeElementListener(hitReceivedSourceConditionBox);
@@ -1069,7 +857,7 @@ public class ItemEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateHitReceivedSourceTimedConditionWidgets(Item.TimedConditionEffect condition) { public void updateHitReceivedSourceTimedConditionWidgets(Common.TimedConditionEffect condition) {
boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE);
boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE);
@@ -1087,7 +875,7 @@ public class ItemEditor extends JSONElementEditor {
hitReceivedSourceConditionForever.setEnabled(!clear); hitReceivedSourceConditionForever.setEnabled(!clear);
} }
public void updateHitReceivedTargetTimedConditionEditorPane(JPanel pane, Item.TimedConditionEffect condition, final FieldUpdateListener listener) { public void updateHitReceivedTargetTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (hitReceivedTargetConditionBox != null) { if (hitReceivedTargetConditionBox != null) {
removeElementListener(hitReceivedTargetConditionBox); removeElementListener(hitReceivedTargetConditionBox);
@@ -1165,7 +953,7 @@ public class ItemEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateHitReceivedTargetTimedConditionWidgets(Item.TimedConditionEffect condition) { public void updateHitReceivedTargetTimedConditionWidgets(Common.TimedConditionEffect condition) {
boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE);
boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE);
@@ -1184,129 +972,41 @@ public class ItemEditor extends JSONElementEditor {
} }
public static class SourceTimedConditionsListModel implements ListModel<Item.TimedConditionEffect> { public static class SourceTimedConditionsListModel extends CommonEditor.AtListModel<Common.TimedConditionEffect, Common.DeathEffect> {
Item.KillEffect source; public SourceTimedConditionsListModel(Common.DeathEffect effect) {
super(effect);
public SourceTimedConditionsListModel(Item.KillEffect effect) {
this.source = effect;;
} }
@Override @Override
public int getSize() { protected List<Common.TimedConditionEffect> getInner() {
if (source.conditions_source == null) return 0; return source.conditions_source;
return source.conditions_source.size();
} }
@Override @Override
public Item.TimedConditionEffect getElementAt(int index) { protected void setInner(List<Common.TimedConditionEffect> value) {
if (source.conditions_source == null) return null; source.conditions_source = value;
return source.conditions_source.get(index);
} }
public void addItem(Item.TimedConditionEffect item) { }
if (source.conditions_source == null) {
source.conditions_source = new ArrayList<Item.TimedConditionEffect>();
}
source.conditions_source.add(item);
int index = source.conditions_source.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Item.TimedConditionEffect item) { public static class TargetTimedConditionsListModel extends CommonEditor.AtListModel<Common.TimedConditionEffect, Common.HitEffect> {
int index = source.conditions_source.indexOf(item);
source.conditions_source.remove(item);
if (source.conditions_source.isEmpty()) {
source.conditions_source = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Item.TimedConditionEffect item) { public TargetTimedConditionsListModel(Common.HitEffect effect) {
int index = source.conditions_source.indexOf(item); super(effect);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
} }
@Override @Override
public void removeListDataListener(ListDataListener l) { protected List<Common.TimedConditionEffect> getInner() {
listeners.remove(l); return source.conditions_target;
}
}
public static class TargetTimedConditionsListModel implements ListModel<Item.TimedConditionEffect> {
Item.HitEffect source;
public TargetTimedConditionsListModel(Item.HitEffect effect) {
this.source = effect;;
} }
@Override @Override
public int getSize() { protected void setInner(List<Common.TimedConditionEffect> value) {
if (source.conditions_target == null) return 0; source.conditions_target = value;
return source.conditions_target.size();
} }
@Override }
public Item.TimedConditionEffect getElementAt(int index) {
if (source.conditions_target == null) return null;
return source.conditions_target.get(index);
}
public void addItem(Item.TimedConditionEffect item) {
if (source.conditions_target == null) {
source.conditions_target = new ArrayList<Item.TimedConditionEffect>();
}
source.conditions_target.add(item);
int index = source.conditions_target.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Item.TimedConditionEffect item) {
int index = source.conditions_target.indexOf(item);
source.conditions_target.remove(item);
if (source.conditions_target.isEmpty()) {
source.conditions_target = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Item.TimedConditionEffect item) {
int index = source.conditions_target.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class TimedConditionsCellRenderer extends DefaultListCellRenderer { public static class TimedConditionsCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;
@@ -1316,7 +1016,7 @@ public class ItemEditor extends JSONElementEditor {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (c instanceof JLabel) { if (c instanceof JLabel) {
JLabel label = ((JLabel)c); JLabel label = ((JLabel)c);
Item.TimedConditionEffect effect = (Item.TimedConditionEffect) value; Common.TimedConditionEffect effect = (Common.TimedConditionEffect) value;
if (effect.condition != null) { if (effect.condition != null) {
@@ -1342,67 +1042,22 @@ public class ItemEditor extends JSONElementEditor {
} }
} }
public static class ConditionsListModel implements ListModel<Item.ConditionEffect> { public static class ConditionsListModel extends CommonEditor.AtListModel<Common.ConditionEffect, Item.EquipEffect> {
Item.EquipEffect source;
public ConditionsListModel(Item.EquipEffect equipEffect) { public ConditionsListModel(Item.EquipEffect equipEffect) {
this.source = equipEffect; super(equipEffect);
} }
@Override @Override
public int getSize() { protected List<Common.ConditionEffect> getInner() {
if (source.conditions == null) return 0; return source.conditions;
return source.conditions.size();
} }
@Override @Override
public Item.ConditionEffect getElementAt(int index) { protected void setInner(List<Common.ConditionEffect> value) {
if (source.conditions == null) return null; source.conditions = value;
return source.conditions.get(index);
} }
}
public void addItem(Item.ConditionEffect item) {
if (source.conditions == null) {
source.conditions = new ArrayList<Item.ConditionEffect>();
}
source.conditions.add(item);
int index = source.conditions.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Item.ConditionEffect item) {
int index = source.conditions.indexOf(item);
source.conditions.remove(item);
if (source.conditions.isEmpty()) {
source.conditions = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Item.ConditionEffect item) {
int index = source.conditions.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class ConditionsCellRenderer extends DefaultListCellRenderer { public static class ConditionsCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;
@@ -1412,7 +1067,7 @@ public class ItemEditor extends JSONElementEditor {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (c instanceof JLabel) { if (c instanceof JLabel) {
JLabel label = ((JLabel)c); JLabel label = ((JLabel)c);
Item.ConditionEffect effect = (Item.ConditionEffect) value; Common.ConditionEffect effect = (Common.ConditionEffect) value;
if (effect.condition != null) { if (effect.condition != null) {
if (effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) { if (effect.magnitude == ActorCondition.MAGNITUDE_CLEAR) {
@@ -1450,7 +1105,7 @@ public class ItemEditor extends JSONElementEditor {
} }
public static boolean isNull(Item.HitEffect effect) { public static boolean isNull(Common.HitEffect effect) {
if (effect.ap_boost_min != null) return false; if (effect.ap_boost_min != null) return false;
if (effect.ap_boost_max != null) return false; if (effect.ap_boost_max != null) return false;
if (effect.hp_boost_min != null) return false; if (effect.hp_boost_min != null) return false;
@@ -1461,7 +1116,7 @@ public class ItemEditor extends JSONElementEditor {
} }
public static boolean isNull(Item.KillEffect effect) { public static boolean isNull(Common.DeathEffect effect) {
if (effect.ap_boost_min != null) return false; if (effect.ap_boost_min != null) return false;
if (effect.ap_boost_max != null) return false; if (effect.ap_boost_max != null) return false;
if (effect.hp_boost_min != null) return false; if (effect.hp_boost_min != null) return false;
@@ -1470,7 +1125,7 @@ public class ItemEditor extends JSONElementEditor {
return true; return true;
} }
public static boolean isNull(Item.HitReceivedEffect effect) { public static boolean isNull(Common.HitReceivedEffect effect) {
if (effect.ap_boost_min != null) return false; if (effect.ap_boost_min != null) return false;
if (effect.ap_boost_max != null) return false; if (effect.ap_boost_max != null) return false;
if (effect.hp_boost_min != null) return false; if (effect.hp_boost_min != null) return false;

View File

@@ -6,7 +6,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.ButtonGroup; import javax.swing.ButtonGroup;
import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListCellRenderer;
@@ -18,24 +17,14 @@ import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JRadioButton; import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.GameDataElement;
import com.gpl.rpg.atcontentstudio.model.Project; import com.gpl.rpg.atcontentstudio.model.Project;
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition; import com.gpl.rpg.atcontentstudio.model.gamedata.*;
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet; import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel; import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel;
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons; import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
@@ -43,6 +32,7 @@ import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox; import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox;
import com.gpl.rpg.atcontentstudio.ui.OverlayIcon; import com.gpl.rpg.atcontentstudio.ui.OverlayIcon;
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView; import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideBoxLayout;
public class NPCEditor extends JSONElementEditor { public class NPCEditor extends JSONElementEditor {
@@ -53,11 +43,11 @@ public class NPCEditor extends JSONElementEditor {
private static final String json_view_id = "JSON"; private static final String json_view_id = "JSON";
private static final String dialogue_tree_id = "Dialogue Tree"; private static final String dialogue_tree_id = "Dialogue Tree";
private NPC.TimedConditionEffect selectedHitEffectSourceCondition; private Common.TimedConditionEffect selectedHitEffectSourceCondition;
private NPC.TimedConditionEffect selectedHitEffectTargetCondition; private Common.TimedConditionEffect selectedHitEffectTargetCondition;
private NPC.TimedConditionEffect selectedHitReceivedEffectSourceCondition; private Common.TimedConditionEffect selectedHitReceivedEffectSourceCondition;
private NPC.TimedConditionEffect selectedHitReceivedEffectTargetCondition; private Common.TimedConditionEffect selectedHitReceivedEffectTargetCondition;
private NPC.TimedConditionEffect selectedDeathEffectSourceCondition; private Common.TimedConditionEffect selectedDeathEffectSourceCondition;
private JButton npcIcon; private JButton npcIcon;
private JTextField idField; private JTextField idField;
@@ -86,7 +76,7 @@ public class NPCEditor extends JSONElementEditor {
private JSpinner blockChance; private JSpinner blockChance;
private JSpinner dmgRes; private JSpinner dmgRes;
private NPC.HitEffect hitEffect; private Common.HitEffect hitEffect;
private CollapsiblePanel hitEffectPane; private CollapsiblePanel hitEffectPane;
private JSpinner hitEffectHPMin; private JSpinner hitEffectHPMin;
private JSpinner hitEffectHPMax; private JSpinner hitEffectHPMax;
@@ -119,7 +109,7 @@ public class NPCEditor extends JSONElementEditor {
private JRadioButton hitTargetConditionForever; private JRadioButton hitTargetConditionForever;
private JSpinner hitTargetConditionDuration; private JSpinner hitTargetConditionDuration;
private NPC.HitReceivedEffect hitReceivedEffect; private Common.HitReceivedEffect hitReceivedEffect;
private CollapsiblePanel hitReceivedEffectPane; private CollapsiblePanel hitReceivedEffectPane;
private JSpinner hitReceivedEffectHPMin; private JSpinner hitReceivedEffectHPMin;
private JSpinner hitReceivedEffectHPMax; private JSpinner hitReceivedEffectHPMax;
@@ -156,7 +146,7 @@ public class NPCEditor extends JSONElementEditor {
private JRadioButton hitReceivedTargetConditionForever; private JRadioButton hitReceivedTargetConditionForever;
private JSpinner hitReceivedTargetConditionDuration; private JSpinner hitReceivedTargetConditionDuration;
private NPC.DeathEffect deathEffect; private Common.DeathEffect deathEffect;
private CollapsiblePanel deathEffectPane; private CollapsiblePanel deathEffectPane;
private JSpinner deathEffectHPMin; private JSpinner deathEffectHPMin;
private JSpinner deathEffectHPMax; private JSpinner deathEffectHPMax;
@@ -270,7 +260,7 @@ public class NPCEditor extends JSONElementEditor {
hitEffectPane = new CollapsiblePanel("Effect on every hit: "); hitEffectPane = new CollapsiblePanel("Effect on every hit: ");
hitEffectPane.setLayout(new JideBoxLayout(hitEffectPane, JideBoxLayout.PAGE_AXIS)); hitEffectPane.setLayout(new JideBoxLayout(hitEffectPane, JideBoxLayout.PAGE_AXIS));
if (npc.hit_effect == null) { if (npc.hit_effect == null) {
hitEffect = new NPC.HitEffect(); hitEffect = new Common.HitEffect();
} else { } else {
hitEffect = npc.hit_effect; hitEffect = npc.hit_effect;
} }
@@ -279,106 +269,48 @@ public class NPCEditor extends JSONElementEditor {
hitEffectAPMin = addIntegerField(hitEffectPane, "AP bonus min: ", hitEffect.ap_boost_min, true, npc.writable, listener); hitEffectAPMin = addIntegerField(hitEffectPane, "AP bonus min: ", hitEffect.ap_boost_min, true, npc.writable, listener);
hitEffectAPMax = addIntegerField(hitEffectPane, "AP bonus max: ", hitEffect.ap_boost_max, true, npc.writable, listener); hitEffectAPMax = addIntegerField(hitEffectPane, "AP bonus max: ", hitEffect.ap_boost_max, true, npc.writable, listener);
CollapsiblePanel hitSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: "); String hitSourceTitle = "Actor Conditions applied to the source: ";
hitSourceConditionsPane.setLayout(new JideBoxLayout(hitSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitSourceCellRenderer = new TimedConditionsCellRenderer();
hitSourceConditionsListModel = new SourceTimedConditionsListModel(hitEffect); hitSourceConditionsListModel = new SourceTimedConditionsListModel(hitEffect);
hitSourceConditionsList = new JList(hitSourceConditionsListModel); final boolean hitSourceMoveUpDownEnabled = false;
hitSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitSourceResult = CommonEditor.createListPanel(
hitSourceConditionsPane.add(new JScrollPane(hitSourceConditionsList), JideBoxLayout.FIX); hitSourceTitle,
final JPanel hitSourceTimedConditionsEditorPane = new JPanel(); hitSourceCellRenderer,
final JButton createHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitSourceConditionsListModel,
final JButton deleteHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); npc.writable,
hitSourceConditionsList.addListSelectionListener(new ListSelectionListener() { hitSourceMoveUpDownEnabled,
@Override (e) -> selectedHitEffectSourceCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitEffectSourceCondition,
selectedHitEffectSourceCondition = (NPC.TimedConditionEffect) hitSourceConditionsList.getSelectedValue(); this::updateHitSourceTimedConditionEditorPane,
updateHitSourceTimedConditionEditorPane(hitSourceTimedConditionsEditorPane, selectedHitEffectSourceCondition, listener); listener,
} Common.TimedConditionEffect::new);
}); CollapsiblePanel hitSourceConditionsPane = hitSourceResult.panel;
if (npc.writable) { hitSourceConditionsList = hitSourceResult.list;
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
NPC.TimedConditionEffect condition = new NPC.TimedConditionEffect();
hitSourceConditionsListModel.addItem(condition);
hitSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitEffectSourceCondition != null) {
hitSourceConditionsListModel.removeItem(selectedHitEffectSourceCondition);
selectedHitEffectSourceCondition = null;
hitSourceConditionsList.clearSelection();
listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitSourceConditionsPane.add(hitSourceTimedConditionsEditorPane, JideBoxLayout.FIX);
if (npc.hit_effect == null || npc.hit_effect.conditions_source == null || npc.hit_effect.conditions_source.isEmpty()) { if (npc.hit_effect == null || npc.hit_effect.conditions_source == null || npc.hit_effect.conditions_source.isEmpty()) {
hitSourceConditionsPane.collapse(); hitSourceConditionsPane.collapse();
} }
hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX); hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX);
final CollapsiblePanel hitTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the target: "); String hitTargetTitle = "Actor Conditions applied to the target: ";
hitTargetConditionsPane.setLayout(new JideBoxLayout(hitTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitTargetCellRenderer = new TimedConditionsCellRenderer();
hitTargetConditionsListModel = new TargetTimedConditionsListModel(hitEffect); hitTargetConditionsListModel = new TargetTimedConditionsListModel(hitEffect);
hitTargetConditionsList = new JList(hitTargetConditionsListModel); final boolean hitTargetMoveUpDownEnabled = false;
hitTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitTargetResult = CommonEditor.createListPanel(
hitTargetConditionsPane.add(new JScrollPane(hitTargetConditionsList), JideBoxLayout.FIX); hitTargetTitle,
final JPanel hitTargetTimedConditionsEditorPane = new JPanel(); hitTargetCellRenderer,
final JButton createHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitTargetConditionsListModel,
final JButton deleteHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); npc.writable,
hitTargetConditionsList.addListSelectionListener(new ListSelectionListener() { hitTargetMoveUpDownEnabled,
@Override (e) -> selectedHitEffectTargetCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitEffectTargetCondition,
selectedHitEffectTargetCondition = (NPC.TimedConditionEffect) hitTargetConditionsList.getSelectedValue(); this::updateHitTargetTimedConditionEditorPane,
updateHitTargetTimedConditionEditorPane(hitTargetTimedConditionsEditorPane, selectedHitEffectTargetCondition, listener); listener,
} Common.TimedConditionEffect::new);
}); CollapsiblePanel hitTargetConditionsPane = hitTargetResult.panel;
if (npc.writable) { hitTargetConditionsList = hitTargetResult.list;
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
NPC.TimedConditionEffect condition = new NPC.TimedConditionEffect();
hitTargetConditionsListModel.addItem(condition);
hitTargetConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitEffectTargetCondition != null) {
hitTargetConditionsListModel.removeItem(selectedHitEffectTargetCondition);
selectedHitEffectTargetCondition = null;
hitTargetConditionsList.clearSelection();
listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitTargetConditionsPane.add(hitTargetTimedConditionsEditorPane, JideBoxLayout.FIX);
hitEffectPane.add(hitTargetConditionsPane, JideBoxLayout.FIX); hitEffectPane.add(hitTargetConditionsPane, JideBoxLayout.FIX);
if (npc.hit_effect == null || npc.hit_effect.conditions_target == null || npc.hit_effect.conditions_target.isEmpty()) { if (npc.hit_effect == null || npc.hit_effect.conditions_target == null || npc.hit_effect.conditions_target.isEmpty()) {
hitTargetConditionsPane.collapse(); hitTargetConditionsPane.collapse();
@@ -388,7 +320,7 @@ public class NPCEditor extends JSONElementEditor {
hitReceivedEffectPane = new CollapsiblePanel("Effect on every hit received: "); hitReceivedEffectPane = new CollapsiblePanel("Effect on every hit received: ");
hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS)); hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS));
if (npc.hit_received_effect == null) { if (npc.hit_received_effect == null) {
hitReceivedEffect = new NPC.HitReceivedEffect(); hitReceivedEffect = new Common.HitReceivedEffect();
} else { } else {
hitReceivedEffect = npc.hit_received_effect; hitReceivedEffect = npc.hit_received_effect;
} }
@@ -401,106 +333,48 @@ public class NPCEditor extends JSONElementEditor {
hitReceivedEffectAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, npc.writable, listener); hitReceivedEffectAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, npc.writable, listener);
hitReceivedEffectAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, npc.writable, listener); hitReceivedEffectAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, npc.writable, listener);
CollapsiblePanel hitReceivedSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to this NPC: "); String hitReceivedSourceTitle = "Actor Conditions applied to this NPC: ";
hitReceivedSourceConditionsPane.setLayout(new JideBoxLayout(hitReceivedSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitReceivedSourceCellRenderer = new TimedConditionsCellRenderer();
hitReceivedSourceConditionsListModel = new SourceTimedConditionsListModel(hitReceivedEffect); hitReceivedSourceConditionsListModel = new SourceTimedConditionsListModel(hitReceivedEffect);
hitReceivedSourceConditionsList = new JList(hitReceivedSourceConditionsListModel); final boolean hitReceivedSourceMoveUpDownEnabled = false;
hitReceivedSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitReceivedSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitReceivedSourceResult = CommonEditor.createListPanel(
hitReceivedSourceConditionsPane.add(new JScrollPane(hitReceivedSourceConditionsList), JideBoxLayout.FIX); hitReceivedSourceTitle,
final JPanel hitReceivedSourceTimedConditionsEditorPane = new JPanel(); hitReceivedSourceCellRenderer,
final JButton createHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitReceivedSourceConditionsListModel,
final JButton deleteHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); npc.writable,
hitReceivedSourceConditionsList.addListSelectionListener(new ListSelectionListener() { hitReceivedSourceMoveUpDownEnabled,
@Override (e) -> selectedHitReceivedEffectSourceCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitReceivedEffectSourceCondition,
selectedHitReceivedEffectSourceCondition = (NPC.TimedConditionEffect) hitReceivedSourceConditionsList.getSelectedValue(); this::updateHitReceivedSourceTimedConditionEditorPane,
updateHitReceivedSourceTimedConditionEditorPane(hitReceivedSourceTimedConditionsEditorPane, selectedHitReceivedEffectSourceCondition, listener); listener,
} Common.TimedConditionEffect::new);
}); CollapsiblePanel hitReceivedSourceConditionsPane = hitReceivedSourceResult.panel;
if (npc.writable) { hitReceivedSourceConditionsList = hitReceivedSourceResult.list;
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitReceivedSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
NPC.TimedConditionEffect condition = new NPC.TimedConditionEffect();
hitReceivedSourceConditionsListModel.addItem(condition);
hitReceivedSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitReceivedSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitReceivedEffectSourceCondition != null) {
hitReceivedSourceConditionsListModel.removeItem(selectedHitReceivedEffectSourceCondition);
selectedHitReceivedEffectSourceCondition = null;
hitReceivedSourceConditionsList.clearSelection();
listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitReceivedSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitReceivedSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitReceivedSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitReceivedSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitReceivedSourceConditionsPane.add(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.FIX);
if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_source == null || npc.hit_received_effect.conditions_source.isEmpty()) { if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_source == null || npc.hit_received_effect.conditions_source.isEmpty()) {
hitReceivedSourceConditionsPane.collapse(); hitReceivedSourceConditionsPane.collapse();
} }
hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX); hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX);
final CollapsiblePanel hitReceivedTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the attacker: "); String hitReceivedTargetTitle = "Actor Conditions applied to the attacker: ";
hitReceivedTargetConditionsPane.setLayout(new JideBoxLayout(hitReceivedTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitReceivedTargetCellRenderer = new TimedConditionsCellRenderer();
hitReceivedTargetConditionsListModel = new TargetTimedConditionsListModel(hitReceivedEffect); hitReceivedTargetConditionsListModel = new TargetTimedConditionsListModel(hitReceivedEffect);
hitReceivedTargetConditionsList = new JList(hitReceivedTargetConditionsListModel); final boolean hitReceivedTargetMoveUpDownEnabled = false;
hitReceivedTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitReceivedTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitReceivedTargetResult = CommonEditor.createListPanel(
hitReceivedTargetConditionsPane.add(new JScrollPane(hitReceivedTargetConditionsList), JideBoxLayout.FIX); hitReceivedTargetTitle,
final JPanel hitReceivedTargetTimedConditionsEditorPane = new JPanel(); hitReceivedTargetCellRenderer,
final JButton createHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitReceivedTargetConditionsListModel,
final JButton deleteHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); npc.writable,
hitReceivedTargetConditionsList.addListSelectionListener(new ListSelectionListener() { hitReceivedTargetMoveUpDownEnabled,
@Override (e) -> selectedHitReceivedEffectTargetCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitReceivedEffectTargetCondition,
selectedHitReceivedEffectTargetCondition = (NPC.TimedConditionEffect) hitReceivedTargetConditionsList.getSelectedValue(); this::updateHitReceivedTargetTimedConditionEditorPane,
updateHitReceivedTargetTimedConditionEditorPane(hitReceivedTargetTimedConditionsEditorPane, selectedHitReceivedEffectTargetCondition, listener); listener,
} Common.TimedConditionEffect::new);
}); final CollapsiblePanel hitReceivedTargetConditionsPane = hitReceivedTargetResult.panel;
if (npc.writable) { hitReceivedTargetConditionsList = hitReceivedTargetResult.list;
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitReceivedTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
NPC.TimedConditionEffect condition = new NPC.TimedConditionEffect();
hitReceivedTargetConditionsListModel.addItem(condition);
hitReceivedTargetConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitReceivedTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitReceivedEffectTargetCondition != null) {
hitReceivedTargetConditionsListModel.removeItem(selectedHitReceivedEffectTargetCondition);
selectedHitReceivedEffectTargetCondition = null;
hitReceivedTargetConditionsList.clearSelection();
listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitReceivedTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitReceivedTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitReceivedTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitReceivedTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitReceivedTargetConditionsPane.add(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.FIX);
hitReceivedEffectPane.add(hitReceivedTargetConditionsPane, JideBoxLayout.FIX); hitReceivedEffectPane.add(hitReceivedTargetConditionsPane, JideBoxLayout.FIX);
if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_target == null || npc.hit_received_effect.conditions_target.isEmpty()) { if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_target == null || npc.hit_received_effect.conditions_target.isEmpty()) {
hitReceivedTargetConditionsPane.collapse(); hitReceivedTargetConditionsPane.collapse();
@@ -510,7 +384,7 @@ public class NPCEditor extends JSONElementEditor {
deathEffectPane = new CollapsiblePanel("Effect when killed: "); deathEffectPane = new CollapsiblePanel("Effect when killed: ");
deathEffectPane.setLayout(new JideBoxLayout(deathEffectPane, JideBoxLayout.PAGE_AXIS)); deathEffectPane.setLayout(new JideBoxLayout(deathEffectPane, JideBoxLayout.PAGE_AXIS));
if (npc.death_effect == null) { if (npc.death_effect == null) {
deathEffect = new NPC.DeathEffect(); deathEffect = new Common.DeathEffect();
} else { } else {
deathEffect = npc.death_effect; deathEffect = npc.death_effect;
} }
@@ -519,54 +393,25 @@ public class NPCEditor extends JSONElementEditor {
deathEffectAPMin = addIntegerField(deathEffectPane, "Killer AP bonus min: ", deathEffect.ap_boost_min, true, npc.writable, listener); deathEffectAPMin = addIntegerField(deathEffectPane, "Killer AP bonus min: ", deathEffect.ap_boost_min, true, npc.writable, listener);
deathEffectAPMax = addIntegerField(deathEffectPane, "Killer AP bonus max: ", deathEffect.ap_boost_max, true, npc.writable, listener); deathEffectAPMax = addIntegerField(deathEffectPane, "Killer AP bonus max: ", deathEffect.ap_boost_max, true, npc.writable, listener);
CollapsiblePanel deathSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the killer: "); String deathSourceTitle = "Actor Conditions applied to the killer: ";
deathSourceConditionsPane.setLayout(new JideBoxLayout(deathSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer deathSourceCellRenderer = new TimedConditionsCellRenderer();
deathSourceConditionsListModel = new SourceTimedConditionsListModel(deathEffect); deathSourceConditionsListModel = new SourceTimedConditionsListModel(deathEffect);
deathSourceConditionsList = new JList(deathSourceConditionsListModel); final boolean deathSourceMoveUpDownEnabled = false;
deathSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
deathSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> deathSourceResult = CommonEditor.createListPanel(
deathSourceConditionsPane.add(new JScrollPane(deathSourceConditionsList), JideBoxLayout.FIX); deathSourceTitle,
final JPanel deathSourceTimedConditionsEditorPane = new JPanel(); deathSourceCellRenderer,
final JButton createDeathSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); deathSourceConditionsListModel,
final JButton deleteDeathSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); npc.writable,
deathSourceConditionsList.addListSelectionListener(new ListSelectionListener() { deathSourceMoveUpDownEnabled,
@Override (e) -> selectedDeathEffectSourceCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedDeathEffectSourceCondition,
selectedDeathEffectSourceCondition = (NPC.TimedConditionEffect) deathSourceConditionsList.getSelectedValue(); this::updateDeathSourceTimedConditionEditorPane,
updateDeathSourceTimedConditionEditorPane(deathSourceTimedConditionsEditorPane, selectedDeathEffectSourceCondition, listener); listener,
} Common.TimedConditionEffect::new);
}); CollapsiblePanel deathSourceConditionsPane = deathSourceResult.panel;
if (npc.writable) { deathSourceConditionsList = deathSourceResult.list;
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createDeathSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
NPC.TimedConditionEffect condition = new NPC.TimedConditionEffect();
deathSourceConditionsListModel.addItem(condition);
deathSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(deathSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteDeathSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedDeathEffectSourceCondition != null) {
deathSourceConditionsListModel.removeItem(selectedDeathEffectSourceCondition);
selectedDeathEffectSourceCondition = null;
deathSourceConditionsList.clearSelection();
listener.valueChanged(deathSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createDeathSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteDeathSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
deathSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
deathSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(deathSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
deathSourceConditionsPane.add(deathSourceTimedConditionsEditorPane, JideBoxLayout.FIX);
if (npc.death_effect == null || npc.death_effect.conditions_source == null || npc.death_effect.conditions_source.isEmpty()) { if (npc.death_effect == null || npc.death_effect.conditions_source == null || npc.death_effect.conditions_source.isEmpty()) {
deathSourceConditionsPane.collapse(); deathSourceConditionsPane.collapse();
} }
@@ -577,7 +422,7 @@ public class NPCEditor extends JSONElementEditor {
pane.add(combatTraitPane, JideBoxLayout.FIX); pane.add(combatTraitPane, JideBoxLayout.FIX);
} }
public void updateHitSourceTimedConditionEditorPane(JPanel pane, NPC.TimedConditionEffect condition, final FieldUpdateListener listener) { public void updateHitSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (hitSourceConditionBox != null) { if (hitSourceConditionBox != null) {
removeElementListener(hitSourceConditionBox); removeElementListener(hitSourceConditionBox);
@@ -649,7 +494,7 @@ public class NPCEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateHitSourceTimedConditionWidgets(NPC.TimedConditionEffect condition) { public void updateHitSourceTimedConditionWidgets(Common.TimedConditionEffect condition) {
boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE);
boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE);
@@ -668,7 +513,7 @@ public class NPCEditor extends JSONElementEditor {
} }
public void updateHitTargetTimedConditionEditorPane(JPanel pane, NPC.TimedConditionEffect condition, final FieldUpdateListener listener) { public void updateHitTargetTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (hitTargetConditionBox != null) { if (hitTargetConditionBox != null) {
removeElementListener(hitTargetConditionBox); removeElementListener(hitTargetConditionBox);
@@ -739,7 +584,7 @@ public class NPCEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateHitTargetTimedConditionWidgets(NPC.TimedConditionEffect condition) { public void updateHitTargetTimedConditionWidgets(Common.TimedConditionEffect condition) {
boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE);
boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE);
@@ -758,7 +603,7 @@ public class NPCEditor extends JSONElementEditor {
} }
public void updateHitReceivedSourceTimedConditionEditorPane(JPanel pane, NPC.TimedConditionEffect condition, final FieldUpdateListener listener) { public void updateHitReceivedSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (hitReceivedSourceConditionBox != null) { if (hitReceivedSourceConditionBox != null) {
removeElementListener(hitReceivedSourceConditionBox); removeElementListener(hitReceivedSourceConditionBox);
@@ -830,7 +675,7 @@ public class NPCEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateHitReceivedSourceTimedConditionWidgets(NPC.TimedConditionEffect condition) { public void updateHitReceivedSourceTimedConditionWidgets(Common.TimedConditionEffect condition) {
boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE);
boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE);
@@ -849,7 +694,7 @@ public class NPCEditor extends JSONElementEditor {
} }
public void updateHitReceivedTargetTimedConditionEditorPane(JPanel pane, NPC.TimedConditionEffect condition, final FieldUpdateListener listener) { public void updateHitReceivedTargetTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (hitReceivedTargetConditionBox != null) { if (hitReceivedTargetConditionBox != null) {
removeElementListener(hitReceivedTargetConditionBox); removeElementListener(hitReceivedTargetConditionBox);
@@ -920,7 +765,7 @@ public class NPCEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateHitReceivedTargetTimedConditionWidgets(NPC.TimedConditionEffect condition) { public void updateHitReceivedTargetTimedConditionWidgets(Common.TimedConditionEffect condition) {
boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE);
boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE);
@@ -938,7 +783,7 @@ public class NPCEditor extends JSONElementEditor {
hitReceivedTargetConditionForever.setEnabled(!clear); hitReceivedTargetConditionForever.setEnabled(!clear);
} }
public void updateDeathSourceTimedConditionEditorPane(JPanel pane, NPC.TimedConditionEffect condition, final FieldUpdateListener listener) { public void updateDeathSourceTimedConditionEditorPane(JPanel pane, Common.TimedConditionEffect condition, final FieldUpdateListener listener) {
pane.removeAll(); pane.removeAll();
if (deathSourceConditionBox != null) { if (deathSourceConditionBox != null) {
removeElementListener(deathSourceConditionBox); removeElementListener(deathSourceConditionBox);
@@ -1010,7 +855,7 @@ public class NPCEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public void updateDeathSourceTimedConditionWidgets(NPC.TimedConditionEffect condition) { public void updateDeathSourceTimedConditionWidgets(Common.TimedConditionEffect condition) {
boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE); boolean immunity = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration != null && condition.duration > ActorCondition.DURATION_NONE);
boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE); boolean clear = (condition.magnitude == null || condition.magnitude == ActorCondition.MAGNITUDE_CLEAR) && (condition.duration == null || condition.duration == ActorCondition.DURATION_NONE);
@@ -1028,129 +873,41 @@ public class NPCEditor extends JSONElementEditor {
deathSourceConditionForever.setEnabled(!clear); deathSourceConditionForever.setEnabled(!clear);
} }
public static class TargetTimedConditionsListModel implements ListModel<NPC.TimedConditionEffect> { public static class TargetTimedConditionsListModel extends CommonEditor.AtListModel<Common.TimedConditionEffect, Common.HitEffect> {
NPC.HitEffect source; public TargetTimedConditionsListModel(Common.HitEffect effect) {
super(effect);
public TargetTimedConditionsListModel(NPC.HitEffect effect) {
this.source = effect;
} }
@Override @Override
public int getSize() { protected List<Common.TimedConditionEffect> getInner() {
if (source.conditions_target == null) return 0; return source.conditions_target;
return source.conditions_target.size();
} }
@Override @Override
public NPC.TimedConditionEffect getElementAt(int index) { protected void setInner(List<Common.TimedConditionEffect> value) {
if (source.conditions_target == null) return null; source.conditions_target = value;
return source.conditions_target.get(index);
} }
public void addItem(NPC.TimedConditionEffect item) { }
if (source.conditions_target == null) {
source.conditions_target = new ArrayList<NPC.TimedConditionEffect>();
}
source.conditions_target.add(item);
int index = source.conditions_target.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(NPC.TimedConditionEffect item) { public static class SourceTimedConditionsListModel extends CommonEditor.AtListModel<Common.TimedConditionEffect, Common.DeathEffect> {
int index = source.conditions_target.indexOf(item);
source.conditions_target.remove(item);
if (source.conditions_target.isEmpty()) {
source.conditions_target = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(NPC.TimedConditionEffect item) { public SourceTimedConditionsListModel(Common.DeathEffect effect) {
int index = source.conditions_target.indexOf(item); super(effect);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
} }
@Override @Override
public void removeListDataListener(ListDataListener l) { protected List<Common.TimedConditionEffect> getInner() {
listeners.remove(l); return source.conditions_source;
}
}
public static class SourceTimedConditionsListModel implements ListModel<NPC.TimedConditionEffect> {
NPC.DeathEffect source;
public SourceTimedConditionsListModel(NPC.DeathEffect effect) {
this.source = effect;
} }
@Override @Override
public int getSize() { protected void setInner(List<Common.TimedConditionEffect> value) {
if (source.conditions_source == null) return 0; source.conditions_source = value;
return source.conditions_source.size();
} }
@Override }
public NPC.TimedConditionEffect getElementAt(int index) {
if (source.conditions_source == null) return null;
return source.conditions_source.get(index);
}
public void addItem(NPC.TimedConditionEffect item) {
if (source.conditions_source == null) {
source.conditions_source = new ArrayList<NPC.TimedConditionEffect>();
}
source.conditions_source.add(item);
int index = source.conditions_source.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(NPC.TimedConditionEffect item) {
int index = source.conditions_source.indexOf(item);
source.conditions_source.remove(item);
if (source.conditions_source.isEmpty()) {
source.conditions_source = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(NPC.TimedConditionEffect item) {
int index = source.conditions_source.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class TimedConditionsCellRenderer extends DefaultListCellRenderer { public static class TimedConditionsCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;
@@ -1160,7 +917,7 @@ public class NPCEditor extends JSONElementEditor {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (c instanceof JLabel) { if (c instanceof JLabel) {
JLabel label = ((JLabel)c); JLabel label = ((JLabel)c);
NPC.TimedConditionEffect effect = (NPC.TimedConditionEffect) value; Common.TimedConditionEffect effect = (Common.TimedConditionEffect) value;
if (effect.condition != null) { if (effect.condition != null) {
@@ -1186,7 +943,7 @@ public class NPCEditor extends JSONElementEditor {
} }
} }
public static boolean isNull(NPC.HitEffect effect) { public static boolean isNull(Common.HitEffect effect) {
if (effect.ap_boost_min != null) return false; if (effect.ap_boost_min != null) return false;
if (effect.ap_boost_max != null) return false; if (effect.ap_boost_max != null) return false;
if (effect.hp_boost_min != null) return false; if (effect.hp_boost_min != null) return false;
@@ -1196,7 +953,7 @@ public class NPCEditor extends JSONElementEditor {
return true; return true;
} }
public static boolean isNull(NPC.HitReceivedEffect effect) { public static boolean isNull(Common.HitReceivedEffect effect) {
if (effect.ap_boost_min != null) return false; if (effect.ap_boost_min != null) return false;
if (effect.ap_boost_max != null) return false; if (effect.ap_boost_max != null) return false;
if (effect.hp_boost_min != null) return false; if (effect.hp_boost_min != null) return false;
@@ -1210,7 +967,7 @@ public class NPCEditor extends JSONElementEditor {
return true; return true;
} }
public static boolean isNull(NPC.DeathEffect effect) { public static boolean isNull(Common.DeathEffect effect) {
if (effect.ap_boost_min != null) return false; if (effect.ap_boost_min != null) return false;
if (effect.ap_boost_max != null) return false; if (effect.ap_boost_max != null) return false;
if (effect.hp_boost_min != null) return false; if (effect.hp_boost_min != null) return false;

View File

@@ -1,29 +1,18 @@
package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; package com.gpl.rpg.atcontentstudio.ui.gamedataeditors;
import java.awt.Component; import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextArea; import javax.swing.JTextArea;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.GameDataElement;
@@ -31,9 +20,9 @@ import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
import com.gpl.rpg.atcontentstudio.model.gamedata.Quest; import com.gpl.rpg.atcontentstudio.model.gamedata.Quest;
import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage; import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage;
import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel; import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel;
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox; import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideBoxLayout;
public class QuestEditor extends JSONElementEditor { public class QuestEditor extends JSONElementEditor {
@@ -77,94 +66,26 @@ public class QuestEditor extends JSONElementEditor {
nameField = addTranslatableTextField(pane, "Quest Name: ", quest.name, quest.writable, listener); nameField = addTranslatableTextField(pane, "Quest Name: ", quest.name, quest.writable, listener);
visibleBox = addIntegerBasedCheckBox(pane, "Visible in quest log", quest.visible_in_log, quest.writable, listener); visibleBox = addIntegerBasedCheckBox(pane, "Visible in quest log", quest.visible_in_log, quest.writable, listener);
CollapsiblePanel stagesPane = new CollapsiblePanel("Quest stages: "); String title = "Quest stages: ";
stagesPane.setLayout(new JideBoxLayout(stagesPane, JideBoxLayout.PAGE_AXIS)); StagesCellRenderer cellRenderer = new StagesCellRenderer();
stagesListModel = new StagesListModel(quest); stagesListModel = new StagesListModel(quest);
stagesList = new JList<QuestStage>(stagesListModel); final boolean moveUpDownEnabled = true;
stagesList.setCellRenderer(new StagesCellRenderer());
stagesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
stagesPane.add(new JScrollPane(stagesList), JideBoxLayout.FIX);
final JPanel stagesEditorPane = new JPanel();
final JButton createStage = new JButton(new ImageIcon(DefaultIcons.getCreateIcon()));
final JButton deleteStage = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
final JButton moveStageUp = new JButton(new ImageIcon(DefaultIcons.getArrowUpIcon()));
final JButton moveStageDown = new JButton(new ImageIcon(DefaultIcons.getArrowDownIcon()));
deleteStage.setEnabled(false);
moveStageUp.setEnabled(false);
moveStageDown.setEnabled(false);
stagesList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedStage = (QuestStage) stagesList.getSelectedValue();
if (selectedStage != null) {
deleteStage.setEnabled(true);
moveStageUp.setEnabled(stagesList.getSelectedIndex() > 0);
moveStageDown.setEnabled(stagesList.getSelectedIndex() < (stagesListModel.getSize() - 1));
} else {
deleteStage.setEnabled(false);
moveStageUp.setEnabled(false);
moveStageDown.setEnabled(false);
}
updateStageEditorPane(stagesEditorPane, selectedStage, listener);
}
});
if (quest.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createStage.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
QuestStage stage = new QuestStage(quest);
stagesListModel.addItem(stage);
stagesList.setSelectedValue(stage, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteStage.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedStage != null) {
stagesListModel.removeItem(selectedStage);
selectedStage = null;
stagesList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
moveStageUp.addActionListener(new ActionListener() {
@Override CollapsiblePanel stagesPane = CommonEditor.createListPanel(
public void actionPerformed(ActionEvent e) { title,
if (selectedStage != null) { cellRenderer,
stagesListModel.moveUp(selectedStage); stagesListModel,
stagesList.setSelectedValue(selectedStage, true); quest.writable,
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. moveUpDownEnabled,
} (e)->selectedStage=e,
} ()->selectedStage,
}); this::updateStageEditorPane,
moveStageDown.addActionListener(new ActionListener() { listener,
()->new QuestStage(quest)).panel;
@Override
public void actionPerformed(ActionEvent e) {
if (selectedStage != null) {
stagesListModel.moveDown(selectedStage);
stagesList.setSelectedValue(selectedStage, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createStage, JideBoxLayout.FIX);
listButtonsPane.add(deleteStage, JideBoxLayout.FIX);
listButtonsPane.add(moveStageUp, JideBoxLayout.FIX);
listButtonsPane.add(moveStageDown, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
stagesPane.add(listButtonsPane, JideBoxLayout.FIX);
}
if (quest.stages == null || quest.stages.isEmpty()) { if (quest.stages == null || quest.stages.isEmpty()) {
stagesPane.collapse(); stagesPane.collapse();
} }
stagesEditorPane.setLayout(new JideBoxLayout(stagesEditorPane, JideBoxLayout.PAGE_AXIS));
stagesPane.add(stagesEditorPane, JideBoxLayout.FIX);
pane.add(stagesPane, JideBoxLayout.FIX); pane.add(stagesPane, JideBoxLayout.FIX);
} }
@@ -184,88 +105,21 @@ public class QuestEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public static class StagesListModel implements ListModel<QuestStage> { public static class StagesListModel extends CommonEditor.AtListModel<QuestStage,Quest> {
Quest source;
public StagesListModel(Quest quest) { public StagesListModel(Quest quest) {
this.source = quest; super(quest);
}
@Override
public int getSize() {
if (source.stages == null) return 0;
return source.stages.size();
} }
@Override @Override
public QuestStage getElementAt(int index) { protected List<QuestStage> getInner() {
if (source.stages == null) return null; return source.stages;
return source.stages.get(index);
}
public void addItem(QuestStage item) {
if (source.stages == null) {
source.stages = new ArrayList<QuestStage>();
}
source.stages.add(item);
int index = source.stages.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(QuestStage item) {
int index = source.stages.indexOf(item);
source.stages.remove(item);
if (source.stages.isEmpty()) {
source.stages = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(QuestStage item) {
int index = source.stages.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
public void moveUp(QuestStage item) {
int index = source.stages.indexOf(item);
QuestStage exchanged = source.stages.get(index - 1);
source.stages.set(index, exchanged);
source.stages.set(index - 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index - 1, index));
}
}
public void moveDown(QuestStage item) {
int index = source.stages.indexOf(item);
QuestStage exchanged = source.stages.get(index + 1);
source.stages.set(index, exchanged);
source.stages.set(index + 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index + 1));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
} }
@Override @Override
public void removeListDataListener(ListDataListener l) { protected void setInner(List<QuestStage> value) {
listeners.remove(l); source.stages = value;
} }
} }

View File

@@ -18,6 +18,7 @@ import javax.swing.JToolTip;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
import javax.swing.ToolTipManager; import javax.swing.ToolTipManager;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import prefuse.Display; import prefuse.Display;
import prefuse.Visualization; import prefuse.Visualization;
import prefuse.action.ActionList; import prefuse.action.ActionList;
@@ -321,23 +322,7 @@ public class DialogueGraphView extends Display {
@Override @Override
protected String getText(VisualItem item) { protected String getText(VisualItem item) {
return wordWrap(super.getText(item), 40); return CommonEditor.wordWrap(super.getText(item), 40);
}
public String wordWrap(String in, int length) {
final String newline = "\n";
//:: Trim
while(in.length() > 0 && (in.charAt(0) == '\t' || in.charAt(0) == ' ')) in = in.substring(1);
//:: If Small Enough Already, Return Original
if(in.length() < length) return in;
//:: If Next length Contains Newline, Split There
if(in.substring(0, length).contains(newline)) return in.substring(0, in.indexOf(newline)).trim() + newline + wordWrap(in.substring(in.indexOf("\n") + 1), length);
//:: Otherwise, Split Along Nearest Previous Space/Tab/Dash
int spaceIndex = Math.max(Math.max( in.lastIndexOf(" ", length), in.lastIndexOf("\t", length)), in.lastIndexOf("-", length));
//:: If No Nearest Space, Split At length
if(spaceIndex == -1) spaceIndex = length;
//:: Split
return in.substring(0, spaceIndex).trim() + newline + wordWrap(in.substring(spaceIndex), length);
} }
} }

View File

@@ -62,6 +62,7 @@ import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeModel; import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath; import javax.swing.tree.TreePath;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants; import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
@@ -378,7 +379,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addMapchange.addActionListener(new ActionListener() { addMapchange.addActionListener(new ActionListener() {
@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.addItem(MapObject.newMapchange(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -391,7 +392,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addSpawn.addActionListener(new ActionListener() { addSpawn.addActionListener(new ActionListener() {
@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.addItem(MapObject.newSpawnArea(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -404,7 +405,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addRest.addActionListener(new ActionListener() { addRest.addActionListener(new ActionListener() {
@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.addItem(MapObject.newRest(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -417,7 +418,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addKey.addActionListener(new ActionListener() { addKey.addActionListener(new ActionListener() {
@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.addItem(MapObject.newKey(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -430,7 +431,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addReplace.addActionListener(new ActionListener() { addReplace.addActionListener(new ActionListener() {
@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.addItem(MapObject.newReplace(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -443,7 +444,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addScript.addActionListener(new ActionListener() { addScript.addActionListener(new ActionListener() {
@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.addItem(MapObject.newScript(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -456,7 +457,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addContainer.addActionListener(new ActionListener() { addContainer.addActionListener(new ActionListener() {
@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.addItem(MapObject.newContainer(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -469,7 +470,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addSign.addActionListener(new ActionListener() { addSign.addActionListener(new ActionListener() {
@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.addItem(MapObject.newSign(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -482,7 +483,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
deleteObject.addActionListener(new ActionListener() { deleteObject.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.removeObject(selectedMapObject); groupObjectsListModel.removeItem(selectedMapObject);
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -587,7 +588,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addReplacement.addActionListener(new ActionListener() { addReplacement.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
replacementsListModel.addObject(null, null); replacementsListModel.addReplacement(null, null);
} }
}); });
deleteReplacement = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); deleteReplacement = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
@@ -596,7 +597,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
deleteReplacement.addActionListener(new ActionListener() { deleteReplacement.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
replacementsListModel.removeObject(selectedReplacement); replacementsListModel.removeItem(selectedReplacement);
} }
}); });
replacementListButtonsPane.add(new JPanel(), JideBoxLayout.VARY); replacementListButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
@@ -1153,61 +1154,22 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
} }
public class ReplacementsListModel implements ListModel<ReplaceArea.Replacement> { public class ReplacementsListModel extends CommonEditor.AtListModel<ReplaceArea.Replacement, ReplaceArea> {
public ReplaceArea area;
public ReplacementsListModel(ReplaceArea area) { public ReplacementsListModel(ReplaceArea area) {
this.area = area; super(area);
}
@Override
protected List<ReplaceArea.Replacement> getInner() {
return source.replacements;
} }
@Override @Override
public int getSize() { protected void setInner(List<ReplaceArea.Replacement> value) {
if (area.replacements == null) return 0; source.replacements = value;
return area.replacements.size();
} }
@Override public void addReplacement(String source, String target) {
public ReplaceArea.Replacement getElementAt(int index) { addItem(this.source.createReplacement(source, target));
if (index < 0 || index > getSize()) return null;
if (area.replacements == null) return null;
return area.replacements.get(index);
}
public void objectChanged(ReplaceArea.Replacement repl) {
int index = area.replacements.indexOf(repl);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
public void addObject(String source, String target) {
ReplaceArea.Replacement repl = area.addReplacement(source, target);
int index = area.replacements.indexOf(repl);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeObject(ReplaceArea.Replacement repl) {
int index = area.replacements.indexOf(repl);
area.removeReplacement(repl);
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
} }
} }
@@ -1286,58 +1248,20 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
} }
public class MapObjectsListModel implements ListModel<MapObject> { public class MapObjectsListModel extends CommonEditor.AtListModel<MapObject, MapObjectGroup> {
public MapObjectGroup group;
public MapObjectsListModel(MapObjectGroup group) { public MapObjectsListModel(MapObjectGroup group) {
this.group = group; super(group);
} }
@Override @Override
public int getSize() { protected List<MapObject> getInner() {
return group.mapObjects.size(); return source.mapObjects;
} }
@Override @Override
public MapObject getElementAt(int index) { protected void setInner(List<MapObject> value) {
return group.mapObjects.get(index); source.mapObjects = value;
} }
public void objectChanged(MapObject area) {
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(groupObjectsList, ListDataEvent.CONTENTS_CHANGED, group.mapObjects.indexOf(area), group.mapObjects.indexOf(area)));
}
}
public void addObject(MapObject area) {
group.mapObjects.add(area);
int index = group.mapObjects.indexOf(area);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(groupObjectsList, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeObject(MapObject area) {
int index = group.mapObjects.indexOf(area);
group.mapObjects.remove(area);
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(groupObjectsList, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
} }
public class GroupObjectsRenderer extends DefaultListCellRenderer { public class GroupObjectsRenderer extends DefaultListCellRenderer {
@@ -1353,36 +1277,20 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
} }
public class SpawnGroupNpcListModel implements ListModel<NPC> { public class SpawnGroupNpcListModel extends CommonEditor.AtListModel<NPC, SpawnArea> {
public SpawnArea area;
public SpawnGroupNpcListModel(SpawnArea area) { public SpawnGroupNpcListModel(SpawnArea area) {
this.area = area; super(area);
} }
@Override @Override
public int getSize() { protected List<NPC> getInner() {
return area.spawnGroup.size(); return source.spawnGroup;
} }
@Override @Override
public NPC getElementAt(int index) { protected void setInner(List<NPC> value) {
return area.spawnGroup.get(index); source.spawnGroup = value;
} }
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
} }
@@ -1956,7 +1864,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
area.oldSchoolRequirement = false; area.oldSchoolRequirement = false;
} }
} }
groupObjectsListModel.objectChanged(selectedMapObject); groupObjectsListModel.itemChanged(selectedMapObject);
} }
} else if (source == spawngroupField) { } else if (source == spawngroupField) {
if (selectedMapObject instanceof SpawnArea) { if (selectedMapObject instanceof SpawnArea) {
@@ -1969,7 +1877,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
area.spawngroup_id = (String) value; area.spawngroup_id = (String) value;
selectedMapObject.link(); selectedMapObject.link();
npcList.setModel(new SpawnGroupNpcListModel(area)); npcList.setModel(new SpawnGroupNpcListModel(area));
groupObjectsListModel.objectChanged(area); groupObjectsListModel.itemChanged(area);
npcList.revalidate(); npcList.revalidate();
npcList.repaint(); npcList.repaint();
tmxViewer.revalidate(); tmxViewer.revalidate();
@@ -1998,7 +1906,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} else { } else {
area.name = null; area.name = null;
} }
groupObjectsListModel.objectChanged(area); groupObjectsListModel.itemChanged(area);
tmxViewer.revalidate(); tmxViewer.revalidate();
tmxViewer.repaint(); tmxViewer.repaint();
} }
@@ -2027,7 +1935,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} else { } else {
area.name = null; area.name = null;
} }
groupObjectsListModel.objectChanged(area); groupObjectsListModel.itemChanged(area);
tmxViewer.revalidate(); tmxViewer.revalidate();
tmxViewer.repaint(); tmxViewer.repaint();
} else if (selectedMapObject instanceof SignArea) { } else if (selectedMapObject instanceof SignArea) {
@@ -2041,7 +1949,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} else { } else {
area.name = null; area.name = null;
} }
groupObjectsListModel.objectChanged(area); groupObjectsListModel.itemChanged(area);
tmxViewer.revalidate(); tmxViewer.revalidate();
tmxViewer.repaint(); tmxViewer.repaint();
} }
@@ -2226,12 +2134,12 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
} else if (source == sourceLayer) { } else if (source == sourceLayer) {
selectedReplacement.sourceLayer = (String)value; selectedReplacement.sourceLayer = (String)value;
replacementsListModel.objectChanged(selectedReplacement); replacementsListModel.itemChanged(selectedReplacement);
groupObjectsListModel.objectChanged(selectedMapObject); groupObjectsListModel.itemChanged(selectedMapObject);
} else if (source == targetLayer) { } else if (source == targetLayer) {
selectedReplacement.targetLayer = (String)value; selectedReplacement.targetLayer = (String)value;
replacementsListModel.objectChanged(selectedReplacement); replacementsListModel.itemChanged(selectedReplacement);
groupObjectsListModel.objectChanged(selectedMapObject); groupObjectsListModel.itemChanged(selectedMapObject);
} }
if (modified) { if (modified) {
if (map.state != GameDataElement.State.modified) { if (map.state != GameDataElement.State.modified) {

View File

@@ -0,0 +1,282 @@
package com.gpl.rpg.atcontentstudio.ui.tools;
import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
import com.gpl.rpg.atcontentstudio.model.gamedata.Common;
import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel;
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.Editor;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.utils.lambda.CallWithReturn;
import com.gpl.rpg.atcontentstudio.utils.lambda.CallWithSingleArg;
import com.gpl.rpg.atcontentstudio.utils.lambda.CallWithThreeArgs;
import com.jidesoft.swing.JideBoxLayout;
import javax.swing.*;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public final class CommonEditor {
public static class PanelCreateResult<E>{
public CollapsiblePanel panel;
public JList<E> list;
}
public static <E, S> PanelCreateResult<E> createListPanel(String title,
ListCellRenderer<? super E> cellRenderer,
AtListModel<E, S> listModel,
boolean writable,
boolean moveUpDownEnabled,
CallWithSingleArg<E> selectedValueSetter,
CallWithReturn<E> selectedValueGetter,
CallWithThreeArgs<JPanel, E, FieldUpdateListener> updateRepliesEditorPane,
FieldUpdateListener listener,
CallWithReturn<E> createNew) {
CollapsiblePanel replies = new CollapsiblePanel(title);
replies.setLayout(new JideBoxLayout(replies, JideBoxLayout.PAGE_AXIS));
JList<E> repliesList = new JList<>(listModel);
repliesList.setCellRenderer(cellRenderer);
repliesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
replies.add(new JScrollPane(repliesList), JideBoxLayout.FIX);
final JPanel repliesEditorPane = new JPanel();
final JButton createReply = new JButton(new ImageIcon(DefaultIcons.getCreateIcon()));
final JButton deleteReply = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
final JButton moveReplyUp = new JButton(new ImageIcon(DefaultIcons.getArrowUpIcon()));
final JButton moveReplyDown = new JButton(new ImageIcon(DefaultIcons.getArrowDownIcon()));
deleteReply.setEnabled(false);
moveReplyUp.setEnabled(false);
moveReplyDown.setEnabled(false);
repliesList.addListSelectionListener(e -> {
E selectedReply = repliesList.getSelectedValue();
selectedValueSetter.call(selectedReply);
if (selectedReply != null) {
deleteReply.setEnabled(true);
if (moveUpDownEnabled) {
moveReplyUp.setEnabled(repliesList.getSelectedIndex() > 0);
moveReplyDown.setEnabled(repliesList.getSelectedIndex() < (listModel.getSize() - 1));
}
} else {
deleteReply.setEnabled(false);
if (moveUpDownEnabled) {
moveReplyUp.setEnabled(false);
moveReplyDown.setEnabled(false);
}
}
updateRepliesEditorPane.call(repliesEditorPane, selectedReply, listener);
});
repliesList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
GameDataElement navObj = listModel.getNavigationElement( repliesList.getSelectedValue());
if (navObj != null) {
ATContentStudio.frame.openEditor(navObj);
ATContentStudio.frame.selectInTree(navObj);
}
}
}
});
repliesList.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
GameDataElement navObj = listModel.getNavigationElement( repliesList.getSelectedValue());
ATContentStudio.frame.openEditor(navObj);
ATContentStudio.frame.selectInTree(navObj);
}
}
});
if (writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createReply.addActionListener(e -> {
E created = createNew.call();
listModel.addItem(created);
repliesList.setSelectedValue(created, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
});
deleteReply.addActionListener(e -> {
E selected = selectedValueGetter.call();
if (selected != null) {
listModel.removeItem(selected);
selected = null;
selectedValueSetter.call(selected);
repliesList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
if (moveUpDownEnabled) {
moveReplyUp.addActionListener(e -> {
E selected = selectedValueGetter.call();
if (selected != null) {
listModel.moveUp(selected);
repliesList.setSelectedValue(selected, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
moveReplyDown.addActionListener(e -> {
E selected = selectedValueGetter.call();
if (selected != null) {
listModel.moveDown(selected);
repliesList.setSelectedValue(selected, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
}
listButtonsPane.add(createReply, JideBoxLayout.FIX);
listButtonsPane.add(deleteReply, JideBoxLayout.FIX);
if (moveUpDownEnabled) {
listButtonsPane.add(moveReplyUp, JideBoxLayout.FIX);
listButtonsPane.add(moveReplyDown, JideBoxLayout.FIX);
}
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
replies.add(listButtonsPane, JideBoxLayout.FIX);
}
repliesEditorPane.setLayout(new JideBoxLayout(repliesEditorPane, JideBoxLayout.PAGE_AXIS));
replies.add(repliesEditorPane, JideBoxLayout.FIX);
PanelCreateResult<E> ePanelCreateResult = new PanelCreateResult<>();
ePanelCreateResult.panel =replies;
ePanelCreateResult.list = repliesList;
return ePanelCreateResult;
}
public static class CreateDeathEffectPanelResult {
public CollapsiblePanel panel;
public JSpinner HPMin;
public JSpinner HPMax;
public JSpinner APMin;
public JSpinner APMax;
}
public static CreateDeathEffectPanelResult createDeathEffectPanel(Common.DeathEffect hitEffect, boolean writable, FieldUpdateListener listener, String title){
CreateDeathEffectPanelResult result = new CreateDeathEffectPanelResult();
result.panel = new CollapsiblePanel(title);
result.panel.setLayout(new JideBoxLayout(result.panel, JideBoxLayout.PAGE_AXIS));
result.HPMin = Editor.addIntegerField(result.panel, "HP bonus min: ", hitEffect.hp_boost_min, true, writable, listener);
result.HPMax = Editor.addIntegerField(result.panel, "HP bonus max: ", hitEffect.hp_boost_max, true, writable, listener);
result.APMin = Editor.addIntegerField(result.panel, "AP bonus min: ", hitEffect.ap_boost_min, true, writable, listener);
result.APMax = Editor.addIntegerField(result.panel, "AP bonus max: ", hitEffect.ap_boost_max, true, writable, listener);
return result;
}
public static String wordWrap(String in, int length) {
if (in == null) return null;
final String newline = "\n";
//:: Trim
while (!in.isEmpty() && (in.charAt(0) == '\t' || in.charAt(0) == ' ')) in = in.substring(1);
//:: If Small Enough Already, Return Original
if (in.length() < length) return in;
//:: If Next length Contains Newline, Split There
if (in.substring(0, length).contains(newline))
return in.substring(0, in.indexOf(newline)).trim() + newline + wordWrap(in.substring(in.indexOf("\n") + 1), length);
//:: Otherwise, Split Along Nearest Previous Space/Tab/Dash
int spaceIndex = Math.max(Math.max(in.lastIndexOf(" ", length), in.lastIndexOf("\t", length)), in.lastIndexOf("-", length));
//:: If No Nearest Space, Split At length
if (spaceIndex == -1) spaceIndex = length;
//:: Split
return in.substring(0, spaceIndex).trim() + newline + wordWrap(in.substring(spaceIndex), length);
}
public abstract static class AtListModel<E, S> implements ListModel<E> {
protected S source;
protected abstract List<E> getInner();
protected abstract void setInner(List<E> value);
protected GameDataElement getNavigationElement(E element){
return null;
}
public AtListModel(S source) {
this.source = source;
}
@Override
public int getSize() {
if (getInner() == null) return 0;
return getInner().size();
}
@Override
public E getElementAt(int index) {
if (index < 0 || index >= getSize()) return null;
return getInner().get(index);
}
public void addItem(E item) {
if (getInner() == null) {
setInner(new ArrayList<>());
}
getInner().add(item);
int index = getInner().indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(E item) {
int index = getInner().indexOf(item);
getInner().remove(item);
if (getInner().isEmpty()) {
setInner(null);
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(E item) {
int index = getInner().indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
public void moveUp(E item) {
int index = getInner().indexOf(item);
E exchanged = getInner().get(index - 1);
getInner().set(index, exchanged);
getInner().set(index - 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index - 1, index));
}
}
public void moveDown(E item) {
int index = getInner().indexOf(item);
E exchanged = getInner().get(index + 1);
getInner().set(index, exchanged);
getInner().set(index + 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index + 1));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
}

View File

@@ -5,14 +5,7 @@ import java.util.List;
import com.gpl.rpg.atcontentstudio.model.GameDataElement; 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.gamedata.ActorCondition; import com.gpl.rpg.atcontentstudio.model.gamedata.*;
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.ContainerArea;
import com.gpl.rpg.atcontentstudio.model.maps.KeyArea; import com.gpl.rpg.atcontentstudio.model.maps.KeyArea;
import com.gpl.rpg.atcontentstudio.model.maps.MapChange; import com.gpl.rpg.atcontentstudio.model.maps.MapChange;
@@ -111,18 +104,18 @@ public class GDEVisitor {
visit(element.category, visited, includeSource); visit(element.category, visited, includeSource);
if (element.icon_id != null) visit(element.getProject().getSpritesheet(element.icon_id.split(":")[0]), 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) { if (element.equip_effect != null && element.equip_effect.conditions != null) {
for (Item.ConditionEffect condEffect : element.equip_effect.conditions) { for (Common.ConditionEffect condEffect : element.equip_effect.conditions) {
visit(condEffect.condition, visited, includeSource); visit(condEffect.condition, visited, includeSource);
} }
} }
if (element.hit_effect != null) { if (element.hit_effect != null) {
if (element.hit_effect.conditions_source != null) { if (element.hit_effect.conditions_source != null) {
for (Item.ConditionEffect condEffect : element.hit_effect.conditions_source) { for (Common.ConditionEffect condEffect : element.hit_effect.conditions_source) {
visit(condEffect.condition, visited, includeSource); visit(condEffect.condition, visited, includeSource);
} }
} }
if (element.hit_effect.conditions_target != null) { if (element.hit_effect.conditions_target != null) {
for (Item.ConditionEffect condEffect : element.hit_effect.conditions_target) { for (Common.ConditionEffect condEffect : element.hit_effect.conditions_target) {
visit(condEffect.condition, visited, includeSource); visit(condEffect.condition, visited, includeSource);
} }
} }
@@ -144,12 +137,12 @@ public class GDEVisitor {
if (element.icon_id != null) visit(element.getProject().getSpritesheet(element.icon_id.split(":")[0]), 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 != null) {
if (element.hit_effect.conditions_source != null) { if (element.hit_effect.conditions_source != null) {
for (NPC.TimedConditionEffect condEffect : element.hit_effect.conditions_source) { for (Common.TimedConditionEffect condEffect : element.hit_effect.conditions_source) {
visit(condEffect.condition, visited, includeSource); visit(condEffect.condition, visited, includeSource);
} }
} }
if (element.hit_effect.conditions_target != null) { if (element.hit_effect.conditions_target != null) {
for (NPC.TimedConditionEffect condEffect : element.hit_effect.conditions_target) { for (Common.TimedConditionEffect condEffect : element.hit_effect.conditions_target) {
visit(condEffect.condition, visited, includeSource); visit(condEffect.condition, visited, includeSource);
} }
} }

View File

@@ -27,6 +27,7 @@ import javax.swing.JTextArea;
import javax.swing.KeyStroke; import javax.swing.KeyStroke;
import javax.swing.plaf.basic.BasicInternalFrameUI; import javax.swing.plaf.basic.BasicInternalFrameUI;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import prefuse.Display; import prefuse.Display;
import prefuse.Visualization; import prefuse.Visualization;
import prefuse.action.Action; import prefuse.action.Action;
@@ -415,25 +416,9 @@ public class WriterModeEditor extends Editor {
@Override @Override
protected String getText(VisualItem item) { protected String getText(VisualItem item) {
if (!item.getBoolean(IS_REPLY) && super.getText(item) == null) return "[Selector]"; if (!item.getBoolean(IS_REPLY) && super.getText(item) == null) return "[Selector]";
return wordWrap(super.getText(item), 40); return CommonEditor.wordWrap(super.getText(item), 40);
} }
public String wordWrap(String in, int length) {
if (in == null) return null;
final String newline = "\n";
//:: Trim
while(in.length() > 0 && (in.charAt(0) == '\t' || in.charAt(0) == ' ')) in = in.substring(1);
//:: If Small Enough Already, Return Original
if(in.length() < length) return in;
//:: If Next length Contains Newline, Split There
if(in.substring(0, length).contains(newline)) return in.substring(0, in.indexOf(newline)).trim() + newline + wordWrap(in.substring(in.indexOf("\n") + 1), length);
//:: Otherwise, Split Along Nearest Previous Space/Tab/Dash
int spaceIndex = Math.max(Math.max( in.lastIndexOf(" ", length), in.lastIndexOf("\t", length)), in.lastIndexOf("-", length));
//:: If No Nearest Space, Split At length
if(spaceIndex == -1) spaceIndex = length;
//:: Split
return in.substring(0, spaceIndex).trim() + newline + wordWrap(in.substring(spaceIndex), length);
}
} }
class NodeStrokeColorAction extends ColorAction { class NodeStrokeColorAction extends ColorAction {

View File

@@ -0,0 +1,5 @@
package com.gpl.rpg.atcontentstudio.utils.lambda;
public interface CallWithReturn<T> {
T call();
}

View File

@@ -0,0 +1,7 @@
package com.gpl.rpg.atcontentstudio.utils.lambda;
public interface CallWithSingleArg<T> {
void call(T arg);
}

View File

@@ -0,0 +1,5 @@
package com.gpl.rpg.atcontentstudio.utils.lambda;
public interface CallWithThreeArgs<T1, T2, T3> {
void call(T1 arg1, T2 arg2, T3 arg3);
}

View File

@@ -0,0 +1,6 @@
package com.gpl.rpg.atcontentstudio.utils.lambda;
public interface CallWithTwoArgs<T1, T2> {
void call(T1 arg1, T2 arg2);
}