From c2f0213e4e5f00bcb6e8b27de8fa436b957cac21 Mon Sep 17 00:00:00 2001 From: Josh Sanchez Date: Sun, 16 Nov 2025 00:40:51 -0600 Subject: [PATCH 1/4] Add -sym on c_flags to xLaserBolt.cpp in configure.py --- configure.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.py b/configure.py index 08dedccae..d503bbeff 100644 --- a/configure.py +++ b/configure.py @@ -571,7 +571,7 @@ def MatchingFor(*versions): Object(Matching, "SB/Game/zCameraFly.cpp"), Object(Matching, "SB/Core/x/xCurveAsset.cpp"), Object(NonMatching, "SB/Core/x/xDecal.cpp", extra_cflags=["-sym on"]), - Object(NonMatching, "SB/Core/x/xLaserBolt.cpp"), + Object(NonMatching, "SB/Core/x/xLaserBolt.cpp", extra_cflags=["-sym on"]), Object(NonMatching, "SB/Game/zCameraTweak.cpp"), Object(NonMatching, "SB/Core/x/xPtankPool.cpp"), Object(Equivalent, "SB/Core/gc/iTRC.cpp"), From 6e518f6c35c7033691e04ca98b630c6b37001ff0 Mon Sep 17 00:00:00 2001 From: Josh Sanchez Date: Sun, 16 Nov 2025 00:41:12 -0600 Subject: [PATCH 2/4] iParMgr: Properly expose gRenderBuffer global var --- src/SB/Core/gc/iParMgr.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/SB/Core/gc/iParMgr.h b/src/SB/Core/gc/iParMgr.h index e82711aef..4168278ce 100644 --- a/src/SB/Core/gc/iParMgr.h +++ b/src/SB/Core/gc/iParMgr.h @@ -9,7 +9,7 @@ struct tagiRenderArrays { // total size: 0x5280 -public: + public: U16 m_index[960]; // offset 0x0, size 0x780 RxObjSpace3DVertex m_vertex[480]; // offset 0x780, size 0x4380 F32 m_vertexTZ[480]; // offset 0x4B00, size 0x780 @@ -18,7 +18,7 @@ struct tagiRenderArrays struct tagiRenderInput { // total size: 0x80 -public: + public: U16* m_index; // offset 0x0, size 0x4 RxObjSpace3DVertex* m_vertex; // offset 0x4, size 0x4 F32* m_vertexTZ; // offset 0x8, size 0x4 @@ -32,6 +32,8 @@ struct tagiRenderInput xVec4 m_camViewU; // offset 0x70, size 0x10 }; +extern tagiRenderInput gRenderBuffer; + void iParMgrInit(); void iParMgrUpdate(F32 elapsedTime); void iParMgrRender(); From 5424b3c454a499bab985bc1221c0b1a1308dc3e4 Mon Sep 17 00:00:00 2001 From: Josh Sanchez Date: Sun, 16 Nov 2025 00:41:36 -0600 Subject: [PATCH 3/4] xLaserBolt: Header updates using objdiff tooling --- src/SB/Core/x/xLaserBolt.h | 52 +++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/SB/Core/x/xLaserBolt.h b/src/SB/Core/x/xLaserBolt.h index 4e8de6048..9d5703aba 100644 --- a/src/SB/Core/x/xLaserBolt.h +++ b/src/SB/Core/x/xLaserBolt.h @@ -11,18 +11,6 @@ #include #include -enum fx_when_enum -{ - FX_WHEN_LAUNCH, - FX_WHEN_IMPACT, - FX_WHEN_BIRTH, - FX_WHEN_DEATH, - FX_WHEN_HEAD, - FX_WHEN_TAIL, - FX_WHEN_KILL, - MAX_FX_WHEN -}; - enum fx_type_enum { FX_TYPE_PARTICLE, @@ -44,6 +32,18 @@ enum fx_orient_enum struct xLaserBoltEmitter { + enum fx_when_enum + { + FX_WHEN_LAUNCH, + FX_WHEN_IMPACT, + FX_WHEN_BIRTH, + FX_WHEN_DEATH, + FX_WHEN_HEAD, + FX_WHEN_TAIL, + FX_WHEN_KILL, + MAX_FX_WHEN + }; + struct config { F32 radius; @@ -61,16 +61,6 @@ struct xLaserBoltEmitter }; struct bolt; - - struct static_queue - { - U32 _first; - U32 _size; - U32 _max_size; - U32 _max_size_mask; - bolt* _buffer; - }; - struct effect_data { struct effect_callback @@ -107,15 +97,15 @@ struct xLaserBoltEmitter }; config cfg; - static_queue bolts; + static_queue bolts; F32 ialpha; RwRaster* bolt_raster; S32 start_collide; effect_data* fx[7]; U32 fxsize[7]; - void init(U32 max_bolts, const char*); - void set_texture(char* name); + void init(u32 max_bolts, const char* texture_name); + void set_texture(const char* name); void set_texture(U32 aid); void set_texture(RwTexture* tex); void set_texture(RwRaster* raster); @@ -129,10 +119,20 @@ struct xLaserBoltEmitter void collide_update(bolt& b); RxObjSpace3DVertex* render(bolt& b, RxObjSpace3DVertex* vert); RxObjSpace3DVertex* get_vert_buffer(S32& dat); - void applyDamage(bolt& b); + void apply_damage(bolt& b); void reset_fx(fx_when_enum when); U32 visible() const; + + void debug_init(const char* texture_name) + { + + } + + void debug_refresh_effects(fx_when_enum when) + { + + } }; #endif From 3e997e3d25ec996df90034512f0a918c47799c33 Mon Sep 17 00:00:00 2001 From: Josh Sanchez Date: Sun, 16 Nov 2025 00:41:52 -0600 Subject: [PATCH 4/4] xLaserBolt: Initial pass of function matches --- src/SB/Core/x/xLaserBolt.cpp | 56 ++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/src/SB/Core/x/xLaserBolt.cpp b/src/SB/Core/x/xLaserBolt.cpp index 423a004f5..4427c0dd6 100644 --- a/src/SB/Core/x/xLaserBolt.cpp +++ b/src/SB/Core/x/xLaserBolt.cpp @@ -2,14 +2,23 @@ #include "xString.h" #include "xstransvc.h" #include "iParMgr.h" +#include "zEvent.h" +#include "zBase.h" +#include "zNPCTypeCommon.h" +#include "zEntDestructObj.h" #include -extern tagiRenderInput gRenderBuffer; -extern F32 lbl_803CF7A4; // 0.0f -extern F32 lbl_803CF7A8; // 255f +void xLaserBoltEmitter::init(u32 max_bolts, const char* texture_name) +{ + this->bolt_raster = NULL; + memset(fxsize, 0, sizeof(fxsize)); + this->bolts.init(max_bolts); + debug_init(texture_name); +} + -void xLaserBoltEmitter::set_texture(char* name) +void xLaserBoltEmitter::set_texture(const char* name) { set_texture(xStrHash(name)); } @@ -36,23 +45,30 @@ void xLaserBoltEmitter::set_texture(RwRaster* raster) this->bolt_raster = raster; } +void xLaserBoltEmitter::reset() +{ +} + void xLaserBoltEmitter::refresh_config() { F32 alpha; if (this->cfg.kill_dist <= this->cfg.fade_dist) { - alpha = lbl_803CF7A4; + alpha = 0.0f; } else { - alpha = lbl_803CF7A8 / (this->cfg.kill_dist - this->cfg.fade_dist); + alpha = 255.0f / (this->cfg.kill_dist - this->cfg.fade_dist); } this->ialpha = alpha; } void xLaserBoltEmitter::attach_effects(fx_when_enum when, effect_data* fx, size_t fxsize) { - // TODO!!! + this->fx[when] = fx; + this->fxsize[when] = fxsize; + reset_fx(when); + debug_refresh_effects(when); } RxObjSpace3DVertex* xLaserBoltEmitter::get_vert_buffer(S32& dat) @@ -61,9 +77,31 @@ RxObjSpace3DVertex* xLaserBoltEmitter::get_vert_buffer(S32& dat) return gRenderBuffer.m_vertex; } +void xLaserBoltEmitter::apply_damage(xLaserBoltEmitter::bolt& b) +{ + if (b.hit_ent->baseType == eBaseTypeNPC) + { + zNPCCommon* npc = (zNPCCommon*)b.hit_ent; + npc->Damage(DMGTYP_PROJECTILE, NULL, &b.dir); + } + else if (b.hit_ent->baseType == eBaseTypeDestructObj) + { + zEntDestructObj_Hit((zEntDestructObj*)b.hit_ent, 0x40000); + } + else + { + zEntEvent(b.hit_ent, eEventHit, cfg.damage, 0.0f, 0.0f, 0.0f); + } +} + // WIP. void xLaserBoltEmitter::reset_fx(fx_when_enum when) { - U32* sizePtr = &this->fxsize[when]; - effect_data** effect = &this->fx[when]; + for (U32 i = 0; i < sizeof(fx); i++) + { + U32* sizePtr = &this->fxsize[when]; + effect_data** effect = &this->fx[when]; + + + } }