// // spec_legacy.cpp // BoE // // Created by Celtic Minstrel on 15-07-11. // // #include "catch.hpp" #include "oldstructs.hpp" #include "scenario/special.hpp" #include "fileio/resmgr/res_strings.hpp" #include "dialogxml/widgets/pictypes.hpp" #include "spell.hpp" #include "damage.hpp" #include "skills_traits.hpp" #include "fields.hpp" #include "race.hpp" #include "scenario/monster.hpp" // for eAttitude #include "scenario/town.hpp" // for lighting constants using namespace std; ostream& operator<< (ostream& out, eSpecType spec); // TODO: Replace these with behavioral tests - ie, actually run the node and verify correct results. TEST_CASE("When converting legacy special nodes (general)") { cSpecial newSpec; legacy::special_node_type oldSpec = {0,-1,-1,0,-1,-1,-1,-1,-1,-1,-1}; // Fetching opcodes requires strings to be available // Here we fetch them from the rsrc dir, rather than the data dir ResMgr::strings.pushPath("../rsrc/strings"); oldSpec.jumpto = 12; SECTION("Null Special") { oldSpec.type = 0; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::NONE); CHECK(newSpec.jumpto == 12); } SECTION("Set Flag") { oldSpec.type = 1; oldSpec.m1 = 2; oldSpec.m2 = 3; oldSpec.sd1 = 4; oldSpec.sd2 = 5; oldSpec.ex1a = 6; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::SET_SDF); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.sd1 == 4); CHECK(newSpec.sd2 == 5); CHECK(newSpec.ex1a == 6); CHECK(newSpec.jumpto == 12); } SECTION("Increment Flag") { oldSpec.type = 2; oldSpec.m1 = 2; oldSpec.m2 = 3; oldSpec.sd1 = 4; oldSpec.sd2 = 5; oldSpec.ex1a = 6; oldSpec.ex1b = 7; newSpec.import_legacy(oldSpec); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.sd1 == 4); CHECK(newSpec.sd2 == 5); CHECK(newSpec.ex1a == 6); CHECK(newSpec.ex1b == 7); CHECK(newSpec.jumpto == 12); } SECTION("Display Message") { oldSpec.type = 3; oldSpec.m1 = 2; oldSpec.m2 = 3; newSpec.import_legacy(oldSpec); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.jumpto == 12); } SECTION("Secret Passage") { oldSpec.type = 4; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::CANT_ENTER); CHECK(newSpec.ex1a == 0); CHECK(newSpec.ex2a == 1); CHECK(newSpec.jumpto == 12); } SECTION("Display Small Message") { oldSpec.type = 5; oldSpec.m1 = 2; oldSpec.m2 = 3; newSpec.import_legacy(oldSpec); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.jumpto == 12); } SECTION("Flip Flag") { oldSpec.type = 6; oldSpec.m1 = 2; oldSpec.m2 = 3; oldSpec.sd1 = 4; oldSpec.sd2 = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::FLIP_SDF); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.sd1 == 4); CHECK(newSpec.sd2 == 5); CHECK(newSpec.jumpto == 12); } SECTION("Out Block") { oldSpec.type = 7; oldSpec.m1 = 4; oldSpec.m2 = 5; oldSpec.ex1a = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_CONTEXT); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == int(eSpecCtx::OUT_MOVE)); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Town Block") { oldSpec.type = 8; oldSpec.m1 = 4; oldSpec.m2 = 5; oldSpec.ex1a = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_CONTEXT); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == int(eSpecCtx::TOWN_MOVE)); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Combat Block") { oldSpec.type = 9; oldSpec.m1 = 4; oldSpec.m2 = 5; oldSpec.ex1a = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_CONTEXT); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == int(eSpecCtx::COMBAT_MOVE)); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Looking Block") { oldSpec.type = 10; oldSpec.m1 = 4; oldSpec.m2 = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_LOOKING); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.jumpto == 12); } SECTION("Can't Enter") { oldSpec.type = 11; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::CANT_ENTER); CHECK(newSpec.ex1a == 1); CHECK(newSpec.ex2a == 0); CHECK(newSpec.jumpto == 12); } SECTION("Change Time") { oldSpec.type = 12; oldSpec.ex1a = 4; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::CHANGE_TIME); CHECK(newSpec.ex1a == 4); CHECK(newSpec.jumpto == 12); } SECTION("Start Scenario Timer") { oldSpec.type = 13; oldSpec.ex1a = 4; oldSpec.ex1b = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::SCEN_TIMER_START); CHECK(newSpec.ex1a == 4); CHECK(newSpec.ex1b == 5); CHECK(newSpec.jumpto == 12); } SECTION("Play Sound") { oldSpec.type = 14; oldSpec.ex1a = 10; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::PLAY_SOUND); CHECK(newSpec.ex1a == 10); CHECK(newSpec.jumpto == 12); } SECTION("Change Horse Possession") { oldSpec.type = 15; oldSpec.m1 = 2; oldSpec.m2 = 3; oldSpec.ex1a = 4; oldSpec.ex2a = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::CHANGE_HORSE_OWNER); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.ex1a == 4); CHECK(newSpec.ex2a == 5); CHECK(newSpec.jumpto == 12); } SECTION("Change Boat Owner") { oldSpec.type = 16; oldSpec.m1 = 2; oldSpec.m2 = 3; oldSpec.ex1a = 4; oldSpec.ex2a = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::CHANGE_BOAT_OWNER); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.ex1a == 4); CHECK(newSpec.ex2a == 5); CHECK(newSpec.jumpto == 12); } SECTION("Set Town Visibility") { oldSpec.type = 17; oldSpec.m1 = 2; oldSpec.m2 = 3; oldSpec.ex1a = 4; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::SET_TOWN_VISIBILITY); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.ex1a == 4); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Major Event Occurred") { oldSpec.type = 18; oldSpec.m1 = 2; oldSpec.m2 = 3; oldSpec.ex1a = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::MAJOR_EVENT_OCCURRED); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.ex1a == 5); CHECK(newSpec.jumpto == 12); } SECTION("Forced Give") { oldSpec.type = 19; oldSpec.m1 = 2; oldSpec.m2 = 3; oldSpec.ex1a = 4; oldSpec.ex2b = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::FORCED_GIVE); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.ex1a == 4); CHECK(newSpec.ex2b == 5); CHECK(newSpec.jumpto == 12); } SECTION("Buy Items of Type") { oldSpec.type = 20; oldSpec.type = 19; oldSpec.m1 = 2; oldSpec.m2 = 3; oldSpec.ex1a = 4; oldSpec.ex1b = 5; oldSpec.ex2a = 6; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::FORCED_GIVE); CHECK(newSpec.m1 == 2); CHECK(newSpec.m2 == 3); CHECK(newSpec.ex1a == 4); CHECK(newSpec.ex1b == 5); CHECK(newSpec.ex2a == 6); CHECK(newSpec.jumpto == 12); } SECTION("Call Scenario Special") { oldSpec.type = 21; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::CALL_GLOBAL); CHECK(newSpec.jumpto == 12); } SECTION("Set Many Flags") { oldSpec.type = 22; oldSpec.sd1 = 4; oldSpec.ex1a = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::SET_SDF_ROW); CHECK(newSpec.sd1 == 4); CHECK(newSpec.ex1a == 5); CHECK(newSpec.jumpto == 12); } SECTION("Copy Flag") { oldSpec.type = 23; oldSpec.sd1 = 2; oldSpec.sd2 = 3; oldSpec.ex1a = 4; oldSpec.ex1b = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::COPY_SDF); CHECK(newSpec.sd1 == 2); CHECK(newSpec.sd2 == 3); CHECK(newSpec.ex1a == 4); CHECK(newSpec.ex1b == 5); CHECK(newSpec.jumpto == 12); } SECTION("Ritual of Sanctification") { oldSpec.type = 24; oldSpec.ex1b = 32; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_CONTEXT); CHECK(newSpec.ex1a == int(eSpecCtx::TARGET)); CHECK(newSpec.ex1b == int(eSpell::RITUAL_SANCTIFY)); CHECK(newSpec.ex1c == 12); CHECK(newSpec.jumpto == 32); } SECTION("Rest") { oldSpec.type = 25; oldSpec.ex1a = 2; oldSpec.ex1b = 3; newSpec.import_legacy(oldSpec); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 3); CHECK(newSpec.jumpto == 12); } SECTION("Wandering Will Fight") { oldSpec.type = 26; oldSpec.ex1a = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::CANT_ENTER); CHECK(newSpec.ex1a == 0); CHECK(newSpec.ex2a == 0); CHECK(newSpec.jumpto == 12); } SECTION("End Scenario") { oldSpec.type = 27; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::END_SCENARIO); CHECK(newSpec.jumpto == 12); } // Clean up after ourselves ResMgr::strings.popPath(); } TEST_CASE("When converting legacy special nodes (one-shot)") { cSpecial newSpec; legacy::special_node_type oldSpec = {0,-1,-1,0,-1,-1,-1,-1,-1,-1,-1}; // Fetching opcodes requires strings to be available // Here we fetch them from the rsrc dir, rather than the data dir ResMgr::strings.pushPath("../rsrc/strings"); oldSpec.sd1 = 8; oldSpec.sd2 = 7; oldSpec.m1 = 4; oldSpec.m2 = 5; oldSpec.jumpto = 12; SECTION("Give Item") { oldSpec.type = 50; oldSpec.ex1a = 9; oldSpec.ex1b = 2500; oldSpec.ex2a = 1500; oldSpec.ex2b = 10; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_GIVE_ITEM); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 9); CHECK(newSpec.ex1b == 2500); CHECK(newSpec.ex2a == 1500); CHECK(newSpec.ex2b == 10); CHECK(newSpec.jumpto == 12); } SECTION("Give Special Item") { oldSpec.type = 51; oldSpec.ex1a = 15; oldSpec.ex1b = 16; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_GIVE_SPEC_ITEM); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 15); CHECK(newSpec.ex1b == 16); CHECK(newSpec.jumpto == 12); } SECTION("Do Nothing") { oldSpec.type = 52; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_NULL); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.jumpto == 12); } SECTION("Set SDF") { oldSpec.type = 53; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_SET_SDF); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.jumpto == 12); } SECTION("Message") { oldSpec.type = 54; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_DISPLAY_MSG); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.jumpto == 12); } SECTION("Dialog") { oldSpec.type = 55; oldSpec.pic = 42; oldSpec.ex1a = 20; oldSpec.ex1b = 18; oldSpec.ex2a = 19; oldSpec.ex2b = 17; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_DIALOG); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.pictype == PIC_DLOG); CHECK(newSpec.pic == 42); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == -1); CHECK(newSpec.m3 == 5); CHECK(newSpec.ex1a == 9); CHECK(newSpec.ex1b == 18); CHECK(newSpec.ex2a == 19); CHECK(newSpec.ex2b == 17); CHECK(newSpec.jumpto == 12); } SECTION("Dialog (terrain)") { oldSpec.type = 56; oldSpec.pic = 42; oldSpec.ex1a = 20; oldSpec.ex1b = 18; oldSpec.ex2a = 19; oldSpec.ex2b = 17; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_DIALOG); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.pictype == PIC_TER); CHECK(newSpec.pic == 42); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == -1); CHECK(newSpec.m3 == 5); CHECK(newSpec.ex1a == 9); CHECK(newSpec.ex1b == 18); CHECK(newSpec.ex2a == 19); CHECK(newSpec.ex2b == 17); CHECK(newSpec.jumpto == 12); } SECTION("Dialog (monster)") { oldSpec.type = 57; oldSpec.pic = 42; oldSpec.ex1a = 20; oldSpec.ex1b = 18; oldSpec.ex2a = 19; oldSpec.ex2b = 17; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_DIALOG); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.pictype == PIC_MONST); CHECK(newSpec.pic == 42); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == -1); CHECK(newSpec.m3 == 5); CHECK(newSpec.ex1a == 9); CHECK(newSpec.ex1b == 18); CHECK(newSpec.ex2a == 19); CHECK(newSpec.ex2b == 17); CHECK(newSpec.jumpto == 12); } SECTION("Give Item") { oldSpec.type = 58; oldSpec.pic = 42; oldSpec.ex1a = 20; oldSpec.ex1b = 18; oldSpec.ex2a = 19; oldSpec.ex2b = 17; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_GIVE_ITEM_DIALOG); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.pictype == PIC_DLOG); CHECK(newSpec.pic == 42); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == -1); CHECK(newSpec.m3 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 18); CHECK(newSpec.ex2a == 19); CHECK(newSpec.ex2b == 17); CHECK(newSpec.jumpto == 12); } SECTION("Give Item (terrain)") { oldSpec.type = 59; oldSpec.pic = 42; oldSpec.ex1a = 20; oldSpec.ex1b = 18; oldSpec.ex2a = 19; oldSpec.ex2b = 17; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_GIVE_ITEM_DIALOG); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.pictype == PIC_TER); CHECK(newSpec.pic == 42); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == -1); CHECK(newSpec.m3 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 18); CHECK(newSpec.ex2a == 19); CHECK(newSpec.ex2b == 17); CHECK(newSpec.jumpto == 12); } SECTION("Give Item (monster)") { oldSpec.type = 60; oldSpec.pic = 42; oldSpec.ex1a = 20; oldSpec.ex1b = 18; oldSpec.ex2a = 19; oldSpec.ex2b = 17; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_GIVE_ITEM_DIALOG); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.pictype == PIC_MONST); CHECK(newSpec.pic == 42); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == -1); CHECK(newSpec.m3 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 18); CHECK(newSpec.ex2a == 19); CHECK(newSpec.ex2b == 17); CHECK(newSpec.jumpto == 12); } SECTION("Place Outdoor Encounter") { oldSpec.type = 61; oldSpec.ex1a = 2; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_OUT_ENCOUNTER); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 2); CHECK(newSpec.jumpto == 12); } SECTION("Place Town Encounter") { oldSpec.type = 62; oldSpec.ex1a = 7; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_TOWN_ENCOUNTER); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.jumpto == 12); } SECTION("Trap") { oldSpec.type = 63; oldSpec.pic = 7; oldSpec.ex1a = 14; oldSpec.ex1b = 15; oldSpec.ex2a = 16; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ONCE_TRAP); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.pictype == PIC_DLOG); CHECK(newSpec.pic == 27); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 14); CHECK(newSpec.ex1b == 15); CHECK(newSpec.ex2a == 16); CHECK(newSpec.jumpto == 12); } // Clean up after ourselves ResMgr::strings.popPath(); } TEST_CASE("When converting legacy special nodes (affect)") { cSpecial newSpec; legacy::special_node_type oldSpec = {0,-1,-1,0,-1,-1,-1,-1,-1,-1,-1}; // Fetching opcodes requires strings to be available // Here we fetch them from the rsrc dir, rather than the data dir ResMgr::strings.pushPath("../rsrc/strings"); oldSpec.m1 = 4; oldSpec.m2 = 5; oldSpec.jumpto = 12; SECTION("Select a PC") { oldSpec.type = 80; oldSpec.ex1a = 1; oldSpec.ex1b = 10; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::SELECT_TARGET); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 1); CHECK(newSpec.ex1b == 10); CHECK(newSpec.jumpto == 12); } SECTION("Do Damage") { oldSpec.type = 81; oldSpec.pic = 1; oldSpec.ex1a = 2; oldSpec.ex1b = 6; oldSpec.ex2a = 3; oldSpec.ex2b = 6; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::DAMAGE); CHECK(newSpec.pic == 1); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 6); CHECK(newSpec.ex2a == 3); CHECK(newSpec.ex2b == int(eDamageType::UNDEAD)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Health") { oldSpec.type = 82; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_HP); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Affect Spell Points") { oldSpec.type = 83; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_SP); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Affect Experience") { oldSpec.type = 84; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_XP); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Affect Skill Points") { oldSpec.type = 85; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_SKILL_PTS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Affect Deadness") { oldSpec.type = 86; oldSpec.ex1a = 2; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_DEADNESS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Affect Poison") { oldSpec.type = 87; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::POISON)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Slow/Haste") { oldSpec.type = 88; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::HASTE_SLOW)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Invulnerability") { oldSpec.type = 89; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::INVULNERABLE)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Magic Resistance") { oldSpec.type = 90; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::MAGIC_RESISTANCE)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Webs") { oldSpec.type = 91; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::WEBS)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Disease") { oldSpec.type = 92; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::DISEASE)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Sanctuary") { oldSpec.type = 93; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::INVISIBLE)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Curse/Bless") { oldSpec.type = 94; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::BLESS_CURSE)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Dumbfounding") { oldSpec.type = 95; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::DUMB)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Sleep") { oldSpec.type = 96; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::ASLEEP)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Paralysis") { oldSpec.type = 97; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex1c == int(eStatus::PARALYZED)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Statistic") { oldSpec.type = 98; oldSpec.pic = 50; oldSpec.ex1a = 10; oldSpec.ex1b = 1; oldSpec.ex2a = 12; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_STAT); CHECK(newSpec.pic == 50); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 10); CHECK(newSpec.ex1b == 1); CHECK(newSpec.ex2a == int(eSkill::ALCHEMY)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Mage Spell") { oldSpec.type = 99; oldSpec.ex1a = 30; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_MAGE_SPELL); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 60); CHECK(newSpec.ex1b == 0); CHECK(newSpec.jumpto == 12); } SECTION("Affect Priest Spell") { oldSpec.type = 100; oldSpec.ex1a = 30; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_PRIEST_SPELL); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 60); CHECK(newSpec.ex1b == 0); CHECK(newSpec.jumpto == 12); } SECTION("Affect Gold") { oldSpec.type = 101; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_GOLD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Affect Food") { oldSpec.type = 102; oldSpec.ex1a = 20; oldSpec.ex1b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_FOOD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Affect Alchemy") { oldSpec.type = 103; oldSpec.ex1a = 16; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_ALCHEMY); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 16); CHECK(newSpec.jumpto == 12); } SECTION("Affect Stealth") { oldSpec.type = 104; oldSpec.ex1a = 30; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_PARTY_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 30); CHECK(newSpec.ex1b == 0); CHECK(newSpec.ex2a == int(ePartyStatus::STEALTH)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Firewalk") { oldSpec.type = 105; oldSpec.ex1a = 30; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_PARTY_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 30); CHECK(newSpec.ex1b == 0); CHECK(newSpec.ex2a == int(ePartyStatus::FIREWALK)); CHECK(newSpec.jumpto == 12); } SECTION("Affect Flying") { oldSpec.type = 106; oldSpec.ex1a = 30; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::AFFECT_PARTY_STATUS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 30); CHECK(newSpec.ex1b == 0); CHECK(newSpec.ex2a == int(ePartyStatus::FLIGHT)); CHECK(newSpec.jumpto == 12); } // Clean up after ourselves ResMgr::strings.popPath(); } TEST_CASE("When converting legacy special nodes (if-then)") { cSpecial newSpec; legacy::special_node_type oldSpec = {0,-1,-1,0,-1,-1,-1,-1,-1,-1,-1}; // Fetching opcodes requires strings to be available // Here we fetch them from the rsrc dir, rather than the data dir ResMgr::strings.pushPath("../rsrc/strings"); oldSpec.jumpto = 12; SECTION("Stuff Done Flag?") { oldSpec.type = 130; oldSpec.sd1 = 8; oldSpec.sd2 = 7; oldSpec.ex1a = 1; oldSpec.ex1b = 10; oldSpec.ex2a = 9; oldSpec.ex2b = 13; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_SDF); CHECK(newSpec.sd1 == 8); CHECK(newSpec.sd2 == 7); CHECK(newSpec.ex1a == 1); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 9); CHECK(newSpec.ex2b == 13); CHECK(newSpec.jumpto == 12); } SECTION("Town Number?") { oldSpec.type = 131; oldSpec.ex1a = 12; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_TOWN_NUM); CHECK(newSpec.ex1a == 12); CHECK(newSpec.ex1b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Random Number?") { oldSpec.type = 132; oldSpec.ex1a = 100; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_RANDOM); CHECK(newSpec.ex1a == 100); CHECK(newSpec.ex1b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Have Special Item?") { oldSpec.type = 133; oldSpec.ex1a = 17; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_HAVE_SPECIAL_ITEM); CHECK(newSpec.ex1a == 17); CHECK(newSpec.ex1b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Stuff Done Compare?") { oldSpec.type = 134; oldSpec.sd1 = 4; oldSpec.sd2 = 5; oldSpec.ex1a = 6; oldSpec.ex1b = 7; oldSpec.ex2b = 8; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_SDF_COMPARE); CHECK(newSpec.sd1 == 4); CHECK(newSpec.sd2 == 5); CHECK(newSpec.ex1a == 6); CHECK(newSpec.ex1b == 7); CHECK(newSpec.ex2b == 8); CHECK(newSpec.jumpto == 12); } SECTION("Town Terrain This Type?") { oldSpec.type = 135; oldSpec.ex1a = 13; oldSpec.ex1b = 14; oldSpec.ex2a = 15; oldSpec.ex2b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_TER_TYPE); CHECK(newSpec.ex1a == 13); CHECK(newSpec.ex1b == 14); CHECK(newSpec.ex2a == 15); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Outdoor Terrain This Type?") { oldSpec.type = 136; oldSpec.ex1a = 13; oldSpec.ex1b = 14; oldSpec.ex2a = 15; oldSpec.ex2b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_TER_TYPE); CHECK(newSpec.ex1a == 13); CHECK(newSpec.ex1b == 14); CHECK(newSpec.ex2a == 15); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Has Gold?") { oldSpec.type = 137; oldSpec.ex1a = 100; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_HAS_GOLD); CHECK(newSpec.ex1a == 100); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == 0); CHECK(newSpec.jumpto == 12); } SECTION("Has Food?") { oldSpec.type = 138; oldSpec.ex1a = 100; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_HAS_FOOD); CHECK(newSpec.ex1a == 100); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == 0); CHECK(newSpec.jumpto == 12); } SECTION("Item Class on Space?") { oldSpec.type = 139; oldSpec.ex1a = 15; oldSpec.ex1b = 16; oldSpec.ex2a = 100; oldSpec.ex2b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_ITEM_CLASS_ON_SPACE); CHECK(newSpec.ex1a == 15); CHECK(newSpec.ex1b == 16); CHECK(newSpec.ex2a == 100); CHECK(newSpec.ex2b == 20); CHECK(newSpec.ex2c == 0); CHECK(newSpec.jumpto == 12); } SECTION("Have Item with Class?") { oldSpec.type = 140; oldSpec.ex1a = 100; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_HAVE_ITEM_CLASS); CHECK(newSpec.ex1a == 100); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == 0); CHECK(newSpec.jumpto == 12); } SECTION("Equipped Item with Class?") { oldSpec.type = 141; oldSpec.ex1a = 100; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_EQUIP_ITEM_CLASS); CHECK(newSpec.ex1a == 100); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == 0); CHECK(newSpec.jumpto == 12); } SECTION("Has Gold? (and take)") { oldSpec.type = 142; oldSpec.ex1a = 100; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_HAS_GOLD); CHECK(newSpec.ex1a == 100); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == 1); CHECK(newSpec.jumpto == 12); } SECTION("Has Food? (and take)") { oldSpec.type = 143; oldSpec.ex1a = 100; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_HAS_FOOD); CHECK(newSpec.ex1a == 100); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == 1); CHECK(newSpec.jumpto == 12); } SECTION("Item Class on Space? (and take)") { oldSpec.type = 144; oldSpec.ex1a = 15; oldSpec.ex1b = 16; oldSpec.ex2a = 100; oldSpec.ex2b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_ITEM_CLASS_ON_SPACE); CHECK(newSpec.ex1a == 15); CHECK(newSpec.ex1b == 16); CHECK(newSpec.ex2a == 100); CHECK(newSpec.ex2b == 20); CHECK(newSpec.ex2c == 1); CHECK(newSpec.jumpto == 12); } SECTION("Have Item with Class? (and take)") { oldSpec.type = 145; oldSpec.ex1a = 100; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_HAVE_ITEM_CLASS); CHECK(newSpec.ex1a == 100); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == 1); CHECK(newSpec.jumpto == 12); } SECTION("Equipped Item with Class? (and take)") { oldSpec.type = 146; oldSpec.ex1a = 100; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_EQUIP_ITEM_CLASS); CHECK(newSpec.ex1a == 100); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == 1); CHECK(newSpec.jumpto == 12); } SECTION("Day Reached?") { oldSpec.type = 147; oldSpec.ex1a = 25; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_DAY_REACHED); CHECK(newSpec.ex1a == 25); CHECK(newSpec.ex1b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Any Barrels?") { oldSpec.type = 148; oldSpec.ex1b = 13; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_FIELDS); CHECK(newSpec.sd1 == 1); CHECK(newSpec.sd2 >= 64 * 64); CHECK(newSpec.m1 == int(OBJECT_BARREL)); CHECK(newSpec.m2 == 13); CHECK(newSpec.ex1a == 0); CHECK(newSpec.ex1b == 0); CHECK(newSpec.ex2a == 64); CHECK(newSpec.ex2b == 64); CHECK(newSpec.jumpto == 12); } SECTION("Any Crates?") { oldSpec.type = 149; oldSpec.ex1b = 13; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_FIELDS); CHECK(newSpec.sd1 == 1); CHECK(newSpec.sd2 >= 64 * 64); CHECK(newSpec.m1 == int(OBJECT_CRATE)); CHECK(newSpec.m2 == 13); CHECK(newSpec.ex1a == 0); CHECK(newSpec.ex1b == 0); CHECK(newSpec.ex2a == 64); CHECK(newSpec.ex2b == 64); CHECK(newSpec.jumpto == 12); } SECTION("Special Thing Happened?") { oldSpec.type = 150; oldSpec.ex1a = 15; oldSpec.ex1b = 13; oldSpec.ex2b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_EVENT_OCCURRED); CHECK(newSpec.ex1a == 15); CHECK(newSpec.ex1b == 13); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Has Cave Lore?") { oldSpec.type = 151; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_TRAIT); CHECK(newSpec.ex1a == int(eTrait::CAVE_LORE)); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == 1); // need one PC ... CHECK(newSpec.ex2b == 2); // ... or more CHECK(newSpec.jumpto == 12); } SECTION("Has Woodsman?") { oldSpec.type = 152; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_TRAIT); CHECK(newSpec.ex1a == int(eTrait::WOODSMAN)); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == 1); // need one PC ... CHECK(newSpec.ex2b == 2); // ... or more CHECK(newSpec.jumpto == 12); } SECTION("Has Enough Mage Lore?") { oldSpec.type = 153; oldSpec.ex1a = 20; oldSpec.ex1b = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_STATISTIC); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == int(eSkill::MAGE_LORE)); CHECK(newSpec.ex2b == 0); // cumulative check CHECK(newSpec.jumpto == 12); } SECTION("Text Response?") { oldSpec.type = 154; oldSpec.pic = 10; oldSpec.ex1a = 167; oldSpec.ex1b = 12; oldSpec.ex2a = 169; oldSpec.ex2b = 15; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_TEXT_RESPONSE); CHECK(newSpec.pic == 10); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 12); CHECK(newSpec.ex2a == 9); CHECK(newSpec.ex2b == 15); CHECK(newSpec.jumpto == 12); } SECTION("Stuff Done Equal?") { oldSpec.type = 155; oldSpec.sd1 = 5; oldSpec.sd2 = 6; oldSpec.ex1a = 13; oldSpec.ex1b = 14; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_SDF_EQ); CHECK(newSpec.sd1 == 5); CHECK(newSpec.sd2 == 6); CHECK(newSpec.ex1a == 13); CHECK(newSpec.ex1b == 14); CHECK(newSpec.jumpto == 12); } // Clean up after ourselves ResMgr::strings.popPath(); } TEST_CASE("When converting legacy special nodes (town)") { cSpecial newSpec; legacy::special_node_type oldSpec = {0,-1,-1,0,-1,-1,-1,-1,-1,-1,-1}; // Fetching opcodes requires strings to be available // Here we fetch them from the rsrc dir, rather than the data dir ResMgr::strings.pushPath("../rsrc/strings"); oldSpec.m1 = 4; oldSpec.m2 = 5; oldSpec.jumpto = 12; SECTION("Town Hostile") { oldSpec.type = 170; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::MAKE_TOWN_HOSTILE); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.jumpto == 12); } SECTION("Change Terrain") { oldSpec.type = 171; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 9; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::CHANGE_TER); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 9); CHECK(newSpec.jumpto == 12); } SECTION("Swap Terrain") { oldSpec.type = 172; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 9; oldSpec.ex2b = 10; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::SWAP_TER); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 9); CHECK(newSpec.ex2b == 10); CHECK(newSpec.jumpto == 12); } SECTION("Transform Terrain") { oldSpec.type = 173; oldSpec.ex1a = 7; oldSpec.ex1b = 8; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TRANS_TER); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.jumpto == 12); } SECTION("Move Party") { oldSpec.type = 174; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 2; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_MOVE_PARTY); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 2); CHECK(newSpec.jumpto == 12); } SECTION("Hit Space") { oldSpec.type = 175; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 9; oldSpec.ex2b = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_HIT_SPACE); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 9); CHECK(newSpec.ex2b == int(eDamageType::COLD)); CHECK(newSpec.jumpto == 12); } SECTION("Explode Space") { oldSpec.type = 176; oldSpec.pic = 30; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 9; oldSpec.ex2b = 3; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_EXPLODE_SPACE); CHECK(newSpec.pic == 30); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 9); CHECK(newSpec.ex2b == int(eDamageType::MAGIC)); CHECK(newSpec.jumpto == 12); } SECTION("Lock space") { oldSpec.type = 177; oldSpec.ex1a = 7; oldSpec.ex1b = 8; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_LOCK_SPACE); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.jumpto == 12); } SECTION("Unlock space") { oldSpec.type = 178; oldSpec.ex1a = 7; oldSpec.ex1b = 8; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_UNLOCK_SPACE); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.jumpto == 12); } SECTION("SFX Burst") { oldSpec.type = 179; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 2; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_SFX_BURST); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 2); CHECK(newSpec.jumpto == 12); } SECTION("Make Wandering Monster") { oldSpec.type = 180; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_CREATE_WANDERING); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.jumpto == 12); } SECTION("Place Monster") { oldSpec.type = 181; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 40; oldSpec.ex2b = 100; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_PLACE_MONST); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 40); CHECK(newSpec.ex2b == 100); CHECK(newSpec.jumpto == 12); } SECTION("Destroy Monsters") { oldSpec.type = 182; oldSpec.ex1a = 50; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_NUKE_MONSTS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 50); CHECK(newSpec.jumpto == 12); } SECTION("Destroy All Monsters") { oldSpec.type = 183; oldSpec.ex1a = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_NUKE_MONSTS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == -1); CHECK(newSpec.jumpto == 12); } SECTION("Generic Lever") { oldSpec.type = 184; oldSpec.ex1b = 12; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_GENERIC_LEVER); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1b == 12); CHECK(newSpec.jumpto == 12); } SECTION("Generic Portal") { oldSpec.type = 185; oldSpec.ex1a = 7; oldSpec.ex1b = 8; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_GENERIC_PORTAL); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.jumpto == 12); } SECTION("Generic Button") { oldSpec.type = 186; oldSpec.ex1b = 12; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_GENERIC_BUTTON); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1b == 12); CHECK(newSpec.jumpto == 12); } SECTION("Generic Stairway") { oldSpec.type = 187; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 12; oldSpec.ex2b = 5; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_GENERIC_STAIR); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 12); CHECK(newSpec.ex2b == 5); CHECK(newSpec.jumpto == 12); } SECTION("Lever") { oldSpec.type = 188; oldSpec.pic = 12; oldSpec.ex1b = 15; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_LEVER); CHECK(newSpec.pictype == PIC_TER); CHECK(newSpec.pic == 12); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == -1); CHECK(newSpec.m3 == 5); CHECK(newSpec.ex1b == 15); CHECK(newSpec.jumpto == 12); } SECTION("Portal") { oldSpec.type = 189; oldSpec.pic = 12; oldSpec.ex1a = 7; oldSpec.ex1b = 8; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_PORTAL); CHECK(newSpec.pictype == PIC_DLOG); CHECK(newSpec.pic == 12); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == -1); CHECK(newSpec.m3 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.jumpto == 12); } SECTION("Stairway") { oldSpec.type = 190; oldSpec.pic = 12; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 15; oldSpec.ex2b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_STAIR); CHECK(newSpec.pictype == PIC_DLOG); CHECK(newSpec.pic == 12); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == -1); CHECK(newSpec.m3 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 15); CHECK(newSpec.ex2b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Relocate Outdoors") { oldSpec.type = 191; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 9; oldSpec.ex2b = 10; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_RELOCATE); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 9); CHECK(newSpec.ex2b == 10); CHECK(newSpec.jumpto == 12); } SECTION("Place Item") { oldSpec.type = 192; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 50; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_PLACE_ITEM); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(oldSpec.ex2a == 50); CHECK(newSpec.jumpto == 12); } SECTION("Split Party") { oldSpec.type = 193; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 10; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_SPLIT_PARTY); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 10); CHECK(newSpec.jumpto == 12); } SECTION("Reunite Party") { oldSpec.type = 194; oldSpec.ex1a = 10; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_REUNITE_PARTY); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 10); CHECK(newSpec.jumpto == 12); } SECTION("Start Timer") { oldSpec.type = 195; oldSpec.ex1a = 7; oldSpec.ex2b = 8; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_TIMER_START); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex2b == 8); CHECK(newSpec.jumpto == 12); } // Clean up after ourselves ResMgr::strings.popPath(); } TEST_CASE("When converting legacy special nodes (rect)") { cSpecial newSpec; legacy::special_node_type oldSpec = {0,-1,-1,0,-1,-1,-1,-1,-1,-1,-1}; // Fetching opcodes requires strings to be available // Here we fetch them from the rsrc dir, rather than the data dir ResMgr::strings.pushPath("../rsrc/strings"); oldSpec.m1 = 4; oldSpec.m2 = 5; oldSpec.pic = 1; oldSpec.ex1a = 2; oldSpec.ex1b = 10; oldSpec.ex2a = 4; oldSpec.ex2b = 20; oldSpec.jumpto = 12; SECTION("Place Fire Wall") { oldSpec.type = 200; oldSpec.sd1 = 75; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == WALL_FIRE); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Place Force Wall") { oldSpec.type = 201; oldSpec.sd1 = 75; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == WALL_FORCE); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Place Ice Wall") { oldSpec.type = 202; oldSpec.sd1 = 75; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == WALL_ICE); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Place Blade Wall") { oldSpec.type = 203; oldSpec.sd1 = 75; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == WALL_BLADES); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Place Stinking Cloud") { oldSpec.type = 204; oldSpec.sd1 = 75; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == CLOUD_STINK); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Place Sleep Cloud") { oldSpec.type = 205; oldSpec.sd1 = 75; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == CLOUD_SLEEP); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Place Quickfire") { oldSpec.type = 206; oldSpec.sd1 = 75; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == FIELD_QUICKFIRE); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Place Fire Barrier") { oldSpec.type = 207; oldSpec.sd1 = 75; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == BARRIER_FIRE); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Place Force Barrier") { oldSpec.type = 208; oldSpec.sd1 = 75; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == BARRIER_FORCE); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Cleanse") { oldSpec.type = 209; oldSpec.sd1 = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 1); CHECK(newSpec.sd2 == FIELD_DISPEL); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Place Special Effects") { oldSpec.type = 210; oldSpec.sd1 = 75; oldSpec.sd2 = 4; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == SFX_LARGE_SLIME); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Place Permanent Effects") { oldSpec.type = 211; oldSpec.sd1 = 75; oldSpec.sd2 = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_PLACE_FIELD); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == OBJECT_BARREL); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Move Items") { oldSpec.type = 212; oldSpec.sd1 = 25; oldSpec.sd2 = 26; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_MOVE_ITEMS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 25); CHECK(newSpec.sd2 == 26); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Destroy Items") { oldSpec.type = 213; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_DESTROY_ITEMS); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Change Terrain") { oldSpec.type = 214; oldSpec.sd1 = 75; oldSpec.sd2 = 80; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_CHANGE_TER); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == 80); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Swap Terrain") { oldSpec.type = 215; oldSpec.sd1 = 75; oldSpec.sd2 = 80; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_SWAP_TER); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.sd1 == 75); CHECK(newSpec.sd2 == 80); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Transform Terrain") { oldSpec.type = 216; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_TRANS_TER); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Lock Terrain") { oldSpec.type = 217; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_LOCK); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } SECTION("Unlock Terrain") { oldSpec.type = 218; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::RECT_UNLOCK); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.pic == 1); CHECK(newSpec.ex1a == 2); CHECK(newSpec.ex1b == 10); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 20); CHECK(newSpec.jumpto == 12); } // Clean up after ourselves ResMgr::strings.popPath(); } TEST_CASE("When converting legacy special nodes (outdoors)") { cSpecial newSpec; legacy::special_node_type oldSpec = {0,-1,-1,0,-1,-1,-1,-1,-1,-1,-1}; // Fetching opcodes requires strings to be available // Here we fetch them from the rsrc dir, rather than the data dir ResMgr::strings.pushPath("../rsrc/strings"); oldSpec.jumpto = 12; SECTION("Make Outdoor Wandering") { oldSpec.type = 225; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::OUT_MAKE_WANDER); CHECK(newSpec.jumpto == 12); } SECTION("Change Terrain") { oldSpec.type = 226; oldSpec.m1 = 4; oldSpec.m2 = 5; oldSpec.ex1a = 7; oldSpec.ex1b = 8; oldSpec.ex2a = 9; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::CHANGE_TER); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 7); CHECK(newSpec.ex1b == 8); CHECK(newSpec.ex2a == 9); CHECK(newSpec.jumpto == 12); } SECTION("Place Outdoor Encounter") { oldSpec.type = 227; oldSpec.m1 = 4; oldSpec.m2 = 5; oldSpec.ex1a = 3; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::OUT_PLACE_ENCOUNTER); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 3); CHECK(newSpec.jumpto == 12); } SECTION("Move Party") { oldSpec.type = 228; oldSpec.m1 = 4; oldSpec.m2 = 5; oldSpec.ex1a = 25; oldSpec.ex1b = 26; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::OUT_MOVE_PARTY); CHECK(newSpec.m1 == 4); CHECK(newSpec.m2 == 5); CHECK(newSpec.ex1a == 25); CHECK(newSpec.ex1b == 26); CHECK(newSpec.jumpto == 12); } SECTION("Outdoor Store") { oldSpec.type = 229; oldSpec.m1 = 8; oldSpec.ex1a = 1; oldSpec.ex1b = 2; oldSpec.ex2a = 5; oldSpec.ex2b = 4; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::ENTER_SHOP); CHECK(newSpec.m1 == 8); CHECK(newSpec.ex1a == 31); CHECK(newSpec.ex1b == 2); CHECK(newSpec.ex2a == 5); CHECK(newSpec.ex2b == 4); } // Clean up after ourselves ResMgr::strings.popPath(); } TEST_CASE("When converting classic special nodes") { cSpecial newSpec; legacy::special_node_type oldSpec = {0,-1,-1,0,-1,-1,-1,-1,-1,-1,-1}; // Fetching opcodes requires strings to be available // Here we fetch them from the rsrc dir, rather than the data dir ResMgr::strings.pushPath("../rsrc/strings"); oldSpec.jumpto = 12; SECTION("If Statistic") { oldSpec.type = 153; oldSpec.ex1a = 20; oldSpec.ex1b = 20; oldSpec.ex2a = 20; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_STATISTIC); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == 20); CHECK(newSpec.ex2a == int(eSkill::MAX_HP)); CHECK(newSpec.ex2b == 0); // cumulative check CHECK(newSpec.jumpto == 12); } /* Disabled for now since it shows a dialog SECTION("Display Picture") { oldSpec.type = 28; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::DISPLAY_PICTURE); CHECK(newSpec.ex1a == 0); CHECK(newSpec.jumpto == 12); } */ SECTION("Random") { oldSpec.type = 29; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::SDF_RANDOM); CHECK(newSpec.jumpto == 12); } SECTION("If Species") { oldSpec.type = 156; oldSpec.ex1a = 2; oldSpec.ex1b = 50; oldSpec.ex2a = 4; oldSpec.ex2b = 0; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::IF_SPECIES); CHECK(newSpec.ex1a == int(eRace::SLITH)); CHECK(newSpec.ex1b == 50); CHECK(newSpec.ex2a == 4); CHECK(newSpec.ex2b == 0); CHECK(newSpec.jumpto == 12); } SECTION("Town Change Lighting") { oldSpec.type = 196; oldSpec.ex1a = 2; oldSpec.ex2a = 15; oldSpec.ex2b = 1; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_CHANGE_LIGHTING); CHECK(newSpec.ex1a == LIGHT_DRAINS); CHECK(newSpec.ex2a == 15); CHECK(newSpec.ex2b == 1); CHECK(newSpec.jumpto == 12); } SECTION("Town Set Attitude") { oldSpec.type = 197; oldSpec.ex1a = 20; oldSpec.ex1b = 2; newSpec.import_legacy(oldSpec); CHECK(newSpec.type == eSpecType::TOWN_SET_ATTITUDE); CHECK(newSpec.ex1a == 20); CHECK(newSpec.ex1b == int(eAttitude::FRIENDLY)); CHECK(newSpec.jumpto == 12); } // Clean up after ourselves ResMgr::strings.popPath(); } ostream& operator<< (ostream& out, eSpecType spec) { out << (*spec).opcode(); return out; }