diff --git a/build.gradle b/build.gradle index 5111ad424..8cee77ceb 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ apply plugin: 'idea' task wrapper(type: Wrapper) { - gradleVersion = '2.4' + gradleVersion = '2.7' } idea { @@ -102,8 +102,8 @@ buildscript { } dependencies { classpath group: 'net.sf.proguard', name: 'proguard-gradle', version: '5.1' - classpath group: 'de.undercouch', name: 'gradle-download-task', version: '1.2' - classpath group: 'com.install4j', name: 'gradle-plugin', version: '6.0.3' + classpath group: 'de.undercouch', name: 'gradle-download-task', version: '2.0.0' + classpath group: 'com.install4j', name: 'gradle-plugin', version: '6.0.4' } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 085a1cdc2..b5166dad4 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 64a16c008..fb0e05240 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -14,9 +14,9 @@ # GNU General Public License for more details. # -#Tue Jun 09 21:28:46 CEST 2015 +#Sun Oct 04 21:25:17 CEST 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-all.zip diff --git a/illabuild/build.gradle b/illabuild/build.gradle index ac425a759..0276b0841 100644 --- a/illabuild/build.gradle +++ b/illabuild/build.gradle @@ -24,7 +24,7 @@ dependencies { compile group: 'de.matthiasmann', name: 'pngdecoder', version: '20130527' compile gradleApi() compile localGroovy() - testCompile group: 'org.testng', name: 'testng', version: '6.9.4' + testCompile group: 'org.testng', name: 'testng', version: '6.9.6' testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3' } diff --git a/illaclient/build.gradle b/illaclient/build.gradle index efda4ce4b..c2aad6846 100644 --- a/illaclient/build.gradle +++ b/illaclient/build.gradle @@ -38,7 +38,7 @@ dependencies { compile group: 'ch.qos.logback', name: 'logback-classic', version: project.ext.logbackVersion compile group: 'net.sf.trove4j', name: 'trove4j', version: '3.0.3' compile group: 'org.bushe', name: 'eventbus', version: '1.4' - compile group: 'com.google.code.gson', name: 'gson', version: '2.3.1' + compile group: 'com.google.code.gson', name: 'gson', version: '2.4' compile group: 'com.google.guava', name: 'guava', version: '18.0' compile group: 'lessvoid', name: 'nifty', version: project.ext.niftyGuiVersion runtime group: 'org.illarion', name: 'rsc_books', version: project.ext.illarionResourcesVersion @@ -50,10 +50,10 @@ dependencies { runtime group: 'org.illarion', name: 'rsc_sounds', version: project.ext.illarionResourcesVersion runtime group: 'org.illarion', name: 'rsc_tables', version: project.ext.illarionResourcesVersion runtime group: 'org.illarion', name: 'rsc_tiles', version: project.ext.illarionResourcesVersion - testCompile group: 'org.testng', name: 'testng', version: '6.9.4' - testCompile group: 'org.easymock', name: 'easymock', version: '3.3.1' - testCompile group: 'org.powermock', name: 'powermock-module-testng', version: '1.6.2' - testCompile group: 'org.powermock', name: 'powermock-api-easymock', version: '1.6.2' + testCompile group: 'org.testng', name: 'testng', version: '6.9.6' + testCompile group: 'org.easymock', name: 'easymock', version: '3.4' + testCompile group: 'org.powermock', name: 'powermock-module-testng', version: '1.6.3' + testCompile group: 'org.powermock', name: 'powermock-api-easymock', version: '1.6.3' } jar { diff --git a/illacommon/build.gradle b/illacommon/build.gradle index c569a5d25..6997ccbb7 100644 --- a/illacommon/build.gradle +++ b/illacommon/build.gradle @@ -34,7 +34,7 @@ dependencies { exclude module: 'log4j' exclude module: 'commons-logging' } - testCompile group: 'org.testng', name: 'testng', version: '6.9.4' + testCompile group: 'org.testng', name: 'testng', version: '6.9.6' } processResources.dependsOn("downloadSkills") diff --git a/illacompiler/build.gradle b/illacompiler/build.gradle index fd8ad1e9c..c11e794c3 100644 --- a/illacompiler/build.gradle +++ b/illacompiler/build.gradle @@ -26,7 +26,7 @@ dependencies { compile project(':common') compile project(':easynpc') compile project(':easyquest') - compile group: 'commons-cli', name: 'commons-cli', version: '1.3' + compile group: 'commons-cli', name: 'commons-cli', version: '1.3.1' compile group: 'org.slf4j', name: 'slf4j-api', version: project.ext.slf4jVersion compile group: 'org.slf4j', name: 'jcl-over-slf4j', version: project.ext.slf4jVersion compile group: 'ch.qos.logback', name: 'logback-classic', version: project.ext.logbackVersion diff --git a/illadownload/build.gradle b/illadownload/build.gradle index 1abca32f7..40776949f 100644 --- a/illadownload/build.gradle +++ b/illadownload/build.gradle @@ -45,10 +45,10 @@ dependencies { compile group: 'org.eclipse.aether', name: 'aether-connector-basic', version: '1.0.2.v20150114' compile group: 'org.eclipse.aether', name: 'aether-transport-http', version: '1.0.2.v20150114' compile group: 'org.apache.maven', name: 'maven-aether-provider', version: '3.3.3' - testCompile group: 'org.testng', name: 'testng', version: '6.9.4' - testCompile group: 'org.easymock', name: 'easymock', version: '3.3.1' - testCompile group: 'org.powermock', name: 'powermock-module-testng', version: '1.6.2' - testCompile group: 'org.powermock', name: 'powermock-api-easymock', version: '1.6.2' + testCompile group: 'org.testng', name: 'testng', version: '6.9.6' + testCompile group: 'org.easymock', name: 'easymock', version: '3.4' + testCompile group: 'org.powermock', name: 'powermock-module-testng', version: '1.6.3' + testCompile group: 'org.powermock', name: 'powermock-api-easymock', version: '1.6.3' } jar { diff --git a/illaeasynpc/build.gradle b/illaeasynpc/build.gradle index 56c9d58c6..ab93f4459 100644 --- a/illaeasynpc/build.gradle +++ b/illaeasynpc/build.gradle @@ -54,11 +54,11 @@ dependencies { compile group: 'org.bushe', name: 'eventbus', version: '1.4' compile group: 'com.github.insubstantial', name: 'substance', version: project.ext.insubstantialVersion compile group: 'com.github.insubstantial', name: 'substance-flamingo', version: project.ext.insubstantialVersion - compile group: 'com.fifesoft', name: 'rsyntaxtextarea', version: '2.5.6' - compile group: 'com.fifesoft', name: 'autocomplete', version: '2.5.4' - compile group: 'org.antlr', name: 'antlr4-runtime', version: '4.5' + compile group: 'com.fifesoft', name: 'rsyntaxtextarea', version: '2.5.8' + compile group: 'com.fifesoft', name: 'autocomplete', version: '2.5.8' + compile group: 'org.antlr', name: 'antlr4-runtime', version: '4.5.1-1' - antlr4 group: 'org.antlr', name: 'antlr4', version: "4.5" + antlr4 group: 'org.antlr', name: 'antlr4', version: '4.5.1-1' runtime group: 'org.illarion', name: 'rsc_tables', version: project.ext.illarionResourcesVersion } diff --git a/illaeasynpc/src/main/java/illarion/easynpc/parser/ParsedNpcVisitor.java b/illaeasynpc/src/main/java/illarion/easynpc/parser/ParsedNpcVisitor.java index c28c0ada8..05e85d0c8 100644 --- a/illaeasynpc/src/main/java/illarion/easynpc/parser/ParsedNpcVisitor.java +++ b/illaeasynpc/src/main/java/illarion/easynpc/parser/ParsedNpcVisitor.java @@ -32,7 +32,6 @@ import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.atn.ATNConfigSet; import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.runtime.tree.ErrorNode; import org.antlr.v4.runtime.tree.TerminalNode; import org.slf4j.Logger; @@ -53,15 +52,214 @@ public class ParsedNpcVisitor extends EasyNpcBaseVisitor implements ANTLRErrorListener { @Nonnull private static final Logger LOGGER = LoggerFactory.getLogger(ParsedNpcVisitor.class); - @Nonnull - private final ParsedNpc npc = new ParsedNpc(); static { SkillLoader.load(); } + @Nonnull + private final ParsedNpc npc = new ParsedNpc(); + @Nullable + private ParsedTalk currentTalkingLine; + + @Nullable + @Override + public ParsedNpcVisitor visitTalkCommand(TalkCommandContext ctx) { + currentTalkingLine = new ParsedTalk(); + ParsedNpcVisitor result = super.visitTalkCommand(ctx); + npc.addNpcData(currentTalkingLine); + currentTalkingLine = null; + return result; + } + + @Nullable + @Override + public ParsedNpcVisitor visitCondition(ConditionContext ctx) { + if (currentTalkingLine == null) { + LOGGER.error("Visiting condition while there is no active talking line."); + return super.visitCondition(ctx); + } + switch (ctx.getStart().getText()) { + case "isAdmin": + currentTalkingLine.addCondition(new ConditionAdmin()); + break; + case "attrib": + currentTalkingLine.addCondition( + new ConditionAttrib(getAttribute(ctx.attribute()), getOperator(ctx.compare()), + getAdvancedNumber(ctx.advancedNumber())) + ); + break; + case "chance": + TerminalNode intNode = ctx.INT(); + if (intNode != null) { + currentTalkingLine.addCondition(new ConditionChance(getInteger(intNode))); + } else { + currentTalkingLine.addCondition(new ConditionChance(getFloat(ctx.FLOAT()))); + } + break; + case "item": + Items item = getItem(ctx.itemId()); + if (item != null) { + currentTalkingLine.addCondition( + new ConditionItem(item, getItemPosition(ctx.itemPos()), getOperator(ctx.compare()), + getAdvancedNumber(ctx.advancedNumber()), + new ParsedItemData(getItemDataOpt(ctx.itemDataList()))) + ); + } + break; + case "magictype": + currentTalkingLine.addCondition(new ConditionMagicType(getMagicType(ctx.magictype()))); + break; + case "money": + currentTalkingLine.addCondition( + new ConditionMoney(getOperator(ctx.compare()), getAdvancedNumber(ctx.advancedNumber()))); + break; + case "%NUMBER": + currentTalkingLine.addCondition(new ConditionNumber(getOperator(ctx.compare()), getInteger(ctx.INT()))); + break; + case "queststatus": + currentTalkingLine.addCondition( + new ConditionQueststatus(getQuestId(ctx.questId()), getOperator(ctx.compare()), + getAdvancedNumber(ctx.advancedNumber())) + ); + break; + case "race": + currentTalkingLine.addCondition(new ConditionRace(getRace(ctx.race()))); + break; + case "rank": + currentTalkingLine.addCondition( + new ConditionRank(getOperator(ctx.compare()), getAdvancedNumber(ctx.advancedNumber()))); + break; + case "sex": + currentTalkingLine.addCondition(new ConditionSex(getSex(ctx.gender()))); + break; + case "skill": + Skill skill = getSkill(ctx.skill()); + if (skill != null) { + currentTalkingLine.addCondition(new ConditionSkill(skill, getOperator(ctx.compare()), + getAdvancedNumber(ctx.advancedNumber()))); + } + break; + case "state": + currentTalkingLine.addCondition( + new ConditionState(getOperator(ctx.compare()), getAdvancedNumber(ctx.advancedNumber()))); + break; + case "talkMode": + currentTalkingLine.addCondition(new ConditionTalkMode(getTalkMode(ctx.talkMode()))); + break; + case "town": + currentTalkingLine.addCondition(new ConditionTown(getTown(ctx.town()))); + break; + default: + return super.visitCondition(ctx); + } + return super.visitCondition(ctx); + } + + @Nullable + @Override + public ParsedNpcVisitor visitConsequence(ConsequenceContext ctx) { + if (currentTalkingLine == null) { + LOGGER.error("Visiting consequence while there is no active talking line."); + return defaultResult(); + } + switch (ctx.getStart().getText()) { + case "arena": + currentTalkingLine.addConsequence(new ConsequenceArena(getArenaTask(ctx.arenaTask()))); + break; + case "attrib": + currentTalkingLine.addConsequence( + new ConsequenceAttribute(getAttribute(ctx.attribute()), getOperator(ctx.set()), + getAdvancedNumber(ctx.advancedNumber())) + ); + break; + case "deleteItem": + Items item = getItem(ctx.itemId()); + if (item != null) { + currentTalkingLine.addConsequence( + new ConsequenceDeleteItem(item, getAdvancedNumber(ctx.advancedNumber()), + new ParsedItemData(getItemDataOpt(ctx.itemDataList()))) + ); + } else { + ctx.addErrorNode(ctx.itemId().getStart()); + } + break; + case "gemcraft": + currentTalkingLine.addConsequence(new ConsequenceGemcraft()); + break; + case "inform": + currentTalkingLine.addConsequence(new ConsequenceInform(getString(ctx.STRING()))); + break; + case "introduce": + currentTalkingLine.addConsequence(new ConsequenceIntroduce()); + break; + case "item": + item = getItem(ctx.itemId()); + if (item != null) { + currentTalkingLine.addConsequence(new ConsequenceItem(item, getAdvancedNumber(ctx.advancedNumber()), + getItemQualityOpt(ctx.itemQuality()), + new ParsedItemData( + getItemDataOpt(ctx.itemDataList())) + )); + } else { + ctx.addErrorNode(ctx.itemId().getStart()); + } + break; + case "money": + currentTalkingLine.addConsequence( + new ConsequenceMoney(getOperator(ctx.set()), getAdvancedNumber(ctx.advancedNumber()))); + break; + case "queststatus": + currentTalkingLine.addConsequence( + new ConsequenceQueststatus(getQuestId(ctx.questId()), getOperator(ctx.set()), + getAdvancedNumber(ctx.advancedNumber())) + ); + break; + case "rankpoints": + currentTalkingLine.addConsequence( + new ConsequenceRankpoints(getOperator(ctx.set()), getAdvancedNumber(ctx.advancedNumber()))); + break; + case "repair": + currentTalkingLine.addConsequence(new ConsequenceRepair()); + break; + case "rune": + currentTalkingLine.addConsequence( + new ConsequenceRune(getMagicType(ctx.magictypeWithRunes()), getInteger(ctx.INT()))); + break; + case "skill": + currentTalkingLine.addConsequence(new ConsequenceSkill(getSkill(ctx.skill()), getOperator(ctx.set()), + getAdvancedNumber(ctx.advancedNumber()))); + break; + case "spawn": + currentTalkingLine.addConsequence( + new ConsequenceSpawn(getMonsterId(ctx.monsterId()), getMonsterCount(ctx.monsterCount()), + getRadius(ctx.radius()), getLocation(ctx.location()))); + break; + case "state": + currentTalkingLine.addConsequence( + new ConsequenceState(getOperator(ctx.set()), getAdvancedNumber(ctx.advancedNumber()))); + break; + case "town": + currentTalkingLine.addConsequence(new ConsequenceTown(getTown(ctx.town()))); + break; + case "trade": + currentTalkingLine.addConsequence(new ConsequenceTrade()); + break; + case "treasure": + currentTalkingLine.addConsequence(new ConsequenceTreasure(getAdvancedNumber(ctx.advancedNumber()))); + break; + case "warp": + currentTalkingLine.addConsequence(new ConsequenceWarp(getLocation(ctx.location()))); + break; + default: + return super.visitConsequence(ctx); + } + return super.visitConsequence(ctx); + } + + @Nullable @Override - public ParsedNpcVisitor visitBasicConfiguration(@NotNull BasicConfigurationContext ctx) { + public ParsedNpcVisitor visitBasicConfiguration(BasicConfigurationContext ctx) { Token startToken = ctx.getStart(); switch (startToken.getText()) { case "affiliation": @@ -122,8 +320,9 @@ public ParsedNpcVisitor visitBasicConfiguration(@NotNull BasicConfigurationConte return super.visitBasicConfiguration(ctx); } + @Nullable @Override - public ParsedNpcVisitor visitColorConfiguration(@NotNull ColorConfigurationContext ctx) { + public ParsedNpcVisitor visitColorConfiguration(ColorConfigurationContext ctx) { Token startToken = ctx.getStart(); Color color = getColor(ctx.color()); @@ -141,8 +340,9 @@ public ParsedNpcVisitor visitColorConfiguration(@NotNull ColorConfigurationConte return super.visitColorConfiguration(ctx); } + @Nullable @Override - public ParsedNpcVisitor visitEquipmentConfiguration(@NotNull EquipmentConfigurationContext ctx) { + public ParsedNpcVisitor visitEquipmentConfiguration(EquipmentConfigurationContext ctx) { Token startToken = ctx.getStart(); Items item = getItem(ctx.itemId()); @@ -182,8 +382,9 @@ public ParsedNpcVisitor visitEquipmentConfiguration(@NotNull EquipmentConfigurat return super.visitEquipmentConfiguration(ctx); } + @Nullable @Override - public ParsedNpcVisitor visitGuardConfiguration(@NotNull GuardConfigurationContext ctx) { + public ParsedNpcVisitor visitGuardConfiguration(GuardConfigurationContext ctx) { Token startToken = ctx.getStart(); switch (startToken.getText()) { @@ -204,8 +405,9 @@ public ParsedNpcVisitor visitGuardConfiguration(@NotNull GuardConfigurationConte return super.visitGuardConfiguration(ctx); } + @Nullable @Override - public ParsedNpcVisitor visitHairConfiguration(@NotNull HairConfigurationContext ctx) { + public ParsedNpcVisitor visitHairConfiguration(HairConfigurationContext ctx) { Token startToken = ctx.getStart(); int id = getInteger(ctx.INT()); @@ -223,8 +425,45 @@ public ParsedNpcVisitor visitHairConfiguration(@NotNull HairConfigurationContext return super.visitHairConfiguration(ctx); } + @Nullable + @Override + public ParsedNpcVisitor visitTraderSimpleConfiguration( + TraderSimpleConfigurationContext ctx) { + Token startToken = ctx.getStart(); + TradeMode tradeMode; + switch (startToken.getText()) { + case "sellItems": + tradeMode = TradeMode.selling; + break; + case "buyPrimaryItems": + tradeMode = TradeMode.buyingPrimary; + break; + case "buySecondaryItems": + tradeMode = TradeMode.buyingSecondary; + break; + default: + ctx.addErrorNode(startToken); + LOGGER.warn("Unknown simple trade configuration key: {}", startToken.getText()); + return super.visitTraderSimpleConfiguration(ctx); + } + + List itemIds = ctx.itemId(); + List ids = new ArrayList<>(itemIds.size()); + for (ItemIdContext itemId : itemIds) { + Items item = getItem(itemId); + if (item == null) { + ctx.addErrorNode(itemId.getStart()); + } else { + ids.add(item.getItemId()); + } + } + npc.addNpcData(new ParsedTradeSimple(tradeMode, ids)); + return super.visitTraderSimpleConfiguration(ctx); + } + + @Nullable @Override - public ParsedNpcVisitor visitTraderComplexConfiguration(@NotNull TraderComplexConfigurationContext ctx) { + public ParsedNpcVisitor visitTraderComplexConfiguration(TraderComplexConfigurationContext ctx) { Token startToken = ctx.getStart(); TradeMode tradeMode; switch (startToken.getText()) { @@ -291,180 +530,79 @@ public ParsedNpcVisitor visitTraderComplexConfiguration(@NotNull TraderComplexCo return super.visitTraderComplexConfiguration(ctx); } + @Nullable @Override - public ParsedNpcVisitor visitTraderSimpleConfiguration( - @NotNull TraderSimpleConfigurationContext ctx) { + public ParsedNpcVisitor visitWalkConfiguration(WalkConfigurationContext ctx) { Token startToken = ctx.getStart(); - TradeMode tradeMode; switch (startToken.getText()) { - case "sellItems": - tradeMode = TradeMode.selling; - break; - case "buyPrimaryItems": - tradeMode = TradeMode.buyingPrimary; - break; - case "buySecondaryItems": - tradeMode = TradeMode.buyingSecondary; + case "radius": + npc.addNpcData(new ParsedWalkingRadius(getInteger(ctx.INT()))); break; default: ctx.addErrorNode(startToken); - LOGGER.warn("Unknown simple trade configuration key: {}", startToken.getText()); - return super.visitTraderSimpleConfiguration(ctx); - } - - List itemIds = ctx.itemId(); - List ids = new ArrayList<>(itemIds.size()); - for (ItemIdContext itemId : itemIds) { - Items item = getItem(itemId); - if (item == null) { - ctx.addErrorNode(itemId.getStart()); - } else { - ids.add(item.getItemId()); - } - } - npc.addNpcData(new ParsedTradeSimple(tradeMode, ids)); - return super.visitTraderSimpleConfiguration(ctx); - } - - @Override - public ParsedNpcVisitor visitWalkConfiguration(@NotNull WalkConfigurationContext ctx) { - Token startToken = ctx.getStart(); - switch (startToken.getText()) { - case "radius": - npc.addNpcData(new ParsedWalkingRadius(getInteger(ctx.INT()))); - break; - default: - ctx.addErrorNode(startToken); - LOGGER.warn("Unknown walking configuration key: {}", startToken.getText()); + LOGGER.warn("Unknown walking configuration key: {}", startToken.getText()); } return super.visitWalkConfiguration(ctx); } @Nullable - private ParsedTalk currentTalkingLine; - @Override - public ParsedNpcVisitor visitTalkCommand(@NotNull TalkCommandContext ctx) { - currentTalkingLine = new ParsedTalk(); - ParsedNpcVisitor result = super.visitTalkCommand(ctx); - npc.addNpcData(currentTalkingLine); - currentTalkingLine = null; - return result; - } - - @Override - public ParsedNpcVisitor visitTrigger(@NotNull TriggerContext ctx) { - if (currentTalkingLine == null) { - LOGGER.error("Visiting trigger while there is no active talking line."); - } else { - currentTalkingLine.addCondition(new ConditionTrigger(getString(ctx.STRING()))); + public ParsedNpcVisitor visitTextConfiguration(TextConfigurationContext ctx) { + TextKeyContext textKeyContext = ctx.textKey(); + if (textKeyContext == null) { + ctx.addErrorNode(ctx.getStart()); + LOGGER.warn("Missing text key for text configuration."); + return defaultResult(); } - return super.visitTrigger(ctx); - } - @Override - public ParsedNpcVisitor visitCondition(@NotNull ConditionContext ctx) { - if (currentTalkingLine == null) { - LOGGER.error("Visiting condition while there is no active talking line."); - return super.visitCondition(ctx); - } - switch (ctx.getStart().getText()) { - case "isAdmin": - currentTalkingLine.addCondition(new ConditionAdmin()); - break; - case "attrib": - currentTalkingLine.addCondition( - new ConditionAttrib(getAttribute(ctx.attribute()), getOperator(ctx.compare()), - getAdvancedNumber(ctx.advancedNumber())) - ); - break; - case "chance": - TerminalNode intNode = ctx.INT(); - if (intNode != null) { - currentTalkingLine.addCondition(new ConditionChance(getInteger(intNode))); - } else { - currentTalkingLine.addCondition(new ConditionChance(getFloat(ctx.FLOAT()))); - } - break; - case "item": - Items item = getItem(ctx.itemId()); - if (item != null) { - currentTalkingLine.addCondition( - new ConditionItem(item, getItemPosition(ctx.itemPos()), getOperator(ctx.compare()), - getAdvancedNumber(ctx.advancedNumber()), - new ParsedItemData(getItemDataOpt(ctx.itemDataList()))) - ); - } - break; - case "magictype": - currentTalkingLine.addCondition(new ConditionMagicType(getMagicType(ctx.magictype()))); - break; - case "money": - currentTalkingLine.addCondition( - new ConditionMoney(getOperator(ctx.compare()), getAdvancedNumber(ctx.advancedNumber()))); - break; - case "%NUMBER": - currentTalkingLine.addCondition(new ConditionNumber(getOperator(ctx.compare()), getInteger(ctx.INT()))); - break; - case "queststatus": - currentTalkingLine.addCondition( - new ConditionQueststatus(getQuestId(ctx.questId()), getOperator(ctx.compare()), - getAdvancedNumber(ctx.advancedNumber())) - ); + String german = getString(ctx.STRING(0)); + String english = getString(ctx.STRING(1)); + switch (textKeyContext.getStart().getText()) { + case "cycletext": + npc.addNpcData(new ParsedCycleText(german, english)); break; - case "race": - currentTalkingLine.addCondition(new ConditionRace(getRace(ctx.race()))); + case "hitPlayerMsg": + npc.addNpcData(new ParsedGuardText(HitPlayer, german, english)); break; - case "rank": - currentTalkingLine.addCondition( - new ConditionRank(getOperator(ctx.compare()), getAdvancedNumber(ctx.advancedNumber()))); + case "tradeFinishedMsg": + npc.addNpcData(new ParsedTradeText(TradingCanceled, german, english)); break; - case "sex": - currentTalkingLine.addCondition(new ConditionSex(getSex(ctx.gender()))); + case "tradeFinishedWithoutTradingMsg": + npc.addNpcData(new ParsedTradeText(TradingCanceledWithoutTrade, german, english)); break; - case "skill": - Skill skill = getSkill(ctx.skill()); - if (skill != null) { - currentTalkingLine.addCondition(new ConditionSkill(skill, getOperator(ctx.compare()), - getAdvancedNumber(ctx.advancedNumber()))); - } + case "tradeNotEnoughMoneyMsg": + npc.addNpcData(new ParsedTradeText(NoMoney, german, english)); break; - case "state": - currentTalkingLine.addCondition( - new ConditionState(getOperator(ctx.compare()), getAdvancedNumber(ctx.advancedNumber()))); + case "tradeWrongItemMsg": + npc.addNpcData(new ParsedTradeText(WrongItem, german, english)); break; - case "talkMode": - currentTalkingLine.addCondition(new ConditionTalkMode(getTalkMode(ctx.talkMode()))); + case "warpedMonsterMsg": + npc.addNpcData(new ParsedGuardText(WarpedMonster, german, english)); break; - case "town": - currentTalkingLine.addCondition(new ConditionTown(getTown(ctx.town()))); + case "warpedPlayerMsg": + npc.addNpcData(new ParsedGuardText(WarpedPlayer, german, english)); break; default: - return super.visitCondition(ctx); - } - return super.visitCondition(ctx); - } - - @Override - public ParsedNpcVisitor visitLanguage(@NotNull LanguageContext ctx) { - if (currentTalkingLine != null) { - currentTalkingLine.addCondition(new ConditionLanguage(getPlayerLanguage(ctx))); + ctx.addErrorNode(textKeyContext.getStart()); + LOGGER.warn("Unknown basic text key: {}", textKeyContext.getText()); } - return super.visitLanguage(ctx); + return super.visitTextConfiguration(ctx); } + @Nullable @Override - public ParsedNpcVisitor visitTalkstateGet(@NotNull TalkstateGetContext ctx) { + public ParsedNpcVisitor visitTrigger(TriggerContext ctx) { if (currentTalkingLine == null) { - LOGGER.error("Visiting talk state get while there is no active talking line."); + LOGGER.error("Visiting trigger while there is no active talking line."); } else { - currentTalkingLine.addCondition(new ConditionTalkstate(getTalkState(ctx))); + currentTalkingLine.addCondition(new ConditionTrigger(getString(ctx.STRING()))); } - return super.visitTalkstateGet(ctx); + return super.visitTrigger(ctx); } + @Nullable @Override - public ParsedNpcVisitor visitAnswer(@NotNull AnswerContext ctx) { + public ParsedNpcVisitor visitAnswer(AnswerContext ctx) { if (currentTalkingLine == null) { LOGGER.error("Visiting consequence while there is no active talking line."); } else { @@ -473,162 +611,41 @@ public ParsedNpcVisitor visitAnswer(@NotNull AnswerContext ctx) { return super.visitAnswer(ctx); } + @Nullable @Override - public ParsedNpcVisitor visitConsequence(@NotNull ConsequenceContext ctx) { - if (currentTalkingLine == null) { - LOGGER.error("Visiting consequence while there is no active talking line."); - return defaultResult(); - } - switch (ctx.getStart().getText()) { - case "arena": - currentTalkingLine.addConsequence(new ConsequenceArena(getArenaTask(ctx.arenaTask()))); - break; - case "attrib": - currentTalkingLine.addConsequence( - new ConsequenceAttribute(getAttribute(ctx.attribute()), getOperator(ctx.set()), - getAdvancedNumber(ctx.advancedNumber())) - ); - break; - case "deleteItem": - Items item = getItem(ctx.itemId()); - if (item != null) { - currentTalkingLine.addConsequence( - new ConsequenceDeleteItem(item, getAdvancedNumber(ctx.advancedNumber()), - new ParsedItemData(getItemDataOpt(ctx.itemDataList()))) - ); - } else { - ctx.addErrorNode(ctx.itemId().getStart()); - } - break; - case "gemcraft": - currentTalkingLine.addConsequence(new ConsequenceGemcraft()); - break; - case "inform": - currentTalkingLine.addConsequence(new ConsequenceInform(getString(ctx.STRING()))); - break; - case "introduce": - currentTalkingLine.addConsequence(new ConsequenceIntroduce()); - break; - case "item": - item = getItem(ctx.itemId()); - if (item != null) { - currentTalkingLine.addConsequence(new ConsequenceItem(item, getAdvancedNumber(ctx.advancedNumber()), - getItemQualityOpt(ctx.itemQuality()), - new ParsedItemData( - getItemDataOpt(ctx.itemDataList())) - )); - } else { - ctx.addErrorNode(ctx.itemId().getStart()); - } - break; - case "money": - currentTalkingLine.addConsequence( - new ConsequenceMoney(getOperator(ctx.set()), getAdvancedNumber(ctx.advancedNumber()))); - break; - case "queststatus": - currentTalkingLine.addConsequence( - new ConsequenceQueststatus(getQuestId(ctx.questId()), getOperator(ctx.set()), - getAdvancedNumber(ctx.advancedNumber())) - ); - break; - case "rankpoints": - currentTalkingLine.addConsequence( - new ConsequenceRankpoints(getOperator(ctx.set()), getAdvancedNumber(ctx.advancedNumber()))); - break; - case "repair": - currentTalkingLine.addConsequence(new ConsequenceRepair()); - break; - case "rune": - currentTalkingLine.addConsequence( - new ConsequenceRune(getMagicType(ctx.magictypeWithRunes()), getInteger(ctx.INT()))); - break; - case "skill": - currentTalkingLine.addConsequence(new ConsequenceSkill(getSkill(ctx.skill()), getOperator(ctx.set()), - getAdvancedNumber(ctx.advancedNumber()))); - break; - case "spawn": - currentTalkingLine.addConsequence( - new ConsequenceSpawn(getMonsterId(ctx.monsterId()), getMonsterCount(ctx.monsterCount()), - getRadius(ctx.radius()), getLocation(ctx.location()))); - break; - case "state": - currentTalkingLine.addConsequence( - new ConsequenceState(getOperator(ctx.set()), getAdvancedNumber(ctx.advancedNumber()))); - break; - case "town": - currentTalkingLine.addConsequence(new ConsequenceTown(getTown(ctx.town()))); - break; - case "trade": - currentTalkingLine.addConsequence(new ConsequenceTrade()); - break; - case "treasure": - currentTalkingLine.addConsequence(new ConsequenceTreasure(getAdvancedNumber(ctx.advancedNumber()))); - break; - case "warp": - currentTalkingLine.addConsequence(new ConsequenceWarp(getLocation(ctx.location()))); - break; - default: - return super.visitConsequence(ctx); + public ParsedNpcVisitor visitLanguage(LanguageContext ctx) { + if (currentTalkingLine != null) { + currentTalkingLine.addCondition(new ConditionLanguage(getPlayerLanguage(ctx))); } - return super.visitConsequence(ctx); + return super.visitLanguage(ctx); } + @Nullable @Override - public ParsedNpcVisitor visitTalkstateSet(@NotNull TalkstateSetContext ctx) { + public ParsedNpcVisitor visitTalkstateGet(TalkstateGetContext ctx) { if (currentTalkingLine == null) { - LOGGER.error("Visiting consequence while there is no active talking line."); - return defaultResult(); + LOGGER.error("Visiting talk state get while there is no active talking line."); + } else { + currentTalkingLine.addCondition(new ConditionTalkstate(getTalkState(ctx))); } - - currentTalkingLine.addConsequence(new ConsequenceTalkstate(getTalkState(ctx))); - return defaultResult(); + return super.visitTalkstateGet(ctx); } + @Nullable @Override - public ParsedNpcVisitor visitTextConfiguration(@NotNull TextConfigurationContext ctx) { - TextKeyContext textKeyContext = ctx.textKey(); - if (textKeyContext == null) { - ctx.addErrorNode(ctx.getStart()); - LOGGER.warn("Missing text key for text configuration."); + public ParsedNpcVisitor visitTalkstateSet(TalkstateSetContext ctx) { + if (currentTalkingLine == null) { + LOGGER.error("Visiting consequence while there is no active talking line."); return defaultResult(); } - String german = getString(ctx.STRING(0)); - String english = getString(ctx.STRING(1)); - switch (textKeyContext.getStart().getText()) { - case "cycletext": - npc.addNpcData(new ParsedCycleText(german, english)); - break; - case "hitPlayerMsg": - npc.addNpcData(new ParsedGuardText(HitPlayer, german, english)); - break; - case "tradeFinishedMsg": - npc.addNpcData(new ParsedTradeText(TradingCanceled, german, english)); - break; - case "tradeFinishedWithoutTradingMsg": - npc.addNpcData(new ParsedTradeText(TradingCanceledWithoutTrade, german, english)); - break; - case "tradeNotEnoughMoneyMsg": - npc.addNpcData(new ParsedTradeText(NoMoney, german, english)); - break; - case "tradeWrongItemMsg": - npc.addNpcData(new ParsedTradeText(WrongItem, german, english)); - break; - case "warpedMonsterMsg": - npc.addNpcData(new ParsedGuardText(WarpedMonster, german, english)); - break; - case "warpedPlayerMsg": - npc.addNpcData(new ParsedGuardText(WarpedPlayer, german, english)); - break; - default: - ctx.addErrorNode(textKeyContext.getStart()); - LOGGER.warn("Unknown basic text key: {}", textKeyContext.getText()); - } - return super.visitTextConfiguration(ctx); + currentTalkingLine.addConsequence(new ConsequenceTalkstate(getTalkState(ctx))); + return defaultResult(); } + @Nullable @Override - public ParsedNpcVisitor visitErrorNode(@NotNull ErrorNode node) { + public ParsedNpcVisitor visitErrorNode(ErrorNode node) { npc.addError(node.getSymbol().getLine(), node.getSymbol().getCharPositionInLine(), node.getText()); return defaultResult(); } @@ -640,46 +657,46 @@ public ParsedNpc getParsedNpc() { @Override public void syntaxError( - @NotNull Recognizer recognizer, - @org.antlr.v4.runtime.misc.Nullable Object offendingSymbol, + Recognizer recognizer, + Object offendingSymbol, int line, int charPositionInLine, - @NotNull String msg, - @org.antlr.v4.runtime.misc.Nullable RecognitionException e) { + String msg, + RecognitionException e) { npc.addError(line, charPositionInLine, msg); } @Override public void reportAmbiguity( - @NotNull Parser recognizer, - @NotNull DFA dfa, + Parser recognizer, + DFA dfa, int startIndex, int stopIndex, boolean exact, - @org.antlr.v4.runtime.misc.Nullable BitSet ambigAlts, - @NotNull ATNConfigSet configs) { + BitSet ambigAlts, + ATNConfigSet configs) { } @Override public void reportAttemptingFullContext( - @NotNull Parser recognizer, - @NotNull DFA dfa, + Parser recognizer, + DFA dfa, int startIndex, int stopIndex, - @org.antlr.v4.runtime.misc.Nullable BitSet conflictingAlts, - @NotNull ATNConfigSet configs) { + BitSet conflictingAlts, + ATNConfigSet configs) { } @Override public void reportContextSensitivity( - @NotNull Parser recognizer, - @NotNull DFA dfa, + Parser recognizer, + DFA dfa, int startIndex, int stopIndex, int prediction, - @NotNull ATNConfigSet configs) { + ATNConfigSet configs) { } }