Compare commits

..

3 commits

Author SHA1 Message Date
KeybadeBlox
ef16b09a96 Revise progress wording
We're not only counting .text, but any sections meant to hold code (e.g.
MMATRIX).
2026-04-19 17:31:41 -04:00
KeybadeBlox
639bb55108 Update progress 2026-04-19 17:29:59 -04:00
KeybadeBlox
b5e0a157a5 Delink ActSequence.obj
One symbol, fSequenceMethods, won't match up automatically in objdiff
until the mangling script is updated to handle method pointers properly.
2026-04-19 17:16:01 -04:00
7 changed files with 551 additions and 17 deletions

View file

@ -2,8 +2,8 @@
# An NMAKE Makefile to compile the game with the Visual C++ 7.0 toolchain # An NMAKE Makefile to compile the game with the Visual C++ 7.0 toolchain
# All object files to link together # All object files to link together
OBJ = src/JSRF/Jet2.obj src/JSRF/Action.obj src/JSRF/SaveData.obj\ OBJ = src/JSRF/Jet2.obj src/JSRF/Action.obj src/JSRF/ActSequence.obj\
src/XDK/Xapi/xapi0.obj src/JSRF/SaveData.obj src/XDK/Xapi/xapi0.obj
# Import library for the only thing we don't compile ourselves, the Xbox kernel # Import library for the only thing we don't compile ourselves, the Xbox kernel
LIB = lib/xboxkrnl.lib LIB = lib/xboxkrnl.lib
@ -44,6 +44,9 @@ src/JSRF/Jet2.obj: src/JSRF/Action.hpp src/XDK/CRT/stddef.h src/XDK/D3D.h\
src/JSRF/Action.obj: src/JSRF/Action.hpp src/MUSASHI/MMatrix.hpp\ src/JSRF/Action.obj: src/JSRF/Action.hpp src/MUSASHI/MMatrix.hpp\
src/XDK/CRT/stddef.h src/XDK/D3D.h src/XDK/Win32.h src/XDK/CRT/stddef.h src/XDK/D3D.h src/XDK/Win32.h
src/JSRF/ActSequence.obj: src/JSRF/Action.hpp src/JSRF/ActSequence.hpp\
src/JSRF/SaveData.hpp src/XDK/Win32.h
src/JSRF/SaveData.obj: src/JSRF/SaveData.hpp src/JSRF/SaveData.obj: src/JSRF/SaveData.hpp
src/XDK/Xapi/xapi0.obj: src/XDK/Win32.h src/XDK/Xapi/xapi0.obj: src/XDK/Win32.h

View file

