fix apply_platform_displacement (#740)
Some checks are pending
Build coop / build-ubuntu (push) Waiting to run
Build coop / build-windows (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:
PeachyPeach 2025-04-12 15:03:12 +02:00 committed by GitHub
parent f22855d21e
commit 26d64ee79d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 102 additions and 45 deletions

View file

@ -5361,6 +5361,13 @@ function mario_update_wall(m, wcd)
-- ... -- ...
end 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 m MarioState
--- @param frame1 integer --- @param frame1 integer
--- @param frame2 integer --- @param frame2 integer
@ -8734,10 +8741,10 @@ function set_object_respawn_info_bits(obj, bits)
-- ... -- ...
end end
--- @param playerIndex integer --- @param o Object
--- @param platform Object --- @param platform Object
--- 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
function apply_platform_displacement(playerIndex, platform) function apply_platform_displacement(o, platform)
-- ... -- ...
end end

View file

@ -1253,6 +1253,29 @@ Updates Mario's wall information based on wall collisions (`WallCollisionData`).
<br /> <br />
## [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:](#)
<br />
--- ---
# functions from mario_actions_airborne.c # functions from mario_actions_airborne.c

View file

@ -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) ## [apply_platform_displacement](#apply_platform_displacement)
### Description ### 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 ### Lua Example
`apply_platform_displacement(playerIndex, platform)` `apply_platform_displacement(o, platform)`
### Parameters ### Parameters
| Field | Type | | Field | Type |
| ----- | ---- | | ----- | ---- |
| playerIndex | `integer` | | o | [Object](structs.md#Object) |
| platform | [Object](structs.md#Object) | | platform | [Object](structs.md#Object) |
### Returns ### Returns
- None - None
### C Prototype ### C Prototype
`void apply_platform_displacement(u32 playerIndex, struct Object *platform);` `void apply_platform_displacement(struct Object *o, struct Object *platform);`
[:arrow_up_small:](#) [:arrow_up_small:](#)

View file

@ -1023,6 +1023,7 @@
- [init_single_mario](functions-4.md#init_single_mario) - [init_single_mario](functions-4.md#init_single_mario)
- [set_mario_particle_flags](functions-4.md#set_mario_particle_flags) - [set_mario_particle_flags](functions-4.md#set_mario_particle_flags)
- [mario_update_wall](functions-4.md#mario_update_wall) - [mario_update_wall](functions-4.md#mario_update_wall)
- [get_mario_state_from_object](functions-4.md#get_mario_state_from_object)
<br /> <br />

View file

@ -1206,7 +1206,7 @@ void bowser_free_update(void) {
struct Object *platform; struct Object *platform;
UNUSED f32 floorHeight; UNUSED f32 floorHeight;
if ((platform = o->platform) != NULL) if ((platform = o->platform) != NULL)
apply_platform_displacement((u32)-1, platform); apply_platform_displacement(o, platform);
o->oBowserUnk10E = 0; o->oBowserUnk10E = 0;
cur_obj_update_floor_and_walls(); cur_obj_update_floor_and_walls();

View file

@ -2392,3 +2392,14 @@ void mario_update_wall(struct MarioState* m, struct WallCollisionData* wcd) {
m->wall->normal.z); 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;
}

View file

@ -300,4 +300,9 @@ Updates Mario's wall information based on wall collisions (`WallCollisionData`).
|descriptionEnd| */ |descriptionEnd| */
void mario_update_wall(struct MarioState* m, struct WallCollisionData* wcd); 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 #endif // MARIO_H

View file

@ -7,12 +7,9 @@
#include "object_helpers.h" #include "object_helpers.h"
#include "object_list_processor.h" #include "object_list_processor.h"
#include "platform_displacement.h" #include "platform_displacement.h"
#include "mario.h"
#include "types.h" #include "types.h"
u16 D_8032FEC0 = 0;
u32 unused_8032FEC4[4] = { 0 };
struct Object *gMarioPlatform = NULL; 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 * Apply one frame of platform rotation to an object using the given platform.
* platform. If isMario is false, use gCurrentObject. * 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 x;
f32 y; f32 y;
f32 z; f32 z;
@ -103,37 +100,30 @@ void apply_platform_displacement(u32 playerIndex, struct Object *platform) {
Vec3f relativeOffset; Vec3f relativeOffset;
Vec3f newObjectOffset; Vec3f newObjectOffset;
Vec3s rotation; Vec3s rotation;
UNUSED s16 unused1;
UNUSED s16 unused2;
UNUSED s16 unused3;
f32 displaceMatrix[4][4]; f32 displaceMatrix[4][4];
if (!platform) { return; } if (!o || !platform) { return; }
rotation[0] = platform->oAngleVelPitch; rotation[0] = platform->oAngleVelPitch;
rotation[1] = platform->oAngleVelYaw; rotation[1] = platform->oAngleVelYaw;
rotation[2] = platform->oAngleVelRoll; rotation[2] = platform->oAngleVelRoll;
if (playerIndex != (u32)-1) { struct MarioState *m = get_mario_state_from_object(o);
D_8032FEC0 = 0; if (m != NULL) {
x = gMarioStates[playerIndex].pos[0]; x = m->pos[0];
y = gMarioStates[playerIndex].pos[1]; y = m->pos[1];
z = gMarioStates[playerIndex].pos[2]; z = m->pos[2];
} else { } else {
x = gCurrentObject->oPosX; x = o->oPosX;
y = gCurrentObject->oPosY; y = o->oPosY;
z = gCurrentObject->oPosZ; z = o->oPosZ;
} }
x += platform->oVelX; x += platform->oVelX;
z += platform->oVelZ; z += platform->oVelZ;
if (rotation[0] != 0 || rotation[1] != 0 || rotation[2] != 0) { if (rotation[0] != 0 || rotation[1] != 0 || rotation[2] != 0) {
unused1 = rotation[0]; if (m != NULL) {
unused2 = rotation[2]; m->faceAngle[1] += rotation[1];
unused3 = platform->oFaceAngleYaw;
if (playerIndex != (u32)-1) {
gMarioStates[playerIndex].faceAngle[1] += rotation[1];
} }
platformPosX = platform->oPosX; platformPosX = platform->oPosX;
@ -163,14 +153,14 @@ void apply_platform_displacement(u32 playerIndex, struct Object *platform) {
z = platformPosZ + newObjectOffset[2]; z = platformPosZ + newObjectOffset[2];
} }
if (playerIndex != (u32)-1) { if (m != NULL) {
gMarioStates[playerIndex].pos[0] = x; m->pos[0] = x;
gMarioStates[playerIndex].pos[1] = y; m->pos[1] = y;
gMarioStates[playerIndex].pos[2] = z; m->pos[2] = z;
} else { } else {
gCurrentObject->oPosX = x; o->oPosX = x;
gCurrentObject->oPosY = y; o->oPosY = y;
gCurrentObject->oPosZ = z; o->oPosZ = z;
} }
} }
@ -184,7 +174,7 @@ void apply_mario_platform_displacement(void) {
struct Object *platform = player->platform; struct Object *platform = player->platform;
if (!(gTimeStopState & TIME_STOP_ACTIVE) && player != NULL && platform != NULL) { if (!(gTimeStopState & TIME_STOP_ACTIVE) && player != NULL && platform != NULL) {
apply_platform_displacement(i, platform); apply_platform_displacement(player, platform);
} }
} }
} }

View file

@ -9,8 +9,8 @@ void update_mario_platform(void);
void get_mario_pos(struct MarioState* m, f32 *x, f32 *y, f32 *z); 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); 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| */ /* |description|Apply one frame of platform rotation to the object using the given platform|descriptionEnd| */
void apply_platform_displacement(u32 playerIndex, struct Object *platform); void apply_platform_displacement(struct Object *o, struct Object *platform);
void apply_mario_platform_displacement(void); void apply_mario_platform_displacement(void);
#ifndef VERSION_JP #ifndef VERSION_JP

View file

@ -16549,6 +16549,24 @@ int smlua_func_mario_update_wall(lua_State* L) {
return 1; 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 // // mario_actions_airborne.c //
////////////////////////////// //////////////////////////////
@ -27532,13 +27550,14 @@ int smlua_func_apply_platform_displacement(lua_State* L) {
return 0; 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 (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "apply_platform_displacement"); return 0; }
if (lua_isnil(L, 2)) { return 0; } if (lua_isnil(L, 2)) { return 0; }
struct Object* platform = (struct Object*)smlua_to_cobject(L, 2, LOT_OBJECT); 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; } 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; 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, "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, "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, "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 // mario_actions_airborne.c
smlua_bind_function(L, "play_flip_sounds", smlua_func_play_flip_sounds); smlua_bind_function(L, "play_flip_sounds", smlua_func_play_flip_sounds);