From 67fdeb3a16941d4f9917dd49ea5228b00229769f Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 3 Sep 2016 23:58:01 -0400 Subject: [PATCH] Add test for loading legacy dialogue Also a minor enhancement to the Set Flag dialogue node. --- doc/editor/Dialogue.html | 8 +- src/BoE.xcodeproj/project.pbxproj | 4 + src/boe.dlgutil.cpp | 2 +- src/classes/talking.cpp | 1 + test/talk_legacy.cpp | 381 ++++++++++++++++++++++++++++++ 5 files changed, 391 insertions(+), 5 deletions(-) create mode 100644 test/talk_legacy.cpp diff --git a/doc/editor/Dialogue.html b/doc/editor/Dialogue.html index 02397ea3..f1826d10 100644 --- a/doc/editor/Dialogue.html +++ b/doc/editor/Dialogue.html @@ -94,12 +94,12 @@ the value in C, the character responds with the text in Text 1. Otherwise,the ch responds with the text in Text 2.

Example: Suppose A is 58, B is 3, and C is 2. If the Stuff Done flag (58,3) is 1, the response is Text 1. If Stuff Done flag (58,3) is 5, the response is Text 2.

-

Node Type 2 - Set to One The character responds with the text in the Text 1 and -Text 2 fields. In addition, the Stuff Done flag (A,B) is set to 1.

+

Node Type 2 - Set Flag The character responds with the text in the Text 1 and +Text 2 fields. In addition, the Stuff Done flag (A,B) is set to C.

Example: You want Stuff Done flag (100,2) to be set to 1 when the party knows that -theres a treasure hidden in a tree. Old Man McGee tells them that its there when asked +theres a treasure hidden in a tree. Old Man McGee tells them that it's there when asked about tree. When Old Man McGee is asked about tree use a talking node of this type as a -response, with A set to 100 and B set to 2.

+response, with A set to 100, B set to 2, and C set to 1.

