From 4a5eba0290e0fb77d762934a50247d1e6cdd36e5 Mon Sep 17 00:00:00 2001 From: SomeJakeGuy Date: Mon, 24 Aug 2026 02:49:31 -0400 Subject: [PATCH 1/8] Renamed TBaseParams to have their members start with m. Added the Type of param based on reading the source file structure. --- include/Koga/BaseParam.hpp | 7 ++++--- src/Koga/Param.cpp | 16 ++++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/include/Koga/BaseParam.hpp b/include/Koga/BaseParam.hpp index a8f5b12..19dd42d 100644 --- a/include/Koga/BaseParam.hpp +++ b/include/Koga/BaseParam.hpp @@ -13,9 +13,10 @@ class TBaseParam { // Seems to be replaced by JDrama::TNameRef::calcKeyCode in SMS static u16 calcKeyCode(const char* pFileName); - TBaseParam* next; - const char* name; - u16 keyCode; + /* 0x4 */ TBaseParam* mNext; + /* 0x8 */ const char* mName; + /* 0xC */ u16 mHash; + /* 0xE */ u16 mType; }; #endif diff --git a/src/Koga/Param.cpp b/src/Koga/Param.cpp index 00b6ce2..9733d50 100644 --- a/src/Koga/Param.cpp +++ b/src/Koga/Param.cpp @@ -3,17 +3,17 @@ TBaseParam::TBaseParam(TParams* params, const char* paramName, unsigned short code) - : keyCode(code) - , name(paramName) - , next(nullptr) + : mHash(code) + , mName(paramName) + , mNext(nullptr) { TBaseParam* root = params->mHead; if (root != nullptr) { TBaseParam* param = root; - while (param->next != nullptr) { - param = param->next; + while (param->mNext != nullptr) { + param = param->mNext; } - param->next = this; + param->mNext = this; return; } @@ -34,8 +34,8 @@ void TParams::load(JSUMemoryInputStream& stream) stream.readString(buffer, 0x50); TBaseParam* param; - for (param = mHead; param != nullptr; param = param->next) { - if (keyCode == param->keyCode && !strcmp(buffer, param->name)) { + for (param = mHead; param != nullptr; param = param->mNext) { + if (keyCode == param->mHash && !strcmp(buffer, param->mName)) { param->load(stream); break; } From edbd323c60a241e89f6b31c76a2c84405ff35f24 Mon Sep 17 00:00:00 2001 From: SomeJakeGuy Date: Sat, 29 Aug 2026 03:39:40 -0400 Subject: [PATCH 2/8] Initial EnTypesManager split. EnemyParam array sub-class, as well as various EnemyParam functions. --- config/GLME01/splits.txt | 6 +- config/GLME01/symbols.txt | 70 +++++++------- configure.py | 1 + include/Koga/EnTypesManager.hpp | 82 +++++++++++++++- src/Koga/EnTypesManager.cpp | 160 ++++++++++++++++++++++++++++++++ 5 files changed, 279 insertions(+), 40 deletions(-) create mode 100644 src/Koga/EnTypesManager.cpp diff --git a/config/GLME01/splits.txt b/config/GLME01/splits.txt index 04d4cc7..e6eaf16 100644 --- a/config/GLME01/splits.txt +++ b/config/GLME01/splits.txt @@ -134,10 +134,14 @@ Sato/EnemyStrategy.cpp: .sdata start:0x804D2E60 end:0x804D2E78 Koga/EnAttackBase.cpp: - .text start:0x800CF63C end:0x800CF6A8 + .text start:0x800CF63C end:0x800CF854 + .ctors start:0x8020BBD8 end:0x8020BBDC .data start:0x80361E78 end:0x80361FA4 .sdata start:0x804D3AF8 end:0x804D3B20 +Koga/EnTypesManager.cpp: + .text start:0x800DA498 end:0x800DB084 + Koga/EnManager.cpp: .text start:0x800E4514 end:0x800E9DC8 .ctors start:0x8020BC28 end:0x8020BC30 diff --git a/config/GLME01/symbols.txt b/config/GLME01/symbols.txt index 29e6ad2..5be0aa1 100644 --- a/config/GLME01/symbols.txt +++ b/config/GLME01/symbols.txt @@ -4204,11 +4204,11 @@ fn_800DA26C = .text:0x800DA26C; // type:function size:0x34 fn_800DA2A0 = .text:0x800DA2A0; // type:function size:0x140 fn_800DA3E0 = .text:0x800DA3E0; // type:function size:0x1C fn_800DA3FC = .text:0x800DA3FC; // type:function size:0x9C -fn_800DA498 = .text:0x800DA498; // type:function size:0x47C -fn_800DA914 = .text:0x800DA914; // type:function size:0x64 +__ct__10EnemyParamFv = .text:0x800DA498; // type:function size:0x47C +__dt__Q24Koga14EnTypesManagerFv = .text:0x800DA914; // type:function size:0x64 newManager__Q24Koga14EnTypesManagerFv = .text:0x800DA978; // type:function size:0x74 deleteManager__Q24Koga14EnTypesManagerFv = .text:0x800DA9EC; // type:function size:0x44 -loadParameters__Q24Koga14EnTypesManagerFv = .text:0x800DAA30; // type:function size:0xC8 +loadCTPParams__Q24Koga14EnTypesManagerFv = .text:0x800DAA30; // type:function size:0xC8 fn_800DAAF8 = .text:0x800DAAF8; // type:function size:0x20 fn_800DAB18 = .text:0x800DAB18; // type:function size:0x8C fn_800DABA4 = .text:0x800DABA4; // type:function size:0x70 @@ -4217,32 +4217,32 @@ fn_800DAC54 = .text:0x800DAC54; // type:function size:0x18 fn_800DAC6C = .text:0x800DAC6C; // type:function size:0x18 fn_800DAC84 = .text:0x800DAC84; // type:function size:0x7C fn_800DAD00 = .text:0x800DAD00; // type:function size:0x90 -fn_800DAD90 = .text:0x800DAD90; // type:function size:0x18 -fn_800DADA8 = .text:0x800DADA8; // type:function size:0x18 -fn_800DADC0 = .text:0x800DADC0; // type:function size:0x18 -fn_800DADD8 = .text:0x800DADD8; // type:function size:0x18 -fn_800DADF0 = .text:0x800DADF0; // type:function size:0x18 -fn_800DAE08 = .text:0x800DAE08; // type:function size:0x18 -fn_800DAE20 = .text:0x800DAE20; // type:function size:0x18 -fn_800DAE38 = .text:0x800DAE38; // type:function size:0x18 -fn_800DAE50 = .text:0x800DAE50; // type:function size:0x18 -fn_800DAE68 = .text:0x800DAE68; // type:function size:0x18 -fn_800DAE80 = .text:0x800DAE80; // type:function size:0x18 -fn_800DAE98 = .text:0x800DAE98; // type:function size:0x18 -fn_800DAEB0 = .text:0x800DAEB0; // type:function size:0x18 -fn_800DAEC8 = .text:0x800DAEC8; // type:function size:0x18 -fn_800DAEE0 = .text:0x800DAEE0; // type:function size:0x18 -fn_800DAEF8 = .text:0x800DAEF8; // type:function size:0x18 -fn_800DAF10 = .text:0x800DAF10; // type:function size:0x18 -fn_800DAF28 = .text:0x800DAF28; // type:function size:0x18 -fn_800DAF40 = .text:0x800DAF40; // type:function size:0x18 -fn_800DAF58 = .text:0x800DAF58; // type:function size:0x18 -fn_800DAF70 = .text:0x800DAF70; // type:function size:0x28 -fn_800DAF98 = .text:0x800DAF98; // type:function size:0x28 -fn_800DAFC0 = .text:0x800DAFC0; // type:function size:0x18 -fn_800DAFD8 = .text:0x800DAFD8; // type:function size:0x18 -fn_800DAFF0 = .text:0x800DAFF0; // type:function size:0x18 -fn_800DB008 = .text:0x800DB008; // type:function size:0x2C +getEnemyLife__Q24Koga14EnTypesManagerFi = .text:0x800DAD90; // type:function size:0x18 +getEnemyHitDamage__Q24Koga14EnTypesManagerFi = .text:0x800DADA8; // type:function size:0x18 +getEnemySpeed__Q24Koga14EnTypesManagerFi = .text:0x800DADC0; // type:function size:0x18 +getEnemySpeedUnseen__Q24Koga14EnTypesManagerFi = .text:0x800DADD8; // type:function size:0x18 +getEnemySpeedFight__Q24Koga14EnTypesManagerFi = .text:0x800DADF0; // type:function size:0x18 +getEnemyEyesight__Q24Koga14EnTypesManagerFi = .text:0x800DAE08; // type:function size:0x18 +getEnemyLightBindFrame__Q24Koga14EnTypesManagerFi = .text:0x800DAE20; // type:function size:0x18 +getEnemyMinLightBindRange__Q24Koga14EnTypesManagerFi = .text:0x800DAE38; // type:function size:0x18 +getEnemyMaxLightBindRange__Q24Koga14EnTypesManagerFi = .text:0x800DAE50; // type:function size:0x18 +getEnemyPointerRange__Q24Koga14EnTypesManagerFi = .text:0x800DAE68; // type:function size:0x18 +getEnemyNumAtKarakai__Q24Koga14EnTypesManagerFi = .text:0x800DAE80; // type:function size:0x18 +getEnemyNumAtOrooro__Q24Koga14EnTypesManagerFi = .text:0x800DAE98; // type:function size:0x18 +getEnemyHikiPower__Q24Koga14EnTypesManagerFi = .text:0x800DAEB0; // type:function size:0x18 +getEnemyEffectiveDeg__Q24Koga14EnTypesManagerFi = .text:0x800DAEC8; // type:function size:0x18 +getEnemyTsuriHeight__Q24Koga14EnTypesManagerFi = .text:0x800DAEE0; // type:function size:0x18 +getEnemyActAfterAttackSu__Q24Koga14EnTypesManagerFi = .text:0x800DAEF8; // type:function size:0x18 +getEnemyActAfterAttackFa__Q24Koga14EnTypesManagerFi = .text:0x800DAF10; // type:function size:0x18 +getEnemyNormalItemTblId__Q24Koga14EnTypesManagerFi = .text:0x800DAF28; // type:function size:0x18 +getEnemyTsuriItemTblId__Q24Koga14EnTypesManagerFi = .text:0x800DAF40; // type:function size:0x18 +getEnemyDisappearFrame__Q24Koga14EnTypesManagerFi = .text:0x800DAF58; // type:function size:0x18 +getEnemyBrightColor__Q24Koga14EnTypesManagerFi = .text:0x800DAF70; // type:function size:0x28 +getEnemyAmbColor__Q24Koga14EnTypesManagerFi = .text:0x800DAF98; // type:function size:0x28 +getEnemyAttackPattern1__Q24Koga14EnTypesManagerFi = .text:0x800DAFC0; // type:function size:0x18 +getEnemyTsuriType__Q24Koga14EnTypesManagerFi = .text:0x800DAFD8; // type:function size:0x18 +getEnemyElement__Q24Koga14EnTypesManagerFi = .text:0x800DAFF0; // type:function size:0x18 +getEnemyCheckBox__Q24Koga14EnTypesManagerFi = .text:0x800DB008; // type:function size:0x2C fn_800DB034 = .text:0x800DB034; // type:function size:0x38 fn_800DB06C = .text:0x800DB06C; // type:function size:0x18 fn_800DB084 = .text:0x800DB084; // type:function size:0x54 @@ -14640,7 +14640,7 @@ lbl_8035AAB0 = .data:0x8035AAB0; // type:object size:0x50 lbl_8035AB00 = .data:0x8035AB00; // type:object size:0xE data:string lbl_8035AB10 = .data:0x8035AB10; // type:object size:0xB data:string lbl_8035AB1C = .data:0x8035AB1C; // type:object size:0xC -lbl_8035AB28 = .data:0x8035AB28; // type:object size:0x10 +__vt__10TParamT = .data:0x8035AB28; // type:object size:0x10 scope:local lbl_8035AB38 = .data:0x8035AB38; // type:object size:0x80 lbl_8035ABB8 = .data:0x8035ABB8; // type:object size:0x54 data:2byte lbl_8035AC0C = .data:0x8035AC0C; // type:object size:0xE data:string @@ -14671,7 +14671,7 @@ lbl_8035B070 = .data:0x8035B070; // type:object size:0xC lbl_8035B07C = .data:0x8035B07C; // type:object size:0x34 lbl_8035B0B0 = .data:0x8035B0B0; // type:object size:0xF data:string lbl_8035B0C0 = .data:0x8035B0C0; // type:object size:0xC -lbl_8035B0CC = .data:0x8035B0CC; // type:object size:0x44 +__vt__10TParamT = .data:0x8035B0CC; // type:object size:0x44 scope:local lbl_8035B110 = .data:0x8035B110; // type:object size:0x15 data:string lbl_8035B128 = .data:0x8035B128; // type:object size:0x2B data:string lbl_8035B154 = .data:0x8035B154; // type:object size:0x1D data:string @@ -14895,7 +14895,7 @@ lbl_8035E148 = .data:0x8035E148; // type:object size:0x90 lbl_8035E1D8 = .data:0x8035E1D8; // type:object size:0x10C lbl_8035E2E4 = .data:0x8035E2E4; // type:object size:0x1A data:string lbl_8035E300 = .data:0x8035E300; // type:object size:0xC -lbl_8035E30C = .data:0x8035E30C; // type:object size:0x44 +__vt__27TParamT = .data:0x8035E30C; // type:object size:0x44 scope:local lbl_8035E350 = .data:0x8035E350; // type:object size:0x9 data:string lbl_8035E35C = .data:0x8035E35C; // type:object size:0xE data:string lbl_8035E36C = .data:0x8035E36C; // type:object size:0xE data:string @@ -15115,11 +15115,11 @@ lbl_80360F58 = .data:0x80360F58; // type:object size:0x12 data:string lbl_80360F6C = .data:0x80360F6C; // type:object size:0x15 data:string lbl_80360F84 = .data:0x80360F84; // type:object size:0xE data:string lbl_80360F94 = .data:0x80360F94; // type:object size:0xC -lbl_80360FA0 = .data:0x80360FA0; // type:object size:0x28 +__vt__Q24Koga14EnTypesManager = .data:0x80360FA0; // type:object size:0x28 lbl_80360FC8 = .data:0x80360FC8; // type:object size:0x24 lbl_80360FEC = .data:0x80360FEC; // type:object size:0x18 data:string lbl_80361004 = .data:0x80361004; // type:object size:0xC -lbl_80361010 = .data:0x80361010; // type:object size:0x60 +__vt__11TParamT = .data:0x80361010; // type:object size:0x60 scope:local lbl_80361070 = .data:0x80361070; // type:object size:0xC data:string lbl_80361080 = .data:0x80361080; // type:object size:0x50 lbl_803610D0 = .data:0x803610D0; // type:object size:0x64 data:2byte @@ -21715,7 +21715,7 @@ lbl_804D3938 = .sdata:0x804D3938; // type:object size:0x6 data:string lbl_804D3940 = .sdata:0x804D3940; // type:object size:0x7 data:string lbl_804D3948 = .sdata:0x804D3948; // type:object size:0x5 data:string lbl_804D3950 = .sdata:0x804D3950; // type:object size:0x8 -lbl_804D3958 = .sdata:0x804D3958; // type:object size:0x8 +__RTTI__Q24Koga14EnTypesManager = .sdata:0x804D3958; // type:object size:0x8 scope:local lbl_804D3960 = .sdata:0x804D3960; // type:object size:0x8 lbl_804D3968 = .sdata:0x804D3968; // type:object size:0x8 lbl_804D3970 = .sdata:0x804D3970; // type:object size:0x8 data:string diff --git a/configure.py b/configure.py index 06d13d6..afaa438 100755 --- a/configure.py +++ b/configure.py @@ -757,6 +757,7 @@ def MatchingFor(*versions): Object(NonMatching, "Koga/SimpleModeler.cpp"), Object(NonMatching, "Koga/CharacterColManager.cpp"), Object(NonMatching, "Koga/EnManager.cpp"), + Object(NonMatching, "Koga/EnTypesManager.cpp"), # Unsorted Object(NonMatching, "Unsorted/bootScene.cpp"), diff --git a/include/Koga/EnTypesManager.hpp b/include/Koga/EnTypesManager.hpp index 4bad811..e77b862 100644 --- a/include/Koga/EnTypesManager.hpp +++ b/include/Koga/EnTypesManager.hpp @@ -4,9 +4,55 @@ #include #include +#include "JSystem/JUtility/JUTColor.hpp" +#include "Koga/ParamInst.hpp" +#include "Koga/Params.hpp" + +/* +TODO splits.txt creates a cyclic dependency if I include the .data and .sdata sections with EnAttackBase. +May need to change / revise one of these but to not lose the section data: + .data start:0x80360D78 end:0x80361070 + .sdata start:0x804D3938 end:0x804D3970 +*/ + class ToolDataRef; class unkEnCharacter; +class EnemyParam { + public: + EnemyParam(); + + public: + /* 0x000 */ TParams mParams; + /* 0x00C */ TParamT mLife; + /* 0x020 */ TParamT mHitDamange; + /* 0x034 */ TParamT mSpeed; + /* 0x048 */ TParamT mSpeedUnseen; + /* 0x05C */ TParamT mSpeedFight; + /* 0x070 */ TParamT mEyesight; + /* 0x084 */ TParamT mLightBindFrame; + /* 0x098 */ TParamT mMinLightBindRange; + /* 0x0AC */ TParamT mMaxLightBindRange; + /* 0x0C0 */ TParamT mNumAtKarakai; + /* 0x0D4 */ TParamT mNumAtOrooro; + /* 0x0E8 */ TParamT mHikiPower; + /* 0x0FC */ TParamT mEffectiveDeg; + /* 0x110 */ TParamT mTsuriHeight; + /* 0x124 */ TParamT mDisappearFrame; + /* 0x138 */ TParamT mAttackPattern1; + /* 0x14C */ TParamT mActAfterAttackSu; + /* 0x160 */ TParamT mActAfterAttackFa; + /* 0x174 */ TParamT mTsuriType; + /* 0x188 */ TParamT mElement; + /* 0x19C */ TParamT mCheckBox; + /* 0x1B0 */ TParamT mNormalItemTblId; + /* 0x1C4 */ TParamT mTsuriItemTblId; + /* 0x1D8 */ TParamT mPointerRange; + /* 0x1EC */ TParamT mBrightColor; + /* 0x200 */ TParamT mAmbColor; + /* 0x214 */ s32 _214; // Unknown +}; + namespace Koga { class EnTypesManager : public JORReflexible { public: @@ -17,9 +63,37 @@ namespace Koga { static void deleteManager(); static EnTypesManager* getManager() { return sManager; } - void loadParameters(); + void loadCTPParams(); // Loads "/param/ctp/%s.prm" in some sprintf loop + + // Various EnemyParam helpers + static s32 getEnemyLife(int); + static s32 getEnemyHitDamage(int); + static s32 getEnemySpeed(int); + static s32 getEnemySpeedUnseen(int); + static s32 getEnemySpeedFight(int); + static s32 getEnemyEyesight(int); + static s32 getEnemyLightBindFrame(int); + static f32 getEnemyMinLightBindRange(int); + static f32 getEnemyMaxLightBindRange(int); + static f32 getEnemyPointerRange(int); + static s32 getEnemyNumAtKarakai(int); + static s32 getEnemyNumAtOrooro(int); + static f32 getEnemyHikiPower(int); + static f32 getEnemyEffectiveDeg(int); + static f32 getEnemyTsuriHeight(int); + static s32 getEnemyActAfterAttackSu(int); + static s32 getEnemyActAfterAttackFa(int); + static s32 getEnemyNormalItemTblId(int); + static s32 getEnemyTsuriItemTblId(int); + static s32 getEnemyDisappearFrame(int); + static JUtility::TColor getEnemyBrightColor(int); + static JUtility::TColor getEnemyAmbColor(int); + static s32 getEnemyAttackPattern1(int); + static s32 getEnemyTsuriType(int); + static s32 getEnemyElement(int); + static u16 getEnemyCheckBox(int); public: - /* 0x04 */ s32** _4; //TODO: This is an array of TParams + /* 0x04 */ EnemyParam* mEnParams; static EnTypesManager* sManager; }; @@ -27,8 +101,8 @@ namespace Koga { }; // All of these are referenced in EnManager. No arg types or return types are guaranteed. -s32 fn_800DAB18(char*); -s32 fn_800DABA4(ToolDataRef); +s32 fn_800DAB18(char*); // Might be static? +s32 fn_800DABA4(ToolDataRef); // Might be static? s32 fn_800DAC84(s32); void* fn_800DAD00(void*); unkEnCharacter* fn_800DB034(void*); diff --git a/src/Koga/EnTypesManager.cpp b/src/Koga/EnTypesManager.cpp new file mode 100644 index 0000000..1606d57 --- /dev/null +++ b/src/Koga/EnTypesManager.cpp @@ -0,0 +1,160 @@ +#include "Koga/EnTypesManager.hpp" +#include "Koga/EnManager.hpp" +#include "Koga/ParamInst.hpp" +#include "types.h" + +EnemyParam::EnemyParam() : + mLife(&mParams, 0, "mLife", mLife.calcKeyCode("mLife")), + mHitDamange(&mParams, 0, "mHitDamange", mHitDamange.calcKeyCode("mHitDamange")), + mSpeed(&mParams, 0, "mSpeed", mSpeed.calcKeyCode("mSpeed")), + mSpeedUnseen(&mParams, 0, "mSpeedUnseen", mSpeedUnseen.calcKeyCode("mSpeedUnseen")), + mSpeedFight(&mParams, 0, "mSpeedFight", mSpeedFight.calcKeyCode("mSpeedFight")), + mEyesight(&mParams, 0, "mEyesight", mEyesight.calcKeyCode("mEyesight")), + mLightBindFrame(&mParams, 0, "mLightBindFrame", mLightBindFrame.calcKeyCode("mLightBindFrame")), + mMinLightBindRange(&mParams, 0, "mMinLightBindRange", mMinLightBindRange.calcKeyCode("mMinLightBindRange")), + mMaxLightBindRange(&mParams, 0, "mMaxLightBindRange", mMaxLightBindRange.calcKeyCode("mMaxLightBindRange")), + mNumAtKarakai(&mParams, 0, "mNumAtKarakai", mNumAtKarakai.calcKeyCode("mNumAtKarakai")), + mNumAtOrooro(&mParams, 0, "mNumAtOrooro", mNumAtOrooro.calcKeyCode("mNumAtOrooro")), + mHikiPower(&mParams, 0, "mHikiPower", mHikiPower.calcKeyCode("mHikiPower")), + mEffectiveDeg(&mParams, 0, "mEffectiveDeg", mEffectiveDeg.calcKeyCode("mEffectiveDeg")), + mTsuriHeight(&mParams, 0, "mTsuriHeight", mTsuriHeight.calcKeyCode("mTsuriHeight")), + mDisappearFrame(&mParams, 0, "mDisappearFrame", mDisappearFrame.calcKeyCode("mDisappearFrame")), + mAttackPattern1(&mParams, 0, "mAttackPattern1", mAttackPattern1.calcKeyCode("mAttackPattern1")), + mActAfterAttackSu(&mParams, 0, "mActAfterAttackSu", mActAfterAttackSu.calcKeyCode("mActAfterAttackSu")), + mActAfterAttackFa(&mParams, 0, "mActAfterAttackFa", mActAfterAttackFa.calcKeyCode("mActAfterAttackFa")), + mTsuriType(&mParams, 0, "mTsuriType", mTsuriType.calcKeyCode("mTsuriType")), + mElement(&mParams, 0, "mElement", mElement.calcKeyCode("mElement")), + mCheckBox(&mParams, 0, "mCheckBox", mCheckBox.calcKeyCode("mCheckBox")), + mNormalItemTblId(&mParams, 0, "mNormalItemTblId", mNormalItemTblId.calcKeyCode("mNormalItemTblId")), + mTsuriItemTblId(&mParams, 0, "mTsuriItemTblId", mTsuriItemTblId.calcKeyCode("mTsuriItemTblId")), + mPointerRange(&mParams, 0, "mPointerRange", mPointerRange.calcKeyCode("mPointerRange")), + mBrightColor(&mParams, 0, "mBrightColor", mBrightColor.calcKeyCode("mBrightColor")), + mAmbColor(&mParams, 0, "mAmbColor", mAmbColor.calcKeyCode("mAmbColor")) { + // Maybe this isn't some default constructor based on mBrightColor / mAmbColor, since they both call fn_800D2FA0, which basically sets the defaults + // of these colors to -1 / 64, or maybe TBaseParam / TParamT needs its own inline base constructor? + } + +namespace Koga { + EnTypesManager::~EnTypesManager() { + delete [] mEnParams; + } + + void EnTypesManager::newManager() { + EnTypesManager* temp = new EnTypesManager(); + temp->mEnParams = new EnemyParam[0x17d]; + + sManager = temp; + } + + void EnTypesManager::deleteManager() { + if (sManager != nullptr) { + sManager = nullptr; + } + } + + s32 EnTypesManager::getEnemyLife(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mLife.get(); + } + + s32 EnTypesManager::getEnemyHitDamage(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mHitDamange.get(); + } + + s32 EnTypesManager::getEnemySpeed(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mSpeed.get(); + } + + + s32 EnTypesManager::getEnemySpeedUnseen(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mSpeedUnseen.get(); + } + + + s32 EnTypesManager::getEnemySpeedFight(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mSpeedFight.get(); + } + + s32 EnTypesManager::getEnemyEyesight(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mEyesight.get(); + } + + s32 EnTypesManager::getEnemyLightBindFrame(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mLightBindFrame.get(); + } + + f32 EnTypesManager::getEnemyMinLightBindRange(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mMinLightBindRange.get(); + } + + f32 EnTypesManager::getEnemyMaxLightBindRange(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mMaxLightBindRange.get(); + } + + f32 EnTypesManager::getEnemyPointerRange(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mPointerRange.get(); + } + + s32 EnTypesManager::getEnemyNumAtKarakai(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mNumAtKarakai.get(); + } + + s32 EnTypesManager::getEnemyNumAtOrooro(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mNumAtOrooro.get(); + } + + f32 EnTypesManager::getEnemyHikiPower(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mHikiPower.get(); + } + + f32 EnTypesManager::getEnemyEffectiveDeg(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mEffectiveDeg.get(); + } + + f32 EnTypesManager::getEnemyTsuriHeight(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mTsuriHeight.get(); + } + + s32 EnTypesManager::getEnemyActAfterAttackSu(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mActAfterAttackSu.get(); + } + + s32 EnTypesManager::getEnemyActAfterAttackFa(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mActAfterAttackFa.get(); + } + + s32 EnTypesManager::getEnemyNormalItemTblId(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mNormalItemTblId.get(); + } + + s32 EnTypesManager::getEnemyTsuriItemTblId(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mTsuriItemTblId.get(); + } + + s32 EnTypesManager::getEnemyDisappearFrame(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mDisappearFrame.get(); + } + + JUtility::TColor EnTypesManager::getEnemyBrightColor(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mBrightColor.get(); + } + + JUtility::TColor EnTypesManager::getEnemyAmbColor(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mAmbColor.get(); + } + + s32 EnTypesManager::getEnemyAttackPattern1(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mAttackPattern1.get(); + } + + s32 EnTypesManager::getEnemyTsuriType(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mTsuriType.get(); + } + + s32 EnTypesManager::getEnemyElement(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mElement.get(); + } + + u16 EnTypesManager::getEnemyCheckBox(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mCheckBox.get(); + } +} From e3d72753a2a678116bed51d34d86d24dd3200af0 Mon Sep 17 00:00:00 2001 From: SomeJakeGuy Date: Sat, 29 Aug 2026 03:54:45 -0400 Subject: [PATCH 3/8] 100% deleteManager() --- src/Koga/EnTypesManager.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Koga/EnTypesManager.cpp b/src/Koga/EnTypesManager.cpp index 1606d57..e407f1d 100644 --- a/src/Koga/EnTypesManager.cpp +++ b/src/Koga/EnTypesManager.cpp @@ -47,9 +47,8 @@ namespace Koga { } void EnTypesManager::deleteManager() { - if (sManager != nullptr) { - sManager = nullptr; - } + delete sManager; + sManager = nullptr; } s32 EnTypesManager::getEnemyLife(int enemyIdx) { From a85241012e8e19ddc1146c563b9e2a3b1241f1a3 Mon Sep 17 00:00:00 2001 From: SomeJakeGuy Date: Sat, 29 Aug 2026 04:04:36 -0400 Subject: [PATCH 4/8] Updated some of the splits based on attack_type being mentioned in fn_800DB0D8 --- config/GLME01/splits.txt | 2 +- include/Koga/EnTypesManager.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/GLME01/splits.txt b/config/GLME01/splits.txt index e6eaf16..cb613bc 100644 --- a/config/GLME01/splits.txt +++ b/config/GLME01/splits.txt @@ -140,7 +140,7 @@ Koga/EnAttackBase.cpp: .sdata start:0x804D3AF8 end:0x804D3B20 Koga/EnTypesManager.cpp: - .text start:0x800DA498 end:0x800DB084 + .text start:0x800DA498 end:0x800DB168 Koga/EnManager.cpp: .text start:0x800E4514 end:0x800E9DC8 diff --git a/include/Koga/EnTypesManager.hpp b/include/Koga/EnTypesManager.hpp index e77b862..1be90db 100644 --- a/include/Koga/EnTypesManager.hpp +++ b/include/Koga/EnTypesManager.hpp @@ -11,7 +11,7 @@ /* TODO splits.txt creates a cyclic dependency if I include the .data and .sdata sections with EnAttackBase. May need to change / revise one of these but to not lose the section data: - .data start:0x80360D78 end:0x80361070 + .data start:0x80360D78 end:0x80361080 .sdata start:0x804D3938 end:0x804D3970 */ From 120d7287803e0ea4e3c4ba2b40ed945971538788 Mon Sep 17 00:00:00 2001 From: SomeJakeGuy Date: Sun, 30 Aug 2026 04:05:58 -0400 Subject: [PATCH 5/8] newManager and getEnemyCheckbox matches, the rest now have decomp.me links. --- include/Koga/EnTypesManager.hpp | 7 ++++--- src/Koga/EnTypesManager.cpp | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/include/Koga/EnTypesManager.hpp b/include/Koga/EnTypesManager.hpp index 1be90db..d56d7fe 100644 --- a/include/Koga/EnTypesManager.hpp +++ b/include/Koga/EnTypesManager.hpp @@ -1,6 +1,7 @@ #ifndef EN_TYPES_MANAGER_H_ #define EN_TYPES_MANAGER_H_ +#include #include #include @@ -56,7 +57,7 @@ class EnemyParam { namespace Koga { class EnTypesManager : public JORReflexible { public: - EnTypesManager(); + inline EnTypesManager(); /* 0x08 */ virtual ~EnTypesManager(); static void newManager(); @@ -91,9 +92,9 @@ namespace Koga { static s32 getEnemyAttackPattern1(int); static s32 getEnemyTsuriType(int); static s32 getEnemyElement(int); - static u16 getEnemyCheckBox(int); + static bool getEnemyCheckBox(int); public: - /* 0x04 */ EnemyParam* mEnParams; + /* 0x04 */ EnemyParam* mEnParams; static EnTypesManager* sManager; }; diff --git a/src/Koga/EnTypesManager.cpp b/src/Koga/EnTypesManager.cpp index e407f1d..b9e4730 100644 --- a/src/Koga/EnTypesManager.cpp +++ b/src/Koga/EnTypesManager.cpp @@ -3,6 +3,8 @@ #include "Koga/ParamInst.hpp" #include "types.h" + +// https://decomp.me/scratch/6Feh6 EnemyParam::EnemyParam() : mLife(&mParams, 0, "mLife", mLife.calcKeyCode("mLife")), mHitDamange(&mParams, 0, "mHitDamange", mHitDamange.calcKeyCode("mHitDamange")), @@ -35,15 +37,17 @@ EnemyParam::EnemyParam() : } namespace Koga { + EnTypesManager::EnTypesManager() { + mEnParams = nullptr; + mEnParams = new EnemyParam[0x17d]; + } + EnTypesManager::~EnTypesManager() { delete [] mEnParams; } void EnTypesManager::newManager() { - EnTypesManager* temp = new EnTypesManager(); - temp->mEnParams = new EnemyParam[0x17d]; - - sManager = temp; + sManager = new EnTypesManager(); } void EnTypesManager::deleteManager() { @@ -133,10 +137,12 @@ namespace Koga { return getManager()->mEnParams[enemyIdx].mDisappearFrame.get(); } + // https://decomp.me/scratch/rwCN5 JUtility::TColor EnTypesManager::getEnemyBrightColor(int enemyIdx) { return getManager()->mEnParams[enemyIdx].mBrightColor.get(); } + // https://decomp.me/scratch/b6HLd JUtility::TColor EnTypesManager::getEnemyAmbColor(int enemyIdx) { return getManager()->mEnParams[enemyIdx].mAmbColor.get(); } @@ -153,7 +159,7 @@ namespace Koga { return getManager()->mEnParams[enemyIdx].mElement.get(); } - u16 EnTypesManager::getEnemyCheckBox(int enemyIdx) { - return getManager()->mEnParams[enemyIdx].mCheckBox.get(); + bool EnTypesManager::getEnemyCheckBox(int enemyIdx) { + return getManager()->mEnParams[enemyIdx].mCheckBox.get() & 1; } } From 6235af8ad2cfcf80e01dabe784b3bcb1ae4d6857 Mon Sep 17 00:00:00 2001 From: SomeJakeGuy Date: Sun, 30 Aug 2026 04:10:39 -0400 Subject: [PATCH 6/8] Fixed a missed function rename. --- src/Koga/MissionMode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Koga/MissionMode.cpp b/src/Koga/MissionMode.cpp index ec67af9..3cee9db 100644 --- a/src/Koga/MissionMode.cpp +++ b/src/Koga/MissionMode.cpp @@ -106,7 +106,7 @@ namespace Koga { void MissionMode::vt_10() { loadCollisionInfo("/col.mp", "/jmp/PolygonInfo"); - EnTypesManager::getManager()->loadParameters(); + EnTypesManager::getManager()->loadCTPParams(); mJmpMsgSender->addReceiver(mEnGenMgr); } From 9bd2faf391a3beebd5dd5c17d630a7bd3daa3817 Mon Sep 17 00:00:00 2001 From: SomeJakeGuy Date: Sun, 30 Aug 2026 20:05:20 -0400 Subject: [PATCH 7/8] Moved Comment from EnTypesManager to hpp/cpp. --- include/Koga/EnTypesManager.hpp | 6 ------ src/Koga/EnTypesManager.cpp | 8 ++++++++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/Koga/EnTypesManager.hpp b/include/Koga/EnTypesManager.hpp index d56d7fe..1abe5a8 100644 --- a/include/Koga/EnTypesManager.hpp +++ b/include/Koga/EnTypesManager.hpp @@ -9,12 +9,6 @@ #include "Koga/ParamInst.hpp" #include "Koga/Params.hpp" -/* -TODO splits.txt creates a cyclic dependency if I include the .data and .sdata sections with EnAttackBase. -May need to change / revise one of these but to not lose the section data: - .data start:0x80360D78 end:0x80361080 - .sdata start:0x804D3938 end:0x804D3970 -*/ class ToolDataRef; class unkEnCharacter; diff --git a/src/Koga/EnTypesManager.cpp b/src/Koga/EnTypesManager.cpp index b9e4730..f0b23d7 100644 --- a/src/Koga/EnTypesManager.cpp +++ b/src/Koga/EnTypesManager.cpp @@ -4,6 +4,14 @@ #include "types.h" +/* +TODO splits.txt creates a cyclic dependency if I include the .data and .sdata sections with EnAttackBase. +May need to change / revise one of these but to not lose the section data: + .data start:0x80360D78 end:0x80361080 + .sdata start:0x804D3938 end:0x804D3970 +*/ + + // https://decomp.me/scratch/6Feh6 EnemyParam::EnemyParam() : mLife(&mParams, 0, "mLife", mLife.calcKeyCode("mLife")), From 30acec9ca2ea76fa433c384ef2ad81f40d8e9ef6 Mon Sep 17 00:00:00 2001 From: SomeJakeGuy Date: Wed, 2 Sep 2026 17:42:37 -0400 Subject: [PATCH 8/8] Rename GameMode/MissionMode function to loadEnemyInfo --- config/GLME01/symbols.txt | 2 +- include/Koga/GameMode.hpp | 2 +- include/Koga/MissionMode.hpp | 2 +- src/Koga/GameMode.cpp | 2 +- src/Koga/GameModeUtil.cpp | 4 ++-- src/Koga/MissionMode.cpp | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/config/GLME01/symbols.txt b/config/GLME01/symbols.txt index 5be0aa1..5f10b69 100644 --- a/config/GLME01/symbols.txt +++ b/config/GLME01/symbols.txt @@ -3169,7 +3169,7 @@ fn_800B9C3C = .text:0x800B9C3C; // type:function size:0x4 fn_800B9C40 = .text:0x800B9C40; // type:function size:0xC4 fn_800B9D04 = .text:0x800B9D04; // type:function size:0x18 curGameModeCreate__Q24Koga12GameModeUtilFv = .text:0x800B9D1C; // type:function size:0x24 -fn_800B9D40__Q24Koga12GameModeUtilFv = .text:0x800B9D40; // type:function size:0x30 +curGameModeLoadEnemyInfo__Q24Koga12GameModeUtilFv = .text:0x800B9D40; // type:function size:0x30 fn_800B9D70__Q24Koga12GameModeUtilFv = .text:0x800B9D70; // type:function size:0x30 curGameModeDraw__Q24Koga12GameModeUtilFv = .text:0x800B9DA0; // type:function size:0x30 curGameModeDestroy__Q24Koga12GameModeUtilFv = .text:0x800B9DD0; // type:function size:0x3C diff --git a/include/Koga/GameMode.hpp b/include/Koga/GameMode.hpp index 1dd7632..c420d38 100644 --- a/include/Koga/GameMode.hpp +++ b/include/Koga/GameMode.hpp @@ -29,7 +29,7 @@ namespace Koga { /* 0x08 */ virtual void vt_8(s16) = 0; /* 0x0C */ virtual void init(); - /* 0x10 */ virtual void vt_10(); + /* 0x10 */ virtual void loadEnemyInfo(); /* 0x14 */ virtual void vt_14(); /* 0x18 */ virtual void vt_18(); }; diff --git a/include/Koga/MissionMode.hpp b/include/Koga/MissionMode.hpp index db9720a..4b81d3d 100644 --- a/include/Koga/MissionMode.hpp +++ b/include/Koga/MissionMode.hpp @@ -28,7 +28,7 @@ namespace Koga { /* 0x08 */ virtual void vt_8(s16); /* 0x0C */ virtual void init(); - /* 0x10 */ virtual void vt_10(); + /* 0x10 */ virtual void loadEnemyInfo(); /* 0x14 */ virtual void vt_14(); /* 0x18 */ virtual void vt_18(); diff --git a/src/Koga/GameMode.cpp b/src/Koga/GameMode.cpp index fd872df..746ae7f 100644 --- a/src/Koga/GameMode.cpp +++ b/src/Koga/GameMode.cpp @@ -8,7 +8,7 @@ namespace Koga { GameMode::~GameMode() { } void GameMode::init() { } - void GameMode::vt_10() { } + void GameMode::loadEnemyInfo() { } void GameMode::vt_14() { } void GameMode::vt_18() { } diff --git a/src/Koga/GameModeUtil.cpp b/src/Koga/GameModeUtil.cpp index 3cf5829..0c0614c 100644 --- a/src/Koga/GameModeUtil.cpp +++ b/src/Koga/GameModeUtil.cpp @@ -10,8 +10,8 @@ namespace Koga { namespace GameModeUtil { GameModeBase::sCurrentGameMode = MissionMode::create(); } - void fn_800B9D40() { - GameModeBase::sCurrentGameMode->vt_10(); + void curGameModeLoadEnemyInfo() { + GameModeBase::sCurrentGameMode->loadEnemyInfo(); } void fn_800B9D70() { diff --git a/src/Koga/MissionMode.cpp b/src/Koga/MissionMode.cpp index 3cee9db..c269535 100644 --- a/src/Koga/MissionMode.cpp +++ b/src/Koga/MissionMode.cpp @@ -104,7 +104,7 @@ namespace Koga { mJmpMsgSender->addReceiver(mEnMgr); } - void MissionMode::vt_10() { + void MissionMode::loadEnemyInfo() { loadCollisionInfo("/col.mp", "/jmp/PolygonInfo"); EnTypesManager::getManager()->loadCTPParams(); mJmpMsgSender->addReceiver(mEnGenMgr);