Files
oboe/test/spec_legacy.cpp
2022-07-12 20:35:45 -04:00

1754 lines
56 KiB
C++

//
// 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;
}