fix mirror mario with custom animations again [build]
Some checks are pending
Build coop / build-linux (push) Waiting to run
Build coop / build-steamos (push) Waiting to run
Build coop / build-windows-opengl (push) Waiting to run
Build coop / build-windows-directx (push) Waiting to run
Build coop / build-macos-arm (push) Waiting to run
Build coop / build-macos-intel (push) Waiting to run

This commit is contained in:
Isaac0-dev 2025-06-03 17:16:49 +10:00
parent 2dfcb39704
commit 73e72e1b77
2 changed files with 38 additions and 12 deletions

View file

@ -5,6 +5,10 @@ extern "C" {
#include "game/object_list_processor.h"
#include "pc/configfile.h"
#include "pc/lua/utils/smlua_anim_utils.h"
#include "behavior_data.h"
#include "pc/lua/smlua_hooks.h"
s16 geo_get_processing_mario_index(void);
}
//
@ -24,7 +28,6 @@ static s32 RetrieveCurrentMarioAnimationIndex(u32 aPlayerIndex) {
}
// Retrieve the current animation index
// As we don't know the length of the table, let's hope that we'll always find the animation...
static s32 RetrieveCurrentAnimationIndex(struct Object *aObject) {
if (!aObject->oAnimations || !aObject->header.gfx.animInfo.curAnim || smlua_anim_util_get_current_animation_name(aObject)) {
return -1;
@ -74,11 +77,14 @@ void DynOS_Anim_Swap(void *aPtr) {
// Animation index
s32 _AnimIndex = -1;
for (u32 i = 0; i < MAX_PLAYERS; i++) {
if (gMarioStates[i].marioObj == NULL) { continue; }
if (_Object == gMarioStates[i].marioObj) {
_AnimIndex = RetrieveCurrentMarioAnimationIndex(i);
break;
u8 index = geo_get_processing_mario_index();
if (index != -1) {
_AnimIndex = RetrieveCurrentMarioAnimationIndex(index);
// Don't allow Mario animations to be treated as regular objects
// because DynOS doesn't properly build an AnimationTable
if (_AnimIndex == -1) {
return;
}
}
if (_AnimIndex == -1) {

View file

@ -333,20 +333,40 @@ static Gfx *make_gfx_mario_alpha(struct GraphNodeGenerated *node, s16 alpha) {
return gfxHead;
}
// Calculates if the processing geo is a mirror mario
static s8 geo_get_processing_mirror_mario_index() {
ptrdiff_t ptrDiff = (struct GraphNodeObject *) gCurGraphNodeProcessingObject - gMirrorMario;
return (ptrDiff >= 0 && ptrDiff < MAX_PLAYERS) ? ptrDiff : -1;
}
static u8 geo_get_processing_object_index(void) {
// sloppy way to fix mirror marios
for (s32 i = 0; i < MAX_PLAYERS; i++) {
if ((struct GraphNodeObject*)gCurGraphNodeObject == &gMirrorMario[i]) {
return i;
}
s8 index = geo_get_processing_mirror_mario_index();
if (index != -1) {
return index;
}
if (gCurGraphNodeProcessingObject == NULL) { return 0; }
struct NetworkPlayer* np = network_player_from_global_index(gCurGraphNodeProcessingObject->globalPlayerIndex);
u8 index = (np == NULL) ? 0 : np->localIndex;
index = (np == NULL) ? 0 : np->localIndex;
return (index >= MAX_PLAYERS) ? 0 : index;
}
s16 geo_get_processing_mario_index(void) {
if (gCurGraphNodeProcessingObject == NULL) { return -1; }
s8 index = geo_get_processing_mirror_mario_index();
if (index != -1) {
return index;
}
if (gCurGraphNodeProcessingObject->behavior != smlua_override_behavior(bhvMario)) {
return -1;
}
index = gCurGraphNodeProcessingObject->oBehParams - 1;
return (index >= MAX_PLAYERS) ? -1 : index;
}
struct MarioState *geo_get_mario_state(void) {
u8 index = geo_get_processing_object_index();
return &gMarioStates[index];