diff --git a/src/EnemyType.cc b/src/EnemyType.cc new file mode 100644 index 00000000..cd0a43ba --- /dev/null +++ b/src/EnemyType.cc @@ -0,0 +1,886 @@ +#include "BattleParamsIndex.hh" + +#include +#include + +#include "Loggers.hh" +#include "PSOEncryption.hh" +#include "StaticGameData.hh" + +using namespace std; + +template <> +const char* name_for_enum(EnemyType type) { + switch (type) { + case EnemyType::NONE: + return "NONE"; + case EnemyType::UNKNOWN: + return "UNKNOWN"; + case EnemyType::AL_RAPPY: + return "AL_RAPPY"; + case EnemyType::ASTARK: + return "ASTARK"; + case EnemyType::BA_BOOTA: + return "BA_BOOTA"; + case EnemyType::BARBA_RAY: + return "BARBA_RAY"; + case EnemyType::BARBAROUS_WOLF: + return "BARBAROUS_WOLF"; + case EnemyType::BOOMA: + return "BOOMA"; + case EnemyType::BOOTA: + return "BOOTA"; + case EnemyType::BULCLAW: + return "BULCLAW"; + case EnemyType::CANADINE: + return "CANADINE"; + case EnemyType::CANADINE_GROUP: + return "CANADINE_GROUP"; + case EnemyType::CANANE: + return "CANANE"; + case EnemyType::CHAOS_BRINGER: + return "CHAOS_BRINGER"; + case EnemyType::CHAOS_SORCERER: + return "CHAOS_SORCERER"; + case EnemyType::CLAW: + return "CLAW"; + case EnemyType::DARK_BELRA: + return "DARK_BELRA"; + case EnemyType::DARK_FALZ_1: + return "DARK_FALZ_1"; + case EnemyType::DARK_FALZ_2: + return "DARK_FALZ_2"; + case EnemyType::DARK_FALZ_3: + return "DARK_FALZ_3"; + case EnemyType::DARK_GUNNER: + return "DARK_GUNNER"; + case EnemyType::DARVANT: + return "DARVANT"; + case EnemyType::DE_ROL_LE: + return "DE_ROL_LE"; + case EnemyType::DEATH_GUNNER: + return "DEATH_GUNNER"; + case EnemyType::DEL_LILY: + return "DEL_LILY"; + case EnemyType::DEL_RAPPY: + return "DEL_RAPPY"; + case EnemyType::DEL_RAPPY_ALT: + return "DEL_RAPPY_ALT"; + case EnemyType::DELBITER: + return "DELBITER"; + case EnemyType::DELDEPTH: + return "DELDEPTH"; + case EnemyType::DELSABER: + return "DELSABER"; + case EnemyType::DIMENIAN: + return "DIMENIAN"; + case EnemyType::DOLMDARL: + return "DOLMDARL"; + case EnemyType::DOLMOLM: + return "DOLMOLM"; + case EnemyType::DORPHON: + return "DORPHON"; + case EnemyType::DORPHON_ECLAIR: + return "DORPHON_ECLAIR"; + case EnemyType::DRAGON: + return "DRAGON"; + case EnemyType::DUBCHIC: + return "DUBCHIC"; + case EnemyType::DUBWITCH: + return "DUBWITCH"; + case EnemyType::EGG_RAPPY: + return "EGG_RAPPY"; + case EnemyType::EPSILON: + return "EPSILON"; + case EnemyType::EVIL_SHARK: + return "EVIL_SHARK"; + case EnemyType::GAEL: + return "GAEL"; + case EnemyType::GAL_GRYPHON: + return "GAL_GRYPHON"; + case EnemyType::GARANZ: + return "GARANZ"; + case EnemyType::GEE: + return "GEE"; + case EnemyType::GI_GUE: + return "GI_GUE"; + case EnemyType::GIBBLES: + return "GIBBLES"; + case EnemyType::GIGOBOOMA: + return "GIGOBOOMA"; + case EnemyType::GILLCHIC: + return "GILLCHIC"; + case EnemyType::GIRTABLULU: + return "GIRTABLULU"; + case EnemyType::GOBOOMA: + return "GOBOOMA"; + case EnemyType::GOL_DRAGON: + return "GOL_DRAGON"; + case EnemyType::GORAN: + return "GORAN"; + case EnemyType::GORAN_DETONATOR: + return "GORAN_DETONATOR"; + case EnemyType::GRASS_ASSASSIN: + return "GRASS_ASSASSIN"; + case EnemyType::GUIL_SHARK: + return "GUIL_SHARK"; + case EnemyType::HALLO_RAPPY: + return "HALLO_RAPPY"; + case EnemyType::HIDOOM: + return "HIDOOM"; + case EnemyType::HILDEBEAR: + return "HILDEBEAR"; + case EnemyType::HILDEBLUE: + return "HILDEBLUE"; + case EnemyType::ILL_GILL: + return "ILL_GILL"; + case EnemyType::KONDRIEU: + return "KONDRIEU"; + case EnemyType::LA_DIMENIAN: + return "LA_DIMENIAN"; + case EnemyType::LOVE_RAPPY: + return "LOVE_RAPPY"; + case EnemyType::MERICAROL: + return "MERICAROL"; + case EnemyType::MERICUS: + return "MERICUS"; + case EnemyType::MERIKLE: + return "MERIKLE"; + case EnemyType::MERILLIA: + return "MERILLIA"; + case EnemyType::MERILTAS: + return "MERILTAS"; + case EnemyType::MERISSA_A: + return "MERISSA_A"; + case EnemyType::MERISSA_AA: + return "MERISSA_AA"; + case EnemyType::MIGIUM: + return "MIGIUM"; + case EnemyType::MONEST: + return "MONEST"; + case EnemyType::MORFOS: + return "MORFOS"; + case EnemyType::MOTHMANT: + return "MOTHMANT"; + case EnemyType::NANO_DRAGON: + return "NANO_DRAGON"; + case EnemyType::NAR_LILY: + return "NAR_LILY"; + case EnemyType::OLGA_FLOW_1: + return "OLGA_FLOW_1"; + case EnemyType::OLGA_FLOW_2: + return "OLGA_FLOW_2"; + case EnemyType::PAL_SHARK: + return "PAL_SHARK"; + case EnemyType::PAN_ARMS: + return "PAN_ARMS"; + case EnemyType::PAZUZU: + return "PAZUZU"; + case EnemyType::PAZUZU_ALT: + return "PAZUZU_ALT"; + case EnemyType::POFUILLY_SLIME: + return "POFUILLY_SLIME"; + case EnemyType::POUILLY_SLIME: + return "POUILLY_SLIME"; + case EnemyType::POISON_LILY: + return "POISON_LILY"; + case EnemyType::PYRO_GORAN: + return "PYRO_GORAN"; + case EnemyType::RAG_RAPPY: + return "RAG_RAPPY"; + case EnemyType::RECOBOX: + return "RECOBOX"; + case EnemyType::RECON: + return "RECON"; + case EnemyType::SAINT_MILLION: + return "SAINT_MILLION"; + case EnemyType::SAINT_RAPPY: + return "SAINT_RAPPY"; + case EnemyType::SAND_RAPPY: + return "SAND_RAPPY"; + case EnemyType::SAND_RAPPY_ALT: + return "SAND_RAPPY_ALT"; + case EnemyType::SATELLITE_LIZARD: + return "SATELLITE_LIZARD"; + case EnemyType::SATELLITE_LIZARD_ALT: + return "SATELLITE_LIZARD_ALT"; + case EnemyType::SAVAGE_WOLF: + return "SAVAGE_WOLF"; + case EnemyType::SHAMBERTIN: + return "SHAMBERTIN"; + case EnemyType::SINOW_BEAT: + return "SINOW_BEAT"; + case EnemyType::SINOW_BERILL: + return "SINOW_BERILL"; + case EnemyType::SINOW_GOLD: + return "SINOW_GOLD"; + case EnemyType::SINOW_SPIGELL: + return "SINOW_SPIGELL"; + case EnemyType::SINOW_ZELE: + return "SINOW_ZELE"; + case EnemyType::SINOW_ZOA: + return "SINOW_ZOA"; + case EnemyType::SO_DIMENIAN: + return "SO_DIMENIAN"; + case EnemyType::UL_GIBBON: + return "UL_GIBBON"; + case EnemyType::VOL_OPT_1: + return "VOL_OPT_1"; + case EnemyType::VOL_OPT_2: + return "VOL_OPT_2"; + case EnemyType::YOWIE: + return "YOWIE"; + case EnemyType::YOWIE_ALT: + return "YOWIE_ALT"; + case EnemyType::ZE_BOOTA: + return "ZE_BOOTA"; + case EnemyType::ZOL_GIBBON: + return "ZOL_GIBBON"; + case EnemyType::ZU: + return "ZU"; + case EnemyType::ZU_ALT: + return "ZU_ALT"; + default: + throw logic_error("invalid enemy type"); + } +} + +template <> +EnemyType enum_for_name(const char* name) { + static const unordered_map names({ + {"NONE", EnemyType::NONE}, + {"UNKNOWN", EnemyType::UNKNOWN}, + {"AL_RAPPY", EnemyType::AL_RAPPY}, + {"ASTARK", EnemyType::ASTARK}, + {"BA_BOOTA", EnemyType::BA_BOOTA}, + {"BARBA_RAY", EnemyType::BARBA_RAY}, + {"BARBAROUS_WOLF", EnemyType::BARBAROUS_WOLF}, + {"BOOMA", EnemyType::BOOMA}, + {"BOOTA", EnemyType::BOOTA}, + {"BULCLAW", EnemyType::BULCLAW}, + {"CANADINE", EnemyType::CANADINE}, + {"CANADINE_GROUP", EnemyType::CANADINE_GROUP}, + {"CANANE", EnemyType::CANANE}, + {"CHAOS_BRINGER", EnemyType::CHAOS_BRINGER}, + {"CHAOS_SORCERER", EnemyType::CHAOS_SORCERER}, + {"CLAW", EnemyType::CLAW}, + {"DARK_BELRA", EnemyType::DARK_BELRA}, + {"DARK_FALZ_1", EnemyType::DARK_FALZ_1}, + {"DARK_FALZ_2", EnemyType::DARK_FALZ_2}, + {"DARK_FALZ_3", EnemyType::DARK_FALZ_3}, + {"DARK_GUNNER", EnemyType::DARK_GUNNER}, + {"DARVANT", EnemyType::DARVANT}, + {"DARVANT_ULTIMATE", EnemyType::DARVANT_ULTIMATE}, + {"DE_ROL_LE", EnemyType::DE_ROL_LE}, + {"DEATH_GUNNER", EnemyType::DEATH_GUNNER}, + {"DEL_LILY", EnemyType::DEL_LILY}, + {"DEL_RAPPY", EnemyType::DEL_RAPPY}, + {"DEL_RAPPY_ALT", EnemyType::DEL_RAPPY_ALT}, + {"DELBITER", EnemyType::DELBITER}, + {"DELDEPTH", EnemyType::DELDEPTH}, + {"DELSABER", EnemyType::DELSABER}, + {"DIMENIAN", EnemyType::DIMENIAN}, + {"DOLMDARL", EnemyType::DOLMDARL}, + {"DOLMOLM", EnemyType::DOLMOLM}, + {"DORPHON", EnemyType::DORPHON}, + {"DORPHON_ECLAIR", EnemyType::DORPHON_ECLAIR}, + {"DRAGON", EnemyType::DRAGON}, + {"DUBCHIC", EnemyType::DUBCHIC}, + {"DUBWITCH", EnemyType::DUBWITCH}, + {"EGG_RAPPY", EnemyType::EGG_RAPPY}, + {"EPSILON", EnemyType::EPSILON}, + {"EVIL_SHARK", EnemyType::EVIL_SHARK}, + {"GAEL", EnemyType::GAEL}, + {"GAL_GRYPHON", EnemyType::GAL_GRYPHON}, + {"GARANZ", EnemyType::GARANZ}, + {"GEE", EnemyType::GEE}, + {"GI_GUE", EnemyType::GI_GUE}, + {"GIBBLES", EnemyType::GIBBLES}, + {"GIGOBOOMA", EnemyType::GIGOBOOMA}, + {"GILLCHIC", EnemyType::GILLCHIC}, + {"GIRTABLULU", EnemyType::GIRTABLULU}, + {"GOBOOMA", EnemyType::GOBOOMA}, + {"GOL_DRAGON", EnemyType::GOL_DRAGON}, + {"GORAN", EnemyType::GORAN}, + {"GORAN_DETONATOR", EnemyType::GORAN_DETONATOR}, + {"GRASS_ASSASSIN", EnemyType::GRASS_ASSASSIN}, + {"GUIL_SHARK", EnemyType::GUIL_SHARK}, + {"HALLO_RAPPY", EnemyType::HALLO_RAPPY}, + {"HIDOOM", EnemyType::HIDOOM}, + {"HILDEBEAR", EnemyType::HILDEBEAR}, + {"HILDEBLUE", EnemyType::HILDEBLUE}, + {"ILL_GILL", EnemyType::ILL_GILL}, + {"KONDRIEU", EnemyType::KONDRIEU}, + {"LA_DIMENIAN", EnemyType::LA_DIMENIAN}, + {"LOVE_RAPPY", EnemyType::LOVE_RAPPY}, + {"MERICAROL", EnemyType::MERICAROL}, + {"MERICUS", EnemyType::MERICUS}, + {"MERIKLE", EnemyType::MERIKLE}, + {"MERILLIA", EnemyType::MERILLIA}, + {"MERILTAS", EnemyType::MERILTAS}, + {"MERISSA_A", EnemyType::MERISSA_A}, + {"MERISSA_AA", EnemyType::MERISSA_AA}, + {"MIGIUM", EnemyType::MIGIUM}, + {"MONEST", EnemyType::MONEST}, + {"MORFOS", EnemyType::MORFOS}, + {"MOTHMANT", EnemyType::MOTHMANT}, + {"NANO_DRAGON", EnemyType::NANO_DRAGON}, + {"NAR_LILY", EnemyType::NAR_LILY}, + {"OLGA_FLOW_1", EnemyType::OLGA_FLOW_1}, + {"OLGA_FLOW_2", EnemyType::OLGA_FLOW_2}, + {"PAL_SHARK", EnemyType::PAL_SHARK}, + {"PAN_ARMS", EnemyType::PAN_ARMS}, + {"PAZUZU", EnemyType::PAZUZU}, + {"PAZUZU_ALT", EnemyType::PAZUZU_ALT}, + {"POFUILLY_SLIME", EnemyType::POFUILLY_SLIME}, + {"POUILLY_SLIME", EnemyType::POUILLY_SLIME}, + {"POISON_LILY", EnemyType::POISON_LILY}, + {"PYRO_GORAN", EnemyType::PYRO_GORAN}, + {"RAG_RAPPY", EnemyType::RAG_RAPPY}, + {"RECOBOX", EnemyType::RECOBOX}, + {"RECON", EnemyType::RECON}, + {"SAINT_MILLION", EnemyType::SAINT_MILLION}, + {"SAINT_RAPPY", EnemyType::SAINT_RAPPY}, + {"SAND_RAPPY", EnemyType::SAND_RAPPY}, + {"SAND_RAPPY_ALT", EnemyType::SAND_RAPPY_ALT}, + {"SATELLITE_LIZARD", EnemyType::SATELLITE_LIZARD}, + {"SATELLITE_LIZARD_ALT", EnemyType::SATELLITE_LIZARD_ALT}, + {"SAVAGE_WOLF", EnemyType::SAVAGE_WOLF}, + {"SHAMBERTIN", EnemyType::SHAMBERTIN}, + {"SINOW_BEAT", EnemyType::SINOW_BEAT}, + {"SINOW_BERILL", EnemyType::SINOW_BERILL}, + {"SINOW_GOLD", EnemyType::SINOW_GOLD}, + {"SINOW_SPIGELL", EnemyType::SINOW_SPIGELL}, + {"SINOW_ZELE", EnemyType::SINOW_ZELE}, + {"SINOW_ZOA", EnemyType::SINOW_ZOA}, + {"SO_DIMENIAN", EnemyType::SO_DIMENIAN}, + {"UL_GIBBON", EnemyType::UL_GIBBON}, + {"VOL_OPT_1", EnemyType::VOL_OPT_1}, + {"VOL_OPT_2", EnemyType::VOL_OPT_2}, + {"YOWIE", EnemyType::YOWIE}, + {"YOWIE_ALT", EnemyType::YOWIE_ALT}, + {"ZE_BOOTA", EnemyType::ZE_BOOTA}, + {"ZOL_GIBBON", EnemyType::ZOL_GIBBON}, + {"ZU", EnemyType::ZU}, + {"ZU_ALT", EnemyType::ZU_ALT}, + }); + return names.at(name); +} + +uint8_t battle_param_index_for_enemy_type(Episode episode, EnemyType enemy_type) { + switch (episode) { + case Episode::EP1: + switch (enemy_type) { + case EnemyType::MOTHMANT: + return 0x00; + case EnemyType::MONEST: + return 0x01; + case EnemyType::SAVAGE_WOLF: + return 0x02; + case EnemyType::BARBAROUS_WOLF: + return 0x03; + case EnemyType::POISON_LILY: + return 0x04; + case EnemyType::NAR_LILY: + return 0x05; + case EnemyType::SINOW_BEAT: + return 0x06; + case EnemyType::CANADINE: + return 0x07; + case EnemyType::CANADINE_GROUP: + return 0x08; + case EnemyType::CANANE: + return 0x09; + case EnemyType::CHAOS_SORCERER: + return 0x0A; + case EnemyType::CHAOS_BRINGER: + return 0x0D; + case EnemyType::DARK_BELRA: + return 0x0E; + case EnemyType::DE_ROL_LE: + return 0x0F; + case EnemyType::DEATH_GUNNER: + throw runtime_error("DEATH_GUNNER entry is not specified"); + case EnemyType::DRAGON: + return 0x12; + case EnemyType::SINOW_GOLD: + return 0x13; + case EnemyType::RAG_RAPPY: + return 0x18; + case EnemyType::AL_RAPPY: + return 0x19; + case EnemyType::NANO_DRAGON: + return 0x1A; + case EnemyType::DUBCHIC: + return 0x1B; + case EnemyType::DUBWITCH: + throw runtime_error("no battle params for DUBWITCH"); + case EnemyType::GILLCHIC: + return 0x1C; + case EnemyType::GARANZ: + return 0x1D; + case EnemyType::DARK_GUNNER: + return 0x1E; + case EnemyType::BULCLAW: + return 0x1F; + case EnemyType::CLAW: + return 0x20; + case EnemyType::VOL_OPT_1: + throw runtime_error("no battle params for VOL_OPT_1"); + case EnemyType::VOL_OPT_2: + return 0x25; + case EnemyType::POUILLY_SLIME: + return 0x2F; + case EnemyType::POFUILLY_SLIME: + return 0x30; + case EnemyType::PAN_ARMS: + return 0x31; + case EnemyType::HIDOOM: + return 0x32; + case EnemyType::MIGIUM: + return 0x33; + case EnemyType::DARVANT: + return 0x35; + case EnemyType::DARVANT_ULTIMATE: + return 0x39; + case EnemyType::DARK_FALZ_1: + return 0x36; + case EnemyType::DARK_FALZ_2: + return 0x37; + case EnemyType::DARK_FALZ_3: + return 0x38; + case EnemyType::HILDEBEAR: + return 0x49; + case EnemyType::HILDEBLUE: + return 0x4A; + case EnemyType::BOOMA: + return 0x4B; + case EnemyType::GOBOOMA: + return 0x4C; + case EnemyType::GIGOBOOMA: + return 0x4D; + case EnemyType::GRASS_ASSASSIN: + return 0x4E; + case EnemyType::EVIL_SHARK: + return 0x4F; + case EnemyType::PAL_SHARK: + return 0x50; + case EnemyType::GUIL_SHARK: + return 0x51; + case EnemyType::DELSABER: + return 0x52; + case EnemyType::DIMENIAN: + return 0x53; + case EnemyType::LA_DIMENIAN: + return 0x54; + case EnemyType::SO_DIMENIAN: + return 0x55; + default: + throw runtime_error("incorrect enemy type for Episode 1"); + } + break; + case Episode::EP2: + switch (enemy_type) { + case EnemyType::MOTHMANT: + return 0x00; + case EnemyType::MONEST: + return 0x01; + case EnemyType::SAVAGE_WOLF: + return 0x02; + case EnemyType::BARBAROUS_WOLF: + return 0x03; + case EnemyType::POISON_LILY: + return 0x04; + case EnemyType::NAR_LILY: + return 0x05; + case EnemyType::SINOW_BERILL: + return 0x06; + case EnemyType::GEE: + return 0x07; + case EnemyType::CHAOS_SORCERER: + return 0x0A; + case EnemyType::DELBITER: + return 0x0D; + case EnemyType::DARK_BELRA: + return 0x0E; + case EnemyType::BARBA_RAY: + return 0x0F; + case EnemyType::GOL_DRAGON: + return 0x12; + case EnemyType::SINOW_SPIGELL: + return 0x13; + case EnemyType::RAG_RAPPY: + return 0x18; + case EnemyType::LOVE_RAPPY: + case EnemyType::SAINT_RAPPY: + case EnemyType::EGG_RAPPY: + case EnemyType::HALLO_RAPPY: + return 0x19; + case EnemyType::GI_GUE: + return 0x1A; + case EnemyType::DUBCHIC: + return 0x1B; + case EnemyType::DUBWITCH: + throw runtime_error("no battle params for DUBWITCH"); + case EnemyType::GILLCHIC: + return 0x1C; + case EnemyType::GARANZ: + return 0x1D; + case EnemyType::GAL_GRYPHON: + return 0x1E; + case EnemyType::EPSILON: + return 0x23; + case EnemyType::DEL_LILY: + return 0x25; + case EnemyType::ILL_GILL: + return 0x26; + case EnemyType::OLGA_FLOW_1: + return 0x2B; + case EnemyType::OLGA_FLOW_2: + return 0x2C; + case EnemyType::GAEL: + return 0x2E; + case EnemyType::DELDEPTH: + return 0x30; + case EnemyType::PAN_ARMS: + return 0x31; + case EnemyType::HIDOOM: + return 0x32; + case EnemyType::MIGIUM: + return 0x33; + case EnemyType::MERICAROL: + return 0x3A; + case EnemyType::UL_GIBBON: + return 0x3B; + case EnemyType::ZOL_GIBBON: + return 0x3C; + case EnemyType::GIBBLES: + return 0x3D; + case EnemyType::MORFOS: + return 0x40; + case EnemyType::RECOBOX: + return 0x41; + case EnemyType::RECON: + return 0x42; + case EnemyType::SINOW_ZOA: + return 0x43; + case EnemyType::SINOW_ZELE: + return 0x44; + case EnemyType::MERIKLE: + return 0x45; + case EnemyType::MERICUS: + return 0x46; + case EnemyType::HILDEBEAR: + return 0x49; + case EnemyType::HILDEBLUE: + return 0x4A; + case EnemyType::MERILLIA: + return 0x4B; + case EnemyType::MERILTAS: + return 0x4C; + case EnemyType::GRASS_ASSASSIN: + return 0x4E; + case EnemyType::DOLMOLM: + return 0x4F; + case EnemyType::DOLMDARL: + return 0x50; + case EnemyType::DELSABER: + return 0x52; + case EnemyType::DIMENIAN: + return 0x53; + case EnemyType::LA_DIMENIAN: + return 0x54; + case EnemyType::SO_DIMENIAN: + return 0x55; + default: + throw runtime_error("incorrect enemy type for Episode 2"); + } + break; + case Episode::EP4: + switch (enemy_type) { + case EnemyType::BOOTA: + return 0x00; + case EnemyType::ZE_BOOTA: + return 0x01; + case EnemyType::BA_BOOTA: + return 0x03; + case EnemyType::SAND_RAPPY: + return 0x05; + case EnemyType::DEL_RAPPY: + return 0x06; + case EnemyType::ZU: + return 0x07; + case EnemyType::PAZUZU: + return 0x08; + case EnemyType::ASTARK: + return 0x09; + case EnemyType::SATELLITE_LIZARD: + return 0x0D; + case EnemyType::YOWIE: + return 0x0E; + case EnemyType::DORPHON: + return 0x0F; + case EnemyType::DORPHON_ECLAIR: + return 0x10; + case EnemyType::GORAN: + return 0x11; + case EnemyType::PYRO_GORAN: + return 0x12; + case EnemyType::GORAN_DETONATOR: + return 0x13; + case EnemyType::SAND_RAPPY_ALT: + return 0x17; + case EnemyType::DEL_RAPPY_ALT: + return 0x18; + case EnemyType::MERISSA_A: + return 0x19; + case EnemyType::MERISSA_AA: + return 0x1A; + case EnemyType::ZU_ALT: + return 0x1B; + case EnemyType::PAZUZU_ALT: + return 0x1C; + case EnemyType::SATELLITE_LIZARD_ALT: + return 0x1D; + case EnemyType::YOWIE_ALT: + return 0x1E; + case EnemyType::GIRTABLULU: + return 0x1F; + case EnemyType::SAINT_MILLION: + case EnemyType::SHAMBERTIN: + case EnemyType::KONDRIEU: + return 0x22; + default: + throw runtime_error("incorrect enemy type for Episode 4"); + } + break; + default: + throw logic_error("incorrect episode in battle param lookup"); + } + throw logic_error("fallthrough case in battle param lookup"); +} + +uint8_t rare_table_index_for_enemy_type(EnemyType enemy_type) { + switch (enemy_type) { + case EnemyType::AL_RAPPY: + return 0x06; + case EnemyType::ASTARK: + return 0x01; + case EnemyType::BA_BOOTA: + return 0x0B; + case EnemyType::BARBA_RAY: + return 0x49; + case EnemyType::BARBAROUS_WOLF: + return 0x08; + case EnemyType::BOOMA: + return 0x09; + case EnemyType::BOOTA: + return 0x09; + case EnemyType::BULCLAW: + return 0x28; + case EnemyType::CANADINE: + case EnemyType::CANADINE_GROUP: + return 0x1C; + case EnemyType::CANANE: + return 0x1D; + case EnemyType::CHAOS_BRINGER: + return 0x24; + case EnemyType::CHAOS_SORCERER: + return 0x1F; + case EnemyType::CLAW: + return 0x26; + case EnemyType::DARK_BELRA: + return 0x25; + case EnemyType::DARK_FALZ_1: + throw runtime_error("DARK_FALZ_1 does not have a rare table entry"); + case EnemyType::DARK_FALZ_2: + return 0x2F; + case EnemyType::DARK_FALZ_3: + return 0x2F; + case EnemyType::DARK_GUNNER: + return 0x22; + case EnemyType::DARVANT: + case EnemyType::DARVANT_ULTIMATE: + throw runtime_error("DARVANT and DARVANT_ULTIMATE do not have rare table entries"); + case EnemyType::DE_ROL_LE: + return 0x2D; + case EnemyType::DEATH_GUNNER: + throw runtime_error("DEATH_GUNNER does not have a rare table entry"); + case EnemyType::DEL_LILY: + return 0x53; + case EnemyType::DEL_RAPPY: + case EnemyType::DEL_RAPPY_ALT: + return 0x18; + case EnemyType::DELBITER: + return 0x48; + case EnemyType::DELDEPTH: + return 0x47; + case EnemyType::DELSABER: + return 0x1E; + case EnemyType::DIMENIAN: + return 0x29; + case EnemyType::DOLMDARL: + return 0x41; + case EnemyType::DOLMOLM: + return 0x40; + case EnemyType::DORPHON: + return 0x0C; + case EnemyType::DORPHON_ECLAIR: + return 0x0D; + case EnemyType::DRAGON: + return 0x2C; + case EnemyType::DUBCHIC: + return 0x18; + case EnemyType::DUBWITCH: + throw runtime_error("DUBWITCH does not have a rare table entry"); + case EnemyType::EGG_RAPPY: + return 0x51; + case EnemyType::EPSILON: + return 0x54; + case EnemyType::EVIL_SHARK: + return 0x10; + case EnemyType::GAEL: + throw runtime_error("GAEL does not have a rare table entry"); + case EnemyType::GAL_GRYPHON: + return 0x4D; + case EnemyType::GARANZ: + return 0x19; + case EnemyType::GEE: + return 0x36; + case EnemyType::GI_GUE: + return 0x37; + case EnemyType::GIBBLES: + return 0x3D; + case EnemyType::GIGOBOOMA: + return 0x0B; + case EnemyType::GILLCHIC: + return 0x32; + case EnemyType::GIRTABLULU: + return 0x06; + case EnemyType::GOBOOMA: + return 0x0A; + case EnemyType::GOL_DRAGON: + return 0x4C; + case EnemyType::GORAN: + return 0x0E; + case EnemyType::GORAN_DETONATOR: + return 0x0F; + case EnemyType::GRASS_ASSASSIN: + return 0x0C; + case EnemyType::GUIL_SHARK: + return 0x12; + case EnemyType::HALLO_RAPPY: + return 0x50; + case EnemyType::HIDOOM: + return 0x17; + case EnemyType::HILDEBEAR: + return 0x01; + case EnemyType::HILDEBLUE: + return 0x02; + case EnemyType::ILL_GILL: + return 0x52; + case EnemyType::KONDRIEU: + return 0x15; + case EnemyType::LA_DIMENIAN: + return 0x2A; + case EnemyType::LOVE_RAPPY: + return 0x33; + case EnemyType::MERICAROL: + return 0x38; + case EnemyType::MERICUS: + return 0x3A; + case EnemyType::MERIKLE: + return 0x39; + case EnemyType::MERILLIA: + return 0x34; + case EnemyType::MERILTAS: + return 0x35; + case EnemyType::MERISSA_A: + return 0x04; + case EnemyType::MERISSA_AA: + return 0x05; + case EnemyType::MIGIUM: + return 0x16; + case EnemyType::MONEST: + return 0x04; + case EnemyType::MORFOS: + return 0x42; + case EnemyType::MOTHMANT: + return 0x03; + case EnemyType::NANO_DRAGON: + return 0x0F; + case EnemyType::NAR_LILY: + return 0x0E; + case EnemyType::OLGA_FLOW_1: + throw runtime_error("OLGA_FLOW_1 does not have a rare table entry"); + case EnemyType::OLGA_FLOW_2: + return 0x4E; + case EnemyType::PAL_SHARK: + return 0x11; + case EnemyType::PAN_ARMS: + return 0x15; + case EnemyType::PAZUZU: + case EnemyType::PAZUZU_ALT: + return 0x08; + case EnemyType::POFUILLY_SLIME: + return 0x13; + case EnemyType::POUILLY_SLIME: + return 0x14; + case EnemyType::POISON_LILY: + return 0x0D; + case EnemyType::PYRO_GORAN: + return 0x10; + case EnemyType::RAG_RAPPY: + return 0x05; + case EnemyType::RECOBOX: + return 0x63; + case EnemyType::RECON: + return 0x64; + case EnemyType::SAINT_RAPPY: + return 0x4F; + case EnemyType::SAINT_MILLION: + return 0x13; + case EnemyType::SAND_RAPPY: + case EnemyType::SAND_RAPPY_ALT: + return 0x17; + case EnemyType::SATELLITE_LIZARD: + case EnemyType::SATELLITE_LIZARD_ALT: + return 0x03; + case EnemyType::SAVAGE_WOLF: + return 0x07; + case EnemyType::SHAMBERTIN: + return 0x14; + case EnemyType::SINOW_BEAT: + return 0x1A; + case EnemyType::SINOW_BERILL: + return 0x3E; + case EnemyType::SINOW_GOLD: + return 0x1B; + case EnemyType::SINOW_SPIGELL: + return 0x3F; + case EnemyType::SINOW_ZELE: + return 0x46; + case EnemyType::SINOW_ZOA: + return 0x45; + case EnemyType::SO_DIMENIAN: + return 0x2B; + case EnemyType::UL_GIBBON: + return 0x3B; + case EnemyType::VOL_OPT_1: + throw runtime_error("VOL_OPT_1 does not have a rare table entry"); + case EnemyType::VOL_OPT_2: + return 0x2E; + case EnemyType::YOWIE: + case EnemyType::YOWIE_ALT: + return 0x02; + case EnemyType::ZE_BOOTA: + return 0x0A; + case EnemyType::ZOL_GIBBON: + return 0x3C; + case EnemyType::ZU: + case EnemyType::ZU_ALT: + return 0x08; + default: + throw logic_error("invalid enemy type"); + } +} diff --git a/src/EnemyType.hh b/src/EnemyType.hh new file mode 100644 index 00000000..4ea5f08d --- /dev/null +++ b/src/EnemyType.hh @@ -0,0 +1,133 @@ +#pragma once + +#include + +#include + +#include "StaticGameData.hh" + +enum class EnemyType { + UNKNOWN = -1, + NONE = 0, + AL_RAPPY, + ASTARK, + BA_BOOTA, + BARBA_RAY, + BARBAROUS_WOLF, + BOOMA, + BOOTA, + BULCLAW, + CANADINE, + CANADINE_GROUP, + CANANE, + CHAOS_BRINGER, + CHAOS_SORCERER, + CLAW, + DARK_BELRA, + DARK_FALZ_1, + DARK_FALZ_2, + DARK_FALZ_3, + DARK_GUNNER, + DARVANT, + DARVANT_ULTIMATE, + DE_ROL_LE, + DEATH_GUNNER, + DEL_LILY, + DEL_RAPPY, + DEL_RAPPY_ALT, + DELBITER, + DELDEPTH, + DELSABER, + DIMENIAN, + DOLMDARL, + DOLMOLM, + DORPHON, + DORPHON_ECLAIR, + DRAGON, + DUBCHIC, + DUBWITCH, // Has no entry in battle params + EGG_RAPPY, + EPSILON, + EVIL_SHARK, + GAEL, + GAL_GRYPHON, + GARANZ, + GEE, + GI_GUE, + GIBBLES, + GIGOBOOMA, + GILLCHIC, + GIRTABLULU, + GOBOOMA, + GOL_DRAGON, + GORAN, + GORAN_DETONATOR, + GRASS_ASSASSIN, + GUIL_SHARK, + HALLO_RAPPY, + HIDOOM, + HILDEBEAR, + HILDEBLUE, + ILL_GILL, + KONDRIEU, + LA_DIMENIAN, + LOVE_RAPPY, + MERICAROL, + MERICUS, + MERIKLE, + MERILLIA, + MERILTAS, + MERISSA_A, + MERISSA_AA, + MIGIUM, + MONEST, + MORFOS, + MOTHMANT, + NANO_DRAGON, + NAR_LILY, + OLGA_FLOW_1, + OLGA_FLOW_2, + PAL_SHARK, + PAN_ARMS, + PAZUZU, + PAZUZU_ALT, + POFUILLY_SLIME, + POUILLY_SLIME, + POISON_LILY, + PYRO_GORAN, + RAG_RAPPY, + RECOBOX, + RECON, + SAINT_MILLION, + SAINT_RAPPY, + SAND_RAPPY, + SAND_RAPPY_ALT, + SATELLITE_LIZARD, + SATELLITE_LIZARD_ALT, + SAVAGE_WOLF, + SHAMBERTIN, + SINOW_BEAT, + SINOW_BERILL, + SINOW_GOLD, + SINOW_SPIGELL, + SINOW_ZELE, + SINOW_ZOA, + SO_DIMENIAN, + UL_GIBBON, + VOL_OPT_1, + VOL_OPT_2, + YOWIE, + YOWIE_ALT, + ZE_BOOTA, + ZOL_GIBBON, + ZU, + ZU_ALT, +}; + +template <> +const char* name_for_enum(EnemyType type); +template <> +EnemyType enum_for_name(const char* name); + +uint8_t battle_param_index_for_enemy_type(Episode episode, EnemyType enemy_type); +uint8_t rare_table_index_for_enemy_type(EnemyType enemy_type);