diff --git a/Source/Contents/JobCodeForItem.cpp b/Source/Contents/JobCodeForItem.cpp index b88d166c..10038df9 100644 --- a/Source/Contents/JobCodeForItem.cpp +++ b/Source/Contents/JobCodeForItem.cpp @@ -140,3 +140,309 @@ CJobCodeForItem* Singleton::GetInstance() { return s_instance; } + +// OFFSET: 0x006CB0A0 +// FUNCTION: fn_06464 +void CJobCodeForItem::InitJobGroups() { + this->AddJobGroup(19, JT_SWORDMAN_B, JT_MAGICIAN_B, JT_ARCHER_B, JT_ACOLYTE_B, JT_MERCHANT_B, JT_THIEF_B); + this->AddJobGroup(20, JT_KNIGHT_B, JT_PRIEST_B, JT_WIZARD_B, JT_BLACKSMITH_B, JT_HUNTER_B, JT_ASSASSIN_B, JT_CRUSADER_B, JT_MONK_B, JT_SAGE_B, JT_ROGUE_B, + JT_ALCHEMIST_B, JT_BARD_B, JT_DANCER_B); + this->AddJobGroup(21, JT_RUNE_KNIGHT_B, JT_ROYAL_GUARD_B, JT_MECHANIC_B, JT_GENETIC_B, JT_WARLOCK_B, JT_SORCERER_B, JT_RANGER_B, JT_MINSTREL_B, JT_WANDERER_B, + JT_ARCHBISHOP_B, JT_SURA_B, JT_GUILLOTINE_CROSS_B, JT_SHADOW_CHASER_B); + this->AddJobGroup(15, JT_SWORDMAN_H, JT_MERCHANT_H, JT_MAGICIAN_H, JT_ARCHER_H, JT_ACOLYTE_H, JT_THIEF_H); + this->AddJobGroup(13, JT_KNIGHT, JT_CRUSADER, JT_BLACKSMITH, JT_ALCHEMIST, JT_WIZARD, JT_SAGE, JT_HUNTER, JT_BARD, JT_DANCER, JT_PRIEST, JT_MONK, JT_ASSASSIN, + JT_ROGUE); + this->AddJobGroup(16, JT_KNIGHT_H, JT_CRUSADER_H, JT_BLACKSMITH_H, JT_ALCHEMIST_H, JT_WIZARD_H, JT_SAGE_H, JT_HUNTER_H, JT_BARD_H, JT_DANCER_H, JT_PRIEST_H, + JT_MONK_H, JT_ASSASSIN_H, JT_ROGUE_H); + this->AddJobGroup(14, JT_RUNE_KNIGHT, JT_ROYAL_GUARD, JT_MECHANIC, JT_GENETIC, JT_WARLOCK, JT_SORCERER, JT_RANGER, JT_MINSTREL, JT_WANDERER, JT_ARCHBISHOP, + JT_SURA, JT_GUILLOTINE_CROSS, JT_SHADOW_CHASER); + this->AddJobGroup(17, JT_RUNE_KNIGHT_H, JT_ROYAL_GUARD_H, JT_MECHANIC_H, JT_GENETIC_H, JT_WARLOCK_H, JT_SORCERER_H, JT_RANGER_H, JT_MINSTREL_H, JT_WANDERER_H, + JT_ARCHBISHOP_H, JT_SURA_H, JT_GUILLOTINE_CROSS_H, JT_SHADOW_CHASER_H); + this->AddJobGroup(18, JT_DRAGON_KNIGHT, JT_MEISTER, JT_SHADOW_CROSS, JT_ARCH_MAGE, JT_CARDINAL, JT_WINDHAWK, JT_IMPERIAL_GUARD, JT_BIOLO, JT_ABYSS_CHASER, + JT_ELEMENTAL_MASTER, JT_INQUISITOR, JT_TROUBADOUR, JT_TROUVERE); + this->AddJobGroup(0, JT_NOVICE, JT_SUPERNOVICE, JT_NOVICE_H, JT_NOVICE_B, JT_SUPERNOVICE_B, JT_SUPERNOVICE2, JT_SUPERNOVICE2_B, JT_HYPER_NOVICE); + this->AddJobGroup(1, JT_SWORDMAN, JT_KNIGHT, JT_CRUSADER, JT_SWORDMAN_H, JT_KNIGHT_H, JT_CRUSADER_H, JT_SWORDMAN_B, JT_KNIGHT_B, JT_CRUSADER_B, + JT_RUNE_KNIGHT, JT_RUNE_KNIGHT_H, JT_ROYAL_GUARD, JT_ROYAL_GUARD_H, JT_RUNE_KNIGHT_B, JT_ROYAL_GUARD_B, JT_DRAGON_KNIGHT, + JT_IMPERIAL_GUARD); + this->AddJobGroup(2, JT_MERCHANT, JT_BLACKSMITH, JT_ALCHEMIST, JT_MERCHANT_H, JT_BLACKSMITH_H, JT_ALCHEMIST_H, JT_MERCHANT_B, JT_BLACKSMITH_B, JT_ALCHEMIST_B, + JT_MECHANIC, JT_MECHANIC_H, JT_MECHANIC_B, JT_GENETIC, JT_GENETIC_H, JT_GENETIC_B, JT_MEISTER, JT_BIOLO); + this->AddJobGroup(3, JT_MAGICIAN, JT_WIZARD, JT_SAGE, JT_MAGICIAN_H, JT_WIZARD_H, JT_SAGE_H, JT_MAGICIAN_B, JT_WIZARD_B, JT_SAGE_B, JT_WARLOCK, JT_WARLOCK_H, + JT_WARLOCK_B, JT_SORCERER, JT_SORCERER_H, JT_SORCERER_B, JT_ARCH_MAGE, JT_ELEMENTAL_MASTER); + this->AddJobGroup(4, JT_ARCHER, JT_HUNTER, JT_BARD, JT_DANCER, JT_ARCHER_H, JT_HUNTER_H, JT_BARD_H, JT_DANCER_H, JT_ARCHER_B, JT_HUNTER_B, JT_BARD_B, + JT_DANCER_B, JT_RANGER, JT_RANGER_H, JT_RANGER_B, JT_MINSTREL, JT_WANDERER, JT_MINSTREL_H, JT_MINSTREL_B, JT_WANDERER_H, JT_WANDERER_B, + JT_WINDHAWK, JT_TROUBADOUR, JT_TROUVERE); + this->AddJobGroup(5, JT_ACOLYTE, JT_PRIEST, JT_MONK, JT_ACOLYTE_H, JT_PRIEST_H, JT_MONK_H, JT_ACOLYTE_B, JT_PRIEST_B, JT_MONK_B, JT_ARCHBISHOP, + JT_ARCHBISHOP_H, JT_SURA, JT_SURA_H, JT_ARCHBISHOP_B, JT_SURA_B, JT_CARDINAL, JT_INQUISITOR); + this->AddJobGroup(6, JT_THIEF, JT_ASSASSIN, JT_ROGUE, JT_THIEF_H, JT_ASSASSIN_H, JT_ROGUE_H, JT_THIEF_B, JT_ASSASSIN_B, JT_ROGUE_B, JT_GUILLOTINE_CROSS, + JT_GUILLOTINE_CROSS_H, JT_SHADOW_CHASER, JT_SHADOW_CHASER_H, JT_GUILLOTINE_CROSS_B, JT_SHADOW_CHASER_B, JT_SHADOW_CROSS, JT_ABYSS_CHASER); + this->AddJobGroup(7, JT_TAEKWON, JT_STAR, JT_TAEKWON_B, JT_STAR_B, JT_STAR_EMPEROR, JT_STAR_EMPEROR_B, JT_SKY_EMPEROR); + this->AddJobGroup(8, JT_TAEKWON, JT_STAR, JT_LINKER, JT_TAEKWON_B, JT_STAR_B, JT_LINKER_B, JT_STAR_EMPEROR, JT_STAR_EMPEROR_B, JT_SOUL_REAPER, + JT_SOUL_REAPER_B, JT_SKY_EMPEROR, JT_SOUL_ASCETIC); + this->AddJobGroup(9, JT_STAR, JT_STAR_B, JT_STAR_EMPEROR, JT_STAR_EMPEROR_B, JT_SKY_EMPEROR); + this->AddJobGroup(10, JT_STAR_EMPEROR, JT_STAR_EMPEROR_B, JT_SKY_EMPEROR); + this->AddJobGroup(11, JT_LINKER, JT_LINKER_B, JT_SOUL_REAPER, JT_SOUL_REAPER_B, JT_SOUL_ASCETIC); + this->AddJobGroup(12, JT_SOUL_REAPER, JT_SOUL_REAPER_B, JT_SOUL_ASCETIC); + this->AddJobGroup(61, JT_NINJA, JT_KAGEROU, JT_OBORO, JT_NINJA_B, JT_KAGEROU_B, JT_OBORO_B, JT_SHINKIRO, JT_SHIRANUI); + this->AddJobGroup(62, JT_KAGEROU, JT_OBORO, JT_KAGEROU_B, JT_OBORO_B, JT_SHINKIRO, JT_SHIRANUI); + this->AddJobGroup(63, JT_GUNSLINGER, JT_REBELLION, JT_GUNSLINGER_B, JT_REBELLION_B, JT_NIGHT_WATCH); + this->AddJobGroup(64, JT_REBELLION, JT_REBELLION_B, JT_NIGHT_WATCH); + this->AddJobGroup(65, JT_DO_SUMMONER, JT_DO_SUMMONER_B, JT_SPIRIT_HANDLER); + this->AddJobGroup(66, JT_DRUID, JT_KARNOS, JT_ALITEA, JT_DRUID_B, JT_KARNOS_B); + this->AddJobGroup(22, JT_KNIGHT, JT_KNIGHT_H, JT_KNIGHT_B, JT_RUNE_KNIGHT, JT_RUNE_KNIGHT_H, JT_RUNE_KNIGHT_B, JT_DRAGON_KNIGHT); + this->AddJobGroup(23, JT_CRUSADER, JT_CRUSADER_H, JT_CRUSADER_B, JT_ROYAL_GUARD, JT_ROYAL_GUARD_H, JT_ROYAL_GUARD_B, JT_IMPERIAL_GUARD); + this->AddJobGroup(24, JT_BLACKSMITH, JT_BLACKSMITH_H, JT_BLACKSMITH_B, JT_MECHANIC, JT_MECHANIC_H, JT_MECHANIC_B, JT_MEISTER); + this->AddJobGroup(25, JT_ALCHEMIST, JT_ALCHEMIST_H, JT_ALCHEMIST_B, JT_GENETIC, JT_GENETIC_H, JT_GENETIC_B, JT_BIOLO); + this->AddJobGroup(26, JT_ASSASSIN, JT_ASSASSIN_H, JT_ASSASSIN_B, JT_GUILLOTINE_CROSS, JT_GUILLOTINE_CROSS_H, JT_GUILLOTINE_CROSS_B, JT_SHADOW_CROSS); + this->AddJobGroup(27, JT_ROGUE, JT_ROGUE_H, JT_ROGUE_B, JT_SHADOW_CHASER, JT_SHADOW_CHASER_H, JT_SHADOW_CHASER_B, JT_ABYSS_CHASER); + this->AddJobGroup(28, JT_WIZARD, JT_WIZARD_H, JT_WIZARD_B, JT_WARLOCK, JT_WARLOCK_H, JT_WARLOCK_B, JT_ARCH_MAGE); + this->AddJobGroup(29, JT_SAGE, JT_SAGE_H, JT_SAGE_B, JT_SORCERER, JT_SORCERER_H, JT_SORCERER_B, JT_ELEMENTAL_MASTER); + this->AddJobGroup(30, JT_PRIEST, JT_PRIEST_H, JT_PRIEST_B, JT_ARCHBISHOP, JT_ARCHBISHOP_H, JT_ARCHBISHOP_B, JT_CARDINAL); + this->AddJobGroup(31, JT_MONK, JT_MONK_H, JT_MONK_B, JT_SURA, JT_SURA_H, JT_SURA_B, JT_INQUISITOR); + this->AddJobGroup(32, JT_HUNTER, JT_HUNTER_H, JT_HUNTER_B, JT_RANGER, JT_RANGER_H, JT_RANGER_B, JT_WINDHAWK); + this->AddJobGroup(33, JT_BARD, JT_BARD_H, JT_BARD_B, JT_MINSTREL, JT_MINSTREL_H, JT_MINSTREL_B, JT_TROUBADOUR); + this->AddJobGroup(34, JT_DANCER, JT_DANCER_H, JT_DANCER_B, JT_WANDERER, JT_WANDERER_H, JT_WANDERER_B, JT_TROUVERE); + this->AddJobGroup(35, JT_KNIGHT_H, JT_RUNE_KNIGHT, JT_RUNE_KNIGHT_H, JT_RUNE_KNIGHT_B, JT_DRAGON_KNIGHT); + this->AddJobGroup(36, JT_CRUSADER_H, JT_ROYAL_GUARD, JT_ROYAL_GUARD_H, JT_ROYAL_GUARD_B, JT_IMPERIAL_GUARD); + this->AddJobGroup(37, JT_BLACKSMITH_H, JT_MECHANIC, JT_MECHANIC_H, JT_MECHANIC_B, JT_MEISTER); + this->AddJobGroup(38, JT_ALCHEMIST_H, JT_GENETIC, JT_GENETIC_H, JT_GENETIC_B, JT_BIOLO); + this->AddJobGroup(39, JT_ASSASSIN_H, JT_GUILLOTINE_CROSS, JT_GUILLOTINE_CROSS_H, JT_GUILLOTINE_CROSS_B, JT_SHADOW_CROSS); + this->AddJobGroup(40, JT_ROGUE_H, JT_SHADOW_CHASER, JT_SHADOW_CHASER_H, JT_SHADOW_CHASER_B, JT_ABYSS_CHASER); + this->AddJobGroup(41, JT_WIZARD_H, JT_WARLOCK, JT_WARLOCK_H, JT_WARLOCK_B, JT_ARCH_MAGE); + this->AddJobGroup(42, JT_SAGE_H, JT_SORCERER, JT_SORCERER_H, JT_SORCERER_B, JT_ELEMENTAL_MASTER); + this->AddJobGroup(43, JT_PRIEST_H, JT_ARCHBISHOP, JT_ARCHBISHOP_H, JT_ARCHBISHOP_B, JT_CARDINAL); + this->AddJobGroup(44, JT_MONK_H, JT_SURA, JT_SURA_H, JT_SURA_B, JT_INQUISITOR); + this->AddJobGroup(45, JT_HUNTER_H, JT_RANGER, JT_RANGER_H, JT_RANGER_B, JT_WINDHAWK); + this->AddJobGroup(46, JT_BARD_H, JT_MINSTREL, JT_MINSTREL_H, JT_MINSTREL_B, JT_TROUBADOUR, JT_TROUVERE); + this->AddJobGroup(47, JT_DANCER_H, JT_WANDERER, JT_WANDERER_H, JT_WANDERER_B, JT_TROUBADOUR, JT_TROUVERE); + this->AddJobGroup(48, JT_RUNE_KNIGHT, JT_RUNE_KNIGHT_H, JT_RUNE_KNIGHT_B, JT_DRAGON_KNIGHT); + this->AddJobGroup(49, JT_ROYAL_GUARD, JT_ROYAL_GUARD_H, JT_ROYAL_GUARD_B, JT_IMPERIAL_GUARD); + this->AddJobGroup(50, JT_MECHANIC, JT_MECHANIC_H, JT_MECHANIC_B, JT_MEISTER); + this->AddJobGroup(51, JT_GENETIC, JT_GENETIC_H, JT_GENETIC_B, JT_BIOLO); + this->AddJobGroup(52, JT_GUILLOTINE_CROSS, JT_GUILLOTINE_CROSS_H, JT_GUILLOTINE_CROSS_B, JT_SHADOW_CROSS); + this->AddJobGroup(53, JT_SHADOW_CHASER, JT_SHADOW_CHASER_H, JT_SHADOW_CHASER_B, JT_ABYSS_CHASER); + this->AddJobGroup(54, JT_WARLOCK, JT_WARLOCK_H, JT_WARLOCK_B, JT_ARCH_MAGE); + this->AddJobGroup(55, JT_SORCERER, JT_SORCERER_H, JT_SORCERER_B, JT_ELEMENTAL_MASTER); + this->AddJobGroup(56, JT_ARCHBISHOP, JT_ARCHBISHOP_H, JT_ARCHBISHOP_B, JT_CARDINAL); + this->AddJobGroup(57, JT_SURA, JT_SURA_H, JT_SURA_B, JT_INQUISITOR); + this->AddJobGroup(58, JT_RANGER, JT_RANGER_H, JT_RANGER_B, JT_WINDHAWK); + this->AddJobGroup(59, JT_MINSTREL, JT_MINSTREL_H, JT_MINSTREL_B, JT_TROUBADOUR); + this->AddJobGroup(60, JT_WANDERER, JT_WANDERER_H, JT_WANDERER_B, JT_TROUVERE); + this->AddJobGroup(67, JT_KARNOS, JT_ALITEA, JT_KARNOS_B); +} + +// OFFSET: 0x006CBD30 +// FUNCTION: fn_06465 +void CJobCodeForItem::InitJobCodes() { + this->AddJobCodeFromGroups(0x1, 0); + this->AddJobCodeFromGroups(0x40, 27); + this->AddJobCode(0x40, JT_THIEF, JT_THIEF_H, JT_THIEF_B); + this->AddJobCodeFromGroups(0x200, 32); + this->AddJobCodeFromGroups(0x1000, 26); + this->AddJobCodeFromGroups(0x2000, 23); + this->AddJobCodeFromGroups(0x2080, 22, 23); + this->AddJobCodeFromGroups(0x2082, 1); + this->AddJobCodeFromGroups(0x4100, 28, 29, 11); + this->AddJobCodeFromGroups(0x4104, 3, 11); + this->AddJobCodeFromGroups(0x4400, 30, 29, 9); + this->AddJobCodeFromGroups(0x8000, 33); + this->AddJobCodeFromGroups(0x10000, 34); + this->AddJobCodeFromGroups(0x18200, 32, 33, 34); + this->AddJobCodeFromGroups(0x18208, 4); + this->AddJobCodeFromGroups(0x20400, 30, 31); + this->AddJobCodeFromGroups(0x20410, 5); + this->AddJobCodeFromGroups(0x24514, 3, 5, 11); + this->AddJobCodeFromGroups(0x24515, 0, 3, 5, 11); + this->AddJobCodeFromGroups(0x40000, 25); + this->AddJobCodeFromGroups(0x40800, 24, 25); + this->AddJobCodeFromGroups(0x40820, 2); + this->AddJobCodeFromGroups(0x428A2, 1, 2, 66); + this->AddJobCodeFromGroups(0x60C30, 5, 2); + this->AddJobCodeFromGroups(0x66DB6, 1, 3, 5, 2, 11); + this->AddJobCodeFromGroups(0x80240, 32, 27); + this->AddJobCode(0x80240, JT_THIEF, JT_THIEF_H, JT_THIEF_B); + this->AddJobCodeFromGroups(0x81040, 6, 61); + this->AddJobCodeFromGroups(0x98208, 4, 27); + this->AddJobCodeFromGroups(0x98248, 4, 27); + this->AddJobCode(0x98248, JT_THIEF, JT_THIEF_H, JT_THIEF_B); + this->AddJobCodeFromGroups(0xC38E2, 1, 2, 6); + this->AddJobCodeFromGroups(0xC38E3, 0, 1, 2, 6); + this->AddJobCodeFromGroups(0xDBAEA, 1, 4, 2, 6); + this->AddJobCodeFromGroups(0xDFBEE, 1, 3, 4, 2, 6, 11, 61); + this->AddJobCodeFromGroups(0xDFBEF, 0, 1, 3, 4, 2, 6, 11, 61, 66); + this->AddJobCodeFromGroups(0xE3CF2, 1, 5, 2, 6); + this->AddJobCodeFromGroups(0xFBCF2, 1, 5, 2, 6, 33, 34); + this->AddJobCodeFromGroups(0xFFF80, 13, 16, 14, 17, 20, 21, 18, 9, 11); + this->AddJobCodeFromGroups(0x438A3, 0, 1, 2, 26, 66); + this->AddJobCodeFromGroups(0x62CB2, 1, 5, 2, 66); + this->AddJobCodeFromGroups(0x62CB3, 1, 5, 2, 0, 66); + this->AddJobCodeFromGroups(0x42, 1, 9); + this->AddJobCodeFromGroups(0x43, 1, 2, 6, 7); + this->AddJobCodeFromGroups(0x44, 1, 2, 6, 4, 7, 63); + this->AddJobCodeFromGroups(0x45, 1, 5, 2, 6, 7); + this->AddJobCodeFromGroups(0x46, 1, 2, 7); + this->AddJobCodeFromGroups(0x47, 30, 26); + this->AddJobCodeFromGroups(0x48, 16, 14, 17, 21, 18); + this->AddJobCodeFromGroups(0x49, 63); + this->AddJobCodeFromGroups(0x4A, 61); + this->AddJobCodeFromGroups(0x4B, 15, 16, 14, 17, 21, 18); + this->AddJobCodeFromGroups(0x50, 35, 36); + this->AddJobCode(0x50, JT_SWORDMAN_H); + this->AddJobCodeFromGroups(0x51, 37, 38); + this->AddJobCode(0x51, JT_MERCHANT_H); + this->AddJobCodeFromGroups(0x52, 39, 40); + this->AddJobCode(0x52, JT_THIEF_H); + this->AddJobCodeFromGroups(0x53, 41, 42); + this->AddJobCode(0x53, JT_MAGICIAN_H); + this->AddJobCodeFromGroups(0x54, 43, 44); + this->AddJobCode(0x54, JT_ACOLYTE_H); + this->AddJobCodeFromGroups(0x55, 45, 46, 47); + this->AddJobCode(0x55, JT_ARCHER_H); + this->AddJobCodeFromGroups(0x56, 41, 42, 43, 44); + this->AddJobCode(0x56, JT_MAGICIAN_H, JT_ACOLYTE_H); + this->AddJobCodeFromGroups(0x57, 35, 36, 37, 38, 39, 40); + this->AddJobCode(0x57, JT_SWORDMAN_H, JT_MERCHANT_H, JT_THIEF_H); + this->AddJobCodeFromGroups(0x58, 41, 42, 43, 44, 45, 46, 47); + this->AddJobCode(0x58, JT_MAGICIAN_H, JT_ACOLYTE_H, JT_ARCHER_H); + this->AddJobCodeFromGroups(0x59, 35, 36, 37, 38); + this->AddJobCode(0x59, JT_SWORDMAN_H, JT_MERCHANT_H); + this->AddJobCodeFromGroups(0x5A, 35, 36, 37, 38, 43, 44); + this->AddJobCode(0x5A, JT_SWORDMAN_H, JT_MERCHANT_H, JT_ACOLYTE_H); + this->AddJobCodeFromGroups(0x5B, 35, 36, 37, 38, 39, 40, 45, 46, 47, 41, 42); + this->AddJobCode(0x5B, JT_SWORDMAN_H, JT_MERCHANT_H, JT_THIEF_H, JT_ARCHER_H, JT_MAGICIAN_H); + this->AddJobCodeFromGroups(0x5C, 40, 45, 46, 47); + this->AddJobCode(0x5C, JT_ARCHER_H); + this->AddJobCodeFromGroups(0x5D, 43, 42); + this->AddJobCodeFromGroups(0x5E, 43, 44); + this->AddJobCodeFromGroups(0x5F, 35); + this->AddJobCodeFromGroups(0x60, 36); + this->AddJobCodeFromGroups(0x61, 37); + this->AddJobCodeFromGroups(0x62, 38); + this->AddJobCodeFromGroups(0x63, 41); + this->AddJobCodeFromGroups(0x64, 42); + this->AddJobCodeFromGroups(0x65, 45); + this->AddJobCodeFromGroups(0x66, 39); + this->AddJobCodeFromGroups(0x67, 46); + this->AddJobCodeFromGroups(0x68, 47); + this->AddJobCodeFromGroups(0x69, 43); + this->AddJobCodeFromGroups(0x6A, 44); + this->AddJobCodeFromGroups(0x6B, 40); + this->AddJobCodeFromGroups(0x6C, 3, 5, 4, 11); + this->AddJobCodeFromGroups(0x6D, 1, 2, 6, 7, 61); + this->AddJobCodeFromGroups(0x6E, 14, 17, 21, 18); + this->AddJobCodeFromGroups(0x6F, 48); + this->AddJobCodeFromGroups(0x70, 49); + this->AddJobCodeFromGroups(0x71, 56, 55); + this->AddJobCodeFromGroups(0x72, 52); + this->AddJobCodeFromGroups(0x73, 50); + this->AddJobCodeFromGroups(0x74, 58); + this->AddJobCodeFromGroups(0x75, 51); + this->AddJobCodeFromGroups(0x76, 54); + this->AddJobCodeFromGroups(0x77, 55); + this->AddJobCodeFromGroups(0x78, 59); + this->AddJobCodeFromGroups(0x79, 60); + this->AddJobCodeFromGroups(0x7A, 56); + this->AddJobCodeFromGroups(0x7B, 57); + this->AddJobCodeFromGroups(0x7C, 53); + this->AddJobCodeFromGroups(0x7D, 48, 49); + this->AddJobCodeFromGroups(0x7E, 54, 55, 56, 57); + this->AddJobCodeFromGroups(0x7F, 48, 49, 50, 51, 56, 57); + this->AddJobCodeFromGroups(0x80, 58, 59, 60); + this->AddJobCodeFromGroups(0x81, 55, 51); + this->AddJobCodeFromGroups(0x82, 9); + this->AddJobCodeFromGroups(0x83, 61, 63); + this->AddJobCodeFromGroups(0x84, 54, 56); + this->AddJobCodeFromGroups(0x85, 1, 2, 6, 4, 7, 61, 63); + this->AddJobCodeFromGroups(0x86, 13, 16, 14, 17, 20, 21, 18, 9, 11, 62, 64); + this->AddJobCodeFromGroups(0x87, 59, 60); + this->AddJobCodeFromGroups(0x88, 54, 55); + this->AddJobCodeFromGroups(0x89, 50, 51); + this->AddJobCodeFromGroups(0x8A, 56, 57); + this->AddJobCodeFromGroups(0x8B, 52, 53); + this->AddJobCodeFromGroups(0x8C, 45, 46, 47, 39, 40); + this->AddJobCode(0x8C, JT_ARCHER_H, JT_THIEF_H); + this->AddJobCodeFromGroups(0x8D, 11); + this->AddJobCodeFromGroups(0x8E, 65); + this->AddJobCodeFromGroups(0x8F, 8); + this->AddJobCodeFromGroups(0x90, 64, 62, 10, 12, 67); + this->AddJobCodeFromGroups(0x91, 10); + this->AddJobCodeFromGroups(0x92, 12); + this->AddJobCodeFromGroups(0x93, 58, 53); + this->AddJobCodeFromGroups(0x94, 4, 6, 61, 63); + this->AddJobCodeFromGroups(0x95, 0, 1, 2, 3, 4, 5, 6, 8, 61, 63, 66); + this->AddJobCodeFromGroups(0x96, 22); + this->AddJobCodeFromGroups(0x97, 24); + this->AddJobCodeFromGroups(0x98, 28); + this->AddJobCodeFromGroups(0x99, 29); + this->AddJobCodeFromGroups(0x9A, 30); + this->AddJobCodeFromGroups(0x9B, 31); + this->AddJobCodeFromGroups(0x9C, 27); + this->AddJobCode(0x9D, JT_DRAGON_KNIGHT); + this->AddJobCode(0x9E, JT_MEISTER); + this->AddJobCode(0x9F, JT_SHADOW_CROSS); + this->AddJobCode(0xA0, JT_ARCH_MAGE); + this->AddJobCode(0xA1, JT_CARDINAL); + this->AddJobCode(0xA2, JT_WINDHAWK); + this->AddJobCode(0xA3, JT_IMPERIAL_GUARD); + this->AddJobCode(0xA4, JT_BIOLO); + this->AddJobCode(0xA5, JT_ABYSS_CHASER); + this->AddJobCode(0xA6, JT_ELEMENTAL_MASTER); + this->AddJobCode(0xA7, JT_INQUISITOR); + this->AddJobCode(0xA8, JT_TROUBADOUR, JT_TROUVERE); + this->AddJobCodeFromGroups(0xA9, 18); + this->AddJobCode(0xAA, JT_TROUBADOUR); + this->AddJobCode(0xAB, JT_TROUVERE); + this->AddJobCodeFromGroups(0xAC, 3); + this->AddJobCode(0xAD, JT_SKY_EMPEROR); + this->AddJobCode(0xAE, JT_SOUL_ASCETIC); + this->AddJobCode(0xAF, JT_SHINKIRO, JT_SHIRANUI); + this->AddJobCode(0xB0, JT_NIGHT_WATCH); + this->AddJobCode(0xB1, JT_HYPER_NOVICE); + this->AddJobCode(0xB2, JT_SPIRIT_HANDLER); + this->AddJobCode(0xB3, JT_SKY_EMPEROR, JT_SOUL_ASCETIC, JT_SHINKIRO, JT_SHIRANUI, JT_NIGHT_WATCH, JT_HYPER_NOVICE, JT_SPIRIT_HANDLER, JT_ALITEA); + this->AddJobCodeFromGroups(0xB4, 18); + this->AddJobCode(0xB4, JT_SKY_EMPEROR, JT_SOUL_ASCETIC, JT_SHINKIRO, JT_SHIRANUI, JT_NIGHT_WATCH, JT_HYPER_NOVICE, JT_SPIRIT_HANDLER, JT_ALITEA); + this->AddJobCode(0xB5, JT_DRAGON_KNIGHT, JT_IMPERIAL_GUARD); + this->AddJobCode(0xB6, JT_HYPER_NOVICE, JT_ARCH_MAGE, JT_ELEMENTAL_MASTER, JT_CARDINAL, JT_INQUISITOR, JT_SOUL_ASCETIC); + this->AddJobCode(0xB7, JT_WINDHAWK, JT_TROUBADOUR, JT_TROUVERE, JT_ABYSS_CHASER); + this->AddJobCode(0xB8, JT_ARCH_MAGE, JT_ELEMENTAL_MASTER, JT_CARDINAL, JT_INQUISITOR, JT_SOUL_ASCETIC); + this->AddJobCode(0xB9, JT_CARDINAL, JT_ELEMENTAL_MASTER, JT_SKY_EMPEROR); + this->AddJobCode(0xBA, JT_DRAGON_KNIGHT, JT_IMPERIAL_GUARD, JT_MEISTER, JT_BIOLO); + this->AddJobCode(0xBB, JT_CARDINAL, JT_INQUISITOR); + this->AddJobCode(0xBC, JT_HYPER_NOVICE, JT_DRAGON_KNIGHT, JT_IMPERIAL_GUARD, JT_ARCH_MAGE, JT_ELEMENTAL_MASTER, JT_WINDHAWK, JT_TROUBADOUR, JT_TROUVERE, + JT_SHADOW_CROSS, JT_ABYSS_CHASER, JT_MEISTER, JT_BIOLO, JT_SOUL_ASCETIC, JT_SHINKIRO, JT_SHIRANUI, JT_HYPER_NOVICE, JT_ALITEA); + this->AddJobCode(0xBD, JT_HYPER_NOVICE, JT_DRAGON_KNIGHT, JT_IMPERIAL_GUARD, JT_CARDINAL, JT_INQUISITOR, JT_MEISTER, JT_BIOLO); + this->AddJobCodeFromGroups(0xBE, 18); + this->AddJobCode(0xBE, JT_SKY_EMPEROR, JT_SOUL_ASCETIC, JT_SHINKIRO, JT_SHIRANUI, JT_NIGHT_WATCH, JT_HYPER_NOVICE, JT_ALITEA); + this->AddJobCodeFromGroups(0xBF, 66); + this->AddJobCode(0xC0, JT_ALITEA); + this->AddJobCodeFromGroups(0xC1, 67); + this->AddJobCodeFromGroups(0xC2, 1, 2); +} + +// OFFSET: 0x006CCB30 +// FUNCTION: fn_06466 +void CJobCodeForItem::Init() { + this->InitJobGroups(); + this->InitJobCodes(); +} + +// OFFSET: 0x006CCBE0 +// FUNCTION: fn_06467 +bool CJobCodeForItem::IsJobAllowed(int job, unsigned long code) { + if (code == 0xFFFFE) { + auto group = this->m_jobGroups.find(0); + if (group == this->m_jobGroups.end()) { + return false; + } + return group->second.find(job) == group->second.end(); + } + if (code == 0xFFFFF) { + return true; + } + + auto it = this->m_jobCodes.find(code); + if (it == this->m_jobCodes.end()) { + return false; + } + return it->second.find(job) != it->second.end(); +} diff --git a/Source/Contents/JobCodeForItem.h b/Source/Contents/JobCodeForItem.h index 70b6f08a..981abd72 100644 --- a/Source/Contents/JobCodeForItem.h +++ b/Source/Contents/JobCodeForItem.h @@ -17,6 +17,11 @@ public: void AddJobCode(unsigned long code, Jobs... jobs); template void AddJobGroup(unsigned int group, Jobs... jobs); + + void InitJobGroups(); + void InitJobCodes(); + void Init(); + bool IsJobAllowed(int job, unsigned long code); }; #if defined(_WIN32) && !defined(_WIN64)