|
|
|
|
@ -8,6 +8,7 @@
|
|
|
|
|
#include <cstdint> |
|
|
|
|
|
|
|
|
|
#include <ankerl/unordered_dense.h> |
|
|
|
|
#include <magic_enum/magic_enum.hpp> |
|
|
|
|
|
|
|
|
|
#include "cursor.h" |
|
|
|
|
#include "data/file.hpp" |
|
|
|
|
@ -18,6 +19,12 @@
|
|
|
|
|
#include "textdat.h" |
|
|
|
|
#include "utils/language.h" |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
struct magic_enum::customize::enum_range<devilution::_monster_id> { |
|
|
|
|
static constexpr int min = devilution::MT_INVALID; |
|
|
|
|
static constexpr int max = devilution::NUM_MTYPES; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
namespace devilution { |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
@ -208,163 +215,10 @@ const _monster_id MonstConvTbl[] = {
|
|
|
|
|
|
|
|
|
|
tl::expected<_monster_id, std::string> ParseMonsterId(std::string_view value) |
|
|
|
|
{ |
|
|
|
|
if (value == "MT_NZOMBIE") return MT_NZOMBIE; |
|
|
|
|
if (value == "MT_BZOMBIE") return MT_BZOMBIE; |
|
|
|
|
if (value == "MT_GZOMBIE") return MT_GZOMBIE; |
|
|
|
|
if (value == "MT_YZOMBIE") return MT_YZOMBIE; |
|
|
|
|
if (value == "MT_RFALLSP") return MT_RFALLSP; |
|
|
|
|
if (value == "MT_DFALLSP") return MT_DFALLSP; |
|
|
|
|
if (value == "MT_YFALLSP") return MT_YFALLSP; |
|
|
|
|
if (value == "MT_BFALLSP") return MT_BFALLSP; |
|
|
|
|
if (value == "MT_WSKELAX") return MT_WSKELAX; |
|
|
|
|
if (value == "MT_TSKELAX") return MT_TSKELAX; |
|
|
|
|
if (value == "MT_RSKELAX") return MT_RSKELAX; |
|
|
|
|
if (value == "MT_XSKELAX") return MT_XSKELAX; |
|
|
|
|
if (value == "MT_RFALLSD") return MT_RFALLSD; |
|
|
|
|
if (value == "MT_DFALLSD") return MT_DFALLSD; |
|
|
|
|
if (value == "MT_YFALLSD") return MT_YFALLSD; |
|
|
|
|
if (value == "MT_BFALLSD") return MT_BFALLSD; |
|
|
|
|
if (value == "MT_NSCAV") return MT_NSCAV; |
|
|
|
|
if (value == "MT_BSCAV") return MT_BSCAV; |
|
|
|
|
if (value == "MT_WSCAV") return MT_WSCAV; |
|
|
|
|
if (value == "MT_YSCAV") return MT_YSCAV; |
|
|
|
|
if (value == "MT_WSKELBW") return MT_WSKELBW; |
|
|
|
|
if (value == "MT_TSKELBW") return MT_TSKELBW; |
|
|
|
|
if (value == "MT_RSKELBW") return MT_RSKELBW; |
|
|
|
|
if (value == "MT_XSKELBW") return MT_XSKELBW; |
|
|
|
|
if (value == "MT_WSKELSD") return MT_WSKELSD; |
|
|
|
|
if (value == "MT_TSKELSD") return MT_TSKELSD; |
|
|
|
|
if (value == "MT_RSKELSD") return MT_RSKELSD; |
|
|
|
|
if (value == "MT_XSKELSD") return MT_XSKELSD; |
|
|
|
|
if (value == "MT_SNEAK") return MT_SNEAK; |
|
|
|
|
if (value == "MT_STALKER") return MT_STALKER; |
|
|
|
|
if (value == "MT_UNSEEN") return MT_UNSEEN; |
|
|
|
|
if (value == "MT_ILLWEAV") return MT_ILLWEAV; |
|
|
|
|
if (value == "MT_NGOATMC") return MT_NGOATMC; |
|
|
|
|
if (value == "MT_BGOATMC") return MT_BGOATMC; |
|
|
|
|
if (value == "MT_RGOATMC") return MT_RGOATMC; |
|
|
|
|
if (value == "MT_GGOATMC") return MT_GGOATMC; |
|
|
|
|
if (value == "MT_FIEND") return MT_FIEND; |
|
|
|
|
if (value == "MT_GLOOM") return MT_GLOOM; |
|
|
|
|
if (value == "MT_BLINK") return MT_BLINK; |
|
|
|
|
if (value == "MT_FAMILIAR") return MT_FAMILIAR; |
|
|
|
|
if (value == "MT_NGOATBW") return MT_NGOATBW; |
|
|
|
|
if (value == "MT_BGOATBW") return MT_BGOATBW; |
|
|
|
|
if (value == "MT_RGOATBW") return MT_RGOATBW; |
|
|
|
|
if (value == "MT_GGOATBW") return MT_GGOATBW; |
|
|
|
|
if (value == "MT_NACID") return MT_NACID; |
|
|
|
|
if (value == "MT_RACID") return MT_RACID; |
|
|
|
|
if (value == "MT_BACID") return MT_BACID; |
|
|
|
|
if (value == "MT_XACID") return MT_XACID; |
|
|
|
|
if (value == "MT_SKING") return MT_SKING; |
|
|
|
|
if (value == "MT_FAT") return MT_FAT; |
|
|
|
|
if (value == "MT_MUDMAN") return MT_MUDMAN; |
|
|
|
|
if (value == "MT_TOAD") return MT_TOAD; |
|
|
|
|
if (value == "MT_FLAYED") return MT_FLAYED; |
|
|
|
|
if (value == "MT_WYRM") return MT_WYRM; |
|
|
|
|
if (value == "MT_CAVSLUG") return MT_CAVSLUG; |
|
|
|
|
if (value == "MT_DEVOUR") return MT_DEVOUR; |
|
|
|
|
if (value == "MT_DVLWYRM") return MT_DVLWYRM; |
|
|
|
|
if (value == "MT_NMAGMA") return MT_NMAGMA; |
|
|
|
|
if (value == "MT_YMAGMA") return MT_YMAGMA; |
|
|
|
|
if (value == "MT_BMAGMA") return MT_BMAGMA; |
|
|
|
|
if (value == "MT_WMAGMA") return MT_WMAGMA; |
|
|
|
|
if (value == "MT_HORNED") return MT_HORNED; |
|
|
|
|
if (value == "MT_MUDRUN") return MT_MUDRUN; |
|
|
|
|
if (value == "MT_FROSTC") return MT_FROSTC; |
|
|
|
|
if (value == "MT_OBLORD") return MT_OBLORD; |
|
|
|
|
if (value == "MT_BONEDMN") return MT_BONEDMN; |
|
|
|
|
if (value == "MT_REDDTH") return MT_REDDTH; |
|
|
|
|
if (value == "MT_LTCHDMN") return MT_LTCHDMN; |
|
|
|
|
if (value == "MT_UDEDBLRG") return MT_UDEDBLRG; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INCIN") return MT_INCIN; |
|
|
|
|
if (value == "MT_FLAMLRD") return MT_FLAMLRD; |
|
|
|
|
if (value == "MT_DOOMFIRE") return MT_DOOMFIRE; |
|
|
|
|
if (value == "MT_HELLBURN") return MT_HELLBURN; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_RSTORM") return MT_RSTORM; |
|
|
|
|
if (value == "MT_STORM") return MT_STORM; |
|
|
|
|
if (value == "MT_STORML") return MT_STORML; |
|
|
|
|
if (value == "MT_MAEL") return MT_MAEL; |
|
|
|
|
if (value == "MT_WINGED") return MT_WINGED; |
|
|
|
|
if (value == "MT_GARGOYLE") return MT_GARGOYLE; |
|
|
|
|
if (value == "MT_BLOODCLW") return MT_BLOODCLW; |
|
|
|
|
if (value == "MT_DEATHW") return MT_DEATHW; |
|
|
|
|
if (value == "MT_MEGA") return MT_MEGA; |
|
|
|
|
if (value == "MT_GUARD") return MT_GUARD; |
|
|
|
|
if (value == "MT_VTEXLRD") return MT_VTEXLRD; |
|
|
|
|
if (value == "MT_BALROG") return MT_BALROG; |
|
|
|
|
if (value == "MT_NSNAKE") return MT_NSNAKE; |
|
|
|
|
if (value == "MT_RSNAKE") return MT_RSNAKE; |
|
|
|
|
if (value == "MT_GSNAKE") return MT_GSNAKE; |
|
|
|
|
if (value == "MT_BSNAKE") return MT_BSNAKE; |
|
|
|
|
if (value == "MT_NBLACK") return MT_NBLACK; |
|
|
|
|
if (value == "MT_RTBLACK") return MT_RTBLACK; |
|
|
|
|
if (value == "MT_BTBLACK") return MT_BTBLACK; |
|
|
|
|
if (value == "MT_RBLACK") return MT_RBLACK; |
|
|
|
|
if (value == "MT_UNRAV") return MT_UNRAV; |
|
|
|
|
if (value == "MT_HOLOWONE") return MT_HOLOWONE; |
|
|
|
|
if (value == "MT_PAINMSTR") return MT_PAINMSTR; |
|
|
|
|
if (value == "MT_REALWEAV") return MT_REALWEAV; |
|
|
|
|
if (value == "MT_SUCCUBUS") return MT_SUCCUBUS; |
|
|
|
|
if (value == "MT_SNOWWICH") return MT_SNOWWICH; |
|
|
|
|
if (value == "MT_HLSPWN") return MT_HLSPWN; |
|
|
|
|
if (value == "MT_SOLBRNR") return MT_SOLBRNR; |
|
|
|
|
if (value == "MT_COUNSLR") return MT_COUNSLR; |
|
|
|
|
if (value == "MT_MAGISTR") return MT_MAGISTR; |
|
|
|
|
if (value == "MT_CABALIST") return MT_CABALIST; |
|
|
|
|
if (value == "MT_ADVOCATE") return MT_ADVOCATE; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_DIABLO") return MT_DIABLO; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_GOLEM") return MT_GOLEM; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_INVALID") return MT_INVALID; |
|
|
|
|
if (value == "MT_BIGFALL") return MT_BIGFALL; |
|
|
|
|
if (value == "MT_DARKMAGE") return MT_DARKMAGE; |
|
|
|
|
if (value == "MT_HELLBOAR") return MT_HELLBOAR; |
|
|
|
|
if (value == "MT_STINGER") return MT_STINGER; |
|
|
|
|
if (value == "MT_PSYCHORB") return MT_PSYCHORB; |
|
|
|
|
if (value == "MT_ARACHNON") return MT_ARACHNON; |
|
|
|
|
if (value == "MT_FELLTWIN") return MT_FELLTWIN; |
|
|
|
|
if (value == "MT_HORKSPWN") return MT_HORKSPWN; |
|
|
|
|
if (value == "MT_VENMTAIL") return MT_VENMTAIL; |
|
|
|
|
if (value == "MT_NECRMORB") return MT_NECRMORB; |
|
|
|
|
if (value == "MT_SPIDLORD") return MT_SPIDLORD; |
|
|
|
|
if (value == "MT_LASHWORM") return MT_LASHWORM; |
|
|
|
|
if (value == "MT_TORCHANT") return MT_TORCHANT; |
|
|
|
|
if (value == "MT_HORKDMN") return MT_HORKDMN; |
|
|
|
|
if (value == "MT_DEFILER") return MT_DEFILER; |
|
|
|
|
if (value == "MT_GRAVEDIG") return MT_GRAVEDIG; |
|
|
|
|
if (value == "MT_TOMBRAT") return MT_TOMBRAT; |
|
|
|
|
if (value == "MT_FIREBAT") return MT_FIREBAT; |
|
|
|
|
if (value == "MT_SKLWING") return MT_SKLWING; |
|
|
|
|
if (value == "MT_LICH") return MT_LICH; |
|
|
|
|
if (value == "MT_CRYPTDMN") return MT_CRYPTDMN; |
|
|
|
|
if (value == "MT_HELLBAT") return MT_HELLBAT; |
|
|
|
|
if (value == "MT_BONEDEMN") return MT_BONEDEMN; |
|
|
|
|
if (value == "MT_LICH") return MT_LICH; |
|
|
|
|
if (value == "MT_BICLOPS") return MT_BICLOPS; |
|
|
|
|
if (value == "MT_FLESTHNG") return MT_FLESTHNG; |
|
|
|
|
if (value == "MT_REAPER") return MT_REAPER; |
|
|
|
|
if (value == "MT_NAKRUL") return MT_NAKRUL; |
|
|
|
|
if (value == "MT_CLEAVER") return MT_CLEAVER; |
|
|
|
|
if (value == "MT_INVILORD") return MT_INVILORD; |
|
|
|
|
if (value == "MT_LRDSAYTR") return MT_LRDSAYTR; |
|
|
|
|
const std::optional<_monster_id> enumValueOpt = magic_enum::enum_cast<_monster_id>(value); |
|
|
|
|
if (enumValueOpt.has_value()) { |
|
|
|
|
return enumValueOpt.value(); |
|
|
|
|
} |
|
|
|
|
return tl::make_unexpected("Unknown enum value"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|