diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index 9660bfcd..489f44a0 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -2142,6 +2142,12 @@ function is_player_active(m)
-- ...
end
+--- @param m MarioState
+--- @return integer
+function is_player_in_local_area(m)
+ -- ...
+end
+
--- @param obj Object
--- @param x number
--- @param y number
@@ -2642,6 +2648,14 @@ function random_mod_offset(base, step, mod)
-- ...
end
+--- @param threshold number
+--- @param distanceToPlayer Pointer_integer
+--- @param angleToPlayer Pointer_integer
+--- @return nil
+function treat_far_home_as_mario(threshold, distanceToPlayer, angleToPlayer)
+ -- ...
+end
+
--- @param x0 integer
--- @param x1 integer
--- @return integer
@@ -3475,6 +3489,11 @@ function enable_time_stop()
-- ...
end
+--- @return nil
+function enable_time_stop_if_alone()
+ -- ...
+end
+
--- @return nil
function enable_time_stop_including_mario()
-- ...
@@ -3912,6 +3931,12 @@ function set_time_stop_flags(flags)
-- ...
end
+--- @param flags integer
+--- @return nil
+function set_time_stop_flags_if_alone(flags)
+ -- ...
+end
+
--- @param x integer
--- @return integer
function signum_positive(x)
diff --git a/autogen/lua_definitions/structs.lua b/autogen/lua_definitions/structs.lua
index 17982f40..562c6a3e 100644
--- a/autogen/lua_definitions/structs.lua
+++ b/autogen/lua_definitions/structs.lua
@@ -31,6 +31,7 @@
--- @field public instantWarps InstantWarp
--- @field public localAreaTimer integer
--- @field public macroObjects Pointer_integer
+--- @field public macroObjectsAltered Pointer_integer
--- @field public musicParam integer
--- @field public musicParam2 integer
--- @field public objectSpawnInfos SpawnInfo
@@ -1326,6 +1327,7 @@
--- @field public prevObj Object
--- @field public respawnInfoType integer
--- @field public unused1 integer
+--- @field public usingObj Object
--- @class ObjectHitbox
--- @field public damageOrCoinValue integer
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index fc59ca4f..684218e5 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -399,6 +399,7 @@
- [is_nearest_mario_state_to_object](#is_nearest_mario_state_to_object)
- [is_nearest_player_to_object](#is_nearest_player_to_object)
- [is_player_active](#is_player_active)
+ - [is_player_in_local_area](#is_player_in_local_area)
- [is_point_close_to_object](#is_point_close_to_object)
- [is_point_within_radius_of_mario](#is_point_within_radius_of_mario)
- [nearest_mario_state_to_object](#nearest_mario_state_to_object)
@@ -472,6 +473,7 @@
- [platform_on_track_update_pos_or_spawn_ball](#platform_on_track_update_pos_or_spawn_ball)
- [random_linear_offset](#random_linear_offset)
- [random_mod_offset](#random_mod_offset)
+ - [treat_far_home_as_mario](#treat_far_home_as_mario)
@@ -614,6 +616,7 @@
- [dist_between_object_and_point](#dist_between_object_and_point)
- [dist_between_objects](#dist_between_objects)
- [enable_time_stop](#enable_time_stop)
+ - [enable_time_stop_if_alone](#enable_time_stop_if_alone)
- [enable_time_stop_including_mario](#enable_time_stop_including_mario)
- [find_unimportant_object](#find_unimportant_object)
- [geo_offset_klepto_debug](#geo_offset_klepto_debug)
@@ -676,6 +679,7 @@
- [random_f32_around_zero](#random_f32_around_zero)
- [set_mario_interact_hoot_if_in_range](#set_mario_interact_hoot_if_in_range)
- [set_time_stop_flags](#set_time_stop_flags)
+ - [set_time_stop_flags_if_alone](#set_time_stop_flags_if_alone)
- [signum_positive](#signum_positive)
- [spawn_base_star_with_no_lvl_exit](#spawn_base_star_with_no_lvl_exit)
- [spawn_mist_particles](#spawn_mist_particles)
@@ -7447,6 +7451,26 @@ The `reliable` field will ensure that the packet arrives, but should be used spa
+## [is_player_in_local_area](#is_player_in_local_area)
+
+### Lua Example
+`local integerValue = is_player_in_local_area(m)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| m | [MarioState](structs.md#MarioState) |
+
+### Returns
+- `integer`
+
+### C Prototype
+`u8 is_player_in_local_area(struct MarioState* m);`
+
+[:arrow_up_small:](#)
+
+
+
## [is_point_close_to_object](#is_point_close_to_object)
### Lua Example
@@ -8908,6 +8932,28 @@ The `reliable` field will ensure that the packet arrives, but should be used spa
+## [treat_far_home_as_mario](#treat_far_home_as_mario)
+
+### Lua Example
+`treat_far_home_as_mario(threshold, distanceToPlayer, angleToPlayer)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| threshold | `number` |
+| distanceToPlayer | `Pointer` <`integer`> |
+| angleToPlayer | `Pointer` <`integer`> |
+
+### Returns
+- None
+
+### C Prototype
+`void treat_far_home_as_mario(f32 threshold, s32* distanceToPlayer, s32* angleToPlayer);`
+
+[:arrow_up_small:](#)
+
+
+
---
# functions from object_helpers.c
@@ -11619,6 +11665,24 @@ The `reliable` field will ensure that the packet arrives, but should be used spa
+## [enable_time_stop_if_alone](#enable_time_stop_if_alone)
+
+### Lua Example
+`enable_time_stop_if_alone()`
+
+### Parameters
+- None
+
+### Returns
+- None
+
+### C Prototype
+`void enable_time_stop_if_alone(void);`
+
+[:arrow_up_small:](#)
+
+
+
## [enable_time_stop_including_mario](#enable_time_stop_including_mario)
### Lua Example
@@ -12921,6 +12985,26 @@ The `reliable` field will ensure that the packet arrives, but should be used spa
+## [set_time_stop_flags_if_alone](#set_time_stop_flags_if_alone)
+
+### Lua Example
+`set_time_stop_flags_if_alone(flags)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| flags | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void set_time_stop_flags_if_alone(s32 flags);`
+
+[:arrow_up_small:](#)
+
+
+
## [signum_positive](#signum_positive)
### Lua Example
diff --git a/docs/lua/structs.md b/docs/lua/structs.md
index ed133695..2ec5afea 100644
--- a/docs/lua/structs.md
+++ b/docs/lua/structs.md
@@ -113,6 +113,7 @@
| instantWarps | [InstantWarp](structs.md#InstantWarp) | |
| localAreaTimer | `integer` | read-only |
| macroObjects | `Pointer` <`integer`> | read-only |
+| macroObjectsAltered | `Pointer` <`integer`> | read-only |
| musicParam | `integer` | |
| musicParam2 | `integer` | |
| objectSpawnInfos | [SpawnInfo](structs.md#SpawnInfo) | |
@@ -878,6 +879,7 @@
| prevObj | [Object](structs.md#Object) | |
| respawnInfoType | `integer` | |
| unused1 | `integer` | |
+| usingObj | [Object](structs.md#Object) | |
### Object-Independent Data Fields
| Field | Type | Access |
diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c
index aa4bb46e..71805393 100644
--- a/src/game/mario_actions_cutscene.c
+++ b/src/game/mario_actions_cutscene.c
@@ -508,7 +508,7 @@ s32 act_reading_automatic_dialog(struct MarioState *m) {
if (m->actionState == 9) {
// only show dialog for local player
if (m == &gMarioStates[0]) {
- actionArg = m->actionArg;
+ u32 actionArg = m->actionArg;
if (GET_HIGH_U16_OF_32(actionArg) == 0) {
create_dialog_box(GET_LOW_U16_OF_32(actionArg));
} else {
@@ -1428,13 +1428,14 @@ s32 act_bbh_enter_spin(struct MarioState *m) {
switch (m->actionState) {
case 0:
- f32 floorDist = 512.0f - (m->pos[1] - m->floorHeight);
- m->vel[1] = floorDist > 0 ? sqrtf(4.0f * floorDist + 1.0f) - 1.0f : 2.0f;
+ {
+ f32 floorDist = 512.0f - (m->pos[1] - m->floorHeight);
+ m->vel[1] = floorDist > 0 ? sqrtf(4.0f * floorDist + 1.0f) - 1.0f : 2.0f;
- m->actionState = 1;
- m->actionTimer = 100;
+ m->actionState = 1;
+ m->actionTimer = 100;
+ }
// fall through
-
case 1:
m->faceAngle[1] = atan2s(cageDZ, cageDX);
mario_set_forward_vel(m, forwardVel);
diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c
index a443628d..8ae05fc7 100644
--- a/src/pc/lua/smlua_cobject_autogen.c
+++ b/src/pc/lua/smlua_cobject_autogen.c
@@ -46,28 +46,29 @@ static struct LuaObjectField sAnimationFields[LUA_ANIMATION_FIELD_COUNT] = {
{ "values", LVT_S16_P, offsetof(struct Animation, values), true, LOT_POINTER },
};
-#define LUA_AREA_FIELD_COUNT 14
+#define LUA_AREA_FIELD_COUNT 15
static struct LuaObjectField sAreaFields[LUA_AREA_FIELD_COUNT] = {
-// { "cachedBehaviors", LOT_???, offsetof(struct Area, cachedBehaviors), false, LOT_??? }, <--- UNIMPLEMENTED
-// { "cachedPositions", LOT_???, offsetof(struct Area, cachedPositions), false, LOT_??? }, <--- UNIMPLEMENTED
- { "camera", LVT_COBJECT_P, offsetof(struct Area, camera), false, LOT_CAMERA },
-// { "dialog", LOT_???, offsetof(struct Area, dialog), false, LOT_??? }, <--- UNIMPLEMENTED
- { "flags", LVT_S8, offsetof(struct Area, flags), false, LOT_NONE },
- { "index", LVT_S8, offsetof(struct Area, index), false, LOT_NONE },
- { "instantWarps", LVT_COBJECT_P, offsetof(struct Area, instantWarps), false, LOT_INSTANTWARP },
- { "localAreaTimer", LVT_U32, offsetof(struct Area, localAreaTimer), true, LOT_NONE },
- { "macroObjects", LVT_S16_P, offsetof(struct Area, macroObjects), true, LOT_POINTER },
- { "musicParam", LVT_U16, offsetof(struct Area, musicParam), false, LOT_NONE },
- { "musicParam2", LVT_U16, offsetof(struct Area, musicParam2), false, LOT_NONE },
- { "objectSpawnInfos", LVT_COBJECT_P, offsetof(struct Area, objectSpawnInfos), false, LOT_SPAWNINFO },
- { "paintingWarpNodes", LVT_COBJECT_P, offsetof(struct Area, paintingWarpNodes), false, LOT_WARPNODE },
- { "surfaceRooms", LVT_S8_P, offsetof(struct Area, surfaceRooms), true, LOT_POINTER },
- { "terrainData", LVT_S16_P, offsetof(struct Area, terrainData), true, LOT_POINTER },
- { "terrainType", LVT_U16, offsetof(struct Area, terrainType), false, LOT_NONE },
-// { "unk04", LVT_COBJECT_P, offsetof(struct Area, unk04), false, LOT_??? }, <--- UNIMPLEMENTED
-// { "unused28", LVT_COBJECT_P, offsetof(struct Area, unused28), false, LOT_??? }, <--- UNIMPLEMENTED
- { "warpNodes", LVT_COBJECT_P, offsetof(struct Area, warpNodes), false, LOT_OBJECTWARPNODE },
-// { "whirlpools", LOT_???, offsetof(struct Area, whirlpools), false, LOT_??? }, <--- UNIMPLEMENTED
+// { "cachedBehaviors", LOT_???, offsetof(struct Area, cachedBehaviors), false, LOT_??? }, <--- UNIMPLEMENTED
+// { "cachedPositions", LOT_???, offsetof(struct Area, cachedPositions), false, LOT_??? }, <--- UNIMPLEMENTED
+ { "camera", LVT_COBJECT_P, offsetof(struct Area, camera), false, LOT_CAMERA },
+// { "dialog", LOT_???, offsetof(struct Area, dialog), false, LOT_??? }, <--- UNIMPLEMENTED
+ { "flags", LVT_S8, offsetof(struct Area, flags), false, LOT_NONE },
+ { "index", LVT_S8, offsetof(struct Area, index), false, LOT_NONE },
+ { "instantWarps", LVT_COBJECT_P, offsetof(struct Area, instantWarps), false, LOT_INSTANTWARP },
+ { "localAreaTimer", LVT_U32, offsetof(struct Area, localAreaTimer), true, LOT_NONE },
+ { "macroObjects", LVT_S16_P, offsetof(struct Area, macroObjects), true, LOT_POINTER },
+ { "macroObjectsAltered", LVT_U8_P, offsetof(struct Area, macroObjectsAltered), true, LOT_POINTER },
+ { "musicParam", LVT_U16, offsetof(struct Area, musicParam), false, LOT_NONE },
+ { "musicParam2", LVT_U16, offsetof(struct Area, musicParam2), false, LOT_NONE },
+ { "objectSpawnInfos", LVT_COBJECT_P, offsetof(struct Area, objectSpawnInfos), false, LOT_SPAWNINFO },
+ { "paintingWarpNodes", LVT_COBJECT_P, offsetof(struct Area, paintingWarpNodes), false, LOT_WARPNODE },
+ { "surfaceRooms", LVT_S8_P, offsetof(struct Area, surfaceRooms), true, LOT_POINTER },
+ { "terrainData", LVT_S16_P, offsetof(struct Area, terrainData), true, LOT_POINTER },
+ { "terrainType", LVT_U16, offsetof(struct Area, terrainType), false, LOT_NONE },
+// { "unk04", LVT_COBJECT_P, offsetof(struct Area, unk04), false, LOT_??? }, <--- UNIMPLEMENTED
+// { "unused28", LVT_COBJECT_P, offsetof(struct Area, unused28), false, LOT_??? }, <--- UNIMPLEMENTED
+ { "warpNodes", LVT_COBJECT_P, offsetof(struct Area, warpNodes), false, LOT_OBJECTWARPNODE },
+// { "whirlpools", LOT_???, offsetof(struct Area, whirlpools), false, LOT_??? }, <--- UNIMPLEMENTED
};
#define LUA_BULLY_COLLISION_DATA_FIELD_COUNT 6
@@ -681,7 +682,7 @@ static struct LuaObjectField sNetworkPlayerFields[LUA_NETWORK_PLAYER_FIELD_COUNT
{ "type", LVT_U8, offsetof(struct NetworkPlayer, type), true, LOT_NONE },
};
-#define LUA_OBJECT_FIELD_COUNT 751
+#define LUA_OBJECT_FIELD_COUNT 752
static struct LuaObjectField sObjectFields[LUA_OBJECT_FIELD_COUNT] = {
{ "activeFlags", LVT_S16, offsetof(struct Object, activeFlags), false, LOT_NONE },
{ "areaTimer", LVT_U32, offsetof(struct Object, areaTimer), false, LOT_NONE },
@@ -1446,6 +1447,7 @@ static struct LuaObjectField sObjectFields[LUA_OBJECT_FIELD_COUNT] = {
{ "respawnInfoType", LVT_S16, offsetof(struct Object, respawnInfoType), false, LOT_NONE },
// { "transform", LVT_???, offsetof(struct Object, transform), false, LOT_??? }, <--- UNIMPLEMENTED
{ "unused1", LVT_U32, offsetof(struct Object, unused1), false, LOT_NONE },
+ { "usingObj", LVT_COBJECT_P, offsetof(struct Object, usingObj), false, LOT_OBJECT },
};
#define LUA_OBJECT_HITBOX_FIELD_COUNT 9
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index 046d94b1..6994fee0 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -33,7 +33,7 @@
int smlua_func_get_behavior_from_id(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 1)) { return 0; }
- s32 id = smlua_to_integer(L, 1);
+ int id = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { return 0; }
smlua_push_pointer(L, LVT_BEHAVIORSCRIPT_P, (void*)get_behavior_from_id(id));
@@ -4936,6 +4936,18 @@ int smlua_func_is_player_active(lua_State* L) {
return 1;
}
+int smlua_func_is_player_in_local_area(lua_State* L) {
+ if(!smlua_functions_valid_param_count(L, 1)) { return 0; }
+
+ struct MarioState* m = (struct MarioState*)smlua_to_cobject(L, 1, LOT_MARIOSTATE);
+ if (!gSmLuaConvertSuccess) { return 0; }
+
+ extern u8 is_player_in_local_area(struct MarioState* m);
+ lua_pushinteger(L, is_player_in_local_area(m));
+
+ return 1;
+}
+
int smlua_func_is_point_close_to_object(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 5)) { return 0; }
@@ -5950,23 +5962,21 @@ int smlua_func_random_mod_offset(lua_State* L) {
return 1;
}
-/*
int smlua_func_treat_far_home_as_mario(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 3)) { return 0; }
f32 threshold = smlua_to_number(L, 1);
if (!gSmLuaConvertSuccess) { return 0; }
-// int* distanceToPlayer = (int*)smlua_to_cobject(L, 2, LOT_???); <--- UNIMPLEMENTED
+ s32* distanceToPlayer = (s32*)smlua_to_cpointer(L, 2, LVT_S32_P);
if (!gSmLuaConvertSuccess) { return 0; }
-// int* angleToPlayer = (int*)smlua_to_cobject(L, 3, LOT_???); <--- UNIMPLEMENTED
+ s32* angleToPlayer = (s32*)smlua_to_cpointer(L, 3, LVT_S32_P);
if (!gSmLuaConvertSuccess) { return 0; }
- extern void treat_far_home_as_mario(f32 threshold, int* distanceToPlayer, int* angleToPlayer);
+ extern void treat_far_home_as_mario(f32 threshold, s32* distanceToPlayer, s32* angleToPlayer);
treat_far_home_as_mario(threshold, distanceToPlayer, angleToPlayer);
return 1;
}
-*/
//////////////////////
// object_helpers.c //
@@ -7656,6 +7666,16 @@ int smlua_func_enable_time_stop(UNUSED lua_State* L) {
return 1;
}
+int smlua_func_enable_time_stop_if_alone(UNUSED lua_State* L) {
+ if(!smlua_functions_valid_param_count(L, 0)) { return 0; }
+
+
+ extern void enable_time_stop_if_alone(void);
+ enable_time_stop_if_alone();
+
+ return 1;
+}
+
int smlua_func_enable_time_stop_including_mario(UNUSED lua_State* L) {
if(!smlua_functions_valid_param_count(L, 0)) { return 0; }
@@ -8760,6 +8780,18 @@ int smlua_func_set_time_stop_flags(lua_State* L) {
return 1;
}
+int smlua_func_set_time_stop_flags_if_alone(lua_State* L) {
+ if(!smlua_functions_valid_param_count(L, 1)) { return 0; }
+
+ s32 flags = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { return 0; }
+
+ extern void set_time_stop_flags_if_alone(s32 flags);
+ set_time_stop_flags_if_alone(flags);
+
+ return 1;
+}
+
int smlua_func_signum_positive(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 1)) { return 0; }
@@ -10297,6 +10329,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "is_nearest_mario_state_to_object", smlua_func_is_nearest_mario_state_to_object);
smlua_bind_function(L, "is_nearest_player_to_object", smlua_func_is_nearest_player_to_object);
smlua_bind_function(L, "is_player_active", smlua_func_is_player_active);
+ smlua_bind_function(L, "is_player_in_local_area", smlua_func_is_player_in_local_area);
smlua_bind_function(L, "is_point_close_to_object", smlua_func_is_point_close_to_object);
smlua_bind_function(L, "is_point_within_radius_of_mario", smlua_func_is_point_within_radius_of_mario);
smlua_bind_function(L, "nearest_mario_state_to_object", smlua_func_nearest_mario_state_to_object);
@@ -10368,7 +10401,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "platform_on_track_update_pos_or_spawn_ball", smlua_func_platform_on_track_update_pos_or_spawn_ball);
smlua_bind_function(L, "random_linear_offset", smlua_func_random_linear_offset);
smlua_bind_function(L, "random_mod_offset", smlua_func_random_mod_offset);
- //smlua_bind_function(L, "treat_far_home_as_mario", smlua_func_treat_far_home_as_mario); <--- UNIMPLEMENTED
+ smlua_bind_function(L, "treat_far_home_as_mario", smlua_func_treat_far_home_as_mario);
// object_helpers.c
smlua_bind_function(L, "abs_angle_diff", smlua_func_abs_angle_diff);
@@ -10510,6 +10543,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "dist_between_object_and_point", smlua_func_dist_between_object_and_point);
smlua_bind_function(L, "dist_between_objects", smlua_func_dist_between_objects);
smlua_bind_function(L, "enable_time_stop", smlua_func_enable_time_stop);
+ smlua_bind_function(L, "enable_time_stop_if_alone", smlua_func_enable_time_stop_if_alone);
smlua_bind_function(L, "enable_time_stop_including_mario", smlua_func_enable_time_stop_including_mario);
smlua_bind_function(L, "find_unimportant_object", smlua_func_find_unimportant_object);
smlua_bind_function(L, "geo_offset_klepto_debug", smlua_func_geo_offset_klepto_debug);
@@ -10583,6 +10617,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "random_f32_around_zero", smlua_func_random_f32_around_zero);
smlua_bind_function(L, "set_mario_interact_hoot_if_in_range", smlua_func_set_mario_interact_hoot_if_in_range);
smlua_bind_function(L, "set_time_stop_flags", smlua_func_set_time_stop_flags);
+ smlua_bind_function(L, "set_time_stop_flags_if_alone", smlua_func_set_time_stop_flags_if_alone);
smlua_bind_function(L, "signum_positive", smlua_func_signum_positive);
smlua_bind_function(L, "spawn_base_star_with_no_lvl_exit", smlua_func_spawn_base_star_with_no_lvl_exit);
smlua_bind_function(L, "spawn_mist_particles", smlua_func_spawn_mist_particles);