JSRF-Decompilation/decompile/src/JSRF/Core.hpp
KeybadeBlox e58f774d82 Add various data structures
Stuff needed to get Core.obj delinking again.
2026-03-20 23:29:02 -04:00

549 lines
14 KiB
C++

/* JSRF Decompilation: JSRF/Core.hpp
Game and GameObj classes that form the foundation of the JSRF game code.
*/
#ifndef CORE_HPP
#define CORE_HPP
#include "../MUSASHI/MMatrix.hpp"
#include "../XDK/CRT/stddef.h"
#include "../XDK/D3D.h"
#include "../XDK/Win32.h"
// TODO; move to header for Graphics COM object in Smilebit libraries
struct GraphicsPerformanceCounters {
unsigned fps;
unsigned trianglesPerSecond;
unsigned frameTriangleCnt;
unsigned unknown0xC;
unsigned unknown0x10;
unsigned unknown0x14;
};
// TODO: Just here to get delinking working until we make dedicated source
// files for these classes
struct CollisionManager {
CollisionManager();
virtual ~CollisionManager();
};
struct UnknownGlobal {
UnknownGlobal();
virtual ~UnknownGlobal();
};
struct UnknownStatic02 {
UnknownStatic02();
virtual ~UnknownStatic02();
};
struct UnknownStatic04 {
UnknownStatic04();
virtual ~UnknownStatic04();
};
struct UnknownStatic05 {
UnknownStatic05();
virtual ~UnknownStatic05();
};
struct UnknownStatic06 {
UnknownStatic06();
virtual ~UnknownStatic06();
};
struct UnknownStatic07 {
UnknownStatic07();
virtual ~UnknownStatic07();
};
struct UnknownStatic09 {
UnknownStatic09();
virtual ~UnknownStatic09();
};
struct UnknownStatic13 {
char unknown1[0x274];
void * unknown2;
void * unknown3;
};
struct UnknownStatic16 {
UnknownStatic16();
virtual ~UnknownStatic16();
};
struct UnknownStatic17 {
UnknownStatic17();
virtual ~UnknownStatic17();
};
struct UnknownStatic18 {
UnknownStatic18();
virtual ~UnknownStatic18();
};
struct UnknownStatic19 {
UnknownStatic19();
virtual ~UnknownStatic19();
};
struct UnknownStatic24 {
UnknownStatic24();
virtual ~UnknownStatic19();
};
struct UnknownStatic27 {
UnknownStatic27();
virtual ~UnknownStatic27();
void * unknown[3];
};
struct GraphicsSetting {
unsigned countedIfZero;
char * name;
D3DVECTOR unknown;
float value;
unsigned index;
};
struct GraphicsSettings {
float * settings;
unsigned settingsArrSizeInBytes;
unsigned unknown1;
unsigned unknown2;
unsigned srcArrZeroCnt;
GraphicsSetting * srcItemsMarked0;
unsigned * offsetsFromPrevSrcItemMarked0;
};
enum GraphicsSettingType {
GST_WARP = 0x0,
GST_WARP_X = 0x1,
GST_WARP_Y = 0x2,
GST_WARP_Z = 0x3,
GST_GO = 0x4,
GST_MEMORY = 0x5,
GST_DRAW = 0x6,
GST_COLOR = 0x7,
GST_COLOR_R = 0x8,
GST_COLOR_G = 0x9,
GST_COLOR_B = 0xa,
GST_AMBIENT = 0xb,
GST_AMBIENT_R = 0xc,
GST_AMBIENT_G = 0xd,
GST_AMBIENT_B = 0xe,
GST_SHADOWCOLOR = 0xf,
GST_SHADOWCOLOR_A = 0x10,
GST_SHADOWCOLOR_R = 0x11,
GST_SHADOWCOLOR_G = 0x12,
GST_SHADOWCOLOR_B = 0x13,
GST_BGCOLOR = 0x14,
GST_BGCOLOR_R = 0x15,
GST_BGCOLOR_G = 0x16,
GST_BGCOLOR_B = 0x17,
GST_MIPMAPLOD = 0x18,
GST_MIPMAPLOD_BIAS = 0x19,
GST_G_CONTRAST = 0x1a,
GST_G_CONTRAST_R = 0x1b,
GST_G_CONTRAST_G = 0x1c,
GST_G_CONTRAST_B = 0x1d,
GST_G_LUMINANCE = 0x1e,
GST_G_LUMINANCE_R = 0x1f,
GST_G_LUMINANCE_G = 0x20,
GST_G_LUMINANCE_B = 0x21,
GST_GRIND = 0x22,
GST_GRIND_NS = 0x23,
GST_GRIND_XS = 0x24,
GST_GRIND_NR = 0x25,
GST_GRIND_XR = 0x26,
GST_GIZA_NO = 0x27,
GST_GIZA_NO_T = 0x28,
GST_GIZA_SPEED = 0x29,
GST_GIZA_SPEED_R = 0x2a,
GST_GIZA_SPEED_T = 0x2b,
GST_GIZA_SPEED_S = 0x2c,
GST_GIZA_GRIND = 0x2d,
GST_GIZA_GRIND_R = 0x2e,
GST_GIZA_GRIND_T = 0x2f,
GST_GIZA_GRIND_S = 0x30,
GST_GIZA_NORMAL = 0x31,
GST_GIZA_NORMAL_R = 0x32,
GST_GIZA_NORMAL_T = 0x33,
GST_GIZA_NORMAL_S = 0x34,
GST_GIZA_SDASH = 0x35,
GST_GIZA_SDASH_R = 0x36,
GST_GIZA_SDASH_T = 0x37,
GST_GIZA_SDASH_S = 0x38,
GST_GIZA_CAMZ = 0x39,
GST_GIZA_CAMZ_ND = 0x3a,
GST_GIZA_CAMZ_XD = 0x3b,
GST_GIZA_CAMZ_NR = 0x3c,
GST_GIZA_CAMZ_XR = 0x3d,
GST_GIZA_CAMTRT = 0x3e,
GST_GIZA_CAMTRT_ND = 0x3f,
GST_GIZA_CAMTRT_XD = 0x40,
GST_GIZA_CAMTRT_NR = 0x41,
GST_GIZA_CAMTRT_XR = 0x42,
GST_GIZA_CAMANG_NA = 0x43,
GST_GIZA_CAMANG_XA = 0x44,
GST_GIZA_CAMANG_NR = 0x45,
GST_GIZA_CAMANG_XR = 0x46,
GST_GIZA_MESH = 0x47,
GST_GIZA_MESH_IP = 0x48,
GST_GIZA_MESH_AP = 0x49,
GST_GIZA_MESH_BA = 0x4a,
GST_GIZA_CAMALPHA = 0x4b,
GST_GIZA_CAMALPHA_ENABLE = 0x4c,
GST_DIST = 0x4d,
GST_FOG = 0x4e,
GST_FOG_ENABLE = 0x4f,
GST_FOG_R = 0x50,
GST_FOG_G = 0x51,
GST_FOG_B = 0x52,
GST_FOG_RANGE = 0x53,
GST_FOG_RANGE_NEAR = 0x54,
GST_FOG_RANGE_FAR = 0x55,
GST_POWER = 0x56,
GST_WIRE_FRAME = 0x57,
GST_WIRE_FRAME_ENABLE = 0x58,
GST_TEXTURE = 0x59,
GST_TEXTURE_NO = 0x5a,
GST_SCREENGAUGE = 0x5b,
GST_SCREENGAUGE_ENABLE = 0x5c,
GST_OWARI = 0x5d,
GST_COUNT = 0x5e,
};
enum GameObjFlags {
GOF_DRAWTREEHEAD = 1 << 0,
GOF_SKIPDRAWINGSOMETHING = 1 << 1,
GOF_NODRAWPHASE2 = 1 << 16,
GOF_DRAWTREE2 = 1 << 18,
GOF_DRAWPHASE1 = 1 << 22,
GOF_DRAWTREECHILD = 1 << 30,
GOF_DELETEAFTEREXEC = 1 << 31
};
// Position in g_game->objects array
// Different indices and ranges are dedicated to different kinds of
// objecs.
enum GameObjIndex {
OBJ_NOTINDEXED = -1, // Not stored in array
OBJ_DIRECTOR = 0,
// TODO
OBJ_CNT = 0x1DF4
};
// Base class of most objects (and everything in g_game->objects)
struct GameObj {
GameObjFlags flags;
GameObjIndex index;
unsigned otherBitfield;
float reverseSortKey; // Sign flipped to produced sortKey
unsigned sortKey; // Four-level key, one byte each
D3DVECTOR someTranslation;
// Links forming a tree of objects for exec phase
GameObj * parent;
GameObj * firstChild;
GameObj * prevSibling;
GameObj * nextSibling;
// Some data structures used for draw phrase
GameObj * nextDrawTree;
GameObj * * prevDrawTreeNext;
GameObj * * * lastDrawTreeNextPtr;
GameObj * drawPriorityListNext;
virtual ~GameObj();
void recursiveExecDefault();
void drawListDefault(
GameObjFlags flagFilterAny1,
int drawArg1,
int drawArg2,
GameObjFlags flagFilterAll,
unsigned otherBitfieldFilterAny,
GameObjFlags flagFilterNone,
GameObjFlags flagFilterAny2
);
void drawTreeDefault1();
void drawTreeDefault2();
void recursiveExecEvent();
void drawListEvent(
GameObjFlags flagFilterAny1,
int drawArg1,
int drawArg2,
GameObjFlags flagFilterAll,
unsigned otherBitfieldFilterAny,
GameObjFlags flagFilterNone,
GameObjFlags flagFilterAny2
);
void drawTreeEvent1();
void drawTreeEvent2();
void recursiveExecCoveredPause();
void drawListCoveredPause(
GameObjFlags flagFilterAny1,
int drawArg1,
int drawArg2,
GameObjFlags flagFilterAll,
unsigned otherBitfieldFilterAny,
GameObjFlags flagFilterNone,
GameObjFlags flagFilterAny2
);
void drawTreeCoveredPause1();
void drawTreeCoveredPause2();
void recursiveExecFreezeCam();
void drawListFreezeCam(
GameObjFlags flagFilterAny1,
int drawArg1,
int drawArg2,
GameObjFlags flagFilterAll,
unsigned otherBitfieldFilterAny,
GameObjFlags flagFilterNone,
GameObjFlags flagFilterAny2
);
void drawTreeFreezeCam1();
void drawTreeFreezeCam2();
void recursiveExecUncoveredPause();
void drawListUncoveredPause(
GameObjFlags flagFilterAny1,
int drawArg1,
int drawArg2,
GameObjFlags flagFilterAll,
unsigned otherBitfieldFilterAny,
GameObjFlags flagFilterNone,
GameObjFlags flagFilterAny2
);
void drawTreeUncoveredPause1();
void drawTreeUncoveredPause2();
void addToSiblings(GameObj * sibling, GameObj * parent);
void destructChildren(GameObj * firstChild);
GameObj * getParent();
void removeFromObjList (GameObj * obj);
void removeChildrenFromObjList(GameObj * firstChild);
// Each frame, one of these trios of methods is called depending on
// which state the game is in
// Default implementation of each does nothing; inheriting objects
// override these methods to run some code during each phase of each
// frame.
virtual void execDefault();
virtual void postExecDefault();
virtual void drawDefault(unsigned);
virtual void execEvent();
virtual void postExecEvent();
virtual void drawEvent(unsigned);
virtual void execCoveredPause();
virtual void postExecCoveredPause();
virtual void drawCoveredPause(unsigned);
virtual void execFreezeCam();
virtual void postExecFreezeCam();
virtual void drawFreezeCam(unsigned);
virtual void execUncoveredPause();
virtual void postExecUncoveredPause();
virtual void drawUncoveredPause(unsigned);
void recursivePostExecDefault();
void recursivePostExecEvent();
void recursivePostExecCoveredPause();
void recursivePostExecFreezeCam();
void recursivePostExecUncoveredPause();
void setParent(GameObj * parent);
GameObj(GameObj * parent, GameObjIndex index, GameObjFlags flags);
};
// There's a big array of possible arguments for draw methods with these
struct DrawFuncArgs {
GameObjFlags flagFilterAny;
int arg1;
int arg2;
};
// Base class of objects serving as the head of a tree of objects to draw
// recursively
struct DrawTree : GameObj {
D3DVECTOR unknown0x44;
D3DVECTOR unknown0x50;
D3DVECTOR unknown0x5C;
D3DVECTOR unknown0x68;
unsigned unknown0x74;
unsigned unknown0x78;
unsigned unknown0x7C;
unsigned unknown0x80;
D3DRECT viewport;
unsigned someIndex;
void copySomeVectors();
DrawTree(GameObj * parent, GameObjIndex index, GameObjFlags flags);
virtual ~DrawTree();
};
struct PlayerObj : GameObj {
unsigned unknown0x44;
unsigned unknown0x48;
PlayerObj(GameObj * parent, GameObjIndex index, GameObjFlags flags);
virtual ~PlayerObj();
};
// Top-level globally-accessible "god object" that runs the main loop and
// provides global access to most other objects and many variables
enum DrawMode {
DRAW_YES,
DRAW_WAITVBLANK,
DRAW_NO
};
enum GlobalIndex {
};
#pragma pack(4)
struct Game {
char unknown0x4[4];
unsigned unknown0x8;
unsigned * unknown0xC;
int initState;
unsigned unknown0x14;
BOOL drawProfilingInfo;
int unknown0x1C;
BOOL logosStarted;
BOOL fatalErr;
D3DCOLOR colour;
D3DCOLOR ambientColour;
D3DCOLOR shadowColour;
D3DCOLOR bgColour;
D3DCOLOR bgColourFallback;
BOOL useFallbackBgColour;
// Game state used to select GameObj methods to call in main loop
// If multiple states are activated, the precedence is
// coveredPause > Event > FreezeCam > UncoveredPause > Default
BOOL coveredPause; // Game paused with world not visible
BOOL event; // Events (cutscenes)
BOOL freezeCam; // Time-frozen camera shots
BOOL uncoveredPause; // Game paused with world visible, or
// automatic pause at start of mission
BOOL coveredPauseNextFrame;
BOOL noCoveredPauseNextFrame;
BOOL eventNextFrame;
BOOL noEventNextFrame;
BOOL freezeCamNextFrame;
BOOL noFreezeCamNextFrame;
BOOL uncoveredPauseNextFrame;
BOOL noUncoveredPauseNextFrame;
BOOL drawChildren;
BOOL skipDraw;
BOOL runSomeExtraDrawListCode;
GraphicsPerformanceCounters perfCounters;
DrawMode drawMode;
// Globally accessible objects and variables
GameObj * objects[7668];
unsigned globals[461]; // Items may be any 32-bit type, e.g. ptr
DrawTree * drawTreesHead;
DrawTree * * drawTreesEndNext;
GameObj * drawListHead;
GameObj * * drawListEndNext;
GameObj * drawPriorityListHead;
GameObj * * drawPriorityListEndNext;
GameObj * drawPriorityListsByKeyHeads [256];
GameObj * * drawPriorityListsByKeyEndNexts[256];
unsigned unknown0x87B4;
LARGE_INTEGER execPerfCount;
LARGE_INTEGER drawPerfCount;
unsigned unknown0x87C8;
unsigned unknown0x87CC;
unsigned frameCnt1;
unsigned unknown0x87D4;
unsigned unknown0x87D8;
GameObj * rootExecObj;
int frameCnt2;
int frameCnt3;
unsigned gameObjCnt;
DrawTree * currentDrawTree;
GameObjIndex currentDrawTreeIndex;
int unknown0x87F4;
Mat4 parentMatrix;
unsigned unknown0x8838;
unsigned unknown0x883C;
Game(unsigned *, unsigned);
virtual ~Game();
void exec();
void drawObj(GameObj * obj, unsigned);
void drawList_(
GameObjFlags flagFilterAny1,
int drawArg1,
int drawArg2,
GameObjFlags flagFilterAll,
unsigned otherBitfieldFilterAny,
GameObjFlags flagFilterNone,
GameObjFlags flagFilterAny2
);
void drawTree1(GameObj * obj);
void setCoveredPauseNextFrame (BOOL val);
void setEventNextFrame (BOOL val);
void setFreezeCamNextFrame (BOOL val);
void setUncoveredPauseNextFrame(BOOL val);
void enableDrawChildren();
void enableSkipDraw();
void fatal();
void setDrawMode(DrawMode mode);
void setGlobal(GlobalIndex index, unsigned val);
unsigned getGlobal(GlobalIndex index);
void addToDrawList (GameObj * obj);
void removeFromDrawList(GameObj * obj);
void setObj (GameObjIndex index , GameObj * obj);
void unsetObj (GameObjIndex index );
GameObj * getObj (GameObjIndex index );
int allocObjIndex(GameObjIndex min , GameObjIndex max);
BOOL objIndexAvail(GameObjIndex index );
void swapObjs (GameObjIndex index1, GameObjIndex index2);
void clearScreen();
void enableSomeExtraDrawListCode();
void setLogosStarted(BOOL val);
void clearDrawPriorityList();
GameObj * getDrawPriorityListHead();
void appendToDrawPriorityList(GameObj * obj);
void sortDrawPriorityListSingleLevel(unsigned char sortKeyBitOffset);
void setFallbackBgColour(D3DCOLOR colour, BOOL useFallback);
void initRootExecObj();
void drawList(GameObjFlags flagFilterAll, BOOL);
void sortDrawPriorityList();
void drawObjs();
void draw();
void frame();
int mainLoop();
};
extern Game * g_game;
// Root of the exec GameObj tree
struct RootExecObj : GameObj {
RootExecObj(GameObj * parent, GameObjIndex index, GameObjFlags flags);
virtual ~RootExecObj();
};
void removeFromObjListByIndex(GameObjIndex index);
#endif