diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua index 76add6869..6dff8c3dc 100644 --- a/autogen/lua_definitions/functions.lua +++ b/autogen/lua_definitions/functions.lua @@ -5361,6 +5361,13 @@ function mario_update_wall(m, wcd) -- ... end +--- @param o Object +--- @return MarioState +--- Gets the MarioState corresponding to the provided object if the object is a Mario object +function get_mario_state_from_object(o) + -- ... +end + --- @param m MarioState --- @param frame1 integer --- @param frame2 integer @@ -8734,10 +8741,10 @@ function set_object_respawn_info_bits(obj, bits) -- ... end ---- @param playerIndex integer +--- @param o Object --- @param platform Object ---- Apply one frame of platform rotation to Mario (player index) or an object (-1) using the given platform -function apply_platform_displacement(playerIndex, platform) +--- Apply one frame of platform rotation to the object using the given platform +function apply_platform_displacement(o, platform) -- ... end diff --git a/docs/lua/functions-4.md b/docs/lua/functions-4.md index 728c150ae..b3feb0373 100644 --- a/docs/lua/functions-4.md +++ b/docs/lua/functions-4.md @@ -1253,6 +1253,29 @@ Updates Mario's wall information based on wall collisions (`WallCollisionData`).
+## [get_mario_state_from_object](#get_mario_state_from_object) + +### Description +Gets the MarioState corresponding to the provided object if the object is a Mario object + +### Lua Example +`local MarioStateValue = get_mario_state_from_object(o)` + +### Parameters +| Field | Type | +| ----- | ---- | +| o | [Object](structs.md#Object) | + +### Returns +[MarioState](structs.md#MarioState) + +### C Prototype +`struct MarioState *get_mario_state_from_object(struct Object *o);` + +[:arrow_up_small:](#) + +
+ --- # functions from mario_actions_airborne.c diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md index daf49e35b..b5984d849 100644 --- a/docs/lua/functions-5.md +++ b/docs/lua/functions-5.md @@ -5548,22 +5548,22 @@ Runs an OR operator on the `obj`'s respawn info with `bits` << 8. If `bits` is 0 ## [apply_platform_displacement](#apply_platform_displacement) ### Description -Apply one frame of platform rotation to Mario (player index) or an object (-1) using the given platform +Apply one frame of platform rotation to the object using the given platform ### Lua Example -`apply_platform_displacement(playerIndex, platform)` +`apply_platform_displacement(o, platform)` ### Parameters | Field | Type | | ----- | ---- | -| playerIndex | `integer` | +| o | [Object](structs.md#Object) | | platform | [Object](structs.md#Object) | ### Returns - None ### C Prototype -`void apply_platform_displacement(u32 playerIndex, struct Object *platform);` +`void apply_platform_displacement(struct Object *o, struct Object *platform);` [:arrow_up_small:](#) diff --git a/docs/lua/functions.md b/docs/lua/functions.md index f280d73c1..363d14d99 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -1023,6 +1023,7 @@ - [init_single_mario](functions-4.md#init_single_mario) - [set_mario_particle_flags](functions-4.md#set_mario_particle_flags) - [mario_update_wall](functions-4.md#mario_update_wall) + - [get_mario_state_from_object](functions-4.md#get_mario_state_from_object)
diff --git a/src/game/behaviors/bowser.inc.c b/src/game/behaviors/bowser.inc.c index 5cc274a3b..d77b782d6 100644 --- a/src/game/behaviors/bowser.inc.c +++ b/src/game/behaviors/bowser.inc.c @@ -1206,7 +1206,7 @@ void bowser_free_update(void) { struct Object *platform; UNUSED f32 floorHeight; if ((platform = o->platform) != NULL) - apply_platform_displacement((u32)-1, platform); + apply_platform_displacement(o, platform); o->oBowserUnk10E = 0; cur_obj_update_floor_and_walls(); diff --git a/src/game/mario.c b/src/game/mario.c index 683c32a4b..5d1d28801 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -2392,3 +2392,14 @@ void mario_update_wall(struct MarioState* m, struct WallCollisionData* wcd) { m->wall->normal.z); } } + +struct MarioState *get_mario_state_from_object(struct Object *o) { + if (!o) { return NULL; } + for (s32 i = 0; i != MAX_PLAYERS; ++i) { + struct MarioState *m = &gMarioStates[i]; + if (m->marioObj == o) { + return m; + } + } + return NULL; +} diff --git a/src/game/mario.h b/src/game/mario.h index e6245cfde..f80238c4a 100644 --- a/src/game/mario.h +++ b/src/game/mario.h @@ -300,4 +300,9 @@ Updates Mario's wall information based on wall collisions (`WallCollisionData`). |descriptionEnd| */ void mario_update_wall(struct MarioState* m, struct WallCollisionData* wcd); +/* |description| +Gets the MarioState corresponding to the provided object if the object is a Mario object +|descriptionEnd| */ +struct MarioState *get_mario_state_from_object(struct Object *o); + #endif // MARIO_H diff --git a/src/game/platform_displacement.c b/src/game/platform_displacement.c index d33188cc6..c86a688a9 100644 --- a/src/game/platform_displacement.c +++ b/src/game/platform_displacement.c @@ -7,12 +7,9 @@ #include "object_helpers.h" #include "object_list_processor.h" #include "platform_displacement.h" +#include "mario.h" #include "types.h" -u16 D_8032FEC0 = 0; - -u32 unused_8032FEC4[4] = { 0 }; - struct Object *gMarioPlatform = NULL; /** @@ -89,10 +86,10 @@ void set_mario_pos(struct MarioState* m, f32 x, f32 y, f32 z) { } /** - * Apply one frame of platform rotation to Mario or an object using the given - * platform. If isMario is false, use gCurrentObject. + * Apply one frame of platform rotation to an object using the given platform. + * If the object is a Mario object, use the corresponding MarioState instead. */ -void apply_platform_displacement(u32 playerIndex, struct Object *platform) { +void apply_platform_displacement(struct Object *o, struct Object *platform) { f32 x; f32 y; f32 z; @@ -103,37 +100,30 @@ void apply_platform_displacement(u32 playerIndex, struct Object *platform) { Vec3f relativeOffset; Vec3f newObjectOffset; Vec3s rotation; - UNUSED s16 unused1; - UNUSED s16 unused2; - UNUSED s16 unused3; f32 displaceMatrix[4][4]; - if (!platform) { return; } + if (!o || !platform) { return; } rotation[0] = platform->oAngleVelPitch; rotation[1] = platform->oAngleVelYaw; rotation[2] = platform->oAngleVelRoll; - if (playerIndex != (u32)-1) { - D_8032FEC0 = 0; - x = gMarioStates[playerIndex].pos[0]; - y = gMarioStates[playerIndex].pos[1]; - z = gMarioStates[playerIndex].pos[2]; + struct MarioState *m = get_mario_state_from_object(o); + if (m != NULL) { + x = m->pos[0]; + y = m->pos[1]; + z = m->pos[2]; } else { - x = gCurrentObject->oPosX; - y = gCurrentObject->oPosY; - z = gCurrentObject->oPosZ; + x = o->oPosX; + y = o->oPosY; + z = o->oPosZ; } x += platform->oVelX; z += platform->oVelZ; if (rotation[0] != 0 || rotation[1] != 0 || rotation[2] != 0) { - unused1 = rotation[0]; - unused2 = rotation[2]; - unused3 = platform->oFaceAngleYaw; - - if (playerIndex != (u32)-1) { - gMarioStates[playerIndex].faceAngle[1] += rotation[1]; + if (m != NULL) { + m->faceAngle[1] += rotation[1]; } platformPosX = platform->oPosX; @@ -163,14 +153,14 @@ void apply_platform_displacement(u32 playerIndex, struct Object *platform) { z = platformPosZ + newObjectOffset[2]; } - if (playerIndex != (u32)-1) { - gMarioStates[playerIndex].pos[0] = x; - gMarioStates[playerIndex].pos[1] = y; - gMarioStates[playerIndex].pos[2] = z; + if (m != NULL) { + m->pos[0] = x; + m->pos[1] = y; + m->pos[2] = z; } else { - gCurrentObject->oPosX = x; - gCurrentObject->oPosY = y; - gCurrentObject->oPosZ = z; + o->oPosX = x; + o->oPosY = y; + o->oPosZ = z; } } @@ -184,7 +174,7 @@ void apply_mario_platform_displacement(void) { struct Object *platform = player->platform; if (!(gTimeStopState & TIME_STOP_ACTIVE) && player != NULL && platform != NULL) { - apply_platform_displacement(i, platform); + apply_platform_displacement(player, platform); } } } diff --git a/src/game/platform_displacement.h b/src/game/platform_displacement.h index 617741571..df5ba22a3 100644 --- a/src/game/platform_displacement.h +++ b/src/game/platform_displacement.h @@ -9,8 +9,8 @@ void update_mario_platform(void); void get_mario_pos(struct MarioState* m, f32 *x, f32 *y, f32 *z); void set_mario_pos(struct MarioState* m, f32 x, f32 y, f32 z); -/* |description|Apply one frame of platform rotation to Mario (player index) or an object (-1) using the given platform|descriptionEnd| */ -void apply_platform_displacement(u32 playerIndex, struct Object *platform); +/* |description|Apply one frame of platform rotation to the object using the given platform|descriptionEnd| */ +void apply_platform_displacement(struct Object *o, struct Object *platform); void apply_mario_platform_displacement(void); #ifndef VERSION_JP diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index b97e4a56f..ff830ba37 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -16549,6 +16549,24 @@ int smlua_func_mario_update_wall(lua_State* L) { return 1; } +int smlua_func_get_mario_state_from_object(lua_State* L) { + if (L == NULL) { return 0; } + + int top = lua_gettop(L); + if (top != 1) { + LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "get_mario_state_from_object", 1, top); + return 0; + } + + if (lua_isnil(L, 1)) { return 0; } + struct Object* o = (struct Object*)smlua_to_cobject(L, 1, LOT_OBJECT); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_mario_state_from_object"); return 0; } + + smlua_push_object(L, LOT_MARIOSTATE, get_mario_state_from_object(o), NULL); + + return 1; +} + ////////////////////////////// // mario_actions_airborne.c // ////////////////////////////// @@ -27532,13 +27550,14 @@ int smlua_func_apply_platform_displacement(lua_State* L) { return 0; } - u32 playerIndex = smlua_to_integer(L, 1); + if (lua_isnil(L, 1)) { return 0; } + struct Object* o = (struct Object*)smlua_to_cobject(L, 1, LOT_OBJECT); if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "apply_platform_displacement"); return 0; } if (lua_isnil(L, 2)) { return 0; } struct Object* platform = (struct Object*)smlua_to_cobject(L, 2, LOT_OBJECT); if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "apply_platform_displacement"); return 0; } - apply_platform_displacement(playerIndex, platform); + apply_platform_displacement(o, platform); return 1; } @@ -34877,6 +34896,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "init_single_mario", smlua_func_init_single_mario); smlua_bind_function(L, "set_mario_particle_flags", smlua_func_set_mario_particle_flags); smlua_bind_function(L, "mario_update_wall", smlua_func_mario_update_wall); + smlua_bind_function(L, "get_mario_state_from_object", smlua_func_get_mario_state_from_object); // mario_actions_airborne.c smlua_bind_function(L, "play_flip_sounds", smlua_func_play_flip_sounds);