diff --git a/autogen/convert_structs.py b/autogen/convert_structs.py index 397c150c..5ebf618f 100644 --- a/autogen/convert_structs.py +++ b/autogen/convert_structs.py @@ -72,7 +72,8 @@ override_field_mutable = { } override_field_invisible = { - "Mod": [ "files" ] + "Mod": [ "files" ], + "MarioState": [ "visibleToEnemies" ], } override_field_immutable = { diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua index c492c18f..9a226b40 100644 --- a/autogen/lua_definitions/functions.lua +++ b/autogen/lua_definitions/functions.lua @@ -6795,6 +6795,11 @@ function cur_obj_set_behavior(behavior) -- ... end +--- @return nil +function cur_obj_set_billboard_if_vanilla_cam() + -- ... +end + --- @param a0 Pointer_integer --- @return integer function cur_obj_set_direction_table(a0) diff --git a/autogen/lua_definitions/structs.lua b/autogen/lua_definitions/structs.lua index eb579551..4e6d34be 100644 --- a/autogen/lua_definitions/structs.lua +++ b/autogen/lua_definitions/structs.lua @@ -188,6 +188,7 @@ --- @field public RacingPenguinBigRadius number --- @field public RacingPenguinHeight number --- @field public RacingPenguinRadius number +--- @field public RespawnShellBoxes integer --- @field public ShowStarMilestones integer --- @field public ToadStar1Requirement integer --- @field public ToadStar2Requirement integer @@ -641,6 +642,7 @@ --- @field public floorLowerLimitShadow integer --- @field public metalCapDuration integer --- @field public metalCapDurationCotmc integer +--- @field public pauseExitAnywhere boolean --- @field public metalCapSequence integer --- @field public pssSlideStarIndex integer --- @field public pssSlideStarTime integer diff --git a/data/behavior_data.c b/data/behavior_data.c index 9cea0cab..69939380 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -3202,16 +3202,12 @@ const BehaviorScript bhvFloorTrapInCastle[] = { const BehaviorScript bhvTree[] = { BEGIN(OBJ_LIST_POLELIKE), ID(id_bhvTree), - #ifdef BETTERCAMERA - CYLBOARD(), - #else - BILLBOARD(), - #endif OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), SET_INT(oInteractType, INTERACT_POLE), SET_HITBOX(/*Radius*/ 80, /*Height*/ 500), SET_INT(oIntangibleTimer, 0), BEGIN_LOOP(), + CALL_NATIVE(cur_obj_set_billboard_if_vanilla_cam), CALL_NATIVE(bhv_pole_base_loop), END_LOOP(), }; diff --git a/docs/lua/functions-4.md b/docs/lua/functions-4.md index 6a0225d6..148ed34f 100644 --- a/docs/lua/functions-4.md +++ b/docs/lua/functions-4.md @@ -3726,6 +3726,24 @@
+## [cur_obj_set_billboard_if_vanilla_cam](#cur_obj_set_billboard_if_vanilla_cam) + +### Lua Example +`cur_obj_set_billboard_if_vanilla_cam()` + +### Parameters +- None + +### Returns +- None + +### C Prototype +`void cur_obj_set_billboard_if_vanilla_cam(void);` + +[:arrow_up_small:](#) + +
+ ## [cur_obj_set_direction_table](#cur_obj_set_direction_table) ### Lua Example diff --git a/docs/lua/functions.md b/docs/lua/functions.md index 0f2f5458..a7458fcc 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -1273,6 +1273,7 @@ - [cur_obj_scale](functions-4.md#cur_obj_scale) - [cur_obj_scale_over_time](functions-4.md#cur_obj_scale_over_time) - [cur_obj_set_behavior](functions-4.md#cur_obj_set_behavior) + - [cur_obj_set_billboard_if_vanilla_cam](functions-4.md#cur_obj_set_billboard_if_vanilla_cam) - [cur_obj_set_direction_table](functions-4.md#cur_obj_set_direction_table) - [cur_obj_set_face_angle_to_move_angle](functions-4.md#cur_obj_set_face_angle_to_move_angle) - [cur_obj_set_hitbox_and_die_if_attacked](functions-4.md#cur_obj_set_hitbox_and_die_if_attacked) diff --git a/docs/lua/structs.md b/docs/lua/structs.md index 9a7eed4d..20677e63 100644 --- a/docs/lua/structs.md +++ b/docs/lua/structs.md @@ -310,6 +310,7 @@ | RacingPenguinBigRadius | `number` | | | RacingPenguinHeight | `number` | | | RacingPenguinRadius | `number` | | +| RespawnShellBoxes | `integer` | | | ShowStarMilestones | `integer` | | | ToadStar1Requirement | `integer` | | | ToadStar2Requirement | `integer` | | @@ -936,6 +937,7 @@ | floorLowerLimitShadow | `integer` | | | metalCapDuration | `integer` | | | metalCapDurationCotmc | `integer` | | +| pauseExitAnywhere | `boolean` | | | metalCapSequence | `integer` | | | pssSlideStarIndex | `integer` | | | pssSlideStarTime | `integer` | | diff --git a/src/game/behaviors/exclamation_box.inc.c b/src/game/behaviors/exclamation_box.inc.c index 6a9c632e..8a1ea789 100644 --- a/src/game/behaviors/exclamation_box.inc.c +++ b/src/game/behaviors/exclamation_box.inc.c @@ -170,7 +170,8 @@ void exclamation_box_act_4(void) { spawn_mist_particles_variable(0, 0, 46.0f); spawn_triangle_break_particles(20, 139, 0.3f, o->oAnimState); create_sound_spawner(SOUND_GENERAL_BREAK_BOX); - if (o->oBehParams2ndByte <= 3) { + u8 threshold = gBehaviorValues.RespawnShellBoxes ? 3 : 2; + if (o->oBehParams2ndByte <= threshold) { o->oAction = 5; cur_obj_hide(); } else { diff --git a/src/game/hardcoded.c b/src/game/hardcoded.c index c2746086..99c266fc 100644 --- a/src/game/hardcoded.c +++ b/src/game/hardcoded.c @@ -97,6 +97,7 @@ struct LevelValues gDefaultLevelValues = { .floorLowerLimit = FLOOR_LOWER_LIMIT, .floorLowerLimitMisc = FLOOR_LOWER_LIMIT_MISC, .floorLowerLimitShadow = FLOOR_LOWER_LIMIT_SHADOW, + .pauseExitAnywhere = 1, .disableActs = false, }; @@ -130,6 +131,7 @@ struct BehaviorValues gDefaultBehaviorValues = { .BowlingBallThiSmallSpeed = 10.0f, .GrateStarRequirement = 120, .ShowStarMilestones = TRUE, + .RespawnShellBoxes = TRUE, .starsNeededForDialog = { 1, 3, 8, 30, 50, 70 }, .dialogs = { .BobombBuddyBob1Dialog = DIALOG_004, diff --git a/src/game/hardcoded.h b/src/game/hardcoded.h index f3354b52..a3a6129d 100644 --- a/src/game/hardcoded.h +++ b/src/game/hardcoded.h @@ -62,6 +62,7 @@ struct LevelValues { s16 floorLowerLimit; s16 floorLowerLimitMisc; s16 floorLowerLimitShadow; + bool pauseExitAnywhere; bool disableActs; }; @@ -225,6 +226,7 @@ struct BehaviorValues { f32 BowlingBallThiSmallSpeed; u16 GrateStarRequirement; u8 ShowStarMilestones; + u8 RespawnShellBoxes; struct StarsNeededForDialog starsNeededForDialog; struct BehaviorDialogs dialogs; struct BehaviorTrajectories trajectories; diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index df882b76..39ea54e9 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -33,6 +33,7 @@ #ifdef BETTERCAMERA #include "bettercamera.h" #endif +#include "hardcoded.h" u16 gDialogColorFadeTimer; s8 gLastDialogLineNum; @@ -2859,7 +2860,7 @@ s16 render_pause_courses_and_castle(void) { render_pause_red_coins(); /* Always allow exiting from course */ - if (TRUE || (gMarioStates[0].action & ACT_FLAG_PAUSE_EXIT)) { + if (gLevelValues.pauseExitAnywhere || (gMarioStates[0].action & ACT_FLAG_PAUSE_EXIT)) { render_pause_course_options(99, 93, &gDialogLineNum, 15); } diff --git a/src/game/level_update.c b/src/game/level_update.c index 5efdf477..7c51cdd0 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -1077,7 +1077,7 @@ void update_hud_values(void) { gHudDisplay.lives = gMarioState->numLives; gHudDisplay.keys = gMarioState->numKeys; - if (numHealthWedges > gHudDisplay.wedges) { + if (numHealthWedges > gHudDisplay.wedges && !gDjuiInMainMenu) { play_sound(SOUND_MENU_POWER_METER, gGlobalSoundSource); } gHudDisplay.wedges = numHealthWedges; @@ -1548,13 +1548,10 @@ s32 update_level(void) { changeLevel = play_mode_normal(); break; case PLAY_MODE_PAUSED: -#ifdef DEVELOPMENT - if (configDisableDevPause) { + if (!(configSingleplayerPause && network_player_connected_count() == 1)) { changeLevel = play_mode_normal(); } -#else - changeLevel = play_mode_normal(); -#endif + if (sCurrPlayMode == PLAY_MODE_PAUSED) { changeLevel = play_mode_paused(); } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 01070542..3cc94e64 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1840,6 +1840,16 @@ void obj_set_cylboard(struct Object *obj) { obj->header.gfx.node.flags |= GRAPH_RENDER_CYLBOARD; } +void cur_obj_set_billboard_if_vanilla_cam(void) { + if (configEnableCamera) { + o->header.gfx.node.flags &= ~GRAPH_RENDER_BILLBOARD; + o->header.gfx.node.flags |= GRAPH_RENDER_CYLBOARD; + } else { + o->header.gfx.node.flags &= ~GRAPH_RENDER_CYLBOARD; + o->header.gfx.node.flags |= GRAPH_RENDER_BILLBOARD; + } +} + void obj_set_hitbox_radius_and_height(struct Object *o, f32 radius, f32 height) { if (o == NULL) { return; } diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index e75266cc..9e8ef5f3 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -204,6 +204,8 @@ void cur_obj_shake_y(f32 amount); void cur_obj_start_cam_event(UNUSED struct Object *obj, s32 cameraEvent); void set_mario_interact_hoot_if_in_range(UNUSED s32 sp0, UNUSED s32 sp4, f32 sp8); void obj_set_billboard(struct Object *obj); +void obj_set_cylboard(struct Object *obj); +void cur_obj_set_billboard_if_vanilla_cam(void); void obj_set_hitbox_radius_and_height(struct Object *o, f32 radius, f32 height); void obj_set_hurtbox_radius_and_height(struct Object *o, f32 radius, f32 height); void cur_obj_set_hitbox_radius_and_height(f32 radius, f32 height); diff --git a/src/pc/configfile.c b/src/pc/configfile.c index d9695962..d97197c5 100644 --- a/src/pc/configfile.c +++ b/src/pc/configfile.c @@ -142,9 +142,6 @@ bool configUncappedFramerate = true; unsigned int configFrameLimit = 60; unsigned int configDrawDistance = 5; bool configDisablePopups = 0; -#ifdef DEVELOPMENT -bool configDisableDevPause = 1; -#endif #ifdef LUA_PROFILER bool configLuaProfiler = 1; #endif @@ -152,6 +149,7 @@ bool configDisableDownloadedModels = 0; unsigned int configInterpolationMode = 1; unsigned int configGamepadNumber = 0; bool configBackgroundGamepad = 1; +bool configSingleplayerPause = 0; static const struct ConfigOption options[] = { {.name = "fullscreen", .type = CONFIG_TYPE_BOOL, .boolValue = &configWindow.fullscreen}, @@ -245,11 +243,9 @@ static const struct ConfigOption options[] = { {.name = "coop_custom_palette_skin", .type = CONFIG_TYPE_COLOR , .colorValue = &configCustomPalette.parts[SKIN]}, {.name = "coop_custom_palette_cap", .type = CONFIG_TYPE_COLOR , .colorValue = &configCustomPalette.parts[CAP]}, {.name = "coop_stay_in_level_after_star", .type = CONFIG_TYPE_UINT , .uintValue = &configStayInLevelAfterStar}, + {.name = "coop_singleplayer_pause", .type = CONFIG_TYPE_BOOL , .boolValue = &configSingleplayerPause}, {.name = "share_lives", .type = CONFIG_TYPE_BOOL , .boolValue = &configShareLives}, {.name = "disable_popups", .type = CONFIG_TYPE_BOOL , .boolValue = &configDisablePopups}, -#ifdef DEVELOPMENT - {.name = "disable_devpause", .type = CONFIG_TYPE_BOOL , .boolValue = &configDisableDevPause}, -#endif #ifdef LUA_PROFILER {.name = "lua_profiler", .type = CONFIG_TYPE_BOOL , .boolValue = &configLuaProfiler}, #endif diff --git a/src/pc/configfile.h b/src/pc/configfile.h index abc04bcd..d98af506 100644 --- a/src/pc/configfile.h +++ b/src/pc/configfile.h @@ -99,14 +99,12 @@ extern bool configUncappedFramerate; extern unsigned int configFrameLimit; extern unsigned int configDrawDistance; extern bool configDisablePopups; -#ifdef DEVELOPMENT -extern bool configDisableDevPause; -#endif #ifdef LUA_PROFILER extern bool configLuaProfiler; #endif extern bool configDisableDownloadedModels; extern unsigned int configInterpolationMode; +extern bool configSingleplayerPause; void configfile_load(const char *filename); void configfile_save(const char *filename); diff --git a/src/pc/djui/djui_panel_misc.c b/src/pc/djui/djui_panel_misc.c index 9540a6bc..27105e52 100644 --- a/src/pc/djui/djui_panel_misc.c +++ b/src/pc/djui/djui_panel_misc.c @@ -5,35 +5,30 @@ #ifdef DEVELOPMENT void djui_panel_options_debug_create(struct DjuiBase* caller) { - f32 bodyHeight = 32 * 4 + 64 * 1 + 16 * 1; + f32 bodyHeight = 32 * 3 + 64 * 1 + 16 * 1; struct DjuiBase* defaultBase = NULL; struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\D\\#1be700\\E\\#00b3ff\\B\\#ffef00\\U\\#ff0800\\G"); struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); { - struct DjuiCheckbox* checkbox1 = djui_checkbox_create(&body->base, "Disable Development Pause", &configDisableDevPause); + struct DjuiCheckbox* checkbox1 = djui_checkbox_create(&body->base, "Fixed Collisions", (bool*)&gLevelValues.fixCollisionBugs); djui_base_set_size_type(&checkbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&checkbox1->base, 1.0f, 32); defaultBase = &checkbox1->base; - struct DjuiCheckbox* checkbox2 = djui_checkbox_create(&body->base, "Fixed Collisions", (bool*)&gLevelValues.fixCollisionBugs); +#ifdef LUA_PROFILER + struct DjuiCheckbox* checkbox2 = djui_checkbox_create(&body->base, "Lua Profiler", &configLuaProfiler); djui_base_set_size_type(&checkbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&checkbox2->base, 1.0f, 32); defaultBase = &checkbox2->base; - -#ifdef LUA_PROFILER - struct DjuiCheckbox* checkbox3 = djui_checkbox_create(&body->base, "Lua Profiler", &configLuaProfiler); - djui_base_set_size_type(&checkbox3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox3->base, 1.0f, 32); - defaultBase = &checkbox3->base; #endif - struct DjuiButton* button2 = djui_button_create(&body->base, "Back"); - djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button2->base, 1.0f, 64); - djui_button_set_style(button2, 1); - djui_interactable_hook_click(&button2->base, djui_panel_menu_back); + struct DjuiButton* button1 = djui_button_create(&body->base, "Back"); + djui_base_set_size_type(&button1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button1->base, 1.0f, 64); + djui_button_set_style(button1, 1); + djui_interactable_hook_click(&button1->base, djui_panel_menu_back); } djui_panel_add(caller, &panel->base, defaultBase); @@ -42,9 +37,9 @@ void djui_panel_options_debug_create(struct DjuiBase* caller) { void djui_panel_misc_create(struct DjuiBase* caller) { #ifdef DEVELOPMENT - f32 bodyHeight = 64 * 3 + 16 * 2; + f32 bodyHeight = 64 * 4 + 16 * 3; #else - f32 bodyHeight = 64 * 2 + 16 * 1; + f32 bodyHeight = 64 * 3 + 16 * 2; #endif struct DjuiBase* defaultBase = NULL; @@ -52,11 +47,15 @@ void djui_panel_misc_create(struct DjuiBase* caller) { struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); { + struct DjuiCheckbox* checkbox1 = djui_checkbox_create(&body->base, "Pause In Singleplayer", &configSingleplayerPause); + djui_base_set_size_type(&checkbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox1->base, 1.0f, 32); + defaultBase = &checkbox1->base; + struct DjuiButton* button1 = djui_button_create(&body->base, "Menu Options"); djui_base_set_size_type(&button1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&button1->base, 1.0f, 64); djui_interactable_hook_click(&button1->base, djui_panel_main_menu_create); - defaultBase = &button1->base; #ifdef DEVELOPMENT struct DjuiButton* button2 = djui_button_create(&body->base, "Debug"); diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c index 47651649..13efee1f 100644 --- a/src/pc/lua/smlua_cobject_autogen.c +++ b/src/pc/lua/smlua_cobject_autogen.c @@ -208,7 +208,7 @@ static struct LuaObjectField sBehaviorTrajectoriesFields[LUA_BEHAVIOR_TRAJECTORI { "UnagiTrajectory", LVT_TRAJECTORY_P, offsetof(struct BehaviorTrajectories, UnagiTrajectory), false, LOT_POINTER }, }; -#define LUA_BEHAVIOR_VALUES_FIELD_COUNT 26 +#define LUA_BEHAVIOR_VALUES_FIELD_COUNT 27 static struct LuaObjectField sBehaviorValuesFields[LUA_BEHAVIOR_VALUES_FIELD_COUNT] = { { "BowlingBallBob2Speed", LVT_F32, offsetof(struct BehaviorValues, BowlingBallBob2Speed), false, LOT_NONE }, { "BowlingBallBobSpeed", LVT_F32, offsetof(struct BehaviorValues, BowlingBallBobSpeed), false, LOT_NONE }, @@ -229,6 +229,7 @@ static struct LuaObjectField sBehaviorValuesFields[LUA_BEHAVIOR_VALUES_FIELD_COU { "RacingPenguinBigRadius", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinBigRadius), false, LOT_NONE }, { "RacingPenguinHeight", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinHeight), false, LOT_NONE }, { "RacingPenguinRadius", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinRadius), false, LOT_NONE }, + { "RespawnShellBoxes", LVT_U8, offsetof(struct BehaviorValues, RespawnShellBoxes), false, LOT_NONE }, { "ShowStarMilestones", LVT_U8, offsetof(struct BehaviorValues, ShowStarMilestones), false, LOT_NONE }, { "ToadStar1Requirement", LVT_U16, offsetof(struct BehaviorValues, ToadStar1Requirement), false, LOT_NONE }, { "ToadStar2Requirement", LVT_U16, offsetof(struct BehaviorValues, ToadStar2Requirement), false, LOT_NONE }, @@ -726,7 +727,7 @@ static struct LuaObjectField sLakituStateFields[LUA_LAKITU_STATE_FIELD_COUNT] = { "yaw", LVT_S16, offsetof(struct LakituState, yaw), false, LOT_NONE }, }; -#define LUA_LEVEL_VALUES_FIELD_COUNT 25 +#define LUA_LEVEL_VALUES_FIELD_COUNT 26 static struct LuaObjectField sLevelValuesFields[LUA_LEVEL_VALUES_FIELD_COUNT] = { { "cellHeightLimit", LVT_S16, offsetof(struct LevelValues, cellHeightLimit), false, LOT_NONE }, { "coinsRequiredForCoinStar", LVT_S16, offsetof(struct LevelValues, coinsRequiredForCoinStar), false, LOT_NONE }, @@ -742,6 +743,7 @@ static struct LuaObjectField sLevelValuesFields[LUA_LEVEL_VALUES_FIELD_COUNT] = { "floorLowerLimitShadow", LVT_S16, offsetof(struct LevelValues, floorLowerLimitShadow), false, LOT_NONE }, { "metalCapDuration", LVT_U16, offsetof(struct LevelValues, metalCapDuration), false, LOT_NONE }, { "metalCapDurationCotmc", LVT_U16, offsetof(struct LevelValues, metalCapDurationCotmc), false, LOT_NONE }, + { "pauseExitAnywhere", LVT_BOOL, offsetof(struct LevelValues, pauseExitAnywhere), false, LOT_NONE }, { "metalCapSequence", LVT_U8, offsetof(struct LevelValues, metalCapSequence), false, LOT_NONE }, { "pssSlideStarIndex", LVT_U8, offsetof(struct LevelValues, pssSlideStarIndex), false, LOT_NONE }, { "pssSlideStarTime", LVT_U16, offsetof(struct LevelValues, pssSlideStarTime), false, LOT_NONE }, diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index b1887887..64542286 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -22252,6 +22252,22 @@ int smlua_func_cur_obj_set_behavior(lua_State* L) { return 1; } +int smlua_func_cur_obj_set_billboard_if_vanilla_cam(UNUSED lua_State* L) { + if (L == NULL) { return 0; } + + int top = lua_gettop(L); + if (top != 0) { + LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "cur_obj_set_billboard_if_vanilla_cam", 0, top); + return 0; + } + + + extern void cur_obj_set_billboard_if_vanilla_cam(void); + cur_obj_set_billboard_if_vanilla_cam(); + + return 1; +} + int smlua_func_cur_obj_set_direction_table(lua_State* L) { if (L == NULL) { return 0; } @@ -29874,6 +29890,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "cur_obj_scale", smlua_func_cur_obj_scale); smlua_bind_function(L, "cur_obj_scale_over_time", smlua_func_cur_obj_scale_over_time); smlua_bind_function(L, "cur_obj_set_behavior", smlua_func_cur_obj_set_behavior); + smlua_bind_function(L, "cur_obj_set_billboard_if_vanilla_cam", smlua_func_cur_obj_set_billboard_if_vanilla_cam); smlua_bind_function(L, "cur_obj_set_direction_table", smlua_func_cur_obj_set_direction_table); smlua_bind_function(L, "cur_obj_set_face_angle_to_move_angle", smlua_func_cur_obj_set_face_angle_to_move_angle); smlua_bind_function(L, "cur_obj_set_hitbox_and_die_if_attacked", smlua_func_cur_obj_set_hitbox_and_die_if_attacked);