You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

108 lines
3.0 KiB

#ifdef _DEBUG
#include "lua/modules/dev/towners.hpp"
#include <string>
#include <ankerl/unordered_dense.h>
#include <sol/sol.hpp>
#include "lua/metadoc.hpp"
#include "player.h"
#include "spells.h"
#include "towners.h"
#include "utils/str_cat.hpp"
namespace devilution {
namespace {
ankerl::unordered_dense::map<std::string_view, _talker_id> TownerShortNameToTownerId = {
{ "griswold", _talker_id::TOWN_SMITH },
{ "smith", _talker_id::TOWN_SMITH },
{ "pepin", _talker_id::TOWN_HEALER },
{ "healer", _talker_id::TOWN_HEALER },
{ "ogden", _talker_id::TOWN_TAVERN },
{ "tavern", _talker_id::TOWN_TAVERN },
{ "cain", _talker_id::TOWN_STORY },
{ "story", _talker_id::TOWN_STORY },
{ "farnham", _talker_id::TOWN_DRUNK },
{ "drunk", _talker_id::TOWN_DRUNK },
{ "adria", _talker_id::TOWN_WITCH },
{ "witch", _talker_id::TOWN_WITCH },
{ "gillian", _talker_id::TOWN_BMAID },
{ "bmaid", _talker_id::TOWN_BMAID },
{ "wirt", _talker_id ::TOWN_PEGBOY },
{ "pegboy", _talker_id ::TOWN_PEGBOY },
{ "lester", _talker_id ::TOWN_FARMER },
{ "farmer", _talker_id ::TOWN_FARMER },
{ "girl", _talker_id ::TOWN_GIRL },
{ "nut", _talker_id::TOWN_COWFARM },
{ "cowfarm", _talker_id::TOWN_COWFARM },
};
std::string DebugCmdVisitTowner(std::string_view name)
{
Player &myPlayer = *MyPlayer;
if (setlevel || !myPlayer.isOnLevel(0))
return StrCat("This command is only available in Town!");
if (name.empty()) {
std::string ret;
ret = StrCat("Please provide the name of a Towner: ");
for (const auto &[name, _] : TownerShortNameToTownerId) {
ret += ' ';
ret.append(name);
}
return ret;
}
auto it = TownerShortNameToTownerId.find(name);
if (it == TownerShortNameToTownerId.end())
return StrCat(name, " is invalid!");
for (const Towner &towner : Towners) {
if (towner._ttype != it->second) continue;
CastSpell(
*MyPlayer,
SpellID::Teleport,
myPlayer.position.tile,
towner.position,
/*spllvl=*/1);
return StrCat("Moved you to ", name, ".");
}
return StrCat("Unable to locate ", name, "!");
}
std::string DebugCmdTalkToTowner(std::string_view name)
{
if (name.empty()) {
std::string ret;
ret = StrCat("Please provide the name of a Towner: ");
for (const auto &[name, _] : TownerShortNameToTownerId) {
ret += ' ';
ret.append(name);
}
return ret;
}
auto it = TownerShortNameToTownerId.find(name);
if (it == TownerShortNameToTownerId.end())
return StrCat(name, " is invalid!");
if (!DebugTalkToTowner(it->second)) return StrCat("Towner not found!");
return StrCat("Opened ", name, " talk window.");
}
} // namespace
sol::table LuaDevTownersModule(sol::state_view &lua)
{
sol::table table = lua.create_table();
LuaSetDocFn(table, "talk", "(name: string)", "Talk to towner.", &DebugCmdTalkToTowner);
LuaSetDocFn(table, "visit", "(name: string)", "Teleport to towner.", &DebugCmdVisitTowner);
return table;
}
} // namespace devilution
#endif // _DEBUG