From bef3767cff6ad3833e7ec7a172d08d2a9162378d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Tue, 1 Sep 2026 14:05:28 +0800 Subject: [PATCH 01/21] added alice's extra fields adjusted tenshi's field signedness --- src/GameObject.hpp | 5 ++++- src/Player.hpp | 16 +++++++++++----- test/main.cpp | 4 +++- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/GameObject.hpp b/src/GameObject.hpp index 7795b66..59c8f02 100644 --- a/src/GameObject.hpp +++ b/src/GameObject.hpp @@ -216,7 +216,10 @@ namespace v2 { class GameObjectReimu : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; class GameObjectMarisa : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; class GameObjectSakuya : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; - class GameObjectAlice : public GameObject { public: char unknown3AC[4]; DECL_GAMEOBJECT_VIRTUALS() }; + class GameObjectAlice : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() + short dollIndex;//0x3ac 0~3, used by C dolls + char unknown3AE[2]; // align 2? + }; class GameObjectPatchouli : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; class GameObjectYoumu : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; class GameObjectRemilia : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; diff --git a/src/Player.hpp b/src/Player.hpp index 147e7bb..d1023bc 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -360,9 +360,15 @@ namespace v2 { class PlayerAlice : public Player { public: - char unknown890[0x2]; - unsigned short dollCount; - char unknown894[0x30]; + unsigned short SPdollCount;//0x890 max 3 + unsigned short dollCount;//0x892 max 4 + char unknown894[4]; + unsigned short SPcirclePhase;//0x898 0~359 looping + short DRTdollCount;//0x89A used by story SC: Knight "Doll of Round Table" + float dollPosX[4], dollPosY[4];//0x89C~0x8B8 used by Seeker Wire tracing + bool unknown8bc;//unsure: SP launching doll flag? + bool unknown8bd[4];//unsure: Seeker Wire doll triggered? + char unknown8c1[3];//align 3? PlayerAlice(const PlayerInfo&); DECL_PLAYER_VIRTUALS() @@ -491,8 +497,8 @@ namespace v2 { bool pillarEnabled;//0x918 char unknown919;//align? - short guardingKeystonesTimer;//0x91a - short guardingKeystonesType;//0x91c 0 for None, 1 for B ver, 2 for C ver + unsigned short guardingKeystonesTimer;//0x91a + unsigned short guardingKeystonesType;//0x91c 0 for None, 1 for B ver, 2 for C ver char unknown91E[2];//align 2? int guardingKeystonesCount;//0x920 diff --git a/test/main.cpp b/test/main.cpp index f70a573..edd3349 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -242,7 +242,9 @@ void testCharacterManager() assert_equal(offsetof(v2::Player, objectList), 0x6f8); assert_equal(offsetof(v2::Player, unknown714), 0x714); assert_equal(offsetof(v2::Player, inputData), 0x754); - assert_equal(offsetof(v2::Player, dashTimer), 0x7D0); + //assert_equal(offsetof(v2::Player, dashTimer), 0x7D0); + + assert_equal(offsetof(v2::GameObjectAlice, dollIndex), 0x3AC); } void testSelectScene() From 4a17b37daad0467c3fa49f8fc2984102be4e7e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Tue, 1 Sep 2026 16:01:23 +0800 Subject: [PATCH 02/21] correction on `Player`'s substruct `standInfo` and `unknown714` --- src/Player.hpp | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index d1023bc..d0e648f 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -27,13 +27,14 @@ namespace v2 { Sprite sprite; // offset 0x484 - int playerId; - int unknown488; // 0x46eb80: = -1; - Vector2f unknown48C; // some coord - char unknown494; + int teamId; + int standState; // 0x46eb80: = -1; -1: stand hide, 0: stand roll in, 1: stand keep, 2: stand fade out + int standCounter; + float standOffset; + unsigned char standOpacity; // align 3 - - //void FUN_46ec50(); + //void FUN_46ec50(); //begin + //void FUN_46ec90(); //update } stand; union ComboModifers { @@ -136,17 +137,25 @@ namespace v2 { // offset 0x6f8 IGameObjectList* objectList; Deque patternData; - int unknown710; // 46b9a0: = 0 - - struct { - List unknown714; // unsure (maybe struct {SpriteEx,byte}) - char unknown720 = 5; - char unknown721; - short unknown722 = 15; - char unknown724[4]; + + int trailTimer; // 46b9a0: = 0 + struct TrailImage { + using SpriteTrail = struct { + SpriteEx sprite; + char mode;//blend mode 0: normal, 1: add, 2:sub + char unknownf1[3];//align 3 + }; + List trailSprites; + char trailStep = 5;//skip n-1 sprites by n step when rendering + char unknown721;//align 1? + short trailLength = 15; + unsigned int colorMask;//4631e9: masking trail sprites color (not for alpha) char unknown728; // 46b9a0: = 0 - char unknown729[3]; - } unknown714; + char unknown729[3];// align 3? + //void FUN_463440(); //append + //void FUN_463330(); //clear + //void FUN_463100(); //render + } trailImage; Deque spellBgTextures; short spellBgTimer; // = 0 From 0635e83c4e77762e2809bb094792ca1d6a6d4eb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Tue, 1 Sep 2026 18:01:30 +0800 Subject: [PATCH 03/21] added `Player::setTrailImage()` --- src/Player.cpp | 1 + src/Player.hpp | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Player.cpp b/src/Player.cpp index 4ad4b03..339707e 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -178,6 +178,7 @@ namespace v2 { void Player::useSkill(int id, short action) { return (this->*union_cast(0x487BA0))(id, action); } unsigned short Player::getMoveLock(unsigned short action) { return (this->*union_cast(0x489610))(action); } void Player::onSkillUpgrade() { return (this->*union_cast(0x489660))(); } + void Player::setTrailImage(int timer, int step, unsigned int colorMask) { return (this->*union_cast(0x46A750))(timer, step, colorMask); } SokuLib::v2::GameObject *Player::createObject(short action, float x, float y, char direction, char layer, float *extraData, unsigned int extraDataSize) { // Mimics 0x46EB30 return this->objectList->createObject(nullptr, this, action, x, y, direction, layer, extraData, extraDataSize); diff --git a/src/Player.hpp b/src/Player.hpp index d0e648f..41cb0e4 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -30,7 +30,7 @@ namespace v2 { int teamId; int standState; // 0x46eb80: = -1; -1: stand hide, 0: stand roll in, 1: stand keep, 2: stand fade out int standCounter; - float standOffset; + float standOffset;// x axis offset; y fixed 32.0f unsigned char standOpacity; // align 3 //void FUN_46ec50(); //begin @@ -152,7 +152,7 @@ namespace v2 { unsigned int colorMask;//4631e9: masking trail sprites color (not for alpha) char unknown728; // 46b9a0: = 0 char unknown729[3];// align 3? - //void FUN_463440(); //append + //void FUN_463440(); //append, has a bug that forgets to reset color after rendering shadow //void FUN_463330(); //clear //void FUN_463100(); //render } trailImage; @@ -286,6 +286,7 @@ namespace v2 { void refreshInputBuffer(); // 0x46cac0 bool isGrounded(); // 0x463530 void updateDefaultBehavior(); + void setTrailImage(int timer, int step, unsigned int colorMask); //0x46a750 SokuLib::v2::GameObject* createObject(short action, float x, float y, char direction, char layer, float *extraData, unsigned int extraDataSize); // 46eb30 SokuLib::v2::GameObject *createObject(short action, float x, float y, char direction, char layer); template From b4a0539ff0398b060a608d28292f94c89375b873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Wed, 2 Sep 2026 11:27:58 +0800 Subject: [PATCH 04/21] added a Komachi's extra field suwako and iku fields supplement some unsure/unused fields are retyped by checking init vfunc --- src/Player.hpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index 41cb0e4..4123537 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -479,7 +479,9 @@ namespace v2 { class PlayerKomachi : public Player { public: - char unknown890[0x08]; + short unknown890;//656d06: = 0 + char unknown892[2];//align 2? + int wispActivationTime;//countdown by frame, spirits will be activated if > 0 PlayerKomachi(const PlayerInfo&); DECL_PLAYER_VIRTUALS() @@ -488,10 +490,13 @@ namespace v2 { class PlayerIku : public Player { public: - char unknown890[0xC]; - unsigned short veilsLikeWind; - unsigned short veilsLikeTime; - char unknown8A0[0x8]; + int unknown890, unknown894, unknown898;//69ae9f: = 0 + unsigned short veilsLikeSky;//0x89c, 900f countdown + unsigned short veilsLikeTime;//0x89e, 600f countdown + + unsigned short cutsceneColor;//0x8a0 as story cutscene color (channel G/B) for iku's stage entrance, 0~255 increased by frame + char unknown8A2[0x2];//align 2? + float backgroundOffset;//change stage#4 background horizon for stage entrance cutscene PlayerIku(const PlayerInfo&); DECL_PLAYER_VIRTUALS() @@ -513,7 +518,8 @@ namespace v2 { int guardingKeystonesCount;//0x920 unsigned short stateOfEnlightenmentTimeLeft; - char unknown926[6]; + char unknown926[2];//align 2? + int unknown928;//6bfaca: = 0 bool skyAttackUsed; //0x92c block movement cancel or another sky attack before landed char unknown92D;//align? @@ -569,7 +575,8 @@ namespace v2 { class PlayerSuwako : public Player { public: - char unknown890[4]; + bool unknown890, holdspinReleased;//0x891 inform L5C/J5C rocks to shot forward + char unknown892[2];//align 2? int curseType;//0x894, enum {None=0, Red, Green, Blue} int punishType;//0x898, enum {None=0, Crush, Block, Attack, Dash} bool orbsSpawned;//0x89C From 9346339d50f2cef5fba5f43a1adbbd41b1afbf98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Wed, 2 Sep 2026 11:41:33 +0800 Subject: [PATCH 05/21] added cirno fields --- src/Player.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index 4123537..142c0c7 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -495,7 +495,7 @@ namespace v2 { unsigned short veilsLikeTime;//0x89e, 600f countdown unsigned short cutsceneColor;//0x8a0 as story cutscene color (channel G/B) for iku's stage entrance, 0~255 increased by frame - char unknown8A2[0x2];//align 2? + char unknown8A2[2];//align 2? float backgroundOffset;//change stage#4 background horizon for stage entrance cutscene PlayerIku(const PlayerInfo&); @@ -545,7 +545,7 @@ namespace v2 { class PlayerChirno : public Player { public: - char unknown890[0x04]; + int freezeAtmosphereTimeLeft;//used by 3SC Freeze Atmosphere, 180f countdown PlayerChirno(const PlayerInfo&); DECL_PLAYER_VIRTUALS() From 0186b3e57e2365143a992957f9a891f0d62d6fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Wed, 2 Sep 2026 15:08:10 +0800 Subject: [PATCH 06/21] added utsuho fields renamed suwako 0x891 bool --- src/Player.hpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index 142c0c7..fd15a8b 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -564,8 +564,14 @@ namespace v2 { class PlayerUtsuho : public Player { public: bool capeDisabled; + char unknown891[3];//align 3? int capeTexture; - char unknown898[0x10]; + float capeOffset;//texture x+y axis moving, +0.25 per frame, 0~255 looping + bool unleashSignal;//inform 5B/J5B/J2B... to shoot + bool unknown89d;//7b5eba: = 0 + char unknown89e[0x2];//align 2? + int unknown8a0;//timer for an unused sc #616 like iku's Stickleback, 600f countdown + int abyssNovaGlow;//0~255; btw nova explosion timer is handled by a UtsuhoObject PlayerUtsuho(const PlayerInfo&); ~PlayerUtsuho() override; @@ -575,7 +581,8 @@ namespace v2 { class PlayerSuwako : public Player { public: - bool unknown890, holdspinReleased;//0x891 inform L5C/J5C rocks to shot forward + bool unknown890; + bool unleashSignal;//0x891 inform L5C/J5C rocks to shoot forward char unknown892[2];//align 2? int curseType;//0x894, enum {None=0, Red, Green, Blue} int punishType;//0x898, enum {None=0, Crush, Block, Attack, Dash} From 3403e64011974706e18dfd949314ab5a772af0a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Wed, 2 Sep 2026 16:12:30 +0800 Subject: [PATCH 07/21] added aya fields --- src/Player.hpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index fd15a8b..fb61f09 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -470,7 +470,11 @@ namespace v2 { class PlayerAya : public Player { public: - char unknown890[0x08]; + short pebbleCount;//maximum 20 + short limitedSpecialTimeLeft;//2sc speed up, ground 360f/ air 450f countdown + short routeForbiddenTimeLeft;//300f countdown + bool unknown896;//block Graceful Dash if true, but never set? + char unknown897;//align 1? PlayerAya(const PlayerInfo&); DECL_PLAYER_VIRTUALS() @@ -581,7 +585,7 @@ namespace v2 { class PlayerSuwako : public Player { public: - bool unknown890; + bool unknown890;//782982: = 0 bool unleashSignal;//0x891 inform L5C/J5C rocks to shoot forward char unknown892[2];//align 2? int curseType;//0x894, enum {None=0, Red, Green, Blue} From b158af05f53a933cfd74a8bc299b6ee85bb233f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Thu, 3 Sep 2026 10:26:41 +0800 Subject: [PATCH 08/21] added vtbl[18],[19],[22],[24] for Player alice ex-fields supplement --- src/Player.cpp | 12 ++++++------ src/Player.hpp | 28 ++++++++++++++-------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/Player.cpp b/src/Player.cpp index 339707e..f4464d1 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -42,19 +42,19 @@ { return (this->*union_cast(VTB[16]))(); } \ void CLS::initialize() \ { return (this->*union_cast(VTB[17]))(); } \ - bool CLS::VUnknown48() \ + bool CLS::handleGroundMovement() \ { return (this->*union_cast(VTB[18]))(); } \ - bool CLS::VUnknown4C(int a0) \ + bool CLS::setScenarioAction(int a0) \ { return (this->*union_cast(VTB[19]))(a0); } \ void CLS::handleInputs() \ { return (this->*union_cast(VTB[20]))(); } \ void CLS::checkAllMotionInputs() \ { return (this->*union_cast(VTB[21]))(); } \ - void CLS::VUnknown58() \ + void CLS::computerInputs() \ { return (this->*union_cast(VTB[22]))(); } \ void CLS::VUnknown5C() \ { return (this->*union_cast(VTB[23]))(); } \ - bool CLS::VUnknown60(int a) \ + bool CLS::setCustomScenarioAction(int a) \ { return (this->*union_cast(VTB[24]))(a); } namespace SokuLib { @@ -167,8 +167,8 @@ namespace v2 { void Player::applyTransform() { return (this->*union_cast(0x46A510))(); } void Player::updatePhysics() { return (this->*union_cast(0x487EF0))(); } void Player::initialize() { return (this->*union_cast(0x48B000))(); } - bool Player::VUnknown48() { return (this->*union_cast(0x4636D0))(); } - bool Player::VUnknown4C(int a) { return (this->*union_cast(0x487220))(a); } + bool Player::handleGroundMovement() { return (this->*union_cast(0x4636D0))(); } + bool Player::setScenarioAction(int a) { return (this->*union_cast(0x487220))(a); } void Player::checkAllMotionInputs() { return (this->*union_cast(0x487020))(); } void Player::updateDefaultBehavior() { return (this->*union_cast(0x483F40))(); } bool Player::isGrounded() { return (this->*union_cast(0x463530))(); } diff --git a/src/Player.hpp b/src/Player.hpp index fb61f09..7293ff8 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -242,13 +242,13 @@ namespace v2 { void applyTransform() override; void updatePhysics() override; virtual void initialize(); // character specific initialization - virtual bool VUnknown48(); // check for landing - virtual bool VUnknown4C(int a); // something with actionId in [700,799] + virtual bool handleGroundMovement(); // handle landing, walking, jump, crouch input + virtual bool setScenarioAction(int scenarioActionId); // remap story scenario action to real action stuff virtual void handleInputs() = 0; // seems to handle inputs (differs for each character) virtual void checkAllMotionInputs(); // compare input buffer for sequences - virtual void VUnknown58() = 0; - virtual void VUnknown5C() = 0; - virtual bool VUnknown60(int a) = 0; + virtual void computerInputs() = 0;// generate computer AI input + virtual void VUnknown5C() = 0; // resets input? + virtual bool setCustomScenarioAction(int customScenarioActionId) = 0; //handle character specified scenario action // Gets the character from this->characterIndex void loadResources(); // 0x46c0b0 @@ -325,13 +325,13 @@ namespace v2 { void initializeAction() override; \ void updatePhysics() override; \ void initialize() override; \ - bool VUnknown48() override; \ - bool VUnknown4C(int a) override; \ + bool handleGroundMovement() override; \ + bool setScenarioAction(int scenarioActionId) override; \ void handleInputs() override; \ void checkAllMotionInputs() override; \ - void VUnknown58() override; \ + void computerInputs() override; \ void VUnknown5C() override; \ - bool VUnknown60(int a) override; + bool setCustomScenarioAction(int customScenarioActionId) override; class PlayerReimu : public Player { public: @@ -372,12 +372,12 @@ namespace v2 { public: unsigned short SPdollCount;//0x890 max 3 unsigned short dollCount;//0x892 max 4 - char unknown894[4]; + unsigned short unknown894, unknown896;//5235a4: =0 unsigned short SPcirclePhase;//0x898 0~359 looping short DRTdollCount;//0x89A used by story SC: Knight "Doll of Round Table" float dollPosX[4], dollPosY[4];//0x89C~0x8B8 used by Seeker Wire tracing - bool unknown8bc;//unsure: SP launching doll flag? - bool unknown8bd[4];//unsure: Seeker Wire doll triggered? + bool SPdollTriggering;//used by SP, signal one/all dolls to shoot laser + bool dollTriggering[4];//used by Seeker Wire, signal the ready C doll to next seq char unknown8c1[3];//align 3? PlayerAlice(const PlayerInfo&); @@ -571,7 +571,7 @@ namespace v2 { char unknown891[3];//align 3? int capeTexture; float capeOffset;//texture x+y axis moving, +0.25 per frame, 0~255 looping - bool unleashSignal;//inform 5B/J5B/J2B... to shoot + bool unleashSignal;//signal 5B/J5B/J2B... to shoot bool unknown89d;//7b5eba: = 0 char unknown89e[0x2];//align 2? int unknown8a0;//timer for an unused sc #616 like iku's Stickleback, 600f countdown @@ -586,7 +586,7 @@ namespace v2 { class PlayerSuwako : public Player { public: bool unknown890;//782982: = 0 - bool unleashSignal;//0x891 inform L5C/J5C rocks to shoot forward + bool unleashSignal;//0x891 signal L5C/J5C rocks to shoot forward char unknown892[2];//align 2? int curseType;//0x894, enum {None=0, Red, Green, Blue} int punishType;//0x898, enum {None=0, Crush, Block, Attack, Dash} From 00c30d5a4bab814e9ff2bb198b6f55676522b888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Thu, 3 Sep 2026 17:19:36 +0800 Subject: [PATCH 09/21] reimu ex-field supplement added marisa ex-fields --- src/Player.hpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index 7293ff8..23d8df5 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -335,11 +335,15 @@ namespace v2 { class PlayerReimu : public Player { public: - char unknown890[0x24]; + short rodSpawned;//the dropping gohei(purification rod) when Reimu got hit + char unknown892[0x2];//align 2? + int unknown894[8];//4ac600: = 0 + unsigned short fantasyHeavenTimer; - unsigned short fantasyHeavenStacks; - unsigned short fantasyHeavenAlreadyHit; - char unknown8BA[0x2]; + unsigned short fantasyHeavenStacks;//0~7 + unsigned short fantasyHeavenAlreadyHit;// 0~1 hit recorded + bool dsRiftUsed;//block another Demon Sealing use before landed + char unknown8BB;//align 1? PlayerReimu(const PlayerInfo&); DECL_PLAYER_VIRTUALS() @@ -348,9 +352,16 @@ namespace v2 { class PlayerMarisa : public Player { public: - char unknown890[0x2]; - unsigned short orreriesTimer; - char unknown894[0x18]; + unsigned short orreriesAttackType;//0: None, 1:B bullets, [2~5]: B emitter index, 8:C lasers, 50: thrown boomerang + unsigned short orreriesTimer;//countdown 600f + unsigned short orreriesActiveTimer;//countdown, B:40f, C:60f + char unknown896[2];//align 2? + + float orreriesRotatePhase;// -=speed + float orreriesRotateSpeed;//type0: 3, type1: 12, type8: 0.5, type50: 12 + float orreriesThrowTargetX, orreriesThrowTargetY;//record decided target pos when throwing out + bool orreriesThrown;//reusing 2sc throws orreries out as boomerang + char unknown8A9[3];//align 3? PlayerMarisa(const PlayerInfo&); DECL_PLAYER_VIRTUALS() From ac351bb12b18c7a2616b0fdb660afba706149456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Fri, 4 Sep 2026 13:06:06 +0800 Subject: [PATCH 10/21] sakuya's, patchouli's extra fields supplement --- src/Player.hpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index 23d8df5..5454bf7 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -370,9 +370,14 @@ namespace v2 { class PlayerSakuya : public Player { public: - unsigned short worldTimer; - unsigned short psTimer; - char unknown894[0xC]; + unsigned short worldTimer;//countdown | The World:300f, Luna Dial:210f + unsigned short psTimer;//Private Square, countdown 300f + unsigned short stopwatchTimer;//4SC Stopwatch + unsigned short unknown896;//4fdf9b: = 0 + unsigned short noLimitTimer;//also lessen rate loss by 0.25 + unsigned short dsSwordCount;//Dancing Star Sword + bool dsSwordTriggering;//signal one sword to shoot out + char unknown89D[3];//align 3? PlayerSakuya(const PlayerInfo&); DECL_PLAYER_VIRTUALS() @@ -398,10 +403,14 @@ namespace v2 { class PlayerPatchouli : public Player { public: - unsigned short philStoneTimer; - char unknown892[0xE]; - unsigned short dHardnessTimer; - char unknown8A2[0x6]; + unsigned short philStoneTimer;//countdown 1200f + unsigned short unknown892;//56413c: =360, only set when jellyfish bubble is breached, but never reset or used + short unknown894, unknown896, unknown898, unknown89A;//554c70: = 0 + unsigned short atmEdgeActivationTime;//countdown 2f, if >0 and lv1+, triggers autumn edge to trace + short sBubbleHitCount;//0~10 + unsigned short dHardnessTimer;//0x8A0 + unsigned short jfPrincessTimer;//countdown 360f + float sprWindSpeed;//B:14.5, C:18.5 PlayerPatchouli(const PlayerInfo&); DECL_PLAYER_VIRTUALS() @@ -496,7 +505,7 @@ namespace v2 { public: short unknown890;//656d06: = 0 char unknown892[2];//align 2? - int wispActivationTime;//countdown by frame, spirits will be activated if > 0 + int wispActivationTime;//countdown 2f(a214)/10f(2C), spirits will be activated if > 0 PlayerKomachi(const PlayerInfo&); DECL_PLAYER_VIRTUALS() From f8fa9a0ca3538a5fbd1aebe75a78156754611c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Fri, 4 Sep 2026 16:01:55 +0800 Subject: [PATCH 11/21] added `GameObjectBase::hitLaunchSpeed`, credit PinkySmile --- src/GameObject.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/GameObject.hpp b/src/GameObject.hpp index 59c8f02..dfbf8d5 100644 --- a/src/GameObject.hpp +++ b/src/GameObject.hpp @@ -56,8 +56,7 @@ namespace v2 { char reflectCounter = 0; // used by youmu reflection shield char unknown1A1 = 0; short forcedCounterHits = 0; // = 0 - float unknown1A4 = 0; // = .0 - float unknown1A8 = 0; // = .0 + Vector2f hitLaunchSpeed; // = {0,0}, set by attack framedata, used by air hit action bool allowEntity = true; // entity collision will be ignored if 0 char unknown1AD[3]; // align 0x3?// offset 0x1b0 struct CustomHitBox { From 36191c55933028520c8ea537509756c5425e939c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Fri, 4 Sep 2026 17:54:41 +0800 Subject: [PATCH 12/21] added youmu's extra fields and a few clone related function fixed trailImage naming in test/main --- src/GameObject.hpp | 4 +++- src/Player.cpp | 6 +++--- src/Player.hpp | 34 +++++++++++++++++++++++++++++----- test/main.cpp | 2 +- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/GameObject.hpp b/src/GameObject.hpp index dfbf8d5..a980709 100644 --- a/src/GameObject.hpp +++ b/src/GameObject.hpp @@ -220,7 +220,9 @@ namespace v2 { char unknown3AE[2]; // align 2? }; class GameObjectPatchouli : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; - class GameObjectYoumu : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; + class GameObjectYoumu : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() + void updateClone(int index);//57d000 + }; class GameObjectRemilia : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; class GameObjectYuyuko : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; class GameObjectYukari : public GameObject { public: DECL_GAMEOBJECT_VIRTUALS() }; diff --git a/src/Player.cpp b/src/Player.cpp index f4464d1..d7b67aa 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -311,7 +311,7 @@ namespace v2 { PlayerYoumu::PlayerYoumu(const PlayerInfo& info) : Player(info) { - memset(this->unknown8C0, 0, 0x10); // [0x8c0-0x8d0] = 0 + memset(&this->cloneBuffer.m_table, 0, 0x10); // container construct this->objectList = new GameObjectList_Youmu(this); } PlayerUtsuho::PlayerUtsuho(const PlayerInfo& info) : @@ -332,8 +332,8 @@ namespace v2 { PlayerYoumu::~PlayerYoumu() { - // unknown object destructor - reinterpret_cast(0x433a50)(&this->unknownObject); + // clone buffer clear + reinterpret_cast(0x433a50)(&this->cloneBuffer); } PlayerUtsuho::~PlayerUtsuho() { diff --git a/src/Player.hpp b/src/Player.hpp index 5454bf7..031f1ff 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -419,11 +419,35 @@ namespace v2 { class PlayerYoumu : public Player { public: - char unknown890[0x2C]; - void *unknownObject; - char unknown8C0[0x16]; - unsigned short youmuCloneTimeLeft; - char unknown8D8[0x14]; + struct CloneData { + CharacterFrameData* frameData; + Vector2f position, center, scale; + float rotationX, rotationY, rotationZ; + Direction direction; + char hitCount;//set along with youmu's collisionLimit + char unknown2A[2];//align 2? + } cloneData;//size 0x2C + class CloneBuffer : public Deque { + public: + void pushClone(const CloneData&);//579510 + CloneData* getClone(int index);//57cfa0 + inline void popClone() { + if (empty()) return; + --m_size; + if (empty()) return; + } + } cloneBuffer;//ring history buffer, maximum 60 clones + bool myonSpawned;//done in initAction... + bool myonAttackActivated; + short myonAttackType;//None:0, (j)5C:1, (j)6C:2, (j)2C:3, d22B:4, d22C:7, a122:5, a222B:6, a222C:8, eye slash:10 + unsigned short mediumBindTimer;// =(Lv+6)*30 + unsigned short cloneTimer;// 600f + short cloneActivated;//block meter gain, but only set in 2sc clone + char unknown8DA[2];//align 2? + //implemente bullet-cutting in story spell Closed-Eye Slash "The Bullet-Cutting Spirit Eye from Roukan" + float eyeSlashPosX, eyeSlashPosY, eyeSlashRotZ; + bool eyeSlashActivated; + char unknown8E9[3];//align 3? PlayerYoumu(const PlayerInfo&); ~PlayerYoumu() override; diff --git a/test/main.cpp b/test/main.cpp index edd3349..21da517 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -240,7 +240,7 @@ void testCharacterManager() assert_equal(offsetof(v2::Player, handInfo), 0x5E4); assert_equal(offsetof(v2::Player, unknown610), 0x610); assert_equal(offsetof(v2::Player, objectList), 0x6f8); - assert_equal(offsetof(v2::Player, unknown714), 0x714); + assert_equal(offsetof(v2::Player, trailImage), 0x714); assert_equal(offsetof(v2::Player, inputData), 0x754); //assert_equal(offsetof(v2::Player, dashTimer), 0x7D0); From 145d1397108d9ffacd7aa98d17b4e23cbfe658d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Fri, 4 Sep 2026 19:42:43 +0800 Subject: [PATCH 13/21] class cleanup --- src/Player.cpp | 5 +++-- src/Player.hpp | 13 ++----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/Player.cpp b/src/Player.cpp index d7b67aa..5079004 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -311,7 +311,7 @@ namespace v2 { PlayerYoumu::PlayerYoumu(const PlayerInfo& info) : Player(info) { - memset(&this->cloneBuffer.m_table, 0, 0x10); // container construct + //memset(&this->cloneBuffer.m_table, 0, 0x10); this->objectList = new GameObjectList_Youmu(this); } PlayerUtsuho::PlayerUtsuho(const PlayerInfo& info) : @@ -333,7 +333,8 @@ namespace v2 { PlayerYoumu::~PlayerYoumu() { // clone buffer clear - reinterpret_cast(0x433a50)(&this->cloneBuffer); + //reinterpret_cast(0x433a50)(&this->cloneBuffer); + this->cloneBuffer.clear(); } PlayerUtsuho::~PlayerUtsuho() { diff --git a/src/Player.hpp b/src/Player.hpp index 031f1ff..22af63b 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -427,16 +427,7 @@ namespace v2 { char hitCount;//set along with youmu's collisionLimit char unknown2A[2];//align 2? } cloneData;//size 0x2C - class CloneBuffer : public Deque { - public: - void pushClone(const CloneData&);//579510 - CloneData* getClone(int index);//57cfa0 - inline void popClone() { - if (empty()) return; - --m_size; - if (empty()) return; - } - } cloneBuffer;//ring history buffer, maximum 60 clones + Deque cloneBuffer;//ring history buffer, maximum 60 clones bool myonSpawned;//done in initAction... bool myonAttackActivated; short myonAttackType;//None:0, (j)5C:1, (j)6C:2, (j)2C:3, d22B:4, d22C:7, a122:5, a222B:6, a222C:8, eye slash:10 @@ -458,7 +449,7 @@ namespace v2 { class PlayerRemilia : public Player { public: unsigned short millVampireTimer; - char unknown892[0x02]; + char unknown892[0x02];//align 2? PlayerRemilia(const PlayerInfo&); DECL_PLAYER_VIRTUALS() From 923362bf0f0a578e7a746993fa02f8a7fa980fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Sat, 5 Sep 2026 09:46:40 +0800 Subject: [PATCH 14/21] found usage of Player vtbl[23] `updateStory` added yukari and yuyuko's extra fields --- src/Player.cpp | 2 +- src/Player.hpp | 44 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/Player.cpp b/src/Player.cpp index 5079004..c4e10b3 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -52,7 +52,7 @@ { return (this->*union_cast(VTB[21]))(); } \ void CLS::computerInputs() \ { return (this->*union_cast(VTB[22]))(); } \ - void CLS::VUnknown5C() \ + void CLS::updateStory() \ { return (this->*union_cast(VTB[23]))(); } \ bool CLS::setCustomScenarioAction(int a) \ { return (this->*union_cast(VTB[24]))(a); } diff --git a/src/Player.hpp b/src/Player.hpp index 22af63b..d5989c2 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -247,7 +247,7 @@ namespace v2 { virtual void handleInputs() = 0; // seems to handle inputs (differs for each character) virtual void checkAllMotionInputs(); // compare input buffer for sequences virtual void computerInputs() = 0;// generate computer AI input - virtual void VUnknown5C() = 0; // resets input? + virtual void updateStory() = 0; // virtual bool setCustomScenarioAction(int customScenarioActionId) = 0; //handle character specified scenario action // Gets the character from this->characterIndex @@ -330,14 +330,14 @@ namespace v2 { void handleInputs() override; \ void checkAllMotionInputs() override; \ void computerInputs() override; \ - void VUnknown5C() override; \ + void updateStory() override; \ bool setCustomScenarioAction(int customScenarioActionId) override; class PlayerReimu : public Player { public: short rodSpawned;//the dropping gohei(purification rod) when Reimu got hit char unknown892[0x2];//align 2? - int unknown894[8];//4ac600: = 0 + int unknown894[8];//4ac600: = 0, maybe for replaced SWR cards unsigned short fantasyHeavenTimer; unsigned short fantasyHeavenStacks;//0~7 @@ -405,7 +405,7 @@ namespace v2 { public: unsigned short philStoneTimer;//countdown 1200f unsigned short unknown892;//56413c: =360, only set when jellyfish bubble is breached, but never reset or used - short unknown894, unknown896, unknown898, unknown89A;//554c70: = 0 + short unknown894, unknown896, unknown898, unknown89A;//554c70: = 0, maybe for replaced SWR cards unsigned short atmEdgeActivationTime;//countdown 2f, if >0 and lv1+, triggers autumn edge to trace short sBubbleHitCount;//0~10 unsigned short dHardnessTimer;//0x8A0 @@ -435,7 +435,7 @@ namespace v2 { unsigned short cloneTimer;// 600f short cloneActivated;//block meter gain, but only set in 2sc clone char unknown8DA[2];//align 2? - //implemente bullet-cutting in story spell Closed-Eye Slash "The Bullet-Cutting Spirit Eye from Roukan" + //implemente bullet-cutting in story spell: Closed-Eye Slash "The Bullet-Cutting Spirit Eye from Roukan" float eyeSlashPosX, eyeSlashPosY, eyeSlashRotZ; bool eyeSlashActivated; char unknown8E9[3];//align 3? @@ -458,9 +458,14 @@ namespace v2 { class PlayerYuyuko : public Player { public: - char unknown890[0x10]; - unsigned short resButterfliesUsed; - char unknown8A2[0xA]; + //story spell: Banquet "All Things Come Full Circle in Death" + int banquetRestTimer;//rest 180f after rings reached max + int banquetElapsedTime;//dec by frame + int banquetRingCount;//max E/N/H/L: 1/3/4/6 + int unknown89C;//5b8170: = 0 + int resButterfliesUsed; + int giftsCount;//Gifts to the Deceased, 0~8 + int giftsTimer;//countdown Lv*30+(count+1)*20 frames PlayerYuyuko(const PlayerInfo&); DECL_PLAYER_VIRTUALS() @@ -469,7 +474,28 @@ namespace v2 { class PlayerYukari : public Player { public: - char unknown890[0x44]; + short parasolSpawned;//the dropping parasol when Yukari got hit + short gapAbsorbCount;//0~13 + bool unknown894;// =0, set 0 when ran is destroyed + char unknown895;// =0, unused? + char unknown896[2];//align 2? + //Universe of Matter and Antimatter + float antimatterPosX1, antimatterPosX2, antimatterPosY1, antimatterPosY2; + short antimatterCount;//0~2 + //story spell: Fantacy Nest "Flying Noctilucae's Nest" + short fireflyFireTimer;//E/N/H/L:180/210/240/270 + short fireflyRestTimer;//120~179 random + //story spell: Aerial Bait "Hyperactive High Speed Flying Object" + short flyObjAimedCD;//EN/H/L:70/65/60, additional aimed bait when hp below 1/3 + short flyObjTimer;//E/N/H/L:45/80/115/150, gen new line per 10f + short flyObjLines;//horizontal line index, inc from 0 + //Wings of Chimera + short wingsCount;//0~3 + char unknown8B6[2];//align 2? + float wingsPosX[3], wingsPosY[3]; + //story spell: "Yakumo's Nest" + short yakumoNestElapsedTime;//inc by frame, fire per 300f + char unknown8D2[2];//align 2? PlayerYukari(const PlayerInfo&); DECL_PLAYER_VIRTUALS() From 6c4a35e91dc7168cdc209c188a8a0c0748664901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Sat, 5 Sep 2026 12:32:51 +0800 Subject: [PATCH 15/21] added suika and reisen extra fields --- src/Player.hpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index d5989c2..51e65be 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -504,9 +504,10 @@ namespace v2 { class PlayerSuika : public Player { public: - char unknown890[0x2]; - unsigned short mppTimer; - char unknown894[0x4]; + unsigned short gakiBindTimer;//countdown 600f, dec opponent's spirit by 2 per frame (regen delay 30f) + unsigned short mppTimer;//countdown 480f + bool upMistUsed;//block another Unpleasant Mist before landed + char unknown895[3]; PlayerSuika(const PlayerInfo&); DECL_PLAYER_VIRTUALS() @@ -515,14 +516,22 @@ namespace v2 { class PlayerUdonge : public Player { public: - char unknown890[0x8]; + short unkown890;// =0 + short reisenOpacity;//0~255 + float reisenOpacityFactor;//normally 1.0, invisible 6D related; towards 0.5 with Infrared Moon + unsigned short urFieldActive; unsigned short uvFieldActive; - char unknown89C[0x4]; - unsigned short elixirUsed; - char unknown8A2[0x10]; + float scanAngle;//Eyesight Cleansing scan range angle + int elixirUsed; + int elixirElapsedTime; + short uvCloneCount;//0~2 + char unknown8AA[2];//align 2? + float uvCloneSpacing;//horizontal + unsigned short xwaveTimeLeft;//countdown 360f unsigned short infraredMoonTimeLeft; - char unknown8B4[0x4]; + bool ocularSpectralUsed;//block another Ocular Spectral before landed + char unknown8B5[3];//align 3? PlayerUdonge(const PlayerInfo&); DECL_PLAYER_VIRTUALS() From 74308db830d0aa09cbd79efcd821cd59ff639350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Sat, 5 Sep 2026 13:26:40 +0800 Subject: [PATCH 16/21] iku and tenshi extra fields supplement --- src/Player.hpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index 51e65be..4a5453e 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -564,7 +564,11 @@ namespace v2 { class PlayerIku : public Player { public: - int unknown890, unknown894, unknown898;//69ae9f: = 0 + //story spell: Cloud Realm "The Thunder Court in the Sea of Abstruse Clouds" + int realmTotalTimer;//harassing fire CD ENH/L:300/240f + int realmLaserCount;//E/N/H/L: 4/6/7/8 + int realmTimer;// E/N/H/L: 150/140/130/120f per turn, gen new laser per 8 frames + unsigned short veilsLikeSky;//0x89c, 900f countdown unsigned short veilsLikeTime;//0x89e, 600f countdown @@ -584,19 +588,19 @@ namespace v2 { float keystoneIndex;//0x910 0~11 looping float backgroundOffset;//0x914 change stage#5 background horizon for the last 2 story spells bool pillarEnabled;//0x918 - char unknown919;//align? + char unknown919;//align 1? unsigned short guardingKeystonesTimer;//0x91a unsigned short guardingKeystonesType;//0x91c 0 for None, 1 for B ver, 2 for C ver char unknown91E[2];//align 2? int guardingKeystonesCount;//0x920 - unsigned short stateOfEnlightenmentTimeLeft; - char unknown926[2];//align 2? - int unknown928;//6bfaca: = 0 + int stateOfEnlightenmentTimeLeft; + //story spell: Spirit Thought "Stone that Calms the Lands" + int spiritThoughtTimer;//inc, drop CD E/N/H/L: 120/80/60/50f bool skyAttackUsed; //0x92c block movement cancel or another sky attack before landed - char unknown92D;//align? + char unknown92D;//align 1? short swordState;// for final spell ko cutscene, 0= not started, 1 = flying, 2 = landed From 15359fe0eb0b0d11fa3bd939bfe63b86a2de2438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Sat, 5 Sep 2026 15:29:44 +0800 Subject: [PATCH 17/21] added sanae full extra fields "unleashSignal" renamed --- src/Player.hpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index 4a5453e..86e71ed 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -248,7 +248,7 @@ namespace v2 { virtual void checkAllMotionInputs(); // compare input buffer for sequences virtual void computerInputs() = 0;// generate computer AI input virtual void updateStory() = 0; // - virtual bool setCustomScenarioAction(int customScenarioActionId) = 0; //handle character specified scenario action + virtual bool setCustomScenarioAction(int customScenarioActionId) = 0; //handle character specified scenario action, ret true means repeat instruction // Gets the character from this->characterIndex void loadResources(); // 0x46c0b0 @@ -611,11 +611,21 @@ namespace v2 { class PlayerSanae : public Player { public: - char unknown890[0xC]; - int kanakoTimer; - int suwakoTimeLeft; - char unknown8A4[0xC]; - + float windSpeed;//flight wind + float windAngle; + Direction windDirection; + char unknown899[3];//align 3? + + int kanakoCdTimer;//kanakoCD+30 + int suwakoCdTimer;//suwakoCD+30 + int kanakoCooldown;//8C:180, lv0:480, lv2~4: (14-Lv)*30 + int suwakoCooldown;//4C:180, lv0:480, lv2~4: (14-Lv)*30 + + bool bshotTriggering;//signal B bullet to emit + bool star2cTrigerring;//signal (j)2C star to emit + bool blackoutSpawned;//used by sanae story blackout narrative + char unknown8AF;//align 1? + PlayerSanae(const PlayerInfo&); DECL_PLAYER_VIRTUALS() }; @@ -645,7 +655,7 @@ namespace v2 { char unknown891[3];//align 3? int capeTexture; float capeOffset;//texture x+y axis moving, +0.25 per frame, 0~255 looping - bool unleashSignal;//signal 5B/J5B/J2B... to shoot + bool bshotTriggering;//signal 5B/J5B/J2B... to emit bool unknown89d;//7b5eba: = 0 char unknown89e[0x2];//align 2? int unknown8a0;//timer for an unused sc #616 like iku's Stickleback, 600f countdown @@ -660,7 +670,7 @@ namespace v2 { class PlayerSuwako : public Player { public: bool unknown890;//782982: = 0 - bool unleashSignal;//0x891 signal L5C/J5C rocks to shoot forward + bool rock5cTriggering;//0x891 signal L5C/J5C rocks to emit char unknown892[2];//align 2? int curseType;//0x894, enum {None=0, Red, Green, Blue} int punishType;//0x898, enum {None=0, Crush, Block, Attack, Dash} From 891d9e6d7debf41a2755e1a2dd12459f508bbc5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Sat, 5 Sep 2026 15:42:15 +0800 Subject: [PATCH 18/21] clean up tenshi todo annotaion --- src/Player.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index 86e71ed..71a944f 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -606,7 +606,7 @@ namespace v2 { PlayerTenshi(const PlayerInfo&); DECL_PLAYER_VIRTUALS() - }; // TODO There's something wrong with Tenshi + }; static_assert(sizeof(PlayerTenshi) == 0x930); class PlayerSanae : public Player { @@ -616,8 +616,8 @@ namespace v2 { Direction windDirection; char unknown899[3];//align 3? - int kanakoCdTimer;//kanakoCD+30 - int suwakoCdTimer;//suwakoCD+30 + int kanakoCdTimer;//kanakoCD+30, dec by frame + int suwakoCdTimer;//suwakoCD+30, dec by frame int kanakoCooldown;//8C:180, lv0:480, lv2~4: (14-Lv)*30 int suwakoCooldown;//4C:180, lv0:480, lv2~4: (14-Lv)*30 From 7a7406ccf2f5165cacd92efa8ca6077db56cc028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Sat, 5 Sep 2026 15:52:28 +0800 Subject: [PATCH 19/21] Youmu dtor/ctor clean up --- src/Player.cpp | 7 ------- src/Player.hpp | 1 - test/main.cpp | 2 +- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/Player.cpp b/src/Player.cpp index c4e10b3..d07acea 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -311,7 +311,6 @@ namespace v2 { PlayerYoumu::PlayerYoumu(const PlayerInfo& info) : Player(info) { - //memset(&this->cloneBuffer.m_table, 0, 0x10); this->objectList = new GameObjectList_Youmu(this); } PlayerUtsuho::PlayerUtsuho(const PlayerInfo& info) : @@ -330,12 +329,6 @@ namespace v2 { this->objectList = new GameObjectList_Utsuho(this); } - PlayerYoumu::~PlayerYoumu() - { - // clone buffer clear - //reinterpret_cast(0x433a50)(&this->cloneBuffer); - this->cloneBuffer.clear(); - } PlayerUtsuho::~PlayerUtsuho() { SokuLib::textureMgr.remove(this->capeTexture); // remove texture in +0x894 diff --git a/src/Player.hpp b/src/Player.hpp index 71a944f..9a2bd62 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -441,7 +441,6 @@ namespace v2 { char unknown8E9[3];//align 3? PlayerYoumu(const PlayerInfo&); - ~PlayerYoumu() override; DECL_PLAYER_VIRTUALS() }; static_assert(sizeof(PlayerYoumu) == 0x8EC); diff --git a/test/main.cpp b/test/main.cpp index 21da517..fc44664 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -226,7 +226,7 @@ void testCharacterManager() assert_equal(sizeof(v2::GameObjectBase), 0x34C); assert_equal(offsetof(v2::GameObjectBase, gameData), 0x158); - assert_equal(offsetof(v2::GameObjectBase, HP), 0x184); + assert_equal(offsetof(v2::GameObjectBase, hp), 0x184); assert_equal(offsetof(v2::GameObjectBase, boxData), 0x1B4); assert_equal(sizeof(v2::GameObject), 0x3AC); From 45a88ced5886de098544c3c1f825074a98327885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Sat, 5 Sep 2026 16:12:43 +0800 Subject: [PATCH 20/21] fixed few fields --- src/Player.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index 9a2bd62..9aca7d3 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -359,7 +359,7 @@ namespace v2 { float orreriesRotatePhase;// -=speed float orreriesRotateSpeed;//type0: 3, type1: 12, type8: 0.5, type50: 12 - float orreriesThrowTargetX, orreriesThrowTargetY;//record decided target pos when throwing out + Vector2f orreriesThrowPos;//record decided target pos when throwing out bool orreriesThrown;//reusing 2sc throws orreries out as boomerang char unknown8A9[3];//align 3? @@ -615,10 +615,10 @@ namespace v2 { Direction windDirection; char unknown899[3];//align 3? - int kanakoCdTimer;//kanakoCD+30, dec by frame - int suwakoCdTimer;//suwakoCD+30, dec by frame - int kanakoCooldown;//8C:180, lv0:480, lv2~4: (14-Lv)*30 - int suwakoCooldown;//4C:180, lv0:480, lv2~4: (14-Lv)*30 + int kanakoCdTimer;//countdown reference kanakoCD, dec by frame + int suwakoCdTimer;//countdown reference suwakoCD, dec by frame + int kanakoCooldown;//reference value, changed with skill level + int suwakoCooldown;//reference value, changed with skill level bool bshotTriggering;//signal B bullet to emit bool star2cTrigerring;//signal (j)2C star to emit From 4d4b58e2d6b7450be06bd23bd95cf00843bec6b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=8E=E5=87=A1=20=E9=87=91?= <18107907861@163.com> Date: Mon, 7 Sep 2026 11:24:10 +0800 Subject: [PATCH 21/21] make yukari pos floats an array --- src/Player.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Player.hpp b/src/Player.hpp index 9aca7d3..688530e 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -475,11 +475,11 @@ namespace v2 { public: short parasolSpawned;//the dropping parasol when Yukari got hit short gapAbsorbCount;//0~13 - bool unknown894;// =0, set 0 when ran is destroyed + bool unknown894;// =0, set 0 when ran is destroyed, but never used? char unknown895;// =0, unused? char unknown896[2];//align 2? //Universe of Matter and Antimatter - float antimatterPosX1, antimatterPosX2, antimatterPosY1, antimatterPosY2; + float antimatterPosX[2], antimatterPosY[2]; short antimatterCount;//0~2 //story spell: Fantacy Nest "Flying Noctilucae's Nest" short fireflyFireTimer;//E/N/H/L:180/210/240/270