Files
oboe/test/town_legacy.cpp

248 lines
8.5 KiB
C++

//
// town_legacy.cpp
// BoE
//
// Created by Celtic Minstrel on 16-08-09.
//
//
#include "catch.hpp"
#include "scenario/town.hpp"
#include "scenario/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);
}
}