From 2bb9b8ec2854372b1a307e7f78720214b6fc2318 Mon Sep 17 00:00:00 2001 From: roblabla Date: Sun, 19 May 2024 13:26:52 +0200 Subject: [PATCH 1/3] Implement BulletManager::RegisterChain --- config/globals.csv | 5 +++ config/implemented.csv | 1 + config/mapping.csv | 8 ++-- config/stubbed.csv | 6 ++- src/BulletManager.cpp | 47 +++++++++++++++++++++++ src/BulletManager.hpp | 82 ++++++++++++++++++++++++++++++++++++++++- src/ChainPriorities.hpp | 2 + src/diffbuild.hpp | 10 +++++ 8 files changed, 155 insertions(+), 6 deletions(-) diff --git a/config/globals.csv b/config/globals.csv index 5d59f44e..fdcf7480 100644 --- a/config/globals.csv +++ b/config/globals.csv @@ -1,5 +1,8 @@ _g_TextureFormatD3D8Mapping, 0x0046c220 _g_StageFiles, 0x004760e0 +_g_EffectsColorWithTextureBlending, 0x00476358 +_g_EffectsColorWithoutTextureBlending, 0x004763c8 +_g_EffectsColor, 0x00476438 _g_ExtraLivesScores, 0x004764b0 _g_EclFiles, 0x004764c4 _g_AnmStageFiles, 0x004764e8 @@ -27,7 +30,9 @@ _g_EnemyManager, 0x004b79c8 _g_EnemyManagerDrawChain, 0x004b79a8 _g_RunningSpellcardInfo, 0x005a5f8c _g_EnemyManagerCalcChain, 0x005a5fb4 +_g_BulletManagerDrawChain, 0x005a5fd8 _g_BulletManager, 0x005a5ff8 +_g_BulletManagerCalcChain, 0x0069bc10 _g_Gui, 0x0069bc30 _g_GameManager, 0x0069bca0 _g_GameManagerDrawChain, 0x0069d740 diff --git a/config/implemented.csv b/config/implemented.csv index 1e6d413e..8d454622 100644 --- a/config/implemented.csv +++ b/config/implemented.csv @@ -40,6 +40,7 @@ AnmManager::SetupVertexBuffer AnmManager::SetRenderStateForVm AnmManager::TranslateRotation AnmManager::ExecuteAnmIdx +BulletManager::RegisterChain ChainElem::ChainElem ChainElem::~ChainElem Chain::CreateElem diff --git a/config/mapping.csv b/config/mapping.csv index 00edab54..2dcd8315 100644 --- a/config/mapping.csv +++ b/config/mapping.csv @@ -130,12 +130,12 @@ BulletManager::FUN_00414360,0x414360,0x25f,__thiscall,i32,BulletManager*,i32,i32 BulletManager::SpawnBullet,0x4145c0,0xa5,__thiscall,u32,BulletManager*,EnemyBulletShooter* AnmVm::FUN_00414670,0x414670,0x27b,unknown,void*,EnemyLaserShooter* BulletManager::RegisterChain,0x4148f0,0xd3,default,ZunResult,char* -BulletManager::OnUpdate,0x4149d0,0x1b10,__stdcall,u32,BulletManager* -BulletManager::OnDraw,0x416500,0x647,__stdcall,ChainCallbackResult,BulletManager* +BulletManager::OnUpdate,0x4149d0,0x1b10,default,ChainCallbackResult,BulletManager* +BulletManager::OnDraw,0x416500,0x647,default,ChainCallbackResult,BulletManager* FUN_00416b50,0x416b50,0xea,__stdcall,void,Bullet* FUN_00416c50,0x416c50,0xf4,__stdcall,void,Bullet* -BulletManager::AddedCallback,0x416d60,0x509,__stdcall,ZunResult,BulletManager* -BulletManager::DeletedCallback,0x417270,0x31,__stdcall,ZunResult,BulletManager* +BulletManager::AddedCallback,0x416d60,0x509,default,ZunResult,BulletManager* +BulletManager::DeletedCallback,0x417270,0x31,default,ZunResult,BulletManager* CutBulletManagerChains,0x4172b0,0x23,unknown,u8 Gui::FUN_004172d3,0x4172d3,0x41,__thiscall,u32,Gui* Gui::FUN_00417314,0x417314,0x18,__thiscall,void,Gui* diff --git a/config/stubbed.csv b/config/stubbed.csv index 0990ea1b..cef91d7d 100644 --- a/config/stubbed.csv +++ b/config/stubbed.csv @@ -57,7 +57,11 @@ EnemyManager::Initialize EnemyManager::OnUpdate EnemyManager::OnDraw EnemyManager::DeletedCallback -BulletManager::RegisterChain +BulletManager::AddedCallback +BulletManager::DeletedCallback +BulletManager::OnUpdate +BulletManager::OnDraw +BulletManager::InitializeToZero BulletManager::RemoveAllBullets ItemManager::SpawnItem Stage::RegisterChain diff --git a/src/BulletManager.cpp b/src/BulletManager.cpp index d11f2620..edeec171 100644 --- a/src/BulletManager.cpp +++ b/src/BulletManager.cpp @@ -1,3 +1,50 @@ #include "BulletManager.hpp" +#include "Chain.hpp" +#include "ChainPriorities.hpp" DIFFABLE_STATIC(BulletManager, g_BulletManager); +DIFFABLE_STATIC(ChainElem, g_BulletManagerCalcChain); +DIFFABLE_STATIC(ChainElem, g_BulletManagerDrawChain); +DIFFABLE_STATIC_ARRAY_ASSIGN(u32, 28, g_EffectsColorWithTextureBlending) = { + 0xff000000, 0xff303030, 0xff606060, 0xff500000, 0xff900000, 0xffff2020, 0xff400040, + 0xff800080, 0xffff30ff, 0xff000050, 0xff000090, 0xff2020ff, 0xff203060, 0xff304090, + 0xff3080ff, 0xff005000, 0xff009000, 0xff20ff20, 0xff206000, 0xff409010, 0xff80ff20, + 0xff505000, 0xff909000, 0xffffff20, 0xff603000, 0xff904010, 0xfff08020, 0xffffffff}; + +DIFFABLE_STATIC_ARRAY_ASSIGN(u32, 28, g_EffectsColorWithoutTextureBlending) = { + 0xfff0f0f0, 0xfff0f0f0, 0xffffffff, 0xffffe0e0, 0xffffe0e0, 0xffffe0e0, 0xffffe0ff, + 0xffffe0ff, 0xffffe0ff, 0xffe0e0ff, 0xffe0e0ff, 0xffe0e0ff, 0xffe0ffff, 0xffe0ffff, + 0xffe0ffff, 0xffe0ffe0, 0xffe0ffe0, 0xffe0ffe0, 0xffe0ffe0, 0xffe0ffe0, 0xffe0ffe0, + 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffe0e0, 0xffffe0e0, 0xffffe0e0, 0xffffffff}; +DIFFABLE_STATIC_ASSIGN(u32 *, g_EffectsColor) = g_EffectsColorWithTextureBlending; + +ZunResult BulletManager::RegisterChain(char *bulletAnmPath) +{ + BulletManager *mgr = &g_BulletManager; + if (((g_Supervisor.cfg.opts >> GCOS_USE_D3D_HW_TEXTURE_BLENDING) & 1) == 0) + { + g_EffectsColor = g_EffectsColorWithTextureBlending; + } + else + { + g_EffectsColor = g_EffectsColorWithoutTextureBlending; + } + mgr->InitializeToZero(); + mgr->bulletAnmPath = bulletAnmPath; + g_BulletManagerCalcChain.callback = (ChainCallback)BulletManager::OnUpdate; + g_BulletManagerCalcChain.addedCallback = NULL; + g_BulletManagerCalcChain.deletedCallback = NULL; + g_BulletManagerCalcChain.addedCallback = (ChainAddedCallback)BulletManager::AddedCallback; + g_BulletManagerCalcChain.deletedCallback = (ChainDeletedCallback)BulletManager::DeletedCallback; + g_BulletManagerCalcChain.arg = mgr; + if (g_Chain.AddToCalcChain(&g_BulletManagerCalcChain, TH_CHAIN_PRIO_CALC_BULLETMANAGER) != ZUN_SUCCESS) + { + return ZUN_ERROR; + } + g_BulletManagerDrawChain.callback = (ChainCallback)BulletManager::OnDraw; + g_BulletManagerDrawChain.addedCallback = NULL; + g_BulletManagerDrawChain.deletedCallback = NULL; + g_BulletManagerDrawChain.arg = mgr; + g_Chain.AddToDrawChain(&g_BulletManagerDrawChain, TH_CHAIN_PRIO_DRAW_BULLETMANAGER); + return ZUN_SUCCESS; +} diff --git a/src/BulletManager.hpp b/src/BulletManager.hpp index 182eebb7..7bd7f079 100644 --- a/src/BulletManager.hpp +++ b/src/BulletManager.hpp @@ -1,15 +1,95 @@ #pragma once +#include "AnmVm.hpp" #include "ZunBool.hpp" #include "ZunResult.hpp" #include "diffbuild.hpp" #include "inttypes.hpp" +struct BulletTypeSprites +{ + AnmVm spriteBullet; + AnmVm spriteSpawnEffectShort; + AnmVm spriteSpawnEffectMedium; + AnmVm spriteSpawnEffectLong; + AnmVm spriteSpawnEffectLongMemset; + + D3DXVECTOR3 grazeSize; + u8 unk_55c; + u8 bulletHeight; +}; +C_ASSERT(sizeof(BulletTypeSprites) == 0x560); + +struct Bullet +{ + BulletTypeSprites sprites; + D3DXVECTOR3 pos; + D3DXVECTOR3 velocity; + D3DXVECTOR3 ex4Acceleration; + f32 speed; + f32 ex5Float0; + f32 dirChangeSpeed; + f32 angle; + f32 ex5Float1; + f32 dirChangeRotation; + ZunTimer timer; + i32 ex5Int0; + i32 dirChangeInterval; + i32 dirChangeNumTimes; + i32 dirChangeMaxTimes; + u16 exFlags; + u16 color; + u16 unk_5bc; + u16 state; + u16 unk_5c0; + u8 unk_5c2; + u8 unk_5c3; +}; +C_ASSERT(sizeof(Bullet) == 0x5c4); + +struct Laser +{ + AnmVm vm0; + AnmVm vm1; + D3DXVECTOR3 pos; + f32 angle; + f32 startOffset; + f32 endOffset; + f32 startLength; + f32 width; + f32 speed; + i32 startTime; + i32 grazeDelay; + i32 duration; + i32 endTime; + i32 grazeInterval; + i32 inUse; + ZunTimer timer; + i16 flags; + i16 color; + u8 state; +}; +C_ASSERT(sizeof(Laser) == 0x270); + struct BulletManager { - static ZunResult RegisterChain(char *bulletAnmFile); + static ZunResult RegisterChain(char *bulletAnmPath); + static ZunResult AddedCallback(BulletManager *mgr); + static ZunResult DeletedCallback(BulletManager *mgr); + static ChainCallbackResult OnUpdate(BulletManager *mgr); + static ChainCallbackResult OnDraw(BulletManager *mgr); void RemoveAllBullets(ZunBool turnIntoItem); + void InitializeToZero(); + + BulletTypeSprites bulletTypeTemplates[16]; + Bullet bullets[640]; + Laser lasers[64]; + i32 nextBulletIndex; + i32 bulletCount; + ZunTimer time; + char *bulletAnmPath; }; +C_ASSERT(sizeof(BulletManager) == 0xf5c18); DIFFABLE_EXTERN(BulletManager, g_BulletManager); diff --git a/src/ChainPriorities.hpp b/src/ChainPriorities.hpp index 500e0ced..6a2d0b4a 100644 --- a/src/ChainPriorities.hpp +++ b/src/ChainPriorities.hpp @@ -8,6 +8,7 @@ #define TH_CHAIN_PRIO_CALC_PLAYER 7 #define TH_CHAIN_PRIO_CALC_ENEMYMANAGER 9 #define TH_CHAIN_PRIO_CALC_EFFECTMANAGER 10 +#define TH_CHAIN_PRIO_CALC_BULLETMANAGER 11 #define TH_CHAIN_PRIO_DRAW_MAINMENU 0 #define TH_CHAIN_PRIO_DRAW_GAMEMANAGER 2 @@ -17,6 +18,7 @@ #define TH_CHAIN_PRIO_DRAW_ENEMYMANAGER 6 #define TH_CHAIN_PRIO_DRAW_HIGH_PRIO_PLAYER 7 #define TH_CHAIN_PRIO_DRAW_EFFECTMANAGER 8 +#define TH_CHAIN_PRIO_DRAW_BULLETMANAGER 9 #define TH_CHAIN_PRIO_DRAW_ASCIIMANAGER_POPUPS 10 #define TH_CHAIN_PRIO_DRAW_SUPERVISOR 14 #define TH_CHAIN_PRIO_DRAW_ASCIIMANAGER_MENUS 15 diff --git a/src/diffbuild.hpp b/src/diffbuild.hpp index f8dca8d6..b13fb8bc 100644 --- a/src/diffbuild.hpp +++ b/src/diffbuild.hpp @@ -34,6 +34,15 @@ #define DIFFABLE_EXTERN(type, name) extern "C" type name; #define DIFFABLE_STATIC(type, name) extern "C" type name; // This macro is meant to be used like so: +// DIFFABLE_STATIC_ARRAY_ASSIGN(u32, g_ArrayName) = 12; +// +// In diffbuild, we want to discard the content of the array, so we generate a +// second, fake static, that we store in a template<> to make sure it doesn't +// get instanciated. +#define DIFFABLE_STATIC_ASSIGN(type, name) \ + extern "C" type name; \ + template <> type DIFFBUILD_HIDE_NAME_##name +// This macro is meant to be used like so: // DIFFABLE_STATIC_ARRAY_ASSIGN(u32, 5, g_ArrayName) = { 0, 1, 2 }; // // In diffbuild, we want to discard the content of the array, so we generate a @@ -45,5 +54,6 @@ #else #define DIFFABLE_EXTERN(type, name) extern type name; #define DIFFABLE_STATIC(type, name) type name; +#define DIFFABLE_STATIC_ASSIGN(type, name) type name #define DIFFABLE_STATIC_ARRAY_ASSIGN(type, size, name) type name[size] #endif From 61c9050daabe143806e2c808dcc6a58c09368651 Mon Sep 17 00:00:00 2001 From: roblabla Date: Mon, 20 May 2024 01:10:14 +0200 Subject: [PATCH 2/3] Implement BulletManager::AddedCallback --- config/globals.csv | 1 + config/implemented.csv | 1 + config/stubbed.csv | 1 - src/AnmIdx.hpp | 32 +++++++++++ src/BulletManager.cpp | 120 +++++++++++++++++++++++++++++++++++++++++ src/BulletManager.hpp | 8 +-- src/ItemManager.hpp | 22 ++++++++ 7 files changed, 180 insertions(+), 5 deletions(-) diff --git a/config/globals.csv b/config/globals.csv index fdcf7480..51e3c825 100644 --- a/config/globals.csv +++ b/config/globals.csv @@ -1,3 +1,4 @@ +_g_BulletTypeInfos, 0x0046a6e8 _g_TextureFormatD3D8Mapping, 0x0046c220 _g_StageFiles, 0x004760e0 _g_EffectsColorWithTextureBlending, 0x00476358 diff --git a/config/implemented.csv b/config/implemented.csv index 8d454622..c59dfede 100644 --- a/config/implemented.csv +++ b/config/implemented.csv @@ -41,6 +41,7 @@ AnmManager::SetRenderStateForVm AnmManager::TranslateRotation AnmManager::ExecuteAnmIdx BulletManager::RegisterChain +BulletManager::AddedCallback ChainElem::ChainElem ChainElem::~ChainElem Chain::CreateElem diff --git a/config/stubbed.csv b/config/stubbed.csv index cef91d7d..9927ded9 100644 --- a/config/stubbed.csv +++ b/config/stubbed.csv @@ -57,7 +57,6 @@ EnemyManager::Initialize EnemyManager::OnUpdate EnemyManager::OnDraw EnemyManager::DeletedCallback -BulletManager::AddedCallback BulletManager::DeletedCallback BulletManager::OnUpdate BulletManager::OnDraw diff --git a/src/AnmIdx.hpp b/src/AnmIdx.hpp index 95b634d0..1d3cb19d 100644 --- a/src/AnmIdx.hpp +++ b/src/AnmIdx.hpp @@ -5,6 +5,8 @@ #define ANM_FILE_ASCIIS 2 #define ANM_FILE_CAPTURE 3 #define ANM_FILE_PLAYER 5 +#define ANM_FILE_BULLET3 6 +#define ANM_FILE_BULLET4 7 #define ANM_FILE_ENEMY 8 #define ANM_FILE_ENEMY2 9 #define ANM_FILE_EFFECTS 11 @@ -26,6 +28,8 @@ #define ANM_OFFSET_REPLAY 0x160 #define ANM_OFFSET_TITLE01S 0x17a #define ANM_OFFSET_TITLE04S 0x195 +#define ANM_OFFSET_BULLET3 0x200 +#define ANM_OFFSET_BULLET4 0x29a #define ANM_OFFSET_EFFECTS 0x2b3 #define ANM_OFFSET_PLAYER 0x400 #define ANM_OFFSET_TEXT 0x700 @@ -55,6 +59,34 @@ #define ANM_SCRIPT_REPLAY_START ANM_OFFSET_REPLAY #define ANM_SCRIPT_REPLAY_END 0x179 +#define ANM_SCRIPT_BULLET3_START ANM_OFFSET_BULLET3 +#define ANM_SCRIPT_BULLET3_PELLET (ANM_SCRIPT_BULLET3_START + 0) +#define ANM_SCRIPT_BULLET3_RING_BALL (ANM_SCRIPT_BULLET3_START + 1) +#define ANM_SCRIPT_BULLET3_RICE (ANM_SCRIPT_BULLET3_START + 2) +#define ANM_SCRIPT_BULLET3_BALL (ANM_SCRIPT_BULLET3_START + 3) +#define ANM_SCRIPT_BULLET3_KUNAI (ANM_SCRIPT_BULLET3_START + 4) +#define ANM_SCRIPT_BULLET3_SHARD (ANM_SCRIPT_BULLET3_START + 5) +#define ANM_SCRIPT_BULLET3_BIG_BALL (ANM_SCRIPT_BULLET3_START + 6) +#define ANM_SCRIPT_BULLET3_FIREBALL (ANM_SCRIPT_BULLET3_START + 7) +#define ANM_SCRIPT_BULLET3_DAGGER (ANM_SCRIPT_BULLET3_START + 8) +#define ANM_SCRIPT_BULLET3_SPAWN_DONUT_SMALL (ANM_SCRIPT_BULLET3_START + 11) +#define ANM_SCRIPT_BULLET3_SPAWN_DONUT_MEDIUM (ANM_SCRIPT_BULLET3_START + 12) +#define ANM_SCRIPT_BULLET3_SPAWN_DONUT_BIG (ANM_SCRIPT_BULLET3_START + 13) +#define ANM_SCRIPT_BULLET3_SPAWN_PELLET_FAST (ANM_SCRIPT_BULLET3_START + 14) +#define ANM_SCRIPT_BULLET3_SPAWN_PELLET_NORMAL (ANM_SCRIPT_BULLET3_START + 15) +#define ANM_SCRIPT_BULLET3_SPAWN_PELLET_SLOW (ANM_SCRIPT_BULLET3_START + 16) +#define ANM_SCRIPT_BULLET3_SPAWN_BIG_BALL_FAST (ANM_SCRIPT_BULLET3_START + 17) +#define ANM_SCRIPT_BULLET3_SPAWN_BIG_BALL_NORMAL (ANM_SCRIPT_BULLET3_START + 18) +#define ANM_SCRIPT_BULLET3_SPAWN_BIG_BALL_SLOW (ANM_SCRIPT_BULLET3_START + 19) +#define ANM_SCRIPT_BULLET3_SPAWN_BIG_BALL_HUGE (ANM_SCRIPT_BULLET3_START + 20) +#define ANM_SCRIPT_BULLET3_END 0x21b + +#define ANM_SCRIPT_BULLET4_START ANM_OFFSET_BULLET4 +#define ANM_SCRIPT_BULLET4_BUBBLE (ANM_SCRIPT_BULLET4_START + 0) +#define ANM_SCRIPT_BULLET4_SPAWN_BUBBLE_NORMAL (ANM_SCRIPT_BULLET4_START + 1) +#define ANM_SCRIPT_BULLET4_SPAWN_BUBBLE_SLOW (ANM_SCRIPT_BULLET4_START + 2) +#define ANM_SCRIPT_BULLET4_END 0x2ae + #define ANM_SCRIPT_EFFECTS_START ANM_OFFSET_EFFECTS #define ANM_SCRIPT_EFFECTS_END 0x2b3 diff --git a/src/BulletManager.cpp b/src/BulletManager.cpp index edeec171..10398594 100644 --- a/src/BulletManager.cpp +++ b/src/BulletManager.cpp @@ -1,6 +1,8 @@ #include "BulletManager.hpp" +#include "AnmManager.hpp" #include "Chain.hpp" #include "ChainPriorities.hpp" +#include "ItemManager.hpp" DIFFABLE_STATIC(BulletManager, g_BulletManager); DIFFABLE_STATIC(ChainElem, g_BulletManagerCalcChain); @@ -18,6 +20,40 @@ DIFFABLE_STATIC_ARRAY_ASSIGN(u32, 28, g_EffectsColorWithoutTextureBlending) = { 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffe0e0, 0xffffe0e0, 0xffffe0e0, 0xffffffff}; DIFFABLE_STATIC_ASSIGN(u32 *, g_EffectsColor) = g_EffectsColorWithTextureBlending; +struct BulletTypeInfo +{ + u32 bulletAnmScriptIdx; + u32 bulletSpawnEffectFastAnmScriptIdx; + u32 bulletSpawnEffectNormalAnmScriptIdx; + u32 bulletSpawnEffectSlowAnmScriptIdx; + u32 bulletSpawnEffectDonutAnmScriptIdx; +}; + +#define ASB3(x) ANM_SCRIPT_BULLET3_##x +#define ASB4(x) ANM_SCRIPT_BULLET4_##x +DIFFABLE_STATIC_ARRAY_ASSIGN(BulletTypeInfo, 10, g_BulletTypeInfos) = { + {ASB3(PELLET), ASB3(SPAWN_PELLET_FAST), ASB3(SPAWN_PELLET_NORMAL), ASB3(SPAWN_PELLET_SLOW), + ASB3(SPAWN_DONUT_SMALL)}, + {ASB3(RING_BALL), ASB3(SPAWN_BIG_BALL_FAST), ASB3(SPAWN_BIG_BALL_NORMAL), ASB3(SPAWN_BIG_BALL_SLOW), + ASB3(SPAWN_DONUT_MEDIUM)}, + {ASB3(RICE), ASB3(SPAWN_BIG_BALL_FAST), ASB3(SPAWN_BIG_BALL_NORMAL), ASB3(SPAWN_BIG_BALL_SLOW), + ASB3(SPAWN_DONUT_MEDIUM)}, + {ASB3(BALL), ASB3(SPAWN_BIG_BALL_FAST), ASB3(SPAWN_BIG_BALL_NORMAL), ASB3(SPAWN_BIG_BALL_SLOW), + ASB3(SPAWN_DONUT_MEDIUM)}, + {ASB3(KUNAI), ASB3(SPAWN_BIG_BALL_FAST), ASB3(SPAWN_BIG_BALL_NORMAL), ASB3(SPAWN_BIG_BALL_SLOW), + ASB3(SPAWN_DONUT_MEDIUM)}, + {ASB3(SHARD), ASB3(SPAWN_BIG_BALL_FAST), ASB3(SPAWN_BIG_BALL_NORMAL), ASB3(SPAWN_BIG_BALL_SLOW), + ASB3(SPAWN_DONUT_MEDIUM)}, + {ASB3(BIG_BALL), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE), + ASB3(SPAWN_DONUT_BIG)}, + {ASB3(FIREBALL), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE), + ASB3(SPAWN_DONUT_BIG)}, + {ASB3(DAGGER), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE), ASB3(SPAWN_BIG_BALL_HUGE), + ASB3(SPAWN_DONUT_BIG)}, + {ASB4(BUBBLE), ASB4(SPAWN_BUBBLE_SLOW), ASB4(SPAWN_BUBBLE_SLOW), ASB4(SPAWN_BUBBLE_SLOW), + ASB4(SPAWN_BUBBLE_NORMAL)}, +}; + ZunResult BulletManager::RegisterChain(char *bulletAnmPath) { BulletManager *mgr = &g_BulletManager; @@ -48,3 +84,87 @@ ZunResult BulletManager::RegisterChain(char *bulletAnmPath) g_Chain.AddToDrawChain(&g_BulletManagerDrawChain, TH_CHAIN_PRIO_DRAW_BULLETMANAGER); return ZUN_SUCCESS; } + +ZunResult BulletManager::AddedCallback(BulletManager *mgr) +{ + u32 idx; + + if ((ZunBool)(g_Supervisor.curState != SUPERVISOR_STATE_GAMEMANAGER_REINIT)) + { + if (g_AnmManager->LoadAnm(ANM_FILE_BULLET3, "data/etama3.anm", ANM_OFFSET_BULLET3) != ZUN_SUCCESS) + { + return ZUN_ERROR; + } + if (g_AnmManager->LoadAnm(ANM_FILE_BULLET4, "data/etama4.anm", ANM_OFFSET_BULLET4) != ZUN_SUCCESS) + { + return ZUN_ERROR; + } + } + for (idx = 0; idx < 10; idx++) + { + g_AnmManager->SetAndExecuteScriptIdx(&mgr->bulletTypeTemplates[idx].spriteBullet, + g_BulletTypeInfos[idx].bulletAnmScriptIdx); + g_AnmManager->SetAndExecuteScriptIdx(&mgr->bulletTypeTemplates[idx].spriteSpawnEffectFast, + g_BulletTypeInfos[idx].bulletSpawnEffectFastAnmScriptIdx); + g_AnmManager->SetAndExecuteScriptIdx(&mgr->bulletTypeTemplates[idx].spriteSpawnEffectNormal, + g_BulletTypeInfos[idx].bulletSpawnEffectNormalAnmScriptIdx); + g_AnmManager->SetAndExecuteScriptIdx(&mgr->bulletTypeTemplates[idx].spriteSpawnEffectSlow, + g_BulletTypeInfos[idx].bulletSpawnEffectSlowAnmScriptIdx); + g_AnmManager->SetAndExecuteScriptIdx(&mgr->bulletTypeTemplates[idx].spriteSpawnEffectDonut, + g_BulletTypeInfos[idx].bulletSpawnEffectDonutAnmScriptIdx); + mgr->bulletTypeTemplates[idx].spriteBullet.baseSpriteIndex = + mgr->bulletTypeTemplates[idx].spriteBullet.activeSpriteIndex; + mgr->bulletTypeTemplates[idx].bulletHeight = mgr->bulletTypeTemplates[idx].spriteBullet.sprite->heightPx; + if (mgr->bulletTypeTemplates[idx].spriteBullet.sprite->heightPx <= 8.0f) + { + mgr->bulletTypeTemplates[idx].grazeSize.x = 4.0f; + mgr->bulletTypeTemplates[idx].grazeSize.y = 4.0f; + } + else if (mgr->bulletTypeTemplates[idx].spriteBullet.sprite->heightPx <= 16.0f) + { + switch (g_BulletTypeInfos[idx].bulletAnmScriptIdx) + { + case ANM_SCRIPT_BULLET3_RICE: + mgr->bulletTypeTemplates[idx].grazeSize.x = 4.0f; + mgr->bulletTypeTemplates[idx].grazeSize.y = 4.0f; + break; + case ANM_SCRIPT_BULLET3_KUNAI: + mgr->bulletTypeTemplates[idx].grazeSize.x = 5.0f; + mgr->bulletTypeTemplates[idx].grazeSize.y = 5.0f; + break; + case ANM_SCRIPT_BULLET3_SHARD: + mgr->bulletTypeTemplates[idx].grazeSize.x = 4.0f; + mgr->bulletTypeTemplates[idx].grazeSize.y = 4.0f; + break; + default: + mgr->bulletTypeTemplates[idx].grazeSize.x = 6.0f; + mgr->bulletTypeTemplates[idx].grazeSize.y = 6.0f; + break; + } + } + else if (mgr->bulletTypeTemplates[idx].spriteBullet.sprite->heightPx <= 32.0f) + { + switch (g_BulletTypeInfos[idx].bulletAnmScriptIdx) + { + case ANM_SCRIPT_BULLET3_FIREBALL: + mgr->bulletTypeTemplates[idx].grazeSize.x = 11.0f; + mgr->bulletTypeTemplates[idx].grazeSize.y = 11.0f; + break; + case ANM_SCRIPT_BULLET3_DAGGER: + mgr->bulletTypeTemplates[idx].grazeSize.x = 9.0f; + mgr->bulletTypeTemplates[idx].grazeSize.y = 9.0f; + break; + default: + mgr->bulletTypeTemplates[idx].grazeSize.x = 16.0f; + mgr->bulletTypeTemplates[idx].grazeSize.y = 16.0f; + } + } + else + { + mgr->bulletTypeTemplates[idx].grazeSize.x = 32.0f; + mgr->bulletTypeTemplates[idx].grazeSize.y = 32.0f; + } + } + memset(&g_ItemManager, 0, sizeof(ItemManager)); + return ZUN_SUCCESS; +} diff --git a/src/BulletManager.hpp b/src/BulletManager.hpp index 7bd7f079..e4bc5a62 100644 --- a/src/BulletManager.hpp +++ b/src/BulletManager.hpp @@ -9,10 +9,10 @@ struct BulletTypeSprites { AnmVm spriteBullet; - AnmVm spriteSpawnEffectShort; - AnmVm spriteSpawnEffectMedium; - AnmVm spriteSpawnEffectLong; - AnmVm spriteSpawnEffectLongMemset; + AnmVm spriteSpawnEffectFast; + AnmVm spriteSpawnEffectNormal; + AnmVm spriteSpawnEffectSlow; + AnmVm spriteSpawnEffectDonut; D3DXVECTOR3 grazeSize; u8 unk_55c; diff --git a/src/ItemManager.hpp b/src/ItemManager.hpp index 4243f211..680c7a85 100644 --- a/src/ItemManager.hpp +++ b/src/ItemManager.hpp @@ -1,5 +1,7 @@ #pragma once +#include "AnmVm.hpp" +#include "ZunTimer.hpp" #include "diffbuild.hpp" #include "inttypes.hpp" @@ -17,9 +19,29 @@ enum ItemType // This enum is 1 byte in size on Enemy ITEM_NO_ITEM }; +struct Item +{ + AnmVm sprite; + D3DXVECTOR3 currentPosition; + D3DXVECTOR3 startPosition; + D3DXVECTOR3 targetPosition; + ZunTimer timer; + u8 itemType; + u8 isInUse; + u8 unk_142; + u8 state; +}; +C_ASSERT(sizeof(Item) == 0x144); + struct ItemManager { void SpawnItem(D3DXVECTOR3 *position, ItemType type, i32 state); + + Item items[512]; + Item dummyItemForFailedSpawns; + u32 nextIndex; + u32 itemCount; }; +C_ASSERT(sizeof(ItemManager) == 0x2894c); DIFFABLE_EXTERN(ItemManager, g_ItemManager); From df932cdc338900236ac78c2aeb90bb232531ff7e Mon Sep 17 00:00:00 2001 From: roblabla Date: Mon, 20 May 2024 01:11:09 +0200 Subject: [PATCH 3/3] Prefer loading unpacked files --- src/FileSystem.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/FileSystem.cpp b/src/FileSystem.cpp index d71338a3..cb685cdc 100644 --- a/src/FileSystem.cpp +++ b/src/FileSystem.cpp @@ -18,6 +18,22 @@ u8 *FileSystem::OpenPath(char *filepath, int isExternalResource) i32 pbg3Idx; entryIdx = -1; +#define PREFER_UNPACKED 1 +#ifdef PREFER_UNPACKED + DebugPrint2("%s Load ... \n", filepath); + file = fopen(filepath, "rb"); + if (file != NULL) + { + fseek(file, 0, SEEK_END); + fsize = ftell(file); + g_LastFileSize = fsize; + fseek(file, 0, SEEK_SET); + data = (u8 *)malloc(fsize); + fread(data, 1, fsize, file); + fclose(file); + return data; + } +#endif if (isExternalResource == 0) { entryname = strrchr(filepath, '\\');