From 7fde9b5d3c03b80550ff307ac275b22b594ff30b Mon Sep 17 00:00:00 2001 From: mparisi20 Date: Wed, 21 May 2025 23:57:14 -0400 Subject: [PATCH] Match gf_task.cpp --- config/RSBE01_02/splits.txt | 5 + config/RSBE01_02/symbols.txt | 40 ++--- configure.py | 1 + include/lib/BrawlHeaders | 2 +- src/sora/gf/gf_task.cpp | 298 +++++++++++++++++++++++++++++++++++ 5 files changed, 325 insertions(+), 21 deletions(-) create mode 100644 src/sora/gf/gf_task.cpp diff --git a/config/RSBE01_02/splits.txt b/config/RSBE01_02/splits.txt index 9fe6e2e..a4cc045 100644 --- a/config/RSBE01_02/splits.txt +++ b/config/RSBE01_02/splits.txt @@ -58,6 +58,11 @@ sora/gf/gf_keep_fb.cpp: sora/gf/gf_memory_util.cpp: .text start:0x80026474 end:0x80026478 +sora/gf/gf_task.cpp: + .text start:0x8002D8B8 end:0x8002E09C + .data start:0x80422EC8 end:0x80422F6C + .sdata start:0x8059C668 end:0x8059C670 + sora/gf/gf_task_scheduler.cpp: .text start:0x8002E09C end:0x8002F188 .sbss start:0x805A0068 end:0x805A006C diff --git a/config/RSBE01_02/symbols.txt b/config/RSBE01_02/symbols.txt index 00cb1ca..4579f79 100644 --- a/config/RSBE01_02/symbols.txt +++ b/config/RSBE01_02/symbols.txt @@ -2641,10 +2641,10 @@ setNextScene__14gfSceneManagerFv = .text:0x8002D5AC; // type:function size:0x94 setNextSequence__14gfSceneManagerFv = .text:0x8002D640; // type:function size:0x94 setLoadModuleName__14gfSceneManagerFv = .text:0x8002D6D4; // type:function size:0x68 loadModule__14gfSceneManagerFv = .text:0x8002D73C; // type:function size:0x17C -__ct__6gfTaskFPCcQ26gfTask8Categoryiii = .text:0x8002D8B8; // type:function size:0x164 +__ct__6gfTaskFPCcQ26gfTask8Categoryiib = .text:0x8002D8B8; // type:function size:0x164 __dt__6gfTaskFv = .text:0x8002DA1C; // type:function size:0x104 -fn_8002DB20 = .text:0x8002DB20; // type:function size:0x18 -fn_8002DB38 = .text:0x8002DB38; // type:function size:0x70 +updateId__6gfTaskFv = .text:0x8002DB20; // type:function size:0x18 +link__6gfTaskFb = .text:0x8002DB38; // type:function size:0x70 unlink__6gfTaskFv = .text:0x8002DBA8; // type:function size:0x70 setPaused__6gfTaskFb = .text:0x8002DC18; // type:function size:0x28 getTask__6gfTaskFi = .text:0x8002DC40; // type:function size:0x34 @@ -17592,10 +17592,10 @@ lbl_80420828 = .data:0x80420828; // type:object size:0x18 lbl_80420840 = .data:0x80420840; // type:object size:0xC data:string lbl_8042084C = .data:0x8042084C; // type:object size:0x64 __vt__8gfThread = .data:0x804208B0; // type:object size:0xC scope:weak -@17 = .data:0x804208BC; // type:object size:0x9 scope:local data:string -@18 = .data:0x804208C8; // type:object size:0xC scope:local +@96 = .data:0x804208BC; // type:object size:0x9 scope:local data:string +@97 = .data:0x804208C8; // type:object size:0xC scope:local __vt__10gfRunnable = .data:0x804208D4; // type:object size:0xC scope:weak -@19 = .data:0x804208E0; // type:object size:0xB scope:local data:string +@98 = .data:0x804208E0; // type:object size:0xB scope:local data:string lbl_804208F0 = .data:0x804208F0; // type:object size:0x30 lbl_80420920 = .data:0x80420920; // type:object size:0x1C lbl_8042093C = .data:0x8042093C; // type:object size:0xC @@ -17748,10 +17748,10 @@ lbl_80422E88 = .data:0x80422E88; // type:object size:0x10 data:string lbl_80422E98 = .data:0x80422E98; // type:object size:0x10 lbl_80422EA8 = .data:0x80422EA8; // type:object size:0x10 lbl_80422EB8 = .data:0x80422EB8; // type:object size:0x10 -jumptable_80422EC8 = .data:0x80422EC8; // type:object size:0x20 scope:local -jumptable_80422EE8 = .data:0x80422EE8; // type:object size:0x20 scope:local -__vt__6gfTask = .data:0x80422F08; // type:object size:0x68 -lbl_80422F70 = .data:0x80422F70; // type:object size:0x64 data:4byte +@469 = .data:0x80422EC8; // type:object size:0x20 scope:local align:8 +@468 = .data:0x80422EE8; // type:object size:0x20 scope:local +__vt__6gfTask = .data:0x80422F08; // type:object size:0x64 +lbl_80422F70 = .data:0x80422F70; // type:object size:0x64 align:8 data:4byte lbl_80422FD4 = .data:0x80422FD4; // type:object size:0xC lbl_80422FE0 = .data:0x80422FE0; // type:object size:0xC jumptable_80422FEC = .data:0x80422FEC; // type:object size:0x24 scope:local @@ -25928,10 +25928,10 @@ lbl_8045C580 = .data:0x8045C580; // type:object size:0x14 lbl_8045C594 = .data:0x8045C594; // type:object size:0xC lbl_8045C5A0 = .data:0x8045C5A0; // type:object size:0x10 lbl_8045C5B0 = .data:0x8045C5B0; // type:object size:0xC8 -TaskName__12ifWifiprTask = .data:0x8045C678; // type:object size:0x10 +TaskName__12ifWifiprTask = .data:0x8045C678; // type:object size:0xD __vt__12ifWifiprTask = .data:0x8045C688; // type:object size:0x64 -lbl_8045C6EC = .data:0x8045C6EC; // type:object size:0x10 -lbl_8045C6FC = .data:0x8045C6FC; // type:object size:0xC +@63 = .data:0x8045C6EC; // type:object size:0xD scope:local +@64 = .data:0x8045C6FC; // type:object size:0xC scope:local lbl_8045C708 = .data:0x8045C708; // type:object size:0x18 lbl_8045C720 = .data:0x8045C720; // type:object size:0xC lbl_8045C72C = .data:0x8045C72C; // type:object size:0x14 @@ -25991,10 +25991,10 @@ lbl_8045D020 = .data:0x8045D020; // type:object size:0x20 lbl_8045D040 = .data:0x8045D040; // type:object size:0xC lbl_8045D04C = .data:0x8045D04C; // type:object size:0x14 lbl_8045D060 = .data:0x8045D060; // type:object size:0x10 -TaskName__9ifAdvTask = .data:0x8045D070; // type:object size:0xC +TaskName__9ifAdvTask = .data:0x8045D070; // type:object size:0xA __vt__9ifAdvTask = .data:0x8045D07C; // type:object size:0x64 -lbl_8045D0E0 = .data:0x8045D0E0; // type:object size:0xC -lbl_8045D0EC = .data:0x8045D0EC; // type:object size:0xC +@75 = .data:0x8045D0E0; // type:object size:0xA scope:local +@76 = .data:0x8045D0EC; // type:object size:0xC scope:local lbl_8045D0F8 = .data:0x8045D0F8; // type:object size:0x10 lbl_8045D108 = .data:0x8045D108; // type:object size:0x18 lbl_8045D120 = .data:0x8045D120; // type:object size:0x18 @@ -28479,8 +28479,8 @@ lbl_8059C650 = .sdata:0x8059C650; // type:object size:0x8 data:4byte lbl_8059C658 = .sdata:0x8059C658; // type:object size:0x4 align:4 data:float lbl_8059C65C = .sdata:0x8059C65C; // type:object size:0x4 align:4 data:float lbl_8059C660 = .sdata:0x8059C660; // type:object size:0x8 -lbl_8059C668 = .sdata:0x8059C668; // type:object size:0x4 data:4byte -lbl_8059C66C = .sdata:0x8059C66C; // type:object size:0x4 data:4byte +TaskIdCounter = .sdata:0x8059C668; // type:object size:0x4 scope:local data:4byte +gUnk8059c66c = .sdata:0x8059C66C; // type:object size:0x4 scope:local data:4byte lbl_8059C670 = .sdata:0x8059C670; // type:object size:0x8 lbl_8059C678 = .sdata:0x8059C678; // type:object size:0x8 lbl_8059C680 = .sdata:0x8059C680; // type:object size:0x8 @@ -29514,7 +29514,7 @@ lbl_8059E4CC = .sdata:0x8059E4CC; // type:object size:0x4 lbl_8059E4D0 = .sdata:0x8059E4D0; // type:object size:0x8 lbl_8059E4D8 = .sdata:0x8059E4D8; // type:object size:0x8 lbl_8059E4E0 = .sdata:0x8059E4E0; // type:object size:0x8 -__RTTI__12ifWifiprTask = .sdata:0x8059E4E8; // type:object size:0x8 +__RTTI__12ifWifiprTask = .sdata:0x8059E4E8; // type:object size:0x8 scope:weak lbl_8059E4F0 = .sdata:0x8059E4F0; // type:object size:0x8 lbl_8059E4F8 = .sdata:0x8059E4F8; // type:object size:0x8 lbl_8059E500 = .sdata:0x8059E500; // type:object size:0x8 @@ -29549,7 +29549,7 @@ lbl_8059E5D0 = .sdata:0x8059E5D0; // type:object size:0x8 lbl_8059E5D8 = .sdata:0x8059E5D8; // type:object size:0x8 lbl_8059E5E0 = .sdata:0x8059E5E0; // type:object size:0x8 lbl_8059E5E8 = .sdata:0x8059E5E8; // type:object size:0x8 -__RTTI__9ifAdvTask = .sdata:0x8059E5F0; // type:object size:0x8 +__RTTI__9ifAdvTask = .sdata:0x8059E5F0; // type:object size:0x8 scope:weak lbl_8059E5F8 = .sdata:0x8059E5F8; // type:object size:0x8 lbl_8059E600 = .sdata:0x8059E600; // type:object size:0x8 data:string lbl_8059E608 = .sdata:0x8059E608; // type:object size:0x8 diff --git a/configure.py b/configure.py index 962b39e..78ecde2 100755 --- a/configure.py +++ b/configure.py @@ -300,6 +300,7 @@ def MatchingFor(*versions): Object(Matching, "sora/gf/gf_gameframe_counter.cpp"), Object(Matching, "sora/gf/gf_keep_fb.cpp"), Object(Matching, "sora/gf/gf_memory_util.cpp"), + Object(Matching, "sora/gf/gf_task.cpp"), Object(NonMatching, "sora/gf/gf_task_scheduler.cpp"), Object(Matching, "sora/gf/gf_thread.cpp"), Object(Matching, "sora/mt/mt_prng.cpp", extra_cflags=["-RTTI off"]), diff --git a/include/lib/BrawlHeaders b/include/lib/BrawlHeaders index 04edcc7..d7db95f 160000 --- a/include/lib/BrawlHeaders +++ b/include/lib/BrawlHeaders @@ -1 +1 @@ -Subproject commit 04edcc7ea9872df9d95dc6adf2b998c427f5c172 +Subproject commit d7db95fd94904dad7478a7b288ab223849002de9 diff --git a/src/sora/gf/gf_task.cpp b/src/sora/gf/gf_task.cpp new file mode 100644 index 0000000..44d8917 --- /dev/null +++ b/src/sora/gf/gf_task.cpp @@ -0,0 +1,298 @@ +#include +#include +#include +#include + +static u32 TaskIdCounter = 1; +static u32 gUnk8059c66c = 0x80000000; + +gfTask::gfTask(const char* name, Category category, int unk2, int unk3, bool unk4) { + unk2C_b6 = true; + unk2C_b5 = false; + unk2C_b3 = false; + unk2C_b2 = true; + unk2C_b1 = true; + unk2C_b0 = false; + m_prev = nullptr; + m_next = nullptr; + m_0xC = nullptr; + m_0x10 = nullptr; + m_0x14 = nullptr; + m_0x18 = nullptr; + m_connectedTask = nullptr; + m_attachedTask = nullptr; + m_nextTask = nullptr; + m_status = 4; + unk32 = 0xFFFF; + unk34 = 0; + unk38 = 0; + if (srSystemGetDebugLevel() <= 3) { + unk2C_b3 = true; + } + u32 newId = TaskIdCounter++; + m_taskId = newId; + m_taskCategory = category; + m_taskName = name; + unk30 = unk2; + unk31 = unk3; + unk2C_b6 = true; + gfTaskScheduler::getInstance()->registTask(this); + if (unk4) { + m_status = 2; + if (!unk2C_b0) { + gfTaskScheduler::getInstance()->link(this); + unk2C_b0 = true; + } + } else { + m_status = 4; + } +} + +gfTask::~gfTask() { + if (UnkClass* curr = unk38) { + curr->func(); + curr = curr->m_next; + while (curr) { + curr->func(); + curr = curr->m_next; + } + } + if (gfTaskScheduler::getInstance()->isRegist(this)) { + m_status = 3; + if (unk2C_b0) { + gfTaskScheduler::getInstance()->unlink(this); + } + gfTaskScheduler::getInstance()->removeFromSuspendList(this); + } + m_status = 5; +} + +void gfTask::updateId() { + u32 newId = gUnk8059c66c++ | 0x80000000; + m_taskId = newId; +} + +void gfTask::link(bool p1) { + if (!unk2C_b0) { + gfTaskScheduler::getInstance()->link(this); + unk2C_b0 = true; + if (p1) { + m_status = 1; + } + } +} + +void gfTask::unlink() { + if (unk2C_b0) { + gfTaskScheduler::getInstance()->unlink(this); + gfTaskScheduler::getInstance()->unregistTask(this); + m_0xC = nullptr; + m_0x10 = nullptr; + m_0x14 = nullptr; + m_0x18 = nullptr; + unk2C_b0 = false; + } +} + +void gfTask::setPaused(bool paused) { + if (paused) { + unk34 = 0x8000; + } else { + unk34 &= 0x7FFF; + } +} + +gfTask* gfTask::getTask(int taskId) { + return gfTaskScheduler::getInstance()->getTask(taskId); +} + +void gfTask::process(TaskType taskType) { + if (taskType < 8) { + switch (taskType) { + case Task_Default: + processDefault(); + break; + case Task_Begin: + processBegin(); + break; + case Task_Anim: + processAnim(); + break; + case Task_Update: + processUpdate(); + break; + case Task_PreMapCorrection: + processPreMapCorrection(); + break; + case Task_MapCorrection: + processMapCorrection(); + break; + case Task_FixPosition: + processFixPosition(); + break; + case Task_PreCollision: + processPreCollision(); + break; + default: + break; + } + } else { + switch (taskType) { + case Task_Collision: + processCollision(); + break; + case Task_Catch: + processCatch(); + break; + case Task_Hit: + processHit(); + break; + case Task_Camera: + processCamera(); + break; + case Task_FixCamera: + processFixCamera(); + break; + case Task_Effect: + processEffect(); + break; + case Task_GameProc: + processGameProc(); + break; + case Task_End: + processEnd(); + break; + default: + break; + } + } +} + +void gfTask::init() { } + +void gfTask::processDefault() { + unk32 &= ~(1 << Task_Default); +} + +void gfTask::processBegin() { + unk32 &= ~(1 << Task_Begin); +} + +void gfTask::processAnim() { + unk32 &= ~(1 << Task_Anim); +} + +void gfTask::processUpdate() { + unk32 &= ~(1 << Task_Update); +} + +void gfTask::processPreMapCorrection() { + unk32 &= ~(1 << Task_PreMapCorrection); +} + +void gfTask::processMapCorrection() { + unk32 &= ~(1 << Task_MapCorrection); +} + +void gfTask::processFixPosition() { + unk32 &= ~(1 << Task_FixPosition); +} + +void gfTask::processPreCollision() { + unk32 &= ~(1 << Task_PreCollision); +} + +void gfTask::processCollision() { + unk32 &= ~(1 << Task_Collision); +} + +void gfTask::processCatch() { + unk32 &= ~(1 << Task_Catch); +} + +void gfTask::processHit() { + unk32 &= ~(1 << Task_Hit); +} + +void gfTask::processCamera() { + unk32 &= ~(1 << Task_Camera); +} + +void gfTask::processFixCamera() { + unk32 &= ~(1 << Task_FixCamera); +} + +void gfTask::processEffect() { + unk32 &= ~(1 << Task_Effect); +} + +void gfTask::processGameProc() { + unk32 &= ~(1 << Task_GameProc); +} + +void gfTask::processEnd() { + unk32 &= ~(1 << Task_End); +} + +void gfTask::renderPre() { } + +void gfTask::renderOpa() { } + +void gfTask::renderXlu() { } + +void gfTask::processDebug() { } + +void gfTask::renderDebug() { } + +void gfTask::render(Render kind) { + switch (kind) { + case Render_Pre: + renderPre(); + break; + case Render_Opa: + renderOpa(); + break; + case Render_Xlu: + renderXlu(); + break; + } +} + +void gfTask::exit() { + if (m_status != 3) { + m_status = 3; + unk2C_b6 = false; + gfTask* r31 = m_attachedTask; + while (r31) { + if (r31->m_status != 3) { + r31->m_status = 3; + r31->unk2C_b6 = false; + + gfTask* r29 = r31->m_attachedTask; + while (r29) { + if (r29->m_status != 3) { + r29->m_status = 3; + r29->unk2C_b6 = false; + + gfTask* r28 = r29->m_attachedTask; + while (r28) { + r28->exit(); + r28 = r28->m_nextTask; + } + if (gfTaskScheduler::getInstance()->getUnk0_1() == 4) { + gfTaskScheduler::getInstance()->setUnk2_7(); + } + } + r29 = r29->m_nextTask; + } + if (gfTaskScheduler::getInstance()->getUnk0_1() == 4) { + gfTaskScheduler::getInstance()->setUnk2_7(); + } + } + r31 = r31->m_nextTask; + } + if (gfTaskScheduler::getInstance()->getUnk0_1() == 4) { + gfTaskScheduler::getInstance()->setUnk2_7(); + } + } +}