Files
oboe/test/talk_legacy.cpp

382 lines
13 KiB
C++

//
// talk_legacy.cpp
// BoE
//
// Created by Celtic Minstrel on 16-08-09.
//
//
#include "catch.hpp"
#include "scenario/town.hpp"
#include "scenario/talking.hpp"
#include "scenario/scenario.hpp"
#include "oldstructs.hpp"
TEST_CASE("Converting legacy talk data") {
cSpeech talk;
legacy::talking_record_type old_talk{};
std::vector<shop_info_t> shops;
old_talk.talk_nodes[0].personality = 12;
old_talk.talk_nodes[0].type = 0;
std::copy_n("findthem", 8, old_talk.talk_nodes[0].link1);
std::fill_n(old_talk.talk_nodes[0].extras, 4, 0);
SECTION("Basic data") {
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].personality == 12);
CHECK(talk.talk_nodes[0].type == eTalkNode::REGULAR);
CHECK(talk.talk_nodes[0].link1[0] == 'f');
CHECK(talk.talk_nodes[0].link1[1] == 'i');
CHECK(talk.talk_nodes[0].link1[2] == 'n');
CHECK(talk.talk_nodes[0].link1[3] == 'd');
CHECK(talk.talk_nodes[0].link2[0] == 't');
CHECK(talk.talk_nodes[0].link2[1] == 'h');
CHECK(talk.talk_nodes[0].link2[2] == 'e');
CHECK(talk.talk_nodes[0].link2[3] == 'm');
CHECK(talk.talk_nodes[0].extras[0] == 0);
CHECK(talk.talk_nodes[0].extras[1] == 0);
CHECK(talk.talk_nodes[0].extras[2] == 0);
CHECK(talk.talk_nodes[0].extras[3] == 0);
}
SECTION("Basic & If-Then talking nodes") {
SECTION("Depends on Flag") {
old_talk.talk_nodes[0].type = 1;
old_talk.talk_nodes[0].extras[0] = 12;
old_talk.talk_nodes[0].extras[1] = 13;
old_talk.talk_nodes[0].extras[2] = 14;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::DEP_ON_SDF);
CHECK(talk.talk_nodes[0].extras[0] == 12);
CHECK(talk.talk_nodes[0].extras[1] == 13);
CHECK(talk.talk_nodes[0].extras[2] == 14);
}
SECTION("Set to One") {
old_talk.talk_nodes[0].type = 2;
old_talk.talk_nodes[0].extras[0] = 12;
old_talk.talk_nodes[0].extras[1] = 13;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::SET_SDF);
CHECK(talk.talk_nodes[0].extras[0] == 12);
CHECK(talk.talk_nodes[0].extras[1] == 13);
CHECK(talk.talk_nodes[0].extras[2] == 1);
}
SECTION("Inn") {
old_talk.talk_nodes[0].type = 3;
old_talk.talk_nodes[0].extras[0] = 12;
old_talk.talk_nodes[0].extras[1] = 13;
old_talk.talk_nodes[0].extras[2] = 14;
old_talk.talk_nodes[0].extras[3] = 15;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::INN);
CHECK(talk.talk_nodes[0].extras[0] == 12);
CHECK(talk.talk_nodes[0].extras[1] == 13);
CHECK(talk.talk_nodes[0].extras[2] == 14);
CHECK(talk.talk_nodes[0].extras[3] == 15);
}
SECTION("Depends on time") {
old_talk.talk_nodes[0].type = 4;
old_talk.talk_nodes[0].extras[0] = 12;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::DEP_ON_TIME);
CHECK(talk.talk_nodes[0].extras[0] == 12);
}
SECTION("Depends on time with event") {
old_talk.talk_nodes[0].type = 5;
old_talk.talk_nodes[0].extras[0] = 12;
old_talk.talk_nodes[0].extras[1] = 13;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::DEP_ON_TIME_AND_EVENT);
CHECK(talk.talk_nodes[0].extras[0] == 12);
CHECK(talk.talk_nodes[0].extras[1] == 13);
}
SECTION("Depends on town") {
old_talk.talk_nodes[0].type = 6;
old_talk.talk_nodes[0].extras[0] = 12;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::DEP_ON_TOWN);
CHECK(talk.talk_nodes[0].extras[0] == 12);
}
}
SECTION("Shops") {
SECTION("Regular shop") {
old_talk.talk_nodes[0].type = 7;
old_talk.talk_nodes[0].extras[0] = 6;
old_talk.talk_nodes[0].extras[1] = 13;
old_talk.talk_nodes[0].extras[2] = 14;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP);
CHECK(talk.talk_nodes[0].extras[0] == 6); // "Utterly Ridiculous"
CHECK(talk.talk_nodes[0].extras[1] == 6);
CHECK(talk.talk_nodes[0].extras[2] == 0);
REQUIRE(shops.size() == 1);
CHECK(shops[0].type == eShopItemType::ITEM);
CHECK(shops[0].first == 13);
CHECK(shops[0].count == 14);
}
SECTION("Training") {
old_talk.talk_nodes[0].type = 8;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::TRAINING);
}
SECTION("Mage spell shop") {
old_talk.talk_nodes[0].type = 9;
old_talk.talk_nodes[0].extras[0] = 6;
old_talk.talk_nodes[0].extras[1] = 13;
old_talk.talk_nodes[0].extras[2] = 14;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP);
CHECK(talk.talk_nodes[0].extras[0] == 6);
CHECK(talk.talk_nodes[0].extras[1] == 6);
CHECK(talk.talk_nodes[0].extras[2] == 0);
REQUIRE(shops.size() == 1);
CHECK(shops[0].type == eShopItemType::MAGE_SPELL);
CHECK(shops[0].first == 43);
CHECK(shops[0].count == 14);
}
SECTION("Priest spell shop") {
old_talk.talk_nodes[0].type = 10;
old_talk.talk_nodes[0].extras[0] = 6;
old_talk.talk_nodes[0].extras[1] = 13;
old_talk.talk_nodes[0].extras[2] = 14;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP);
CHECK(talk.talk_nodes[0].extras[0] == 6);
CHECK(talk.talk_nodes[0].extras[1] == 6);
CHECK(talk.talk_nodes[0].extras[2] == 0);
REQUIRE(shops.size() == 1);
CHECK(shops[0].type == eShopItemType::PRIEST_SPELL);
CHECK(shops[0].first == 43);
CHECK(shops[0].count == 14);
}
SECTION("Alchemy shop") {
old_talk.talk_nodes[0].type = 11;
old_talk.talk_nodes[0].extras[0] = 6;
old_talk.talk_nodes[0].extras[1] = 13;
old_talk.talk_nodes[0].extras[2] = 14;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP);
CHECK(talk.talk_nodes[0].extras[0] == 6);
CHECK(talk.talk_nodes[0].extras[1] == 6);
CHECK(talk.talk_nodes[0].extras[2] == 0);
REQUIRE(shops.size() == 1);
CHECK(shops[0].type == eShopItemType::ALCHEMY);
CHECK(shops[0].first == 13);
CHECK(shops[0].count == 14);
}
SECTION("Healer") {
old_talk.talk_nodes[0].type = 12;
old_talk.talk_nodes[0].extras[0] = 6;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP);
CHECK(talk.talk_nodes[0].extras[0] == 6);
CHECK(talk.talk_nodes[0].extras[1] == 5);
CHECK(talk.talk_nodes[0].extras[2] == 0);
}
SECTION("Junk Shop") {
old_talk.talk_nodes[0].type = 23;
old_talk.talk_nodes[0].extras[0] = 6;
old_talk.talk_nodes[0].extras[1] = 4;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::SHOP);
CHECK(talk.talk_nodes[0].extras[0] == 6);
CHECK(talk.talk_nodes[0].extras[1] == 4);
}
SECTION("Sell weapons") {
old_talk.talk_nodes[0].type = 13;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::SELL_WEAPONS);
}
SECTION("Sell armour") {
old_talk.talk_nodes[0].type = 14;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::SELL_ARMOR);
}
SECTION("Sell anything") {
old_talk.talk_nodes[0].type = 15;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::SELL_ITEMS);
}
SECTION("Identify") {
old_talk.talk_nodes[0].type = 16;
old_talk.talk_nodes[0].extras[0] = 12;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::IDENTIFY);
CHECK(talk.talk_nodes[0].extras[0] == 12);
}
SECTION("Enchant") {
old_talk.talk_nodes[0].type = 17;
old_talk.talk_nodes[0].extras[0] = 12;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::ENCHANT);
CHECK(talk.talk_nodes[0].extras[0] == 12);
}
}
SECTION("Other nodes") {
SECTION("Buy info") {
old_talk.talk_nodes[0].type = 18;
old_talk.talk_nodes[0].extras[0] = 12;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_INFO);
CHECK(talk.talk_nodes[0].extras[0] == 12);
}
SECTION("Buy SDF") {
old_talk.talk_nodes[0].type = 19;
old_talk.talk_nodes[0].extras[0] = 12;
old_talk.talk_nodes[0].extras[1] = 13;
old_talk.talk_nodes[0].extras[2] = 14;
old_talk.talk_nodes[0].extras[3] = 15;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_SDF);
CHECK(talk.talk_nodes[0].extras[0] == 12);
CHECK(talk.talk_nodes[0].extras[1] == 13);
CHECK(talk.talk_nodes[0].extras[2] == 14);
CHECK(talk.talk_nodes[0].extras[3] == 15);
}
SECTION("Buy boat") {
old_talk.talk_nodes[0].type = 20;
old_talk.talk_nodes[0].extras[0] = 12;
old_talk.talk_nodes[0].extras[1] = 13;
old_talk.talk_nodes[0].extras[2] = 14;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_SHIP);
CHECK(talk.talk_nodes[0].extras[0] == 12);
CHECK(talk.talk_nodes[0].extras[1] == 13);
CHECK(talk.talk_nodes[0].extras[2] == 14);
}
SECTION("Buy horse") {
old_talk.talk_nodes[0].type = 21;
old_talk.talk_nodes[0].extras[0] = 12;
old_talk.talk_nodes[0].extras[1] = 13;
old_talk.talk_nodes[0].extras[2] = 14;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_HORSE);
CHECK(talk.talk_nodes[0].extras[0] == 12);
CHECK(talk.talk_nodes[0].extras[1] == 13);
CHECK(talk.talk_nodes[0].extras[2] == 14);
}
SECTION("Buy special item") {
old_talk.talk_nodes[0].type = 22;
old_talk.talk_nodes[0].extras[0] = 12;
old_talk.talk_nodes[0].extras[1] = 13;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_SPEC_ITEM);
CHECK(talk.talk_nodes[0].extras[0] == 12);
CHECK(talk.talk_nodes[0].extras[1] == 13);
}
SECTION("Buy town location") {
old_talk.talk_nodes[0].type = 24;
old_talk.talk_nodes[0].extras[0] = 12;
old_talk.talk_nodes[0].extras[1] = 13;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::BUY_TOWN_LOC);
CHECK(talk.talk_nodes[0].extras[0] == 12);
CHECK(talk.talk_nodes[0].extras[1] == 13);
}
SECTION("Force end") {
old_talk.talk_nodes[0].type = 25;
old_talk.talk_nodes[0].extras[0] = 12;
old_talk.talk_nodes[0].extras[1] = 13;
old_talk.talk_nodes[0].extras[2] = 14;
old_talk.talk_nodes[0].extras[3] = 15;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::END_FORCE);
CHECK(talk.talk_nodes[0].extras[0] == 12);
CHECK(talk.talk_nodes[0].extras[1] == 13);
CHECK(talk.talk_nodes[0].extras[2] == 14);
CHECK(talk.talk_nodes[0].extras[3] == 15);
}
SECTION("Force end + hostile") {
old_talk.talk_nodes[0].type = 26;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::END_FIGHT);
}
SECTION("Force end + alarm") {
old_talk.talk_nodes[0].type = 27;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::END_ALARM);
}
SECTION("Force end + die") {
old_talk.talk_nodes[0].type = 28;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::END_DIE);
}
SECTION("Call town special") {
old_talk.talk_nodes[0].type = 29;
old_talk.talk_nodes[0].extras[0] = 12;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::CALL_TOWN_SPEC);
CHECK(talk.talk_nodes[0].extras[0] == 12);
}
SECTION("Call scenario special") {
old_talk.talk_nodes[0].type = 30;
old_talk.talk_nodes[0].extras[0] = 12;
talk.import_legacy(old_talk, shops);
REQUIRE(talk.talk_nodes.size() >= 1);
CHECK(talk.talk_nodes[0].type == eTalkNode::CALL_SCEN_SPEC);
CHECK(talk.talk_nodes[0].extras[0] == 12);
}
}
}
#if 0
enum class eTalkNode {
REGULAR = 0,
DEP_ON_SDF = 1,
SET_SDF = 2,
INN = 3,
DEP_ON_TIME = 4,
DEP_ON_TIME_AND_EVENT = 5,
DEP_ON_TOWN = 6,
SHOP = 7,
TRAINING = 8,
JOB_BANK = 9,
SELL_WEAPONS = 13,
SELL_ARMOR = 14,
SELL_ITEMS = 15,
IDENTIFY = 16,
ENCHANT = 17,
BUY_INFO = 18,
BUY_SDF = 19,
BUY_SHIP = 20,
BUY_HORSE = 21,
BUY_SPEC_ITEM = 22,
RECEIVE_QUEST = 23,
BUY_TOWN_LOC = 24,
END_FORCE = 25,
END_FIGHT = 26,
END_ALARM = 27, // Town hostile
END_DIE = 28,
CALL_TOWN_SPEC = 29,
CALL_SCEN_SPEC = 30,
};
#endif