static constexpr std::array<Room, 83> room_items = {
Room {503, "Berial"},
Room {504, "Bael"},
Room {505, "Echidna"},
Room {506, "Agnus"},
Room {507, "Credo"},
Room {700, "Dante"},
Room {0, "Opera House"},
Room {1, "Opera House Plaza"},
Room {2, "Storehouse"},
Room {3, "Cathedral"},
Room {4, "Terrace / Business District"},
Room {5, "Residential District"},
Room {6, "Port Caerula"},
Room {7, "Customs House"},
Room {8, "First Mining Area"},
Room {9, "Ferrum Hills"},
Room {10, "M17 Opera House"},
Room {11, "M17 Opera House Plaza"},
Room {12, "Business District / Terrace"},
Room {13, "M20 Opera House Plaza"},
Room {100, "Second Mining Area"},
Room {105, "Fortuna Castle Gate"},
Room {200, "Grand Hall - Fortuna Castle"},
Room {201, "Large Hall"},
Room {202, "Dining Room"},
Room {203, "Torture Chamber"},
Room {204, "Central Courtyard"},
Room {205, "Foris Falls - Bridge Area"},
Room {206, "Gallery"},
Room {207, "Library"},
Room {209, "Soldier's Graveyard"},
Room {210, "Master's Chamber"},
Room {211, "Spiral Well"},
Room {212, "Underground Laboratory"},
Room {213, "R&D Access"},
Room {214, "Game Room"},
Room {215, "Containment Room"},
Room {216, "Angel Creation"},
Room {217, "Foris Falls - Detour Area"},
Room {300, "Forest Entrance"},
Room {301, "Windswept Valley"},
Room {302, "Ruined Church"},
Room {303, "Ruined Valley"},
Room {304, "Ancient Training Ground"},
Room {305, "Lapis River"},
Room {306, "Ancient Plaza"},
Room {307, "Den of the She-Viper"},
Room {308, "Forgotten Ruins"},
Room {309, "Hidden Pit"},
Room {310, "Ruined Lowlands"},
Room {311, "Lost Woods"},
Room {400, "Gran Album Bridge"},
Room {401, "Grand Hall - Order of the Sword HQ"},
Room {402, "Key Chamber"},
Room {403, "The Gauntlet"},
Room {404, "Agnus' Room"},
Room {405, "Security Corridor"},
Room {406, "Experiment Disposal"},
Room {407, "Meeting Room"},
Room {408, "Ascension Chamber"},
Room {409, "Advent Chamber"},
Room {500, "Machina Ex Deus"},
Room {501, "Stairway to Heaven"},
Room {502, "Sacred Heart"},
Room {510, "M18"},
Room {512, "Sky Above Fortuna"},
Room {800, "Secret Mission 1"},
Room {801, "Secret Mission 2"},
Room {802, "Secret Mission 3"},
Room {803, "Secret Mission 4"},
Room {804, "Secret Mission 5"},
Room {805, "Secret Mission 6"},
Room {806, "Secret Mission 7"},
Room {807, "Secret Mission 8"},
Room {808, "Secret Mission 9"},
Room {809, "Secret Mission 10"},
Room {810, "Secret Mission 11"},
Room {811, "Secret Mission 12"},
Room {705, "Bloody Palace 1-19"},
Room {704, "Bloody Palace 21-39"},
Room {703, "Bloody Palace 41-59"},
Room {701, "Bloody Palace 61-79"},
Room {702, "Bloody Palace 81-99"}
};
enum class GameDifficulty : uint32_t {
HUMAN = 0,
DEVIL_HUNTER = 1,
SON_OF_SPARDA_HOH_HAH = 2,
DANTE_MUST_DIE = 3,
LEGENDARY_DARK_KNIGHT = 4,
};
enum ENEMY_ID : int {
SCARECROW_LEG = 0,
SCARECROW_ARM = 1,
EM002 = 2,
SCARECROW_MEGA = 3,
EM004 = 4,
ANGELO_BIANCO = 5,
ANGELO_ALTO = 6,
EM007 = 7,
MEPHISTO = 8,
FAUST = 9,
FROST = 10,
ASSAULT = 11,
BLITZ = 12,
CHIMERA = 13,
EM014 = 14,
CUTLASS = 15,
GLADIUS = 16,
BASILISK = 17,
BERIAL = 18,
BAEL = 19,
EM020 = 20,
ECHIDNA = 21,
CREDO = 22,
AGNUS = 23,
EM024 = 24,
SAVIOR = 25,
EM026 = 26,
EM027 = 27,
EM028 = 28,
SANCTUS_M11 = 29,
SANCTUS_M20 = 30,
};
enum class GameMode : uint32_t {
DEFAULT = 0,
HEAVEN_OR_HELL = 1,
HELL_AND_HELL = 2,
};
static const char* dante_attack_names[109] = {
"", // 0x00 / 0
"Rebellion Combo A1", // 0x01 / 1 ATCK_ID_RV_COMBO0
"Rebellion Combo A2", // 0x02 / 2 ATCK_ID_RV_COMBO1
"Rebellion Combo A3", // 0x03 / 3 ATCK_ID_RV_COMBO2
"Rebellion Combo B1", // 0x04 / 4 ATCK_ID_RV_DELAY_COMBO0
"Rebellion Combo B2", // 0x05 / 5 ATCK_ID_RV_DELAY_COMBO1
"Million Stab", // 0x06 / 6 ATCK_ID_RV_HYAKURETSU
"Helm Breaker", // 0x07 / 7 ATCK_ID_RV_KABUTO
"Stinger Level 1", // 0x08 / 8 ATCK_ID_RV_STINGER_LV1
"Stinger Level 2", // 0x09 / 9 ATCK_ID_RV_STINGER_LV2
"Stinger DT", // 0x0A / 10 ATCK_ID_RV_DT_STINGER
"High Time (Ground)", // 0x0B / 11 ATCK_ID_RV_HITIME
"High Time (Air)", // 0x0C / 12 ATCK_ID_RV_HITIMEJUMP
"Round Trip", // 0x0D / 13 ATCK_ID_RV_ROUND_TRIP
"Round Trip (Call Back Ground)", // 0x0E / 14 ATCK_ID_RV_RETURN
"Round Trip (Call Back Air)", // 0x0F / 15 ATCK_ID_RV_RETURN_AIR
"Prop", // 0x10 / 16 ATCK_ID_SRV_ROLLING
"Shredder", // 0x11 / 17 ATCK_ID_SRV_ROLLING_SERIES
"Aerial Rave 1", // 0x12 / 18 ATCK_ID_SRV_AIR_COMBO0
"Aerial Rave 2", // 0x13 / 19 ATCK_ID_SRV_AIR_COMBO1
"Aerial Rave 3", // 0x14 / 20 ATCK_ID_SRV_AIR_COMBO2
"Aerial Rave 4", // 0x15 / 21 ATCK_ID_SRV_AIR_COMBO3
"Dance Macabre", // 0x16 / 22 ATCK_ID_SRV_DANCE
"Drive", // 0x17 / 23 ATCK_ID_SRV_DRIVE
"Overdrive", // 0x18 / 24 ATCK_ID_SRV_DRIVE_SERIES
"Quick Drive", // 0x19 / 25 ATCK_ID_SRV_COMBO0_DRIVE
"Gilgamesh Combo A1", // 0x1A / 26 ATCK_ID_GM_L_STRAIGHT
"Gilgamesh Combo A2", // 0x1B / 27 ATCK_ID_GM_R_BODY
"Gilgamesh Combo A3", // 0x1C / 28 ATCK_ID_GM_HI_KICK
"Gilgamesh Combo A4", // 0x1D / 29 ATCK_ID_GM_HEEL
"Gilgamesh Combo B1", // 0x1E / 30 ATCK_ID_GM_HYAKURETSU
"Gilgamesh Combo B2", // 0x1F / 31 ATCK_ID_GM_WHIRLWIND
"Full House", // 0x20 / 32 ATCK_ID_GM_DESCENT_KICK
"Kick 13 (Regular)", // 0x21 / 33 ATCK_ID_GM_KICK_13R
"Draw", // 0x22 / 34 ATCK_ID_GM_SWAYING_BACK
"Straight", // 0x23 / 35 ATCK_ID_GM_STRAIGHT
"Shock (Ground)", // 0x24 / 36 ATCK_ID_SGM_INFERNO
"Shocking (Air)", // 0x25 / 37 ATCK_ID_SGM_AIR_INFERNO
"Real Impact", // 0x26 / 38 ATCK_ID_SGM_REAL_IMPACT
"Beast Uppercut", // 0x27 / 39 ATCK_ID_SGM_MAGMA_DRIVE
"Rising Dragon", // 0x28 / 40 ATCK_ID_SGM_RISING_DRAGON
"Divine Dragon", // 0x29 / 41 ATCK_ID_SGM_DIVINE_DRAGON
"Lucifer Combo A1", // 0x2A / 42 ATCK_ID_LF_WIDE_RANGE_COMBO0
"Lucifer Combo A2", // 0x2B / 43 ATCK_ID_LF_WIDE_RANGE_COMBO1
"Lucifer Combo A3", // 0x2C / 44 ATCK_ID_LF_WIDE_RANGE_COMBO2
"Lucifer Combo A4", // 0x2D / 45 ATCK_ID_LF_WIDE_RANGE_COMBO3
"Lucifer Combo D1", // 0x2E / 46 ATCK_ID_LF_CROSS_THROW
"Lucifer Combo C1", // 0x2F / 47 ATCK_ID_LF_BOISTEROUS
"Lucifer Combo E1", // 0x30 / 48 ATCK_ID_LF_LAUNCH
"Lucifer Combo B1", // 0x31 / 49 ATCK_ID_LF_ROLLING
"ATCK_ID_LF_ARRANGEMENT_COMBO", // 0x32 / 50 ATCK_ID_LF_ARRANGEMENT_COMBO
"Splash", // 0x33 / 51 ATCK_ID_LF_AIR_ARRANGEMENT
"Pin Up (Regular)", // 0x34 / 52 ATCK_ID_LF_DIO_KNIFE
"Pin Up (DT)", // 0x35 / 53 ATCK_ID_LF_ADD_DIO_KNIFE
"Ecstasy (Ground)", // 0x36 / 54 ATCK_ID_LF_DETONATE_ALL
"Ecstasy (Air)", // 0x37 / 55 ATCK_ID_LF_AIR_DETONATE_ALL
"Climax (Ground)", // 0x38 / 56 ATCK_ID_SLF_BOM_BARRIER
"Climax (Air)", // 0x39 / 57 ATCK_ID_SLF_AIR_BOM_BARRIER
"Discipline", // 0x3A / 58 ATCK_ID_SLF_FUNNEL
"Bondage?", // 0x3B / 59 ATCK_ID_SLF_CONCENTRATED_LAUNCH
"Ebony & Ivory Shoot (Ground)", // 0x3C / 60 ATCK_ID_EI_SHOT
"Ebony & Ivory Charged Shot Lv1 (G)", // 0x3D / 61 ATCK_ID_EI_CSHOT_LV1
"Ebony & Ivory Charged Shot Lv2 (G)", // 0x3E / 62 ATCK_ID_EI_CSHOT_LV2
"Ebony & Ivory Charged Shot Lv3 (G)", // 0x3F / 63 ATCK_ID_EI_CSHOT_LV3
"Ebony & Ivory Shoot (Air)", // 0x40 / 64 ATCK_ID_EI_AIR_SHOT
"Ebony & Ivory Charged Shot Lv1 (A)", // 0x41 / 65 ATCK_ID_EI_AIR_CSHOT_LV1
"Ebony & Ivory Charged Shot Lv2 (A)", // 0x42 / 66 ATCK_ID_EI_AIR_CSHOT_LV2
"Ebony & Ivory Charged Shot Lv3 (A)", // 0x43 / 67 ATCK_ID_EI_AIR_CSHOT_LV3
"Ebony & Ivory Twosome Time", // 0x44 / 68 ATCK_ID_SEI_TWO_SOMETIME
"Ebony & Ivory Honeycomb Fire", // 0x45 / 69 ATCK_ID_SEI_HONEYCOMB
"Ebony & Ivory Rainstorm", // 0x46 / 70 ATCK_ID_SEI_RAIN_STORM
"Coyote Ace Shoot (Ground)", // 0x47 / 71 ATCK_ID_CA_SHOT
"Coyote Ace Charged Shot Lv1 (G)", // 0x48 / 72 ATCK_ID_CA_CSHOT_LV1
"Coyote Ace Charged Shot Lv2 (G)", // 0x49 / 73 ATCK_ID_CA_CSHOT_LV2
"Coyote Ace Charged Shot Lv3 (G)", // 0x4A / 74 ATCK_ID_CA_CSHOT_LV3
"Coyote Ace Shoot (Air)", // 0x4B / 75 ATCK_ID_CA_AIR_SHOT
"Coyote Ace Charged Shot Lv1 (A)", // 0x4C / 76 ATCK_ID_CA_AIR_CSHOT_LV1
"Coyote Ace Charged Shot Lv2 (A)", // 0x4D / 77 ATCK_ID_CA_AIR_CSHOT_LV2
"Coyote Ace Charged Shot Lv3 (A)", // 0x4E / 78 ATCK_ID_CA_AIR_CSHOT_LV3
"Coyote Ace Fireworks (Ground)", // 0x4F / 79 ATCK_ID_SCA_NUNCHAKU
"Coyote Ace Fireworks (Air)", // 0x50 / 80 ATCK_ID_SCA_AIR_NUNCHAKU
"Coyote Ace Backslide", // 0x51 / 81 ATCK_ID_SCA_BACK_SHOT
"Coyote Ace Gun Stinger", // 0x52 / 82 ATCK_ID_SCA_STINGER
"PF013: Epidemic", // 0x53 / 83 ATCK_ID_PD_LAUNCHER
"PF124: Hatred", // 0x54 / 84 ATCK_ID_PD_LAUNCHER2
"PF398: Revenge", // 0x55 / 85 ATCK_ID_PD_LAUNCHER3
"PF262: Jealousy", // 0x56 / 86 ATCK_ID_PD_AIR_MACHINE_GUN
"ATCK_ID_SPD_BATTERY", // 0x57 / 87 ATCK_ID_SPD_BATTERY
"PF594: Argument", // 0x58 / 88 ATCK_ID_SPD_METEOR
"PF422: Grief", // 0x59 / 89 ATCK_ID_SPD_BOOMERANG
"PF666: Omen", // 0x5A / 90 ATCK_ID_SPD_PANDORA_BOX
"Trickster Dash", // 0x5B / 91 ATCK_ID_TS_DASH
"Sky Star", // 0x5C / 92 ATCK_ID_TS_AIR_DASH
"Air Trick", // 0x5D / 93 ATCK_ID_TS_AIRTRICK
"Flipper?", // 0x5E / 94 ATCK_ID_TS_BACK_WARP
"Release (Bronze No Target)", // 0x5F / 95 ATCK_ID_RG_RELEASE
"Release (Silver Missed)", // 0x60 / 96 ATCK_ID_RG_GUARD_RELEASE
"Release (Gold Just)", // 0x61 / 97 ATCK_ID_RG_JUST_RELEASE
"Release Air (Bronze)", // 0x62 / 98 ATCK_ID_RG_AIR_RELEASE
"Release Air (Silver)", // 0x63 / 99 ATCK_ID_RG_AIR_GUARD_RELEASE
"Release Air (Gold)", // 0x64 / 100 ATCK_ID_RG_AIR_JUST_RELEASE
"Dreadnaught", // 0x65 / 101 ATCK_ID_RG_INVINCIBLE
"Yamato Combo A1", // 0x66 / 102 ATCK_ID_YT_COMBO0
"Yamato Combo A2", // 0x67 / 103 ATCK_ID_YT_COMBO1
"Yamato Combo A3", // 0x68 / 104 ATCK_ID_YT_COMBO2
"Aerial Rave V1", // 0x69 / 105 ATCK_ID_YT_AIR_COMBO0
"Aerial Rave V2", // 0x6A / 106 ATCK_ID_YT_AIR_COMBO1
"Slash Dimension (Far)", // 0x6B / 107 ATCK_ID_YT_SPACE
"Slash Dimension (Close)", // 0x6C / 108 ATCK_ID_YT_SPACE2
};
static const std::vector<std::pair<uint16_t, const char*>> buttonPairs = {
{0x0000, "None"},
{0x0001, "Back"},
{0x0002, "L3"},
{0x0004, "R3"},
{0x0008, "Start"},
{0x0010, "Dpad Up"},
{0x0020, "Dpad Right"},
{0x0040, "Dpad Down"},
{0x0080, "Dpad Left"},
{0x0100, "L1"},
{0x0200, "R1"},
{0x0400, "L2"},
{0x0800, "R2"},
{0x1000, "Y"},
{0x2000, "B"},
{0x4000, "A"},
{0x8000, "X"}
};