Files
mm/src/code/z_eff_footmark.c
T
Lucas Shaw dcf44596d2 Animation system updated, some more boot files decompiled (+6%), z_fcurve_data_skelanime decompiled (1 non-matching), some asm files split, etc (#89)
* Progress on various files

* gfxprint stuff

* split some rodata, add iconv for rodata string parsing

* z_std_dma rodata

* 2 nonmatchings in gfxprint

* mtxuty-cvt ok

* more

* match a function in idle.c

* progress

* Cleanup

* Rename BgPolygon to CollisionPoly

* progress

* some effect stuff

* more effect progress

* updates

* made suggested changes

* z_effect_soft_sprite_old_init mostly ok

* remove old effects enum

* gamealloc.c OK

* added more files

* motor.c almost done

* motor.c OK

* updates

* migration of two files

* listalloc.c oK

* z_fcurve_data_skelanime split

* z_fcurve_data_skelanime.c decompiled

* more files split

* z_malloc.c OK

* contpfs.c OK

* fault.c rodata migrated

* migrated fault_drawer rodata

* update

* update preprocess.py

* renamed functions in z_skelanime

* started z_skelanime cleanup

* like halfway through fixing z_skelanime

* animation system updated to meet oot standards

* remove unused animation structs

* rename matrix structs to fit oot

* Add -woff 712

* fix diff_settings.py because i accidentally broke it before

* fixed merge conflict, doesn't match though

* It matches now

* Updates

* Fixed warnings...added gcc code syntax checking

* Remove gcc check, added in Tharo's PR

* warnings fixed (i think)

* fixed all warnings i think

* ok

* not sure what to do

* Fix all warnings i think (z_en_a_keep needs some file cleanup thouguh)

* it matches if i do this

* remove comment

* accidentally put osPfsFreeBlocks in epilinkhandle.c

* memcmp -> bcmp

* change u32 size to size_t size, delete string.h because it caused unnecessary confusion with defining size_t twice

* format.sh

* MTXMODE_NEW and MTXMODE_APPLY to matrix functions

* Made suggested changes

* pragma sFaultDrawerFont instead of including in repo

* add some functions to functions.h

* Bss reordering fixed in z_collision_check...added hack to disasm.py

* Updated z_en_a_keep.c

* Missed suggestion in EnAObj_Destroy

* .

* update z_fcurve_Data_skelanime and z_skelanime with suggestions

* devmgr.c ok

* minor changes

* Addressed comments

* remove redundant file

* gfxp -> dlist in game.c

* updated actorfixer.py

* fixed warnings in z_malloc

* Change void* back to Actor*

* format

* Add the soft_sprit comments back

* Rename SV->Flex

* remove .common

* run format

* Update src/code/z_skelanime.c

* u32 channel

Co-authored-by: Lucas Shaw <lucas.shaw1123@gmail.com>
Co-authored-by: angie <angheloalf95@gmail.com>
Co-authored-by: Kenix3 <kenixwhisperwind@gmail.com>
2021-10-24 10:59:14 -04:00

121 lines
4.1 KiB
C

#include "global.h"
void EffFootmark_Init(GlobalContext* globalCtx) {
EffFootmark* footmark;
s32 i;
for (footmark = globalCtx->footprintInfo, i = 0; i < 100; i++, footmark++) {
footmark->actor = NULL;
footmark->location.x = 0;
footmark->location.y = 0;
footmark->location.z = 0;
footmark->flags = 0;
footmark->id = 0;
footmark->alpha = 0;
footmark->alphaChange = 0;
}
}
void EffFootmark_Add(GlobalContext* globalCtx, MtxF* displayMatrix, Actor* actor, u8 id, Vec3f* location, u16 size,
u8 red, u8 green, u8 blue, u16 alpha, u16 alphaChange, u16 fadeoutDelay) {
s32 i;
EffFootmark* footmark;
EffFootmark* destination = NULL;
EffFootmark* oldest = NULL;
s32 isNew = 1;
for (footmark = globalCtx->footprintInfo, i = 0; i < 100; i++, footmark++) {
if (((actor == footmark->actor) && (footmark->id == id)) && ((footmark->flags & 1) == 0)) {
if (fabsf((footmark->location).x - location->x) <= 1) {
if (fabsf((footmark->location).z - location->z) <= 1) {
isNew = 0;
break;
}
}
// This footmark is being re-added at a new location. Let's mark this one to start fading out.
footmark->flags = 1;
}
if (footmark->actor == NULL) {
destination = footmark;
} else {
if (destination == NULL) {
if ((oldest != NULL && footmark->age > oldest->age) || (oldest == NULL)) {
oldest = footmark;
}
}
}
}
if ((isNew) && ((destination != NULL || (oldest != NULL)))) {
if (destination == NULL) {
destination = oldest;
}
Matrix_MtxFCopy(&destination->displayMatrix, displayMatrix);
destination->actor = actor;
destination->location.x = location->x;
destination->location.y = location->y;
destination->location.z = location->z;
destination->flags = 0;
destination->id = id;
destination->red = red;
destination->green = green;
destination->blue = blue;
destination->alpha = alpha;
destination->alphaChange = alphaChange;
destination->size = size;
destination->fadeoutDelay = fadeoutDelay;
destination->age = 0;
}
}
void EffFootmark_Update(GlobalContext* globalCtx) {
EffFootmark* footmark;
s32 i;
for (footmark = globalCtx->footprintInfo, i = 0; i < 100; i++, footmark++) {
if (footmark->actor != NULL) {
if ((footmark->flags & 1) == 1) {
if (footmark->age < 0xFFFFu) { // TODO replace with MAX_U16 or something
footmark->age++;
}
if (footmark->fadeoutDelay == 0) {
if (footmark->alpha >= footmark->alphaChange + 0x1000) {
footmark->alpha -= footmark->alphaChange;
} else {
footmark->actor = NULL;
}
} else if (footmark->fadeoutDelay > 0) {
footmark->fadeoutDelay--;
}
}
}
}
}
void EffFootmark_Draw(GlobalContext* globalCtx) {
EffFootmark* footmark;
s32 i;
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
func_8012C448(globalCtx->state.gfxCtx);
gSPDisplayList(gfxCtx->polyXlu.p++, D_801BC240);
for (footmark = globalCtx->footprintInfo, i = 0; i < 100; i++, footmark++) {
if (footmark->actor != NULL) {
Matrix_SetCurrentState(&footmark->displayMatrix);
Matrix_Scale(footmark->size * (1.0f / 0x100) * 0.7f, 1, footmark->size * (1.0f / 0x100), MTXMODE_APPLY);
gSPMatrix(gfxCtx->polyXlu.p++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD);
gDPSetPrimColor(gfxCtx->polyXlu.p++, 0, 0, footmark->red, footmark->green, footmark->blue,
footmark->alpha >> 8);
gSPDisplayList(gfxCtx->polyXlu.p++, D_801BC288);
}
}
}