From bd412a70c8fc48c9312f48a51917ad90124ee4ea Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 3 Sep 2016 15:43:14 -0400 Subject: [PATCH] Add test for importing legacy town data --- src/BoE.xcodeproj/project.pbxproj | 4 + src/classes/town.cpp | 2 + src/classes/town_import.tpp | 1 + test/town_legacy.cpp | 247 ++++++++++++++++++++++++++++++ 4 files changed, 254 insertions(+) create mode 100644 test/town_legacy.cpp diff --git a/src/BoE.xcodeproj/project.pbxproj b/src/BoE.xcodeproj/project.pbxproj index e9f1ae84..e4643bf3 100755 --- a/src/BoE.xcodeproj/project.pbxproj +++ b/src/BoE.xcodeproj/project.pbxproj @@ -106,6 +106,7 @@ 9169C3241B3B23610041002B /* libboost_thread.dylib in Copy Libraries and Frameworks */ = {isa = PBXBuildFile; fileRef = 910D9CA31B36439100414B17 /* libboost_thread.dylib */; }; 9176FEC71D550EFE006EF694 /* out_legacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9176FEC01D550EFC006EF694 /* out_legacy.cpp */; }; 9176FEC81D550EFE006EF694 /* scen_legacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9176FEC11D550EFC006EF694 /* scen_legacy.cpp */; }; + 9176FECC1D550EFE006EF694 /* town_legacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9176FEC51D550EFE006EF694 /* town_legacy.cpp */; }; 9178235D1B2EA0C5007F3444 /* vorbisenc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9178235C1B2EA0C5007F3444 /* vorbisenc.framework */; }; 9178235E1B2EA0C5007F3444 /* vorbisenc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9178235C1B2EA0C5007F3444 /* vorbisenc.framework */; }; 9178235F1B2EA0C5007F3444 /* vorbisenc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9178235C1B2EA0C5007F3444 /* vorbisenc.framework */; }; @@ -648,6 +649,7 @@ 9169C31F1B37A5D50041002B /* BoE Scenario Editor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "BoE Scenario Editor.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 9176FEC01D550EFC006EF694 /* out_legacy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = out_legacy.cpp; sourceTree = ""; }; 9176FEC11D550EFC006EF694 /* scen_legacy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scen_legacy.cpp; sourceTree = ""; }; + 9176FEC51D550EFE006EF694 /* town_legacy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = town_legacy.cpp; sourceTree = ""; }; 9178235C1B2EA0C5007F3444 /* vorbisenc.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = vorbisenc.framework; path = ../../../../../../Library/Frameworks/vorbisenc.framework; sourceTree = ""; }; 917823671B2F32DD007F3444 /* vorbisfile.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = vorbisfile.framework; path = ../../../../../../Library/Frameworks/vorbisfile.framework; sourceTree = ""; }; 9178236E1B2F331D007F3444 /* vorbis.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = vorbis.framework; path = ../../../../../../Library/Frameworks/vorbis.framework; sourceTree = ""; }; @@ -1365,6 +1367,7 @@ 91E128E31BC1624700C8BE1D /* ter_legacy.cpp */, 91EF27721B693D3800666469 /* ter_read.cpp */, 91EF27741B693D4800666469 /* ter_write.cpp */, + 9176FEC51D550EFE006EF694 /* town_legacy.cpp */, 91C2A6EC1B8FA91400346948 /* town_read.cpp */, 91E381451B97671E00F69B81 /* town_write.cpp */, ); @@ -1896,6 +1899,7 @@ 91E128E61BC19DA400C8BE1D /* init.cpp in Sources */, 9176FEC71D550EFE006EF694 /* out_legacy.cpp in Sources */, 9176FEC81D550EFE006EF694 /* scen_legacy.cpp in Sources */, + 9176FECC1D550EFE006EF694 /* town_legacy.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/classes/town.cpp b/src/classes/town.cpp index bad62869..d73e0b6c 100644 --- a/src/classes/town.cpp +++ b/src/classes/town.cpp @@ -27,6 +27,8 @@ void cTown::import_legacy(legacy::town_record_type& old){ exits[i].x = old.exit_locs[i].x; exits[i].y = old.exit_locs[i].y; exits[i].spec = old.exit_specs[i]; + wandering_locs[i].x = old.wandering_locs[i].x; + wandering_locs[i].y = old.wandering_locs[i].y; wandering[i].import_legacy(old.wandering[i]); } preset_fields.clear(); diff --git a/src/classes/town_import.tpp b/src/classes/town_import.tpp index 393c7bbc..a1c859e6 100644 --- a/src/classes/town_import.tpp +++ b/src/classes/town_import.tpp @@ -25,6 +25,7 @@ struct import_helper { template void cTown::import_legacy(T& old, int){ typedef import_helper sizes; + assert(max_dim == sizes::dim && "Tried to import legacy town into wrong-sized town"); cField the_field, the_road; the_field.type = SPECIAL_SPOT; the_road.type = SPECIAL_ROAD; diff --git a/test/town_legacy.cpp b/test/town_legacy.cpp new file mode 100644 index 00000000..04f80a3d --- /dev/null +++ b/test/town_legacy.cpp @@ -0,0 +1,247 @@ +// +// town_legacy.cpp +// BoE +// +// Created by Celtic Minstrel on 16-08-09. +// +// + +#include "catch.hpp" +#include "town.hpp" +#include "scenario.hpp" +#include "oldstructs.hpp" + +TEST_CASE("Converting legacy town data") { + cScenario scen; + scen.ter_types.resize(5); + legacy::town_record_type old_town = {0}; + + SECTION("With basic data") { + old_town.town_chop_time = 5; + old_town.town_chop_key = 6; + old_town.wandering_locs[0] = {3,4}; + old_town.special_locs[0] = {1,2}; + old_town.spec_id[0] = 7; + old_town.sign_locs[0] = {8,9}; + old_town.lighting = 0; + old_town.start_locs[0] = {15,0}; + old_town.start_locs[1] = {0,15}; + old_town.start_locs[2] = {45,0}; + old_town.start_locs[3] = {0,45}; + old_town.exit_locs[0] = {11,12}; + old_town.exit_specs[0] = 10; + old_town.in_town_rect = {14, 14, 30, 30}; + old_town.max_num_monst = 12345; + old_town.spec_on_entry = 13; + old_town.spec_on_entry_if_dead = 16; + old_town.timer_spec_times[0] = 17; + old_town.timer_specs[0] = 19; + old_town.specials1 = 20; + old_town.specials2 = 21; + old_town.difficulty = 1; + cTown town(scen, AREA_MEDIUM); + town.import_legacy(old_town); + CHECK(town.town_chop_time == 5); + CHECK(town.town_chop_key == 6); + CHECK(town.wandering_locs[0] == loc(3,4)); + REQUIRE(town.special_locs.size() >= 1); + CHECK(town.special_locs[0] == loc(1,2)); + CHECK(town.special_locs[0].spec == 7); + REQUIRE(town.sign_locs.size() >= 1); + CHECK(town.sign_locs[0] == loc(8,9)); + CHECK(town.lighting_type == LIGHT_NORMAL); + CHECK(town.start_locs[0] == loc(15,0)); + CHECK(town.start_locs[1] == loc(0,15)); + CHECK(town.start_locs[2] == loc(45,0)); + CHECK(town.start_locs[3] == loc(0,45)); + CHECK(town.exits[0] == loc(11,12)); + CHECK(town.exits[0].spec == 10); + CHECK(town.in_town_rect == rect(14,14,30,30)); + CHECK(town.max_num_monst == 12345); + CHECK(town.spec_on_entry == 13); + CHECK(town.spec_on_entry_if_dead == 16); + CHECK(town.spec_on_hostile == -1); + REQUIRE(town.timers.size() >= 1); + CHECK(town.timers[0].time == 17); + CHECK(town.timers[0].node == 19); + CHECK(town.bg_town == -1); + CHECK(town.bg_fight == -1); + CHECK_FALSE(town.strong_barriers); + CHECK_FALSE(town.defy_mapping); + CHECK_FALSE(town.defy_scrying); + CHECK_FALSE(town.is_hidden); + CHECK_FALSE(town.has_tavern); + } + SECTION("With preset items") { + old_town.preset_items[0].item_loc = {7,8}; + old_town.preset_items[0].item_code = 3; + old_town.preset_items[0].charges = 10; + old_town.preset_items[0].ability = 9; + old_town.preset_items[0].always_there = true; + old_town.preset_items[0].property = true; + old_town.preset_items[0].contained = true; + cTown town(scen, AREA_TINY); + town.import_legacy(old_town); + REQUIRE(town.preset_items.size() >= 1); + CHECK(town.preset_items[0].loc == loc(7,8)); + CHECK(town.preset_items[0].code == 3); + CHECK(town.preset_items[0].charges == 9); + CHECK(town.preset_items[0].ability == -1); + CHECK(town.preset_items[0].always_there); + CHECK(town.preset_items[0].property); + CHECK(town.preset_items[0].contained); + } + SECTION("With preset fields") { + int j = 0; + for(int i = 3; i <= 8; i++, j++) { + old_town.preset_fields[j].field_loc.x = i; + old_town.preset_fields[j].field_loc.y = i; + old_town.preset_fields[j].field_type= i; + } + for(int i = 14; i <= 21; i++, j++) { + old_town.preset_fields[j].field_loc.x = i; + old_town.preset_fields[j].field_loc.y = i; + old_town.preset_fields[j].field_type = i; + } + cTown town(scen, AREA_SMALL); + town.import_legacy(old_town); + REQUIRE(town.preset_fields.size() >= 14); + CHECK(town.preset_fields[0].loc == loc(3,3)); + CHECK(town.preset_fields[0].type == FIELD_WEB); + CHECK(town.preset_fields[1].loc == loc(4,4)); + CHECK(town.preset_fields[1].type == OBJECT_CRATE); + CHECK(town.preset_fields[2].loc == loc(5,5)); + CHECK(town.preset_fields[2].type == OBJECT_BARREL); + CHECK(town.preset_fields[3].loc == loc(6,6)); + CHECK(town.preset_fields[3].type == BARRIER_FIRE); + CHECK(town.preset_fields[4].loc == loc(7,7)); + CHECK(town.preset_fields[4].type == BARRIER_FORCE); + CHECK(town.preset_fields[5].loc == loc(8,8)); + CHECK(town.preset_fields[5].type == FIELD_QUICKFIRE); + CHECK(town.preset_fields[6].loc == loc(14,14)); + CHECK(town.preset_fields[6].type == SFX_SMALL_BLOOD); + CHECK(town.preset_fields[7].loc == loc(15,15)); + CHECK(town.preset_fields[7].type == SFX_MEDIUM_BLOOD); + CHECK(town.preset_fields[8].loc == loc(16,16)); + CHECK(town.preset_fields[8].type == SFX_LARGE_BLOOD); + CHECK(town.preset_fields[9].loc == loc(17,17)); + CHECK(town.preset_fields[9].type == SFX_SMALL_SLIME); + CHECK(town.preset_fields[10].loc == loc(18,18)); + CHECK(town.preset_fields[10].type == SFX_LARGE_SLIME); + CHECK(town.preset_fields[11].loc == loc(19,19)); + CHECK(town.preset_fields[11].type == SFX_ASH); + CHECK(town.preset_fields[12].loc == loc(20,20)); + CHECK(town.preset_fields[12].type == SFX_BONES); + CHECK(town.preset_fields[13].loc == loc(21,21)); + CHECK(town.preset_fields[13].type == SFX_RUBBLE); + } + SECTION("With creatures") { + legacy::tiny_tr_type pop = {0}; + + struct creature_start_type { + uint8_t number; + uint8_t start_attitude; + location start_loc; + uint8_t mobile; + uint8_t time_flag; + uint8_t extra1,extra2; + int16_t spec1, spec2; + int8_t spec_enc_code,time_code; + int16_t monster_time,personality; + int16_t special_on_kill,facial_pic; + }; + pop.creatures[0] = { + 12, // number + 2, // start attitude + {3,4}, // start pos + 1, 7, // mobile, time_flag + 6, 5, // extra1, extra2 (unused) + 9, 10, // spec1, spec2 + 8, 12, 11, // spec_enc_code, time_code, monster_time + 15, // personality + 22, 19 // spec_on_kill, facial_pic + }; + cTown town(scen, AREA_SMALL); + // import_legacy expects special arrays to be filled + town.specials.resize(100); + town.special_locs.resize(50); + town.import_legacy(pop, 0); + REQUIRE(town.creatures.size() >= 1); + CHECK(town.creatures[0].number == 12); + CHECK(town.creatures[0].start_attitude == eAttitude::FRIENDLY); + CHECK(town.creatures[0].start_loc == loc(3,4)); + CHECK(town.creatures[0].mobility == 1); + CHECK(town.creatures[0].time_flag == eMonstTime::APPEAR_WHEN_EVENT); + CHECK(town.creatures[0].spec1 == 9); + CHECK(town.creatures[0].spec2 == 10); + CHECK(town.creatures[0].spec_enc_code == 8); + CHECK(town.creatures[0].time_code == 12); + CHECK(town.creatures[0].monster_time == 11); + CHECK(town.creatures[0].personality == 15); + CHECK(town.creatures[0].special_on_kill == 22); + CHECK(town.creatures[0].facial_pic == 18); + } + SECTION("With wandering monsters") { + old_town.wandering[0] = {1,2,3,4}; + old_town.wandering[1] = {5,6,7,8}; + cTown town(scen, AREA_TINY); + // import_legacy expects special arrays to be filled + town.specials.resize(100); + town.special_locs.resize(50); + town.import_legacy(old_town); + REQUIRE(town.wandering.size() >= 2); + CHECK(town.wandering[0].monst[0] == 1); + CHECK(town.wandering[0].monst[1] == 2); + CHECK(town.wandering[0].monst[2] == 3); + CHECK(town.wandering[0].monst[3] == 4); + CHECK(town.wandering[1].monst[0] == 5); + CHECK(town.wandering[1].monst[1] == 6); + CHECK(town.wandering[1].monst[2] == 7); + CHECK(town.wandering[1].monst[3] == 8); + } + SECTION("Big town") { + legacy::big_tr_type big = {0}; + big.terrain[2][3] = 15; + big.room_rect[0] = {12,13,14,15}; + cTown town(scen, AREA_LARGE); + // import_legacy expects special arrays to be filled + town.specials.resize(100); + town.special_locs.resize(50); + town.import_legacy(big, 0); + CHECK(town.max_dim == 64); + CHECK(town.terrain[2][3] == 15); + REQUIRE(town.area_desc.size() >= 1); + CHECK(town.area_desc[0] == rect(12,13,14,15)); + CHECK(town.creatures.size() == 60); + } + SECTION("Medium town") { + legacy::ave_tr_type med = {0}; + med.terrain[2][3] = 15; + med.room_rect[0] = {12,13,14,15}; + cTown town(scen, AREA_MEDIUM); + // import_legacy expects special arrays to be filled + town.specials.resize(100); + town.special_locs.resize(50); + town.import_legacy(med, 0); + CHECK(town.max_dim == 48); + CHECK(town.terrain[2][3] == 15); + REQUIRE(town.area_desc.size() >= 1); + CHECK(town.area_desc[0] == rect(12,13,14,15)); + CHECK(town.creatures.size() == 40); + } + SECTION("Small town") { + legacy::tiny_tr_type sm = {0}; + sm.terrain[2][3] = 15; + sm.room_rect[0] = {12,13,14,15}; + cTown town(scen, AREA_SMALL); + // import_legacy expects special arrays to be filled + town.specials.resize(100); + town.special_locs.resize(50); + town.import_legacy(sm, 0); + CHECK(town.max_dim == 32); + CHECK(town.terrain[2][3] == 15); + REQUIRE(town.area_desc.size() >= 1); + CHECK(town.area_desc[0] == rect(12,13,14,15)); + CHECK(town.creatures.size() == 30); + } +}