diff --git a/config/symbol_addrs.txt b/config/symbol_addrs.txt index 76b36e17..6c0ead78 100644 --- a/config/symbol_addrs.txt +++ b/config/symbol_addrs.txt @@ -77,6 +77,10 @@ snd_SendIOPCommandNoWait = 0x11e8c8; // type:func // P2/alo.c //////////////////////////////////////////////////////////////// InitAlo__FP3ALO = 0x123ED0; // type:func +SnipAloObjects__FP3ALOiP4SNIP = 0x124DF8; // type:func +UpdateAlo__FP3ALOf = 0x124FC0; // type:func +LoadAloFromBrx__FP3ALOP18CBinaryInputStream = 0x1289C0; // type:func +SetAloTargetHitTest__FP3ALOi = 0x12AA28; // type:func //////////////////////////////////////////////////////////////// // P2/binoc.c @@ -351,6 +355,8 @@ CollectLifetkn__FP7LIFETKN = 0x148FF0; // type:func FUN_00149168 = 0x149168; // type:func break_bottle = 0x149190; // type:func +s_asnipDprize = 0x2619A0; // size:0x3c + //////////////////////////////////////////////////////////////// // P2/difficulty.c //////////////////////////////////////////////////////////////// @@ -789,7 +795,7 @@ GRandInRange__Fff = 0x1EAAE0; // type:func GRandGaussian = 0x1EAB48; // type:func FFloatsNear__Ffff = 0x1EAC68; // type:func CSolveQuadratic = 0x1EACA0; // type:func -PrescaleClq = 0x1EAD30; // type:func +PrescaleClq__FP3CLQffT0 = 0x1EAD30; // type:func CalculateSinCos__FfPfT1 = 0x1EAD88; // type:func GTrunc = 0x1EAE78; // type:func GTrunc1 = 0x1EAF28; // type:func diff --git a/include/alo.h b/include/alo.h index 56938c32..28c80765 100644 --- a/include/alo.h +++ b/include/alo.h @@ -8,6 +8,9 @@ #include #include +// Forward +struct CBinaryInputStream; + struct FICG { uchar grficSweep; @@ -17,6 +20,16 @@ struct FICG uchar grficShock; }; +/** + * @brief Unknown +*/ +struct SNIP +{ + int grfsnip; + OID oid; + int ib; +}; + /** * @brief "Lightweight" * @@ -56,4 +69,27 @@ struct ALO : public LO */ void InitAlo(ALO *palo); +/** + * @brief unknown + * + */ +void SnipAloObjects(ALO *palo, int csnip, SNIP *asnip); + +/** + * @brief Updates an ALO + * + * @param palo ALO to initialize + */ +void UpdateAlo(ALO *palo, float dt); + +/** + * @brief unknown + */ +void LoadAloFromBrx(ALO *palo, CBinaryInputStream *pbis); + +/** + * @brief unknown + */ +void SetAloTargetHitTest(ALO *palo, int fHitTest); + #endif // ALO_H diff --git a/include/coin.h b/include/coin.h index cad16028..427c4f44 100644 --- a/include/coin.h +++ b/include/coin.h @@ -115,6 +115,14 @@ struct CHARM : public DPRIZE */ void InitDprize(DPRIZE *pdprize); +/** + * @brief Loads a DPrize from an Input Stream + * + * @param pdprize DPrize to initialize + * @param pbis Input Stream + */ +void LoadDprizeFromBrx(DPRIZE *pdprize, CBinaryInputStream *pbis); + /** * @brief Initializes a DPrize * @@ -122,6 +130,12 @@ void InitDprize(DPRIZE *pdprize); */ void InitCoin(COIN *pcoin); +/** + * @brief Add a life + * + */ +void AddLife(void *ptr); + /** * @brief Initializes a Charm * @@ -136,4 +150,7 @@ void InitCharm(CHARM *pcharm); */ void InitKey(KEY *pkey); + +extern SNIP s_asnipDprize[5]; + #endif // COIN_H diff --git a/src/P2/coin.c b/src/P2/coin.c index de613f45..208d7b07 100644 --- a/src/P2/coin.c +++ b/src/P2/coin.c @@ -1,5 +1,6 @@ #include #include +#include void InitDprize(DPRIZE *pdprize) { @@ -17,7 +18,12 @@ void InitDprize(DPRIZE *pdprize) pdprize->fLastBounce = 1; } -INCLUDE_ASM(const s32, "P2/coin", LoadDprizeFromBrx__FP6DPRIZEP18CBinaryInputStream); +void LoadDprizeFromBrx(DPRIZE *pdprize, CBinaryInputStream *pbis) +{ + SetAloTargetHitTest(pdprize, 1); + LoadAloFromBrx(pdprize, pbis); + SnipAloObjects(pdprize, 5, s_asnipDprize); +} INCLUDE_ASM(const s32, "P2/coin", CloneDprize__FP6DPRIZET0); @@ -61,7 +67,19 @@ INCLUDE_ASM(const s32, "P2/coin", UpdateCoin__FP4COINf); INCLUDE_ASM(const s32, "P2/coin", CreateSwCharm__FP2SW); -INCLUDE_ASM(const s32, "P2/coin", AddLife__FPv); +void AddLife(void *ptr) +{ + int new_clife; + int capped_clife; + + new_clife = g_pgsCur->clife + 1; + capped_clife = 99; + if (new_clife < 99) + { + capped_clife = new_clife; + } + g_pgsCur->clife = capped_clife; +} INCLUDE_ASM(const s32, "P2/coin", OnCoinSmack__FP4COIN); diff --git a/src/P2/flash.c b/src/P2/flash.c index b8fc4ce1..feefc69e 100644 --- a/src/P2/flash.c +++ b/src/P2/flash.c @@ -1,10 +1,17 @@ #include +#include + +extern CLOCK g_clock; INCLUDE_ASM(const s32, "P2/flash", InitFlash__FP5FLASH); INCLUDE_ASM(const s32, "P2/flash", LoadFlashFromBrx__FP5FLASHP18CBinaryInputStream); -INCLUDE_ASM(const s32, "P2/flash", UpdateFlash__FP5FLASHf); +void UpdateFlash(FLASH *pflash,float dt) +{ + UpdateAlo((ALO *)pflash,dt); + pflash->gScaleCur = GSmooth(pflash->gScaleCur, pflash->gScaleTarget, g_clock.dt, &pflash->smpScale, 0); +} INCLUDE_ASM(const s32, "P2/flash", RenderFlashSelf__FP5FLASHP2CMP2RO); diff --git a/src/P2/util.c b/src/P2/util.c index be73c27e..9ebe1d7e 100644 --- a/src/P2/util.c +++ b/src/P2/util.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -103,7 +104,12 @@ int FFloatsNear(float g1,float g2,float gEpsilon) INCLUDE_ASM(const s32, "P2/util", CSolveQuadratic); -INCLUDE_ASM(const s32, "P2/util", PrescaleClq); +void PrescaleClq(CLQ *pclqSrc, float ru, float du, CLQ *pclqDst) +{ + pclqDst->w = pclqSrc->w * ru * ru; + pclqDst->v = (pclqSrc->w + pclqSrc->w) * ru * du + pclqSrc->v * ru; + pclqDst->u = pclqSrc->w * du * du + pclqSrc->v * du + pclqSrc->u; +} INCLUDE_ASM(const s32, "P2/util", CalculateSinCos__FfPfT1);