Node Type 3 - Inn If the party can afford it, conversation ends, and the party is moved to a different place and healed. Field A is the cost of the inn, and field B is the quality of the inn (Range 0 ... 3). If the party can afford it, the character says diff --git a/src/BoE.xcodeproj/project.pbxproj b/src/BoE.xcodeproj/project.pbxproj index e4643bf3..c32b6482 100755 --- a/src/BoE.xcodeproj/project.pbxproj +++ b/src/BoE.xcodeproj/project.pbxproj @@ -106,6 +106,7 @@ 9169C3241B3B23610041002B /* libboost_thread.dylib in Copy Libraries and Frameworks */ = {isa = PBXBuildFile; fileRef = 910D9CA31B36439100414B17 /* libboost_thread.dylib */; }; 9176FEC71D550EFE006EF694 /* out_legacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9176FEC01D550EFC006EF694 /* out_legacy.cpp */; }; 9176FEC81D550EFE006EF694 /* scen_legacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9176FEC11D550EFC006EF694 /* scen_legacy.cpp */; }; + 9176FECB1D550EFE006EF694 /* talk_legacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9176FEC41D550EFD006EF694 /* talk_legacy.cpp */; }; 9176FECC1D550EFE006EF694 /* town_legacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9176FEC51D550EFE006EF694 /* town_legacy.cpp */; }; 9178235D1B2EA0C5007F3444 /* vorbisenc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9178235C1B2EA0C5007F3444 /* vorbisenc.framework */; }; 9178235E1B2EA0C5007F3444 /* vorbisenc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9178235C1B2EA0C5007F3444 /* vorbisenc.framework */; }; @@ -649,6 +650,7 @@ 9169C31F1B37A5D50041002B /* BoE Scenario Editor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "BoE Scenario Editor.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 9176FEC01D550EFC006EF694 /* out_legacy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = out_legacy.cpp; sourceTree = ""; }; 9176FEC11D550EFC006EF694 /* scen_legacy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scen_legacy.cpp; sourceTree = ""; }; + 9176FEC41D550EFD006EF694 /* talk_legacy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = talk_legacy.cpp; sourceTree = ""; }; 9176FEC51D550EFE006EF694 /* town_legacy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = town_legacy.cpp; sourceTree = ""; }; 9178235C1B2EA0C5007F3444 /* vorbisenc.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = vorbisenc.framework; path = ../../../../../../Library/Frameworks/vorbisenc.framework; sourceTree = ""; }; 917823671B2F32DD007F3444 /* vorbisfile.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = vorbisfile.framework; path = ../../../../../../Library/Frameworks/vorbisfile.framework; sourceTree = ""; }; @@ -1362,6 +1364,7 @@ 91CC173A1B421CA0003D9A69 /* scen_read.cpp */, 91CC173B1B421CA0003D9A69 /* scen_write.cpp */, 919B13A51BBDE985009905A4 /* spec_legacy.cpp */, + 9176FEC41D550EFD006EF694 /* talk_legacy.cpp */, 91C2A6EE1B8FAA8E00346948 /* talk_read.cpp */, 91E381471B97675900F69B81 /* talk_write.cpp */, 91E128E31BC1624700C8BE1D /* ter_legacy.cpp */, @@ -1899,6 +1902,7 @@ 91E128E61BC19DA400C8BE1D /* init.cpp in Sources */, 9176FEC71D550EFE006EF694 /* out_legacy.cpp in Sources */, 9176FEC81D550EFE006EF694 /* scen_legacy.cpp in Sources */, + 9176FECB1D550EFE006EF694 /* talk_legacy.cpp in Sources */, 9176FECC1D550EFE006EF694 /* town_legacy.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/src/boe.dlgutil.cpp b/src/boe.dlgutil.cpp index 444715a8..fe38f468 100644 --- a/src/boe.dlgutil.cpp +++ b/src/boe.dlgutil.cpp @@ -801,7 +801,7 @@ void handle_talk_event(location p) { save_talk_str2 = ""; break; case eTalkNode::SET_SDF: - PSD[a][b] = 1; + PSD[a][b] = c; break; case eTalkNode::INN: if(univ.party.gold < a) { diff --git a/src/classes/talking.cpp b/src/classes/talking.cpp index 6b7ad189..b43d3191 100644 --- a/src/classes/talking.cpp +++ b/src/classes/talking.cpp @@ -34,6 +34,7 @@ void cSpeech::import_legacy(legacy::talking_record_type& old, std::vector shops; + old_talk.talk_nodes[0].personality = 12; + old_talk.talk_nodes[0].type = 0; + std::copy_n("findthem", 8, old_talk.talk_nodes[0].link1); + std::fill_n(old_talk.talk_nodes[0].extras, 4, 0); + + SECTION("Basic data") { + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].personality == 12); + CHECK(talk.talk_nodes[0].type == eTalkNode::REGULAR); + CHECK(talk.talk_nodes[0].link1[0] == 'f'); + CHECK(talk.talk_nodes[0].link1[1] == 'i'); + CHECK(talk.talk_nodes[0].link1[2] == 'n'); + CHECK(talk.talk_nodes[0].link1[3] == 'd'); + CHECK(talk.talk_nodes[0].link2[0] == 't'); + CHECK(talk.talk_nodes[0].link2[1] == 'h'); + CHECK(talk.talk_nodes[0].link2[2] == 'e'); + CHECK(talk.talk_nodes[0].link2[3] == 'm'); + CHECK(talk.talk_nodes[0].extras[0] == 0); + CHECK(talk.talk_nodes[0].extras[1] == 0); + CHECK(talk.talk_nodes[0].extras[2] == 0); + CHECK(talk.talk_nodes[0].extras[3] == 0); + } + SECTION("Basic & If-Then talking nodes") { + SECTION("Depends on Flag") { + old_talk.talk_nodes[0].type = 1; + old_talk.talk_nodes[0].extras[0] = 12; + old_talk.talk_nodes[0].extras[1] = 13; + old_talk.talk_nodes[0].extras[2] = 14; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::DEP_ON_SDF); + CHECK(talk.talk_nodes[0].extras[0] == 12); + CHECK(talk.talk_nodes[0].extras[1] == 13); + CHECK(talk.talk_nodes[0].extras[2] == 14); + } + SECTION("Set to One") { + old_talk.talk_nodes[0].type = 2; + old_talk.talk_nodes[0].extras[0] = 12; + old_talk.talk_nodes[0].extras[1] = 13; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::SET_SDF); + CHECK(talk.talk_nodes[0].extras[0] == 12); + CHECK(talk.talk_nodes[0].extras[1] == 13); + CHECK(talk.talk_nodes[0].extras[2] == 1); + } + SECTION("Inn") { + old_talk.talk_nodes[0].type = 3; + old_talk.talk_nodes[0].extras[0] = 12; + old_talk.talk_nodes[0].extras[1] = 13; + old_talk.talk_nodes[0].extras[2] = 14; + old_talk.talk_nodes[0].extras[3] = 15; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::INN); + CHECK(talk.talk_nodes[0].extras[0] == 12); + CHECK(talk.talk_nodes[0].extras[1] == 13); + CHECK(talk.talk_nodes[0].extras[2] == 14); + CHECK(talk.talk_nodes[0].extras[3] == 15); + } + SECTION("Depends on time") { + old_talk.talk_nodes[0].type = 4; + old_talk.talk_nodes[0].extras[0] = 12; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::DEP_ON_TIME); + CHECK(talk.talk_nodes[0].extras[0] == 12); + } + SECTION("Depends on time with event") { + old_talk.talk_nodes[0].type = 5; + old_talk.talk_nodes[0].extras[0] = 12; + old_talk.talk_nodes[0].extras[1] = 13; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::DEP_ON_TIME_AND_EVENT); + CHECK(talk.talk_nodes[0].extras[0] == 12); + CHECK(talk.talk_nodes[0].extras[1] == 13); + } + SECTION("Depends on town") { + old_talk.talk_nodes[0].type = 6; + old_talk.talk_nodes[0].extras[0] = 12; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::DEP_ON_TOWN); + CHECK(talk.talk_nodes[0].extras[0] == 12); + } + } + SECTION("Shops") { + SECTION("Regular shop") { + old_talk.talk_nodes[0].type = 7; + old_talk.talk_nodes[0].extras[0] = 6; + old_talk.talk_nodes[0].extras[1] = 13; + old_talk.talk_nodes[0].extras[2] = 14; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP); + CHECK(talk.talk_nodes[0].extras[0] == 6); // "Utterly Ridiculous" + CHECK(talk.talk_nodes[0].extras[1] == 6); + CHECK(talk.talk_nodes[0].extras[2] == 0); + REQUIRE(shops.size() == 1); + CHECK(shops[0].type == eShopItemType::ITEM); + CHECK(shops[0].first == 13); + CHECK(shops[0].count == 14); + } + SECTION("Training") { + old_talk.talk_nodes[0].type = 8; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::TRAINING); + } + SECTION("Mage spell shop") { + old_talk.talk_nodes[0].type = 9; + old_talk.talk_nodes[0].extras[0] = 6; + old_talk.talk_nodes[0].extras[1] = 13; + old_talk.talk_nodes[0].extras[2] = 14; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP); + CHECK(talk.talk_nodes[0].extras[0] == 6); + CHECK(talk.talk_nodes[0].extras[1] == 6); + CHECK(talk.talk_nodes[0].extras[2] == 0); + REQUIRE(shops.size() == 1); + CHECK(shops[0].type == eShopItemType::MAGE_SPELL); + CHECK(shops[0].first == 43); + CHECK(shops[0].count == 14); + } + SECTION("Priest spell shop") { + old_talk.talk_nodes[0].type = 10; + old_talk.talk_nodes[0].extras[0] = 6; + old_talk.talk_nodes[0].extras[1] = 13; + old_talk.talk_nodes[0].extras[2] = 14; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP); + CHECK(talk.talk_nodes[0].extras[0] == 6); + CHECK(talk.talk_nodes[0].extras[1] == 6); + CHECK(talk.talk_nodes[0].extras[2] == 0); + REQUIRE(shops.size() == 1); + CHECK(shops[0].type == eShopItemType::PRIEST_SPELL); + CHECK(shops[0].first == 43); + CHECK(shops[0].count == 14); + } + SECTION("Alchemy shop") { + old_talk.talk_nodes[0].type = 11; + old_talk.talk_nodes[0].extras[0] = 6; + old_talk.talk_nodes[0].extras[1] = 13; + old_talk.talk_nodes[0].extras[2] = 14; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP); + CHECK(talk.talk_nodes[0].extras[0] == 6); + CHECK(talk.talk_nodes[0].extras[1] == 6); + CHECK(talk.talk_nodes[0].extras[2] == 0); + REQUIRE(shops.size() == 1); + CHECK(shops[0].type == eShopItemType::ALCHEMY); + CHECK(shops[0].first == 13); + CHECK(shops[0].count == 14); + } + SECTION("Healer") { + old_talk.talk_nodes[0].type = 12; + old_talk.talk_nodes[0].extras[0] = 6; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP); + CHECK(talk.talk_nodes[0].extras[0] == 6); + CHECK(talk.talk_nodes[0].extras[1] == 5); + CHECK(talk.talk_nodes[0].extras[2] == 0); + } + SECTION("Junk Shop") { + old_talk.talk_nodes[0].type = 23; + old_talk.talk_nodes[0].extras[0] = 6; + old_talk.talk_nodes[0].extras[1] = 4; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP); + CHECK(talk.talk_nodes[0].extras[0] == 6); + CHECK(talk.talk_nodes[0].extras[1] == 4); + } + SECTION("Sell weapons") { + old_talk.talk_nodes[0].type = 13; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::SELL_WEAPONS); + } + SECTION("Sell armour") { + old_talk.talk_nodes[0].type = 14; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::SELL_ARMOR); + } + SECTION("Sell anything") { + old_talk.talk_nodes[0].type = 15; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::SELL_ITEMS); + } + SECTION("Identify") { + old_talk.talk_nodes[0].type = 16; + old_talk.talk_nodes[0].extras[0] = 12; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::IDENTIFY); + CHECK(talk.talk_nodes[0].extras[0] == 12); + } + SECTION("Enchant") { + old_talk.talk_nodes[0].type = 17; + old_talk.talk_nodes[0].extras[0] = 12; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::ENCHANT); + CHECK(talk.talk_nodes[0].extras[0] == 12); + } + } + SECTION("Other nodes") { + SECTION("Buy info") { + old_talk.talk_nodes[0].type = 18; + old_talk.talk_nodes[0].extras[0] = 12; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_INFO); + CHECK(talk.talk_nodes[0].extras[0] == 12); + } + SECTION("Buy SDF") { + old_talk.talk_nodes[0].type = 19; + old_talk.talk_nodes[0].extras[0] = 12; + old_talk.talk_nodes[0].extras[1] = 13; + old_talk.talk_nodes[0].extras[2] = 14; + old_talk.talk_nodes[0].extras[3] = 15; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_SDF); + CHECK(talk.talk_nodes[0].extras[0] == 12); + CHECK(talk.talk_nodes[0].extras[1] == 13); + CHECK(talk.talk_nodes[0].extras[2] == 14); + CHECK(talk.talk_nodes[0].extras[3] == 15); + } + SECTION("Buy boat") { + old_talk.talk_nodes[0].type = 20; + old_talk.talk_nodes[0].extras[0] = 12; + old_talk.talk_nodes[0].extras[1] = 13; + old_talk.talk_nodes[0].extras[2] = 14; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_SHIP); + CHECK(talk.talk_nodes[0].extras[0] == 12); + CHECK(talk.talk_nodes[0].extras[1] == 13); + CHECK(talk.talk_nodes[0].extras[2] == 14); + } + SECTION("Buy horse") { + old_talk.talk_nodes[0].type = 21; + old_talk.talk_nodes[0].extras[0] = 12; + old_talk.talk_nodes[0].extras[1] = 13; + old_talk.talk_nodes[0].extras[2] = 14; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_HORSE); + CHECK(talk.talk_nodes[0].extras[0] == 12); + CHECK(talk.talk_nodes[0].extras[1] == 13); + CHECK(talk.talk_nodes[0].extras[2] == 14); + } + SECTION("Buy special item") { + old_talk.talk_nodes[0].type = 22; + old_talk.talk_nodes[0].extras[0] = 12; + old_talk.talk_nodes[0].extras[1] = 13; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_SPEC_ITEM); + CHECK(talk.talk_nodes[0].extras[0] == 12); + CHECK(talk.talk_nodes[0].extras[1] == 13); + } + SECTION("Buy town location") { + old_talk.talk_nodes[0].type = 24; + old_talk.talk_nodes[0].extras[0] = 12; + old_talk.talk_nodes[0].extras[1] = 13; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_TOWN_LOC); + CHECK(talk.talk_nodes[0].extras[0] == 12); + CHECK(talk.talk_nodes[0].extras[1] == 13); + } + SECTION("Force end") { + old_talk.talk_nodes[0].type = 25; + old_talk.talk_nodes[0].extras[0] = 12; + old_talk.talk_nodes[0].extras[1] = 13; + old_talk.talk_nodes[0].extras[2] = 14; + old_talk.talk_nodes[0].extras[3] = 15; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::END_FORCE); + CHECK(talk.talk_nodes[0].extras[0] == 12); + CHECK(talk.talk_nodes[0].extras[1] == 13); + CHECK(talk.talk_nodes[0].extras[2] == 14); + CHECK(talk.talk_nodes[0].extras[3] == 15); + } + SECTION("Force end + hostile") { + old_talk.talk_nodes[0].type = 26; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::END_FIGHT); + } + SECTION("Force end + alarm") { + old_talk.talk_nodes[0].type = 27; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::END_ALARM); + } + SECTION("Force end + die") { + old_talk.talk_nodes[0].type = 28; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::END_DIE); + } + SECTION("Call town special") { + old_talk.talk_nodes[0].type = 29; + old_talk.talk_nodes[0].extras[0] = 12; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::CALL_TOWN_SPEC); + CHECK(talk.talk_nodes[0].extras[0] == 12); + } + SECTION("Call scenario special") { + old_talk.talk_nodes[0].type = 30; + old_talk.talk_nodes[0].extras[0] = 12; + talk.import_legacy(old_talk, shops); + REQUIRE(talk.talk_nodes.size() >= 1); + CHECK(talk.talk_nodes[0].type == eTalkNode::CALL_SCEN_SPEC); + CHECK(talk.talk_nodes[0].extras[0] == 12); + } + } +} +#if 0 +enum class eTalkNode { + REGULAR = 0, + DEP_ON_SDF = 1, + SET_SDF = 2, + INN = 3, + DEP_ON_TIME = 4, + DEP_ON_TIME_AND_EVENT = 5, + DEP_ON_TOWN = 6, + SHOP = 7, + TRAINING = 8, + JOB_BANK = 9, + SELL_WEAPONS = 13, + SELL_ARMOR = 14, + SELL_ITEMS = 15, + IDENTIFY = 16, + ENCHANT = 17, + BUY_INFO = 18, + BUY_SDF = 19, + BUY_SHIP = 20, + BUY_HORSE = 21, + BUY_SPEC_ITEM = 22, + RECEIVE_QUEST = 23, + BUY_TOWN_LOC = 24, + END_FORCE = 25, + END_FIGHT = 26, + END_ALARM = 27, // Town hostile + END_DIE = 28, + CALL_TOWN_SPEC = 29, + CALL_SCEN_SPEC = 30, +}; +#endif