From 0bc20896dbaca8016eb613e992de897eef17b73d Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Wed, 28 Oct 2026 20:24:26 +0000 Subject: [PATCH] Decompile 4 functions in Source/Contents/SpriteFrameSynchronization.cpp, Source/Contents/NpcLocationRadius.cpp, ... Batch #1694 by eAthena: 0 byte-identical, 4 confirmed by peer review. - fn_23819 CSession::GetSyncedFrame: logic confirmed by peer review - fn_23467 CSession::GetNpcLocationRadius: logic confirmed by peer review - fn_23823 CSession::GetRidingJob: logic confirmed by peer review - fn_24152 CSession::GetSpriteJob: logic confirmed by peer review Reviewed-by: ragnarok-clanker Adds to the build: Source/Contents/SpriteFrameSynchronization.cpp, Source/Contents/NpcLocationRadius.cpp, Source/Contents/SpriteJob.cpp --- Source/Client/Session.h | 10 +- Source/Contents/NpcLocationRadius.cpp | 438 ++++++++++++++++++ .../Contents/SpriteFrameSynchronization.cpp | 29 ++ Source/Contents/SpriteJob.cpp | 178 +++++++ data/compile.json | 3 + 5 files changed, 657 insertions(+), 1 deletion(-) create mode 100644 Source/Contents/NpcLocationRadius.cpp create mode 100644 Source/Contents/SpriteFrameSynchronization.cpp create mode 100644 Source/Contents/SpriteJob.cpp diff --git a/Source/Client/Session.h b/Source/Client/Session.h index 0d7610e..38fbee6 100644 --- a/Source/Client/Session.h +++ b/Source/Client/Session.h @@ -16,7 +16,9 @@ #include #include +class CActRes; class LuaScript; +struct ActionFrame; struct SessionRecord6144 { /* 0000 */ std::uint16_t unknown_0000 = 0; @@ -103,7 +105,9 @@ public: /* 3500 */ ItemInfo unknown_3500[10]; /* 3EB0 */ unsigned char unknown_3EB0[0x9B0]; /* 4860 */ ItemInfo m_itemSlots[10]; - /* 5210 */ unsigned char unknown_5210[0xA8]; + /* 5210 */ unsigned char unknown_5210[0x44]; + /* 5254 */ std::map m_npcLocationRadius; + /* 525C */ unsigned char unknown_525C[0x5C]; /* 52B8 */ std::vector m_accessoryNames; /* 52C4 */ unsigned char unknown_52C4[0x294]; /* 5558 */ int unknown_5558; @@ -227,6 +231,10 @@ public: bool IsTopLayerRobe(int robe); int IsSkillIdInRange6018(unsigned id) const; int IsSkillIdInRange6001(unsigned id) const; + const ActionFrame* GetSyncedFrame(CActRes* baseAct, CActRes* act, unsigned action, int baseFrame, std::uint32_t startTime, int* frame); + float GetNpcLocationRadius(int job, bool riding); + int GetRidingJob(int job); + int GetSpriteJob(int job, int costumeJob, bool spriteIndex); }; extern CSession g_session; diff --git a/Source/Contents/NpcLocationRadius.cpp b/Source/Contents/NpcLocationRadius.cpp new file mode 100644 index 0000000..7c24d7c --- /dev/null +++ b/Source/Contents/NpcLocationRadius.cpp @@ -0,0 +1,438 @@ +#include "Client/Session.h" +#include "Contents/Jobs/JobId.h" +#include "Script/LuaScript.h" + +// OFFSET: 0x00DE0A70 +// FUNCTION: fn_23467 +float CSession::GetNpcLocationRadius(int job, bool riding) { + if (riding == true) { + job = this->GetRidingJob(job); + } + + int radius = 0; + g_session.m_hotkeyScript->Call("GetNpcLocationRadius", "d>d", job, &radius); + if (radius != 0) { + return static_cast(radius * 2 + 1); + } + + if (this->m_npcLocationRadius.find(job) == this->m_npcLocationRadius.end()) { + return 1.0f; + } + + return this->m_npcLocationRadius[job]; +} + +// OFFSET: 0x00E130A0 +// FUNCTION: fn_23823 +int CSession::GetRidingJob(int job) { + if (job == JT_NINJA) { + return JT_FROG_NINJA; + } + if (job == JT_LINKER) { + return JT_FROG_LINKER; + } + if (job == JT_GUNSLINGER) { + return JT_PECO_GUNNER; + } + if (job == JT_SWORDMAN) { + return JT_PECO_SWORD; + } + if (job == JT_BLACKSMITH_H) { + return JT_PIG_WHITESMITH; + } + if (job == JT_MERCHANT) { + return JT_PIG_MERCHANT; + } + if (job == JT_GENETIC || job == JT_GENETIC_H) { + return JT_PIG_GENETIC; + } + if (job == JT_ALCHEMIST_H) { + return JT_PIG_CREATOR; + } + if (job == JT_ARCHER) { + return JT_OSTRICH_ARCHER; + } + if (job == JT_STAR || job == JT_STAR2) { + return JT_PORING_STAR; + } + if (job == JT_NOVICE) { + return JT_PORING_NOVICE; + } + if (job == JT_MONK) { + return JT_SHEEP_MONK; + } + if (job == JT_ACOLYTE) { + return JT_SHEEP_ACO; + } + if (job == JT_SURA || job == JT_SURA_H) { + return JT_SHEEP_SURA; + } + if (job == JT_SUPERNOVICE) { + return JT_PORING_SNOVICE; + } + if (job == JT_ARCHBISHOP || job == JT_ARCHBISHOP_H) { + return JT_SHEEP_ARCB; + } + if (job == JT_MAGICIAN) { + return JT_FOX_MAGICIAN; + } + if (job == JT_SAGE) { + return JT_FOX_SAGE; + } + if (job == JT_SORCERER || job == JT_SORCERER_H) { + return JT_FOX_SORCERER; + } + if (job == JT_WARLOCK || job == JT_WARLOCK_H) { + return JT_FOX_WARLOCK; + } + if (job == JT_WIZARD) { + return JT_FOX_WIZ; + } + if (job == JT_SAGE_H) { + return JT_FOX_PROF; + } + if (job == JT_WIZARD_H) { + return JT_FOX_HWIZ; + } + if (job == JT_ALCHEMIST) { + return JT_PIG_ALCHE; + } + if (job == JT_BLACKSMITH) { + return JT_PIG_BLACKSMITH; + } + if (job == JT_MONK_H) { + return JT_SHEEP_CHAMP; + } + if (job == JT_GUILLOTINE_CROSS || job == JT_GUILLOTINE_CROSS_H) { + return JT_DOG_G_CROSS; + } + if (job == JT_THIEF) { + return JT_DOG_THIEF; + } + if (job == JT_ROGUE) { + return JT_DOG_ROGUE; + } + if (job == JT_SHADOW_CHASER || job == JT_SHADOW_CHASER_H) { + return JT_DOG_CHASER; + } + if (job == JT_ROGUE_H) { + return JT_DOG_STALKER; + } + if (job == JT_ASSASSIN) { + return JT_DOG_ASSASSIN; + } + if (job == JT_ASSASSIN_H) { + return JT_DOG_ASSA_X; + } + if (job == JT_DANCER) { + return JT_OSTRICH_DANCER; + } + if (job == JT_MINSTREL || job == JT_MINSTREL_H) { + return JT_OSTRICH_MINSTREL; + } + if (job == JT_BARD) { + return JT_OSTRICH_BARD; + } + if (job == JT_HUNTER_H) { + return JT_OSTRICH_SNIPER; + } + if (job == JT_WANDERER || job == JT_WANDERER_H) { + return JT_OSTRICH_WANDER; + } + if (job == JT_DANCER_H) { + return JT_OSTRICH_ZIPSI; + } + if (job == JT_BARD_H) { + return JT_OSTRICH_CROWN; + } + if (job == JT_HUNTER) { + return JT_OSTRICH_HUNTER; + } + if (job == JT_TAEKWON) { + return JT_PORING_TAEKWON; + } + if (job == JT_PRIEST) { + return JT_SHEEP_PRIEST; + } + if (job == JT_PRIEST_H) { + return JT_SHEEP_HPRIEST; + } + if (job == JT_NOVICE_B) { + return JT_PORING_NOVICE_B; + } + if (job == JT_SWORDMAN_B) { + return JT_PECO_SWORD_B; + } + if (job == JT_MAGICIAN_B) { + return JT_FOX_MAGICIAN_B; + } + if (job == JT_ARCHER_B) { + return JT_OSTRICH_ARCHER_B; + } + if (job == JT_ACOLYTE_B) { + return JT_SHEEP_ACO_B; + } + if (job == JT_MERCHANT_B) { + return JT_PIG_MERCHANT_B; + } + if (job == JT_HUNTER_B) { + return JT_OSTRICH_HUNTER_B; + } + if (job == JT_ASSASSIN_B) { + return JT_DOG_ASSASSIN_B; + } + if (job == JT_MONK_B) { + return JT_SHEEP_MONK_B; + } + if (job == JT_SAGE_B) { + return JT_FOX_SAGE_B; + } + if (job == JT_ROGUE_B) { + return JT_DOG_ROGUE_B; + } + if (job == JT_ALCHEMIST_B) { + return JT_PIG_ALCHE_B; + } + if (job == JT_BARD_B) { + return JT_OSTRICH_BARD_B; + } + if (job == JT_DANCER_B) { + return JT_OSTRICH_DANCER_B; + } + if (job == JT_SUPERNOVICE_B) { + return JT_PORING_SNOVICE_B; + } + if (job == JT_WARLOCK_B) { + return JT_FOX_WARLOCK_B; + } + if (job == JT_ARCHBISHOP_B) { + return JT_SHEEP_ARCB_B; + } + if (job == JT_GUILLOTINE_CROSS_B) { + return JT_DOG_G_CROSS_B; + } + if (job == JT_SORCERER_B) { + return JT_FOX_SORCERER_B; + } + if (job == JT_MINSTREL_B) { + return JT_OSTRICH_MINSTREL_B; + } + if (job == JT_WANDERER_B) { + return JT_OSTRICH_WANDER_B; + } + if (job == JT_SURA_B) { + return JT_SHEEP_SURA_B; + } + if (job == JT_GENETIC_B) { + return JT_PIG_GENETIC_B; + } + if (job == JT_SHADOW_CHASER_B) { + return JT_DOG_CHASER_B; + } + if (job == JT_NOVICE_H) { + return JT_PORING_NOVICE_H; + } + if (job == JT_SWORDMAN_H) { + return JT_PECO_SWORD_H; + } + if (job == JT_MAGICIAN_H) { + return JT_FOX_MAGICIAN_H; + } + if (job == JT_ARCHER_H) { + return JT_OSTRICH_ARCHER_H; + } + if (job == JT_ACOLYTE_H) { + return JT_SHEEP_ACO_H; + } + if (job == JT_MERCHANT_H) { + return JT_PIG_MERCHANT_H; + } + if (job == JT_THIEF_H) { + return JT_DOG_THIEF_H; + } + if (job == JT_THIEF_B) { + return JT_DOG_THIEF_B; + } + if (job == JT_SUPERNOVICE2) { + return JT_PORING_SNOVICE2; + } + if (job == JT_SUPERNOVICE2_B) { + return JT_PORING_SNOVICE2_B; + } + if (job == JT_PRIEST_B) { + return JT_SHEEP_PRIEST_B; + } + if (job == JT_WIZARD_B) { + return JT_FOX_WIZ_B; + } + if (job == JT_BLACKSMITH_B) { + return JT_PIG_BLACKSMITH_B; + } + if (job == JT_MECHANIC || job == JT_MECHANIC_H) { + return JT_PIG_MECHANIC; + } + if (job == JT_MECHANIC_B) { + return JT_PIG_MECHANIC_B; + } + if (job == JT_RANGER || job == JT_RANGER_H) { + return JT_OSTRICH_RANGER; + } + if (job == JT_RANGER_B) { + return JT_OSTRICH_RANGER_B; + } + if (job == JT_KNIGHT) { + return JT_LION_KNIGHT; + } + if (job == JT_KNIGHT_H) { + return JT_LION_KNIGHT_H; + } + if (job == JT_KNIGHT_B) { + return JT_LION_KNIGHT_B; + } + if (job == JT_ROYAL_GUARD || job == JT_ROYAL_GUARD_H) { + return JT_LION_ROYAL_GUARD; + } + if (job == JT_ROYAL_GUARD_B) { + return JT_LION_ROYAL_GUARD_B; + } + if (job == JT_RUNE_KNIGHT || job == JT_RUNE_KNIGHT_H) { + return JT_LION_RUNE_KNIGHT; + } + if (job == JT_RUNE_KNIGHT_B) { + return JT_LION_RUNE_KNIGHT_B; + } + if (job == JT_CRUSADER) { + return JT_LION_CRUSADER; + } + if (job == JT_CRUSADER_H) { + return JT_LION_CRUSADER_H; + } + if (job == JT_CRUSADER_B) { + return JT_LION_CRUSADER_B; + } + if (job == JT_KAGEROU) { + return JT_FROG_KAGEROU; + } + if (job == JT_OBORO) { + return JT_FROG_OBORO; + } + if (job == JT_REBELLION) { + return JT_PECO_REBELLION; + } + if (job == JT_DO_SUMMONER) { + return JT_DO_CART_SUMMONER; + } + if (job == JT_DO_SUMMONER_B) { + return JT_DO_CART_SUMMONER_B; + } + if (job == JT_NINJA_B) { + return JT_FROG_NINJA_B; + } + if (job == JT_KAGEROU_B) { + return JT_FROG_KAGEROU_B; + } + if (job == JT_OBORO_B) { + return JT_FROG_OBORO_B; + } + if (job == JT_TAEKWON_B) { + return JT_PORING_TAEKWON_B; + } + if (job == JT_STAR_B || job == JT_STAR2_B) { + return JT_PORING_STAR_B; + } + if (job == JT_LINKER_B) { + return JT_FROG_LINKER_B; + } + if (job == JT_GUNSLINGER_B) { + return JT_PECO_GUNNER_B; + } + if (job == JT_REBELLION_B) { + return JT_PECO_REBELLION_B; + } + if (job == JT_STAR_EMPEROR || job == JT_STAR2_EMPEROR) { + return JT_HAETAE_STAR_EMPEROR; + } + if (job == JT_STAR_EMPEROR_B || job == JT_STAR2_EMPEROR_B) { + return JT_HAETAE_STAR_EMPEROR_B; + } + if (job == JT_SOUL_REAPER) { + return JT_HAETAE_SOUL_REAPER; + } + if (job == JT_SOUL_REAPER_B) { + return JT_HAETAE_SOUL_REAPER_B; + } + if (job == JT_SHADOW_CROSS) { + return JT_SHADOW_CROSS_RIDING; + } + if (job == JT_ABYSS_CHASER) { + return JT_ABYSS_CHASER_RIDING; + } + if (job == JT_DRAGON_KNIGHT) { + return JT_DRAGON_KNIGHT_RIDING; + } + if (job == JT_IMPERIAL_GUARD) { + return JT_IMPERIAL_GUARD_RIDING; + } + if (job == JT_BIOLO) { + return JT_BIOLO_RIDING; + } + if (job == JT_MEISTER) { + return JT_MEISTER_RIDING; + } + if (job == JT_WINDHAWK) { + return JT_WINDHAWK_RIDING; + } + if (job == JT_TROUBADOUR) { + return JT_TROUBADOUR_RIDING; + } + if (job == JT_TROUVERE) { + return JT_TROUVERE_RIDING; + } + if (job == JT_ARCH_MAGE) { + return JT_ARCH_MAGE_RIDING; + } + if (job == JT_ELEMENTAL_MASTER) { + return JT_ELEMENTAL_MASTER_RIDING; + } + if (job == JT_CARDINAL) { + return JT_CARDINAL_RIDING; + } + if (job == JT_INQUISITOR) { + return JT_INQUISITOR_RIDING; + } + if (job == JT_SKY_EMPEROR || job == JT_SKY_EMPEROR2) { + return JT_SKY_EMPEROR_RIDING; + } + if (job == JT_SOUL_ASCETIC) { + return JT_SOUL_ASCETIC_RIDING; + } + if (job == JT_SHINKIRO) { + return JT_SHINKIRO_RIDING; + } + if (job == JT_SHIRANUI) { + return JT_SHIRANUI_RIDING; + } + if (job == JT_NIGHT_WATCH) { + return JT_NIGHT_WATCH_RIDING; + } + if (job == JT_HYPER_NOVICE) { + return JT_HYPER_NOVICE_RIDING; + } + if (job == JT_SPIRIT_HANDLER) { + return JT_SPIRIT_HANDLER_RIDING; + } + if (job == JT_DRUID || job == JT_DRUID_B) { + return JT_DRUID_RIDING; + } + if (job == JT_KARNOS || job == JT_KARNOS_B) { + return JT_KARNOS_RIDING; + } + if (job == JT_ALITEA) { + return JT_ALITEA_RIDING; + } + if (job == JT_WEREWOLF || job == JT_WERERAPTOR) { + return JT_DRUID_RIDING; + } + + return job; +} diff --git a/Source/Contents/SpriteFrameSynchronization.cpp b/Source/Contents/SpriteFrameSynchronization.cpp new file mode 100644 index 0000000..f9b9f4b --- /dev/null +++ b/Source/Contents/SpriteFrameSynchronization.cpp @@ -0,0 +1,29 @@ +#include "Client/Session.h" +#include "Resource/Sprites/ActionResource.h" + +#include +#include + +// OFFSET: 0x00E12D70 +// FUNCTION: fn_23819 +const ActionFrame* CSession::GetSyncedFrame(CActRes* baseAct, CActRes* act, unsigned action, int baseFrame, std::uint32_t startTime, int* frame) { + if (!baseAct || !act) { + return nullptr; + } + + int baseCount = baseAct->FrameCount(action); + int count = act->FrameCount(action); + if (baseCount <= 0 || count <= 0 || baseCount >= count || count % baseCount != 0) { + return nullptr; + } + + int ratio = count / baseCount; + int speed = static_cast(act->Speed(action)); + float elapsed = (timeGetTime() - startTime) / 24.0; + if (speed == 0) { + speed = 4; + } + + *frame = static_cast(elapsed / speed) % ratio + ratio * baseFrame; + return &act->Frame(action, *frame); +} diff --git a/Source/Contents/SpriteJob.cpp b/Source/Contents/SpriteJob.cpp new file mode 100644 index 0000000..f334113 --- /dev/null +++ b/Source/Contents/SpriteJob.cpp @@ -0,0 +1,178 @@ +#include "Client/Session.h" +#include "Contents/Jobs/JobId.h" +#include "Contents/Jobs/JobNames.h" + +// OFFSET: 0x00E2EE70 +// FUNCTION: fn_24152 +int CSession::GetSpriteJob(int job, int costumeJob, bool spriteIndex) { + switch (job) { + case JT_MARRIED: + case JT_SANTA: + case JT_SUMMER: + case JT_HANBOK: + case JT_OKTOBERFEST: + case JT_SUMMER2: + return job; + } + + int mount; + if (g_session.GetRidingJob(JobNames::BaseJob(job)) == job) { + mount = 1; + } else { + switch (job) { + case JT_CHICKEN: + case JT_CHICKEN2: + case JT_CHICKEN_H: + case JT_CHICKEN2_H: + case JT_CHICKEN_B: + case JT_CHICKEN2_B: + case JT_RUNE_CHICKEN: + case JT_RUNE_CHICKEN_H: + case JT_RUNE_CHICKEN_B: + case JT_ROYAL_CHICKEN: + case JT_ROYAL_CHICKEN_H: + case JT_ROYAL_CHICKEN_B: + case JT_WOLF_RANGER: + case JT_WOLF_RANGER_H: + case JT_WOLF_RANGER_B: + case JT_WOLF_WINDHAWK: + case JT_DRAGON_KNIGHT_CHICKEN: + case JT_IMPERIAL_GUARD_CHICKEN: + mount = 2; + break; + default: + mount = 0; + break; + } + } + + switch (costumeJob) { + case JT_RUNE_KNIGHT_2ND: + costumeJob = JT_RUNE_KNIGHT_H; + break; + case JT_MECHANIC_2ND: + costumeJob = JT_MECHANIC_H; + break; + case JT_GUILLOTINE_CROSS_2ND: + costumeJob = JT_GUILLOTINE_CROSS_H; + break; + case JT_WARLOCK_2ND: + costumeJob = JT_WARLOCK_H; + break; + case JT_ARCHBISHOP_2ND: + costumeJob = JT_ARCHBISHOP_H; + break; + case JT_RANGER_2ND: + costumeJob = JT_RANGER_H; + break; + case JT_ROYAL_GUARD_2ND: + costumeJob = JT_ROYAL_GUARD_H; + break; + case JT_GENETIC_2ND: + costumeJob = JT_GENETIC_H; + break; + case JT_SHADOW_CHASER_2ND: + costumeJob = JT_SHADOW_CHASER_H; + break; + case JT_SORCERER_2ND: + costumeJob = JT_SORCERER_H; + break; + case JT_SURA_2ND: + costumeJob = JT_SURA_H; + break; + case JT_MINSTREL_2ND: + costumeJob = JT_MINSTREL_H; + break; + case JT_WANDERER_2ND: + costumeJob = JT_WANDERER_H; + break; + } + + if (mount == 1) { + costumeJob = g_session.GetRidingJob(costumeJob); + } else if (mount == 2) { + switch (costumeJob) { + case JT_KNIGHT: + costumeJob = JT_CHICKEN; + break; + case JT_CRUSADER: + costumeJob = JT_CHICKEN2; + break; + case JT_KNIGHT_H: + costumeJob = JT_CHICKEN_H; + break; + case JT_CRUSADER_H: + costumeJob = JT_CHICKEN2_H; + break; + case JT_KNIGHT_B: + costumeJob = JT_CHICKEN_B; + break; + case JT_CRUSADER_B: + costumeJob = JT_CHICKEN2_B; + break; + case JT_RUNE_KNIGHT: + costumeJob = JT_RUNE_CHICKEN; + break; + case JT_RUNE_KNIGHT_H: + costumeJob = JT_RUNE_CHICKEN_H; + break; + case JT_RUNE_KNIGHT_B: + costumeJob = JT_RUNE_CHICKEN_B; + break; + case JT_DRAGON_KNIGHT: + costumeJob = JT_DRAGON_KNIGHT_CHICKEN; + break; + case JT_ROYAL_GUARD: + costumeJob = JT_ROYAL_CHICKEN; + break; + case JT_ROYAL_GUARD_H: + costumeJob = JT_ROYAL_CHICKEN_H; + break; + case JT_ROYAL_GUARD_B: + costumeJob = JT_ROYAL_CHICKEN_B; + break; + case JT_IMPERIAL_GUARD: + costumeJob = JT_IMPERIAL_GUARD_CHICKEN; + break; + case JT_RANGER: + costumeJob = JT_WOLF_RANGER; + break; + case JT_RANGER_H: + costumeJob = JT_WOLF_RANGER_H; + break; + case JT_RANGER_B: + costumeJob = JT_WOLF_RANGER_B; + break; + case JT_WINDHAWK: + costumeJob = JT_WOLF_WINDHAWK; + break; + } + } else { + if (job == JT_MADOGEAR || job == JT_MADOGEAR_H || job == JT_MADOGEAR_B || job == JT_MEISTER_MADOGEAR) { + switch (costumeJob) { + case JT_MECHANIC: + costumeJob = JT_MADOGEAR; + break; + case JT_MECHANIC_H: + costumeJob = JT_MADOGEAR_H; + break; + case JT_MECHANIC_B: + costumeJob = JT_MADOGEAR_B; + break; + case JT_MEISTER: + costumeJob = JT_MEISTER_MADOGEAR; + break; + } + } + + if (job == JT_WEREWOLF || job == JT_WERERAPTOR) { + costumeJob = job; + } + } + + if (spriteIndex == true && costumeJob > 3950) { + return costumeJob - 3950; + } + + return costumeJob; +} diff --git a/data/compile.json b/data/compile.json index 75c86e7..526f03a 100644 --- a/data/compile.json +++ b/data/compile.json @@ -385,6 +385,7 @@ "Source/Contents/NavigationRequest.cpp": 4, "Source/Contents/NavigationRoute.cpp": 4, "Source/Contents/NavigationSource.cpp": 4, + "Source/Contents/NpcLocationRadius.cpp": 4, "Source/Contents/Party/AdvenPartyInfo.cpp": 4, "Source/Contents/Party/AdventurerAgencyMgr.cpp": 4, "Source/Contents/Party/AgencyRequests.cpp": 4, @@ -423,6 +424,8 @@ "Source/Contents/Sound/SoundConfiguration.cpp": 4, "Source/Contents/Sound/SoundMaker.cpp": 4, "Source/Contents/Sound/SoundMgr.cpp": 4, + "Source/Contents/SpriteFrameSynchronization.cpp": 4, + "Source/Contents/SpriteJob.cpp": 4, "Source/Contents/SpriteLayerOrder.cpp": 4, "Source/Contents/SpriteRidingPolicy.cpp": 4, "Source/Contents/Store/MCStoreInfoBackup.cpp": 4,