@ -7,6 +7,33 @@
"*.hpp" "*.hpp"
], ],
"units": [ "units": [
{
"name": "JSRF/Action",
"target_path": "target/JSRF/Action.obj",
"base_path": "src/JSRF/Action.obj",
"metadata": {
"complete": false,
"source_path": "src/JSRF/Action.cpp"
},
"symbol_mappings": {
"?nopMethod0Arg@CActBase@@UAEXXZ": "?Exec0Default@CActBase@@UAEXXZ",
"?nopMethod1Arg@CActBase@@UAEXI@Z": "?DrawListDefault@CActBase@@UAEXI@Z"
}
},
{
"name": "JSRF/ActSequence",
"target_path": "target/JSRF/ActSequence.obj",
"base_path": "src/JSRF/ActSequence.obj",
"metadata": {
"complete": false,
"source_path": "src/JSRF/ActSequence.cpp"
},
"symbol_mappings": {
"?Exec0Default__jumptable@CActSequence@@3EA": "$L1709",
"?Exec0Default__jumptargets@CActSequence@@3PAPAXA": "$L1710",
"?fSequenceMethods@CActSequence@@3PAP6EXPAU1@@ZA": "?fSequenceMethods@@3PAP8CActSequence@@AEXXZA"
}
},
{ {
"name": "JSRF/Jet2", "name": "JSRF/Jet2",
"target_path": "target/JSRF/Jet2.obj", "target_path": "target/JSRF/Jet2.obj",
@ -23,19 +50,6 @@
"[.rdata-0]": "[.xdata$x-0]" "[.rdata-0]": "[.xdata$x-0]"
} }
}, },
{
"name": "JSRF/Action",
"target_path": "target/JSRF/Action.obj",
"base_path": "src/JSRF/Action.obj",
"metadata": {
"complete": false,
"source_path": "src/JSRF/Action.cpp"
},
"symbol_mappings": {
"?nopMethod0Arg@CActBase@@UAEXXZ": "?Exec0Default@CActBase@@UAEXXZ",
"?nopMethod1Arg@CActBase@@UAEXI@Z": "?DrawListDefault@CActBase@@UAEXI@Z"
}
},
{ {
"name": "JSRF/SaveData", "name": "JSRF/SaveData",
"target_path": "target/JSRF/SaveData.obj", "target_path": "target/JSRF/SaveData.obj",

View file

@ -0,0 +1,425 @@
/* JSRF Decompilation: JSRF/ActSequence.cpp
CActSequence class managing the top-level game logic.
*/
#pragma bss_seg(".data")
#include "ActSequence.hpp"
#include "SaveData.hpp"
// Array of methods forming state machine; m_dwNextMethod holds the index of
// the method to call in the exec phase
void (CActSequence::*fSequenceMethods[])() = {
&CActSequence::Init,
&CActSequence::LoadSprNorm,
&CActSequence::WaitLoadSprNorm,
&CActSequence::StartBuildCache,
&CActSequence::WaitDestructAct0x1,
&CActSequence::SwitchOnGlobal,
&CActSequence::LoadLogos,
&CActSequence::StartLogos,
&CActSequence::WaitDestructLogos,
&CActSequence::FreeLogos,
&CActSequence::PrepareTitle,
&CActSequence::SetGlobal,
&CActSequence::WaitEndTitle,
&CActSequence::SwitchOnGlobal,
&CActSequence::PrepareHandleTitleMenuSelection,
&CActSequence::PrepareLoadGameMenu,
&CActSequence::WaitEndLoadGameMenu,
&CActSequence::LoadTags_MAYBE,
&CActSequence::WaitLoadTags_MAYBE,
&CActSequence::StartHandleTitleMenuSelection,
&CActSequence::LoadFullRoboyMenu,
&CActSequence::StartFullRoboyMenu,
&CActSequence::WaitEndFullRoboyMenu,
&CActSequence::ReturnFromFullRoboyMenu,
&CActSequence::nop, // Guess these were dummied out
&CActSequence::nop,
&CActSequence::nop,
&CActSequence::nop,
&CActSequence::PrepareStoryOrVsMission,
&CActSequence::NopStoryOrVsMission,
&CActSequence::WaitEndStoryOrVsMission,
&CActSequence::ReturnFromStoryOrVsMission,
&CActSequence::PrepareTutorial,
&CActSequence::NopTutorial,
&CActSequence::WaitEndTutorial,
&CActSequence::ReturnFromTutorial,
&CActSequence::PrepareTestRun,
&CActSequence::NopTestRun,
&CActSequence::WaitEndTestRun,
&CActSequence::ReturnFromTestRun,
&CActSequence::PrepareUnused,
&CActSequence::NopUnused,
&CActSequence::WaitEndUnused,
&CActSequence::ReturnFromUnused,
&CActSequence::PrepareGraffitiMenu,
&CActSequence::WaitLoadGraffitiMenu,
&CActSequence::WaitEndGraffitiMenu,
&CActSequence::ReturnFromGraffitiMenu,
&CActSequence::NopStinger,
&CActSequence::PrepareStinger,
&CActSequence::WaitEndStinger,
&CActSequence::ReturnFromStinger,
&CActSequence::PrepareEnding,
&CActSequence::WaitLoadEnding,
&CActSequence::WaitEndEnding,
&CActSequence::ReturnFromEnding,
&CActSequence::PrepareVsMenu,
&CActSequence::WaitLoadVsMenu,
&CActSequence::WaitEndVsMenu,
&CActSequence::ReturnFromVsMenu,
&CActSequence::PrepareEndingSaveMenu,
&CActSequence::StartEndingSaveMenu,
&CActSequence::WaitEndEndingSaveMenu,
&CActSequence::ReturnFromEndingSaveMenu
};
// Address: 0x0007BC10
// Status: unimplemented
CActSequence::CActSequence(CActBase *lpParent, eACTID ActID, eACTFLAG ActFlag) :
CActBase(lpParent, ActID, ActFlag) {
}
// Address: 0x0007BC90
// Status: unimplemented
CActSequence::~CActSequence() {
}
// Address: 0x0007BDD0
// Status: matching
void CActSequence::Exec0Default() {
// Call queued state machine method
if (this->m_dwNextMethod < sizeof fSequenceMethods / sizeof *fSequenceMethods)
(this->*fSequenceMethods[this->m_dwNextMethod])();
// Increment save time for certain states
switch (this->m_dwNextMethod) {
case 0x14: case 0x15: case 0x16: case 0x17: case 0x18:
case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d:
case 0x1e: case 0x1f: case 0x20: case 0x21: case 0x22:
case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:
case 0x2c: case 0x2d: case 0x2e: case 0x2f:
g_SaveData.IncreasePlaytime();
}
}
// Eliminated by link time code generation (aliased with 0x0007BDD0)
void CActSequence::Exec0Event() {
this->Exec0Default();
}
// Eliminated by link time code generation (aliased with 0x0007BDD0)
void CActSequence::Exec0CoveredPause() {
this->Exec0Default();
}
// Eliminated by link time code generation (aliased with 0x0007BDD0)
void CActSequence::Exec0FreezeCam() {
this->Exec0Default();
}
// Eliminated by link time code generation (aliased with 0x0007BDD0)
void CActSequence::Exec0UncoveredPause() {
this->Exec0Default();
}
// Eliminated by link time code generation (aliased with 0x00011C90)
void CActSequence::nop() {
}
// Address: 0x0007BE30
// Status: unimplemented
void CActSequence::Init() {
}
// Address: 0x0007BFD0
// Status: unimplemented
void CActSequence::LoadSprNorm() {
}
// Address: 0x0007C020
// Status: unimplemented
void CActSequence::WaitLoadSprNorm() {
}
// Address: 0x0007C050
// Status: unimplemented
void CActSequence::StartBuildCache() {
}
// Address: 0x0007C070
// Status: unimplemented
void CActSequence::WaitDestructAct0x1() {
}
// Address: 0x0007C090
// Status: unimplemented
void CActSequence::LoadLogos() {
}
// Address: 0x0007C0D0
// Status: unimplemented
void CActSequence::StartLogos() {
}
// Address: 0x0007C110
// Status: unimplemented
void CActSequence::WaitDestructLogos() {
}
// Address: 0x0007C140
// Status: unimplemented
void CActSequence::FreeLogos() {
}
// Address: 0x0007C160
// Status: unimplemented
void CActSequence::PrepareTitle() {
}
// Address: 0x0007C230
// Status: unimplemented
void CActSequence::SetGlobal() {
}
// Address: 0x0007C250
// Status: unimplemented
void CActSequence::WaitEndTitle() {
}
// Address: 0x0007C270
// Status: unimplemented
void CActSequence::SwitchOnGlobal() {
}
// Address: 0x0007C290
// Status: unimplemented
void CActSequence::PrepareHandleTitleMenuSelection() {
}
// Address: 0x0007C410
// Status: unimplemented
void CActSequence::PrepareLoadGameMenu() {
}
// Address: 0x0007C450
// Status: unimplemented
void CActSequence::WaitEndLoadGameMenu() {
}
// Address: 0x0007C4B0
// Status: unimplemented
void CActSequence::LoadTags_MAYBE() {
}
// Address: 0x0007C510
// Status: unimplemented
void CActSequence::WaitLoadTags_MAYBE() {
}
// Address: 0x0007C560
// Status: unimplemented
void CActSequence::StartHandleTitleMenuSelection() {
}
// Address: 0x0007C600
// Status: unimplemented
void CActSequence::LoadFullRoboyMenu() {
}
// Address: 0x0007C720
// Status: unimplemented
void CActSequence::StartFullRoboyMenu() {
}
// Address: 0x0007C7E0
// Status: unimplemented
void CActSequence::WaitEndFullRoboyMenu() {
}
// Address: 0x0007C800
// Status: unimplemented
void CActSequence::ReturnFromFullRoboyMenu() {
}
// Address: 0x0007C9E0
// Status: unimplemented
void CActSequence::PrepareStoryOrVsMission() {
}
// Address: 0x0007CA60
// Status: unimplemented
void CActSequence::NopStoryOrVsMission() {
}
// Address: 0x0007CA70
// Status: unimplemented
void CActSequence::WaitEndStoryOrVsMission() {
}
// Address: 0x0007CA90
// Status: unimplemented
void CActSequence::ReturnFromStoryOrVsMission() {
}
// Address: 0x0007CAE0
// Status: unimplemented
void CActSequence::PrepareTutorial() {
}
// Address: 0x0007CBB0
// Status: unimplemented
void CActSequence::NopTutorial() {
}
// Address: 0x0007CBC0
// Status: unimplemented
void CActSequence::WaitEndTutorial() {
}
// Address: 0x0007CBE0
// Status: unimplemented
void CActSequence::ReturnFromTutorial() {
}
// Address: 0x0007CC40
// Status: unimplemented
void CActSequence::PrepareTestRun() {
}
// Address: 0x0007CD10
// Status: unimplemented
void CActSequence::NopTestRun() {
}
// Address: 0x0007CD20
// Status: unimplemented
void CActSequence::WaitEndTestRun() {
}
// Address: 0x0007CD40
// Status: unimplemented
void CActSequence::ReturnFromTestRun() {
}
// Address: 0x0007CDA0
// Status: unimplemented
void CActSequence::PrepareUnused() {
}
// Address: 0x0007CE70
// Status: unimplemented
void CActSequence::NopUnused() {
}
// Address: 0x0007CE80
// Status: unimplemented
void CActSequence::WaitEndUnused() {
}
// Address: 0x0007CEA0
// Status: unimplemented
void CActSequence::ReturnFromUnused() {
}
// Address: 0x0007CF00
// Status: unimplemented
void CActSequence::PrepareGraffitiMenu() {
}
// Address: 0x0007CFB0
// Status: unimplemented
void CActSequence::WaitLoadGraffitiMenu() {
}
// Address: 0x0007CFE0
// Status: unimplemented
void CActSequence::WaitEndGraffitiMenu() {
}
// Address: 0x0007D000
// Status: unimplemented
void CActSequence::ReturnFromGraffitiMenu() {
}
// Address: 0x0007D030
// Status: unimplemented
void CActSequence::PrepareVsMenu() {
}
// Address: 0x0007D080
// Status: unimplemented
void CActSequence::WaitLoadVsMenu() {
}
// Address: 0x0007D100
// Status: unimplemented
void CActSequence::WaitEndVsMenu() {
}
// Address: 0x0007D120
// Status: unimplemented
void CActSequence::ReturnFromVsMenu() {
}
// Address: 0x0007D1A0
// Status: unimplemented
void CActSequence::PrepareEndingSaveMenu() {
}
// Address: 0x0007D210
// Status: unimplemented
void CActSequence::StartEndingSaveMenu() {
}
// Address: 0x0007D270
// Status: unimplemented
void CActSequence::WaitEndEndingSaveMenu() {
}
// Address: 0x0007D290
// Status: unimplemented
void CActSequence::ReturnFromEndingSaveMenu() {
}
// Address: 0x0007D2D0
// Status: unimplemented
void CActSequence::PrepareEnding() {
}
// Address: 0x0007D320
// Status: unimplemented
void CActSequence::WaitLoadEnding() {
}
// Address: 0x0007D3D0
// Status: unimplemented
void CActSequence::WaitEndEnding() {
}
// Address: 0x0007D3F0
// Status: unimplemented
void CActSequence::ReturnFromEnding() {
}
// Address: 0x0007D450
// Status: unimplemented
void CActSequence::NopStinger() {
}
// Address: 0x0007D460
// Status: unimplemented
void CActSequence::PrepareStinger() {
}
// Address: 0x0007D520
// Status: unimplemented
void CActSequence::WaitEndStinger() {
}
// Address: 0x0007D540
// Status: unimplemented
void CActSequence::ReturnFromStinger() {
}

View file

@ -0,0 +1,90 @@
/* JSRF Decompilation: JSRF/ActSequence.hpp
CActSequence class managing the top-level game logic.
*/
#ifndef ACTSEQUENCE_HPP
#define ACTSEQUENCE_HPP
#include "Action.hpp"
#include "../XDK/Win32.h"
struct CActSequence : CActBase {
DWORD m_dwChapterBackup; // Holds chapter to return to
DWORD m_dwNextMethod; // Next method to call in state machine
CActSequence(CActBase *lpParent, eACTID ActID, eACTFLAG Flags);
virtual ~CActSequence();
void Exec0Default();
void Exec0Event();
void Exec0CoveredPause();
void Exec0FreezeCam();
void Exec0UncoveredPause();
void nop();
// Methods forming state machine
void Init();
void LoadSprNorm();
void WaitLoadSprNorm();
void StartBuildCache();
void WaitDestructAct0x1();
void LoadLogos();
void StartLogos();
void WaitDestructLogos();
void FreeLogos();
void PrepareTitle();
void SetGlobal();
void WaitEndTitle();
void SwitchOnGlobal();
void PrepareHandleTitleMenuSelection();
void PrepareLoadGameMenu();
void WaitEndLoadGameMenu();
void LoadTags_MAYBE();
void WaitLoadTags_MAYBE();
void StartHandleTitleMenuSelection();
void LoadFullRoboyMenu();
void StartFullRoboyMenu();
void WaitEndFullRoboyMenu();
void ReturnFromFullRoboyMenu();
void PrepareStoryOrVsMission();
void NopStoryOrVsMission();
void WaitEndStoryOrVsMission();
void ReturnFromStoryOrVsMission();
void PrepareTutorial();
void NopTutorial();
void WaitEndTutorial();
void ReturnFromTutorial();
void PrepareTestRun();
void NopTestRun();
void WaitEndTestRun();
void ReturnFromTestRun();
void PrepareUnused();
void NopUnused();
void WaitEndUnused();
void ReturnFromUnused();
void PrepareGraffitiMenu();
void WaitLoadGraffitiMenu();
void WaitEndGraffitiMenu();
void ReturnFromGraffitiMenu();
void PrepareVsMenu();
void WaitLoadVsMenu();
void WaitEndVsMenu();
void ReturnFromVsMenu();
void PrepareEndingSaveMenu();
void StartEndingSaveMenu();
void WaitEndEndingSaveMenu();
void ReturnFromEndingSaveMenu();
void PrepareEnding();
void WaitLoadEnding();
void WaitEndEnding();
void ReturnFromEnding();
void NopStinger();
void PrepareStinger();
void WaitEndStinger();
void ReturnFromStinger();
};
#endif

View file

@ -14,6 +14,7 @@ HEADERS="
XDK/D3D.h XDK/D3D.h
MUSASHI/MMatrix.hpp MUSASHI/MMatrix.hpp
JSRF/Action.hpp JSRF/Action.hpp
JSRF/ActSequence.hpp
JSRF/SaveData.hpp JSRF/SaveData.hpp
" "

View file

@ -2,6 +2,7 @@ Object,Delink?,.text,.text$yc,.text$yd,.text$x,D3D,DSOUND,MMATRIX,XGRPH,XPP,.rda
JSRF/Action.obj,true,0x00011000-0x00013FEB,,,0x00186BA0-0x00186C14,,,,,,0x001C4390-0x001C44F9,0x001E4D20-0x001E4DAB,,0x001EB880-0x001EB933, JSRF/Action.obj,true,0x00011000-0x00013FEB,,,0x00186BA0-0x00186C14,,,,,,0x001C4390-0x001C44F9,0x001E4D20-0x001E4DAB,,0x001EB880-0x001EB933,
JSRF/SaveData.obj,true,0x00039B50-0x0003B937,0x0018AD60-0x0018AD75,0x0018C9A0-0x0018C9AA,,,,,,,0x001CA16C-0x001CA3DB,,0x001EB790-0x001EB793,0x001EFC88-0x001F7047, JSRF/SaveData.obj,true,0x00039B50-0x0003B937,0x0018AD60-0x0018AD75,0x0018C9A0-0x0018C9AA,,,,,,,0x001CA16C-0x001CA3DB,,0x001EB790-0x001EB793,0x001EFC88-0x001F7047,
JSRF/Jet2.obj,true,0x0006F9E0-0x0006FA6F,,,0x00187710-0x00187724,,,,,,,0x001E620C-0x001E622F,,0x0022FCE0-0x0022FCE3, JSRF/Jet2.obj,true,0x0006F9E0-0x0006FA6F,,,0x00187710-0x00187724,,,,,,,0x001E620C-0x001E622F,,0x0022FCE0-0x0022FCE3,
JSRF/ActSequence.obj,true,0x0007BC10-0x0007D5CF,,,0x00187C70-0x00187CD4,,,,,,0x001CCEB8-0x001CCEF7,0x001E67EC-0x001E69CF,,0x0020D2B8-0x0020D3B7,
ADX (need to decompose),false,0x0013A570-0x0014555F,?,?,?,?,,,,,,?,?,?, ADX (need to decompose),false,0x0013A570-0x0014555F,?,?,?,?,,,,,,?,?,?,
Xapi (need to decompose),false,0x00145560-0x0014B79F,?,?,?,?,,,,,,?,?,?, Xapi (need to decompose),false,0x00145560-0x0014B79F,?,?,?,?,,,,,,?,?,?,
XDK/Xapi/xapi0.obj,true,0x00147FB4-0x0014807C,,,,,,,,,,,,, XDK/Xapi/xapi0.obj,true,0x00147FB4-0x0014807C,,,,,,,,,,,,,

1 Object Delink? .text .text$yc .text$yd .text$x D3D DSOUND MMATRIX XGRPH XPP .rdata .rdata$x .data$CRT .data DOLBY
2 JSRF/Action.obj true 0x00011000-0x00013FEB 0x00186BA0-0x00186C14 0x001C4390-0x001C44F9 0x001E4D20-0x001E4DAB 0x001EB880-0x001EB933
3 JSRF/SaveData.obj true 0x00039B50-0x0003B937 0x0018AD60-0x0018AD75 0x0018C9A0-0x0018C9AA 0x001CA16C-0x001CA3DB 0x001EB790-0x001EB793 0x001EFC88-0x001F7047
4 JSRF/Jet2.obj true 0x0006F9E0-0x0006FA6F 0x00187710-0x00187724 0x001E620C-0x001E622F 0x0022FCE0-0x0022FCE3
5 JSRF/ActSequence.obj true 0x0007BC10-0x0007D5CF 0x00187C70-0x00187CD4 0x001CCEB8-0x001CCEF7 0x001E67EC-0x001E69CF 0x0020D2B8-0x0020D3B7
6 ADX (need to decompose) false 0x0013A570-0x0014555F ? ? ? ? ? ? ?
7 Xapi (need to decompose) false 0x00145560-0x0014B79F ? ? ? ? ? ? ?
8 XDK/Xapi/xapi0.obj true 0x00147FB4-0x0014807C

View file

@ -2,8 +2,8 @@
A matching decompilation of the Xbox game Jet Set Radio Future. A matching decompilation of the Xbox game Jet Set Radio Future.
## Progress ## Progress
- Delinking progress: 1.03% (26559 out of 2574172 bytes in XBE address space) - Delinking progress: 1.32% (34051 out of 2574172 bytes in XBE address space)
- Decompilation progress: 19.6% (33 out of the 168 functions delinked so far) - Decompilation progress: 14.6% (37 out of the 241 delinked code symbols)
- **Estimated total progress: 0.20%** (previous two multiplied together) - **Estimated total progress: 0.20%** (previous two multiplied together)
## Roadmap ## Roadmap