From f7dbd399358f7f3fc1fec62ad23521aa86bfe7da Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Wed, 11 Dec 2024 08:09:38 -0500
Subject: [PATCH 01/13] Add new freecamera toggles
---
autogen/lua_definitions/constants.lua | 2 +
autogen/lua_definitions/functions.lua | 30 +++++++++
docs/lua/functions-3.md | 20 ++++++
docs/lua/functions-5.md | 88 +++++++++++++++++++++++++++
docs/lua/functions.md | 5 ++
lang/English.ini | 2 +
src/game/bettercamera.h | 3 +
src/game/bettercamera.inc.h | 66 ++++++++++++++------
src/game/camera.h | 1 +
src/pc/configfile.c | 4 ++
src/pc/configfile.h | 2 +
src/pc/djui/djui_panel_camera.c | 2 +
src/pc/lua/smlua_constants_autogen.c | 2 +
src/pc/lua/smlua_functions_autogen.c | 86 ++++++++++++++++++++++++++
src/pc/lua/utils/smlua_camera_utils.c | 44 +++++++++++---
src/pc/lua/utils/smlua_camera_utils.h | 8 +++
16 files changed, 336 insertions(+), 29 deletions(-)
diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua
index 923dd8df6..75a8ec1a6 100644
--- a/autogen/lua_definitions/constants.lua
+++ b/autogen/lua_definitions/constants.lua
@@ -333,6 +333,7 @@ COURSE_MIN = 1
--- @param np NetworkPlayer
--- @param part PlayerPart
--- @return Color
+--- Gets the palette color of `part` on `np`
function network_player_get_palette_color(np, part)
local color = {
r = network_player_get_palette_color_channel(np, part, 0),
@@ -345,6 +346,7 @@ end
--- @param np NetworkPlayer
--- @param part PlayerPart
--- @return Color
+--- Gets the override palette color of `part` on `np`
function network_player_get_override_palette_color(np, part)
local color = {
r = network_player_get_override_palette_color_channel(np, part, 0),
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index 67a1e2171..ca84be4ff 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -3534,6 +3534,12 @@ function skip_camera_interpolation()
-- ...
end
+--- @param angle integer
+--- @return integer
+function snap_to_45_degrees(angle)
+ -- ...
+end
+
--- @param c Camera
function soft_reset_camera(c)
-- ...
@@ -8487,12 +8493,24 @@ function camera_config_enable_analog_cam(enable)
-- ...
end
+--- @param enable boolean
+--- Overrides if Camera Collision is enabled
+function camera_config_enable_camera_collisions(enable)
+ -- ...
+end
+
--- @param enable boolean
--- Overrides if Free Camera is enabled
function camera_config_enable_free_cam(enable)
-- ...
end
+--- @param enable boolean
+--- Overrides if Freecam DPad Behavior is enabled
+function camera_config_enable_freecam_dpad(enable)
+ -- ...
+end
+
--- @param enable boolean
--- Overrides if camera mouse look is enabled
function camera_config_enable_mouse_look(enable)
@@ -8542,12 +8560,24 @@ function camera_config_is_analog_cam_enabled()
-- ...
end
+--- @return boolean
+--- Checks if Camera Collision is enabled
+function camera_config_is_camera_collision_enabled()
+ -- ...
+end
+
--- @return boolean
--- Checks if Free Camera is enabled
function camera_config_is_free_cam_enabled()
-- ...
end
+--- @return boolean
+--- Checks if Freecam DPad Behavior is enabled
+function camera_config_is_freecam_dpad_enabled()
+ -- ...
+end
+
--- @return boolean
--- Checks if Mouse Look is enabled
function camera_config_is_mouse_look_enabled()
diff --git a/docs/lua/functions-3.md b/docs/lua/functions-3.md
index 32fc12682..f498c4352 100644
--- a/docs/lua/functions-3.md
+++ b/docs/lua/functions-3.md
@@ -2000,6 +2000,26 @@ Gets a behavior ID from only vanilla behavior scripts
+## [snap_to_45_degrees](#snap_to_45_degrees)
+
+### Lua Example
+`local integerValue = snap_to_45_degrees(angle)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| angle | `integer` |
+
+### Returns
+- `integer`
+
+### C Prototype
+`s32 snap_to_45_degrees(s16 angle);`
+
+[:arrow_up_small:](#)
+
+
+
## [soft_reset_camera](#soft_reset_camera)
### Lua Example
diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md
index 1f0b46850..8de43e524 100644
--- a/docs/lua/functions-5.md
+++ b/docs/lua/functions-5.md
@@ -5799,6 +5799,29 @@ Overrides if Analog Camera is enabled
+## [camera_config_enable_camera_collisions](#camera_config_enable_camera_collisions)
+
+### Description
+Overrides if Camera Collision is enabled
+
+### Lua Example
+`camera_config_enable_camera_collisions(enable)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| enable | `boolean` |
+
+### Returns
+- None
+
+### C Prototype
+`void camera_config_enable_camera_collisions(bool enable);`
+
+[:arrow_up_small:](#)
+
+
+
## [camera_config_enable_free_cam](#camera_config_enable_free_cam)
### Description
@@ -5822,6 +5845,29 @@ Overrides if Free Camera is enabled
+## [camera_config_enable_freecam_dpad](#camera_config_enable_freecam_dpad)
+
+### Description
+Overrides if Freecam DPad Behavior is enabled
+
+### Lua Example
+`camera_config_enable_freecam_dpad(enable)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| enable | `boolean` |
+
+### Returns
+- None
+
+### C Prototype
+`void camera_config_enable_freecam_dpad(bool enable);`
+
+[:arrow_up_small:](#)
+
+
+
## [camera_config_enable_mouse_look](#camera_config_enable_mouse_look)
### Description
@@ -6002,6 +6048,27 @@ Checks if Analog Camera is enabled
+## [camera_config_is_camera_collision_enabled](#camera_config_is_camera_collision_enabled)
+
+### Description
+Checks if Camera Collision is enabled
+
+### Lua Example
+`local booleanValue = camera_config_is_camera_collision_enabled()`
+
+### Parameters
+- None
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool camera_config_is_camera_collision_enabled(void);`
+
+[:arrow_up_small:](#)
+
+
+
## [camera_config_is_free_cam_enabled](#camera_config_is_free_cam_enabled)
### Description
@@ -6023,6 +6090,27 @@ Checks if Free Camera is enabled
+## [camera_config_is_freecam_dpad_enabled](#camera_config_is_freecam_dpad_enabled)
+
+### Description
+Checks if Freecam DPad Behavior is enabled
+
+### Lua Example
+`local booleanValue = camera_config_is_freecam_dpad_enabled()`
+
+### Parameters
+- None
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool camera_config_is_freecam_dpad_enabled(void);`
+
+[:arrow_up_small:](#)
+
+
+
## [camera_config_is_mouse_look_enabled](#camera_config_is_mouse_look_enabled)
### Description
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index fd6e9f6f8..7931ffaf1 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -711,6 +711,7 @@
- [shake_camera_roll](functions-3.md#shake_camera_roll)
- [shake_camera_yaw](functions-3.md#shake_camera_yaw)
- [skip_camera_interpolation](functions-3.md#skip_camera_interpolation)
+ - [snap_to_45_degrees](functions-3.md#snap_to_45_degrees)
- [soft_reset_camera](functions-3.md#soft_reset_camera)
- [start_cutscene](functions-3.md#start_cutscene)
- [start_object_cutscene_without_focus](functions-3.md#start_object_cutscene_without_focus)
@@ -1636,7 +1637,9 @@
- smlua_camera_utils.h
- [camera_allow_toxic_gas_camera](functions-5.md#camera_allow_toxic_gas_camera)
- [camera_config_enable_analog_cam](functions-5.md#camera_config_enable_analog_cam)
+ - [camera_config_enable_camera_collisions](functions-5.md#camera_config_enable_camera_collisions)
- [camera_config_enable_free_cam](functions-5.md#camera_config_enable_free_cam)
+ - [camera_config_enable_freecam_dpad](functions-5.md#camera_config_enable_freecam_dpad)
- [camera_config_enable_mouse_look](functions-5.md#camera_config_enable_mouse_look)
- [camera_config_get_aggression](functions-5.md#camera_config_get_aggression)
- [camera_config_get_deceleration](functions-5.md#camera_config_get_deceleration)
@@ -1646,7 +1649,9 @@
- [camera_config_invert_x](functions-5.md#camera_config_invert_x)
- [camera_config_invert_y](functions-5.md#camera_config_invert_y)
- [camera_config_is_analog_cam_enabled](functions-5.md#camera_config_is_analog_cam_enabled)
+ - [camera_config_is_camera_collision_enabled](functions-5.md#camera_config_is_camera_collision_enabled)
- [camera_config_is_free_cam_enabled](functions-5.md#camera_config_is_free_cam_enabled)
+ - [camera_config_is_freecam_dpad_enabled](functions-5.md#camera_config_is_freecam_dpad_enabled)
- [camera_config_is_mouse_look_enabled](functions-5.md#camera_config_is_mouse_look_enabled)
- [camera_config_is_x_inverted](functions-5.md#camera_config_is_x_inverted)
- [camera_config_is_y_inverted](functions-5.md#camera_config_is_y_inverted)
diff --git a/lang/English.ini b/lang/English.ini
index e1d7fa528..d0a709ef6 100644
--- a/lang/English.ini
+++ b/lang/English.ini
@@ -69,6 +69,8 @@ YES = "Yes"
CAMERA = "CAMERA"
FREE_CAMERA = "Free Camera"
ANALOG_CAMERA = "Analog Camera"
+FREE_CAMERA_USE_DPAD = "DPad Behavior"
+FREE_CAMERA_COLLISION = "Camera Collisions"
MOUSE_LOOK = "Mouse Look"
INVERT_X = "Invert X"
INVERT_Y = "Invert Y"
diff --git a/src/game/bettercamera.h b/src/game/bettercamera.h
index dc0db2a39..3b60453e9 100644
--- a/src/game/bettercamera.h
+++ b/src/game/bettercamera.h
@@ -42,3 +42,6 @@ extern u16 newcam_intendedmode;
extern u16 newcam_mode;
extern s16 newcam_yaw;
+
+extern u8 gFreeCameraUseDpad;
+extern u8 gFreeCameraHasCollision;
\ No newline at end of file
diff --git a/src/game/bettercamera.inc.h b/src/game/bettercamera.inc.h
index be50ca65c..4f72b1a84 100644
--- a/src/game/bettercamera.inc.h
+++ b/src/game/bettercamera.inc.h
@@ -119,6 +119,10 @@ u16 newcam_modeflags;
s16 newcam_saved_mode = -1;
s16 newcam_saved_defmode = -1;
+u8 gFreeCameraUseDpad = FALSE;
+u8 gFreeCameraHasCollision = TRUE;
+u8 sFreeCameraDirectionLocked = FALSE;
+
extern bool gDjuiInMainMenu;
///This is called at every level initialisation.
@@ -186,15 +190,17 @@ void newcam_toggle(bool enabled) {
///These are the default settings for Puppycam. You may change them to change how they'll be set for first timers.
void newcam_init_settings(void) {
- newcam_sensitivityX = newcam_clamp(camera_config_get_x_sensitivity(), 1, 100) * 5;
- newcam_sensitivityY = newcam_clamp(camera_config_get_y_sensitivity(), 1, 100) * 5;
- newcam_aggression = newcam_clamp(camera_config_get_aggression(), 0, 100);
- newcam_panlevel = newcam_clamp(camera_config_get_pan_level(), 0, 100);
- newcam_invertX = (s16)camera_config_is_x_inverted();
- newcam_invertY = (s16)camera_config_is_y_inverted();
- newcam_mouse = (u8)camera_config_is_mouse_look_enabled();
- newcam_analogue = (s16)camera_config_is_analog_cam_enabled();
- newcam_degrade = (f32)camera_config_get_deceleration();
+ newcam_sensitivityX = newcam_clamp(camera_config_get_x_sensitivity(), 1, 100) * 5;
+ newcam_sensitivityY = newcam_clamp(camera_config_get_y_sensitivity(), 1, 100) * 5;
+ newcam_aggression = newcam_clamp(camera_config_get_aggression(), 0, 100);
+ newcam_panlevel = newcam_clamp(camera_config_get_pan_level(), 0, 100);
+ newcam_invertX = (s16)camera_config_is_x_inverted();
+ newcam_invertY = (s16)camera_config_is_y_inverted();
+ newcam_mouse = (u8)camera_config_is_mouse_look_enabled();
+ newcam_analogue = (s16)camera_config_is_analog_cam_enabled();
+ newcam_degrade = (f32)camera_config_get_deceleration();
+ gFreeCameraUseDpad = (u8)camera_config_is_freecam_dpad_enabled();
+ gFreeCameraHasCollision = (u8)camera_config_is_camera_collision_enabled();
// setup main menu camera
if (gDjuiInMainMenu) { newcam_tilt = 5; }
@@ -203,15 +209,17 @@ void newcam_init_settings(void) {
}
void newcam_init_settings_override(bool override) {
- newcam_sensitivityX = newcam_clamp(camera_config_get_x_sensitivity(), 1, 100) * 5;
- newcam_sensitivityY = newcam_clamp(camera_config_get_y_sensitivity(), 1, 100) * 5;
- newcam_aggression = newcam_clamp(camera_config_get_aggression(), 0, 100);
- newcam_panlevel = newcam_clamp(camera_config_get_pan_level(), 0, 100);
- newcam_invertX = (s16)camera_config_is_x_inverted();
- newcam_invertY = (s16)camera_config_is_y_inverted();
- newcam_mouse = (u8)camera_config_is_mouse_look_enabled();
- newcam_analogue = (s16)camera_config_is_analog_cam_enabled();
- newcam_degrade = (f32)camera_config_get_deceleration();
+ newcam_sensitivityX = newcam_clamp(camera_config_get_x_sensitivity(), 1, 100) * 5;
+ newcam_sensitivityY = newcam_clamp(camera_config_get_y_sensitivity(), 1, 100) * 5;
+ newcam_aggression = newcam_clamp(camera_config_get_aggression(), 0, 100);
+ newcam_panlevel = newcam_clamp(camera_config_get_pan_level(), 0, 100);
+ newcam_invertX = (s16)camera_config_is_x_inverted();
+ newcam_invertY = (s16)camera_config_is_y_inverted();
+ newcam_mouse = (u8)camera_config_is_mouse_look_enabled();
+ newcam_analogue = (s16)camera_config_is_analog_cam_enabled();
+ newcam_degrade = (f32)camera_config_get_deceleration();
+ gFreeCameraUseDpad = (u8)camera_config_is_freecam_dpad_enabled();
+ gFreeCameraHasCollision = (u8)camera_config_is_camera_collision_enabled();
// setup main menu camera
if (gDjuiInMainMenu) { newcam_tilt = 5; }
@@ -288,6 +296,7 @@ static int ivrt(u8 axis) {
static void newcam_rotate_button(void) {
f32 intendedXMag;
f32 intendedYMag;
+ s16 prevNewcamYaw = newcam_yaw_acc;
if ((newcam_modeflags & NC_FLAG_8D || newcam_modeflags & NC_FLAG_4D) && newcam_modeflags & NC_FLAG_XTURN) {
//8 directional camera rotation input for buttons.
@@ -405,6 +414,25 @@ static void newcam_rotate_button(void) {
newcam_yaw += ivrt(0) * mouse_x * 16;
newcam_tilt += ivrt(1) * mouse_y * 16;
}
+
+ // Dpad behaviors
+ if (gFreeCameraUseDpad) {
+ // Make dpad up head to the nearest cardinal direction
+ if (gPlayer1Controller->buttonPressed & U_JPAD) {
+ newcam_yaw = snap_to_45_degrees(newcam_yaw);
+ }
+ // Make dpad left/right increment 45 degrees
+ else if (gPlayer1Controller->buttonPressed & L_JPAD) { newcam_yaw += ivrt(0)*DEGREES(45); }
+ else if (gPlayer1Controller->buttonPressed & R_JPAD) { newcam_yaw -= ivrt(0)*DEGREES(45); }
+ // Make dpad down lock the current camera direction
+ else if (gPlayer1Controller->buttonPressed & D_JPAD) {
+ sFreeCameraDirectionLocked = !sFreeCameraDirectionLocked;
+ }
+ }
+
+ if (gFreeCameraUseDpad && sFreeCameraDirectionLocked) {
+ newcam_yaw_acc = prevNewcamYaw;
+ }
}
static void newcam_zoom_button(void) {
@@ -692,7 +720,7 @@ static void newcam_position_cam(void) {
newcam_lookat[2] = newcam_pos_target[2]-newcam_pan_z;
newcam_level_bounds();
- if (newcam_modeflags & NC_FLAG_COLLISION) {
+ if (gFreeCameraHasCollision && newcam_modeflags & NC_FLAG_COLLISION) {
newcam_collision();
}
diff --git a/src/game/camera.h b/src/game/camera.h
index e69636762..08a356863 100644
--- a/src/game/camera.h
+++ b/src/game/camera.h
@@ -793,6 +793,7 @@ Gfx *geo_camera_fov(s32 callContext, struct GraphNode *g, UNUSED void *context);
s32 set_camera_mode_fixed(struct Camera* c, s16 x, s16 y, s16 z);
+s32 snap_to_45_degrees(s16 angle);
void camera_set_use_course_specific_settings(u8 enable);
void rom_hack_cam_set_collisions(u8 enable);
void center_rom_hack_camera(void);
diff --git a/src/pc/configfile.c b/src/pc/configfile.c
index a0bf80037..ed2da206e 100644
--- a/src/pc/configfile.c
+++ b/src/pc/configfile.c
@@ -127,6 +127,8 @@ bool configUseStandardKeyBindingsChat = false;
// free camera settings
bool configEnableCamera = false;
bool configCameraAnalog = false;
+bool configCameraDpadBehavior = false;
+bool configCameraHasCollision = true;
bool configCameraMouse = false;
bool configCameraInvertX = false;
bool configCameraInvertY = true;
@@ -253,6 +255,8 @@ static const struct ConfigOption options[] = {
// free camera settings
{.name = "bettercam_enable", .type = CONFIG_TYPE_BOOL, .boolValue = &configEnableCamera},
{.name = "bettercam_analog", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraAnalog},
+ {.name = "bettercam_dpad", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraDpadBehavior},
+ {.name = "bettercam_collision", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraHasCollision},
{.name = "bettercam_mouse_look", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraMouse},
{.name = "bettercam_invertx", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraInvertX},
{.name = "bettercam_inverty", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraInvertY},
diff --git a/src/pc/configfile.h b/src/pc/configfile.h
index 5d38f8d14..fdb985ea2 100644
--- a/src/pc/configfile.h
+++ b/src/pc/configfile.h
@@ -80,6 +80,8 @@ extern bool configUseStandardKeyBindingsChat;
// free camera settings
extern bool configEnableCamera;
extern bool configCameraAnalog;
+extern bool configCameraDpadBehavior;
+extern bool configCameraHasCollision;
extern bool configCameraMouse;
extern bool configCameraInvertX;
extern bool configCameraInvertY;
diff --git a/src/pc/djui/djui_panel_camera.c b/src/pc/djui/djui_panel_camera.c
index 9cc35aa95..6ac3196fc 100644
--- a/src/pc/djui/djui_panel_camera.c
+++ b/src/pc/djui/djui_panel_camera.c
@@ -17,6 +17,8 @@ void djui_panel_camera_create(struct DjuiBase* caller) {
{
djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA), &configEnableCamera, djui_panel_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, ANALOG_CAMERA), &configCameraAnalog, djui_panel_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA_USE_DPAD), &configCameraDpadBehavior, djui_panel_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA_COLLISION), &configCameraHasCollision, djui_panel_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, MOUSE_LOOK), &configCameraMouse, djui_panel_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, INVERT_X), &configCameraInvertX, djui_panel_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, INVERT_Y), &configCameraInvertY, djui_panel_camera_value_changed);
diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c
index d29db2d41..39c475e0f 100644
--- a/src/pc/lua/smlua_constants_autogen.c
+++ b/src/pc/lua/smlua_constants_autogen.c
@@ -298,6 +298,7 @@ char gSmluaConstants[] = ""
"--- @param np NetworkPlayer\n"
"--- @param part PlayerPart\n"
"--- @return Color\n"
+"--- Gets the palette color of `part` on `np`\n"
"function network_player_get_palette_color(np, part)\n"
" local color = {\n"
" r = network_player_get_palette_color_channel(np, part, 0),\n"
@@ -309,6 +310,7 @@ char gSmluaConstants[] = ""
"--- @param np NetworkPlayer\n"
"--- @param part PlayerPart\n"
"--- @return Color\n"
+"--- Gets the override palette color of `part` on `np`\n"
"function network_player_get_override_palette_color(np, part)\n"
" local color = {\n"
" r = network_player_get_override_palette_color_channel(np, part, 0),\n"
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index 516da63d8..2b6d77984 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -11885,6 +11885,23 @@ int smlua_func_skip_camera_interpolation(UNUSED lua_State* L) {
return 1;
}
+int smlua_func_snap_to_45_degrees(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", "snap_to_45_degrees", 1, top);
+ return 0;
+ }
+
+ s16 angle = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "snap_to_45_degrees"); return 0; }
+
+ lua_pushinteger(L, snap_to_45_degrees(angle));
+
+ return 1;
+}
+
int smlua_func_soft_reset_camera(lua_State* L) {
if (L == NULL) { return 0; }
@@ -28888,6 +28905,23 @@ int smlua_func_camera_config_enable_analog_cam(lua_State* L) {
return 1;
}
+int smlua_func_camera_config_enable_camera_collisions(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", "camera_config_enable_camera_collisions", 1, top);
+ return 0;
+ }
+
+ bool enable = smlua_to_boolean(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "camera_config_enable_camera_collisions"); return 0; }
+
+ camera_config_enable_camera_collisions(enable);
+
+ return 1;
+}
+
int smlua_func_camera_config_enable_free_cam(lua_State* L) {
if (L == NULL) { return 0; }
@@ -28905,6 +28939,23 @@ int smlua_func_camera_config_enable_free_cam(lua_State* L) {
return 1;
}
+int smlua_func_camera_config_enable_freecam_dpad(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", "camera_config_enable_freecam_dpad", 1, top);
+ return 0;
+ }
+
+ bool enable = smlua_to_boolean(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "camera_config_enable_freecam_dpad"); return 0; }
+
+ camera_config_enable_freecam_dpad(enable);
+
+ return 1;
+}
+
int smlua_func_camera_config_enable_mouse_look(lua_State* L) {
if (L == NULL) { return 0; }
@@ -29046,6 +29097,21 @@ int smlua_func_camera_config_is_analog_cam_enabled(UNUSED lua_State* L) {
return 1;
}
+int smlua_func_camera_config_is_camera_collision_enabled(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", "camera_config_is_camera_collision_enabled", 0, top);
+ return 0;
+ }
+
+
+ lua_pushboolean(L, camera_config_is_camera_collision_enabled());
+
+ return 1;
+}
+
int smlua_func_camera_config_is_free_cam_enabled(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
@@ -29061,6 +29127,21 @@ int smlua_func_camera_config_is_free_cam_enabled(UNUSED lua_State* L) {
return 1;
}
+int smlua_func_camera_config_is_freecam_dpad_enabled(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", "camera_config_is_freecam_dpad_enabled", 0, top);
+ return 0;
+ }
+
+
+ lua_pushboolean(L, camera_config_is_freecam_dpad_enabled());
+
+ return 1;
+}
+
int smlua_func_camera_config_is_mouse_look_enabled(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
@@ -34119,6 +34200,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "shake_camera_roll", smlua_func_shake_camera_roll);
smlua_bind_function(L, "shake_camera_yaw", smlua_func_shake_camera_yaw);
smlua_bind_function(L, "skip_camera_interpolation", smlua_func_skip_camera_interpolation);
+ smlua_bind_function(L, "snap_to_45_degrees", smlua_func_snap_to_45_degrees);
smlua_bind_function(L, "soft_reset_camera", smlua_func_soft_reset_camera);
smlua_bind_function(L, "start_cutscene", smlua_func_start_cutscene);
smlua_bind_function(L, "start_object_cutscene_without_focus", smlua_func_start_object_cutscene_without_focus);
@@ -34983,7 +35065,9 @@ void smlua_bind_functions_autogen(void) {
// smlua_camera_utils.h
smlua_bind_function(L, "camera_allow_toxic_gas_camera", smlua_func_camera_allow_toxic_gas_camera);
smlua_bind_function(L, "camera_config_enable_analog_cam", smlua_func_camera_config_enable_analog_cam);
+ smlua_bind_function(L, "camera_config_enable_camera_collisions", smlua_func_camera_config_enable_camera_collisions);
smlua_bind_function(L, "camera_config_enable_free_cam", smlua_func_camera_config_enable_free_cam);
+ smlua_bind_function(L, "camera_config_enable_freecam_dpad", smlua_func_camera_config_enable_freecam_dpad);
smlua_bind_function(L, "camera_config_enable_mouse_look", smlua_func_camera_config_enable_mouse_look);
smlua_bind_function(L, "camera_config_get_aggression", smlua_func_camera_config_get_aggression);
smlua_bind_function(L, "camera_config_get_deceleration", smlua_func_camera_config_get_deceleration);
@@ -34993,7 +35077,9 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "camera_config_invert_x", smlua_func_camera_config_invert_x);
smlua_bind_function(L, "camera_config_invert_y", smlua_func_camera_config_invert_y);
smlua_bind_function(L, "camera_config_is_analog_cam_enabled", smlua_func_camera_config_is_analog_cam_enabled);
+ smlua_bind_function(L, "camera_config_is_camera_collision_enabled", smlua_func_camera_config_is_camera_collision_enabled);
smlua_bind_function(L, "camera_config_is_free_cam_enabled", smlua_func_camera_config_is_free_cam_enabled);
+ smlua_bind_function(L, "camera_config_is_freecam_dpad_enabled", smlua_func_camera_config_is_freecam_dpad_enabled);
smlua_bind_function(L, "camera_config_is_mouse_look_enabled", smlua_func_camera_config_is_mouse_look_enabled);
smlua_bind_function(L, "camera_config_is_x_inverted", smlua_func_camera_config_is_x_inverted);
smlua_bind_function(L, "camera_config_is_y_inverted", smlua_func_camera_config_is_y_inverted);
diff --git a/src/pc/lua/utils/smlua_camera_utils.c b/src/pc/lua/utils/smlua_camera_utils.c
index 68e715861..5132934bc 100644
--- a/src/pc/lua/utils/smlua_camera_utils.c
+++ b/src/pc/lua/utils/smlua_camera_utils.c
@@ -2,16 +2,18 @@
#include "game/bettercamera.h"
#include "game/object_list_processor.h"
-static struct CameraOverride sOverrideCameraXSens = { 0 };
-static struct CameraOverride sOverrideCameraYSens = { 0 };
-static struct CameraOverride sOverrideCameraAggr = { 0 };
-static struct CameraOverride sOverrideCameraPan = { 0 };
-static struct CameraOverride sOverrideCameraDegrade = { 0 };
-static struct CameraOverride sOverrideCameraInvertX = { 0 };
-static struct CameraOverride sOverrideCameraInvertY = { 0 };
-static struct CameraOverride sOverrideEnableCamera = { 0 };
-static struct CameraOverride sOverrideCameraAnalog = { 0 };
-static struct CameraOverride sOverrideCameraMouse = { 0 };
+static struct CameraOverride sOverrideCameraXSens = { 0 };
+static struct CameraOverride sOverrideCameraYSens = { 0 };
+static struct CameraOverride sOverrideCameraAggr = { 0 };
+static struct CameraOverride sOverrideCameraPan = { 0 };
+static struct CameraOverride sOverrideCameraDegrade = { 0 };
+static struct CameraOverride sOverrideCameraInvertX = { 0 };
+static struct CameraOverride sOverrideCameraInvertY = { 0 };
+static struct CameraOverride sOverrideEnableCamera = { 0 };
+static struct CameraOverride sOverrideCameraAnalog = { 0 };
+static struct CameraOverride sOverrideCameraMouse = { 0 };
+static struct CameraOverride sOverrideCameraFreecamDpad = { 0 };
+static struct CameraOverride sOverrideCameraFreecamCollision = { 0 };
void camera_reset_overrides(void) {
sOverrideCameraXSens.override = false;
@@ -24,6 +26,8 @@ void camera_reset_overrides(void) {
sOverrideEnableCamera.override = false;
sOverrideCameraAnalog.override = false;
sOverrideCameraMouse.override = false;
+ sOverrideCameraFreecamDpad.override = false;
+ sOverrideCameraFreecamCollision.override = false;
}
void camera_freeze(void) {
@@ -62,6 +66,14 @@ bool camera_config_is_analog_cam_enabled(void) {
return sOverrideCameraAnalog.override ? sOverrideCameraAnalog.value : configCameraAnalog;
}
+bool camera_config_is_freecam_dpad_enabled(void) {
+ return sOverrideCameraFreecamDpad.override ? sOverrideCameraFreecamDpad.value : configCameraDpadBehavior;
+}
+
+bool camera_config_is_camera_collision_enabled(void) {
+ return sOverrideCameraFreecamCollision.override ? sOverrideCameraFreecamCollision.value : configCameraHasCollision;
+}
+
bool camera_config_is_mouse_look_enabled(void) {
return sOverrideCameraMouse.override ? sOverrideCameraMouse.value : configCameraMouse;
}
@@ -106,6 +118,18 @@ void camera_config_enable_analog_cam(bool enable) {
newcam_init_settings();
}
+void camera_config_enable_freecam_dpad(bool enable) {
+ sOverrideCameraFreecamDpad.value = enable;
+ sOverrideCameraFreecamDpad.override = true;
+ newcam_init_settings();
+}
+
+void camera_config_enable_camera_collisions(bool enable) {
+ sOverrideCameraFreecamCollision.value = enable;
+ sOverrideCameraFreecamCollision.override = true;
+ newcam_init_settings();
+}
+
void camera_config_enable_mouse_look(bool enable) {
sOverrideCameraMouse.value = enable;
sOverrideCameraMouse.override = true;
diff --git a/src/pc/lua/utils/smlua_camera_utils.h b/src/pc/lua/utils/smlua_camera_utils.h
index 286b32247..585bb8f1a 100644
--- a/src/pc/lua/utils/smlua_camera_utils.h
+++ b/src/pc/lua/utils/smlua_camera_utils.h
@@ -30,6 +30,10 @@ void camera_romhack_allow_dpad_usage(u8 allow);
bool camera_config_is_free_cam_enabled(void);
/* |description|Checks if Analog Camera is enabled|descriptionEnd| */
bool camera_config_is_analog_cam_enabled(void);
+/* |description|Checks if Freecam DPad Behavior is enabled|descriptionEnd| */
+bool camera_config_is_freecam_dpad_enabled(void);
+/* |description|Checks if Camera Collision is enabled|descriptionEnd| */
+bool camera_config_is_camera_collision_enabled(void);
/* |description|Checks if Mouse Look is enabled|descriptionEnd| */
bool camera_config_is_mouse_look_enabled(void);
/* |description|Checks if camera X is inverted|descriptionEnd| */
@@ -51,6 +55,10 @@ u32 camera_config_get_deceleration(void);
void camera_config_enable_free_cam(bool enable);
/* |description|Overrides if Analog Camera is enabled|descriptionEnd| */
void camera_config_enable_analog_cam(bool enable);
+/* |description|Overrides if Freecam DPad Behavior is enabled|descriptionEnd| */
+void camera_config_enable_freecam_dpad(bool enable);
+/* |description|Overrides if Camera Collision is enabled|descriptionEnd| */
+void camera_config_enable_camera_collisions(bool enable);
/* |description|Overrides if camera mouse look is enabled|descriptionEnd| */
void camera_config_enable_mouse_look(bool enable);
/* |description|Overrides if camera X is inverted|descriptionEnd| */
From 38e27edd385383ce6dc8daf9ec0315af6bf085ff Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Wed, 11 Dec 2024 09:04:37 -0500
Subject: [PATCH 02/13] Make hide and seek force free camera collision
Also update the PU prevention code to actually be good
---
mods/hide-and-seek.lua | 15 ++++-----------
1 file changed, 4 insertions(+), 11 deletions(-)
diff --git a/mods/hide-and-seek.lua b/mods/hide-and-seek.lua
index 5711e7723..aba5db2b4 100644
--- a/mods/hide-and-seek.lua
+++ b/mods/hide-and-seek.lua
@@ -137,6 +137,9 @@ local function update()
if network_is_server() then
server_update()
end
+
+ -- Force free camera collisions
+ camera_config_enable_camera_collisions(true)
end
local function screen_transition(trans)
@@ -227,17 +230,7 @@ local function mario_update(m)
end
-- pu prevention
- if m.pos.x >= 0 then
- puX = math_floor((8192 + m.pos.x) / 65536)
- else
- puX = math_ceil((-8192 + m.pos.x) / 65536)
- end
- if m.pos.z >= 0 then
- puZ = math_floor((8192 + m.pos.z) / 65536)
- else
- puZ = math_ceil((-8192 + m.pos.z) / 65536)
- end
- if puX ~= 0 or puZ ~= 0 then
+ if m.playerIndex == 0 and (m.pos.x > 32767 or m.pos.x < -32768 or m.pos.z > 32767 or m.pos.z < 32768) then
s.seeking = true
warp_restart_level()
end
From a51c08c44cd5e39547b0c820d73de5308ff91b3b Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Wed, 11 Dec 2024 09:04:58 -0500
Subject: [PATCH 03/13] Fix
---
mods/hide-and-seek.lua | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/mods/hide-and-seek.lua b/mods/hide-and-seek.lua
index aba5db2b4..c608951bb 100644
--- a/mods/hide-and-seek.lua
+++ b/mods/hide-and-seek.lua
@@ -26,8 +26,6 @@ local sRoundEndTimeout = 3 * 60 * 30 -- three minutes
local pauseExitTimer = 0
local canLeave = false
local sFlashingIndex = 0
-local puX = 0
-local puZ = 0
local np = gNetworkPlayers[0]
local cannonTimer = 0
@@ -230,7 +228,7 @@ local function mario_update(m)
end
-- pu prevention
- if m.playerIndex == 0 and (m.pos.x > 32767 or m.pos.x < -32768 or m.pos.z > 32767 or m.pos.z < 32768) then
+ if m.playerIndex == 0 and (m.pos.x > 32767 or m.pos.x < -32768 or m.pos.z > 32767 or m.pos.z < -32768) then
s.seeking = true
warp_restart_level()
end
From 149bdaf1e898fa091fd50d6dfc887e114dae8146 Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Wed, 11 Dec 2024 11:32:17 -0500
Subject: [PATCH 04/13] Fix mouse camera
---
src/game/bettercamera.inc.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/game/bettercamera.inc.h b/src/game/bettercamera.inc.h
index 4f72b1a84..c09b52bff 100644
--- a/src/game/bettercamera.inc.h
+++ b/src/game/bettercamera.inc.h
@@ -411,7 +411,9 @@ static void newcam_rotate_button(void) {
}
if ((newcam_mouse == 1) && !gDjuiInMainMenu && !gDjuiChatBoxFocus && !gDjuiConsoleFocus) {
- newcam_yaw += ivrt(0) * mouse_x * 16;
+ if (!gFreeCameraUseDpad || !sFreeCameraDirectionLocked) {
+ newcam_yaw += ivrt(0) * mouse_x * 16;
+ }
newcam_tilt += ivrt(1) * mouse_y * 16;
}
From 71386156a07b698796d456f420abc70310ff6a66 Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Mon, 6 Jan 2025 23:36:14 -0500
Subject: [PATCH 05/13] Add romhack camera into camera settings
---
autogen/convert_functions.py | 2 +-
autogen/lua_definitions/constants.lua | 9 ++
autogen/lua_definitions/functions.lua | 53 ++++++++--
docs/lua/constants.md | 3 +
docs/lua/functions-3.md | 26 +----
docs/lua/functions-5.md | 146 ++++++++++++++++++++++++--
docs/lua/functions.md | 9 +-
lang/English.ini | 6 ++
src/game/bettercamera.inc.h | 4 +-
src/game/camera.c | 34 ++++--
src/game/camera.h | 12 +--
src/pc/configfile.c | 30 ++++--
src/pc/configfile.h | 15 ++-
src/pc/djui/djui_panel_camera.c | 62 ++++++++---
src/pc/djui/djui_panel_camera.h | 3 +-
src/pc/lua/smlua_constants_autogen.c | 3 +
src/pc/lua/smlua_functions_autogen.c | 130 ++++++++++++++++++-----
src/pc/lua/utils/smlua_camera_utils.c | 34 +++++-
src/pc/lua/utils/smlua_camera_utils.h | 21 +++-
19 files changed, 481 insertions(+), 121 deletions(-)
diff --git a/autogen/convert_functions.py b/autogen/convert_functions.py
index a8c738930..a05137c1c 100644
--- a/autogen/convert_functions.py
+++ b/autogen/convert_functions.py
@@ -116,7 +116,7 @@
"src/game/obj_behaviors_2.c": [ "wiggler_jumped_on_attack_handler", "huge_goomba_weakly_attacked" ],
"src/game/level_info.h": [ "_name_table" ],
"src/pc/lua/utils/smlua_obj_utils.h": [ "spawn_object_remember_field" ],
- "src/game/camera.h": [ "update_camera", "init_camera", "stub_camera", "^reset_camera", "move_point_along_spline" ],
+ "src/game/camera.h": [ "update_camera", "init_camera", "stub_camera", "^reset_camera", "move_point_along_spline", "romhack_camera_init_settings" ],
"src/game/behavior_actions.h": [ "bhv_dust_smoke_loop", "bhv_init_room" ],
"src/pc/lua/utils/smlua_audio_utils.h": [ "smlua_audio_utils_override", "audio_custom_shutdown", "smlua_audio_custom_deinit", "audio_sample_destroy_pending_copies", "audio_custom_update_volume" ],
"src/pc/djui/djui_hud_utils.h": [ "djui_hud_render_texture", "djui_hud_render_texture_raw", "djui_hud_render_texture_tile", "djui_hud_render_texture_tile_raw" ],
diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua
index e5a4cdcb1..f397d4c83 100644
--- a/autogen/lua_definitions/constants.lua
+++ b/autogen/lua_definitions/constants.lua
@@ -2527,6 +2527,15 @@ RCO_ALL_EXCEPT_BOWSER = 1
--- @type RomhackCameraOverride
RCO_NONE = 2
+--- @type RomhackCameraOverride
+RCO_ALL_INCLUDING_VANILLA = 3
+
+--- @type RomhackCameraOverride
+RCO_ALL_VANILLA_EXCEPT_BOWSER = 4
+
+--- @type RomhackCameraOverride
+RCO_DISABLE = 5
+
--- @class CharacterSound
--- @type CharacterSound
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index d91a6fd6a..5e30ac263 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -3392,12 +3392,6 @@ function resolve_geometry_collisions(pos, lastGood)
-- ...
end
---- @param enable integer
---- Toggles collision settings for the ROM hack camera. This enables or disables specific collision behaviors in modded levels
-function rom_hack_cam_set_collisions(enable)
- -- ...
-end
-
--- @param c Camera
--- @param cPos Vec3f
--- @param avoidYaw Pointer_integer
@@ -3616,6 +3610,7 @@ end
--- @param angle integer
--- @return integer
+--- Takes in an SM64 angle unit and returns the nearest 45 degree angle, also in SM64 angle units. Useful when needing to align angles (camera, yaw, ect.)
function snap_to_45_degrees(angle)
-- ...
end
@@ -8961,14 +8956,14 @@ function camera_config_is_analog_cam_enabled()
end
--- @return boolean
---- Checks if Camera Collision is enabled
-function camera_config_is_camera_collision_enabled()
+--- Checks if Free Camera is enabled
+function camera_config_is_free_cam_enabled()
-- ...
end
--- @return boolean
---- Checks if Free Camera is enabled
-function camera_config_is_free_cam_enabled()
+--- Checks if Camera Collision is enabled
+function camera_config_is_free_camera_collision_enabled()
-- ...
end
@@ -9031,12 +9026,24 @@ function camera_freeze()
-- ...
end
+--- @return integer
+--- Gets if the romhack camera should fly above poison gas
+function camera_get_allow_toxic_gas_camera()
+ -- ...
+end
+
--- @return boolean
--- Checks if the camera should account for surfaces
function camera_get_checking_surfaces()
-- ...
end
+--- @return RomhackCameraOverride
+--- Gets the current romhack camera override status
+function camera_get_romhack_override()
+ -- ...
+end
+
--- @return boolean
--- Checks if the camera is frozen
function camera_is_frozen()
@@ -9049,7 +9056,7 @@ function camera_reset_overrides()
end
--- @param allow integer
---- Sets if the romhack camera should allow centering
+--- Sets if the romhack camera should allow centering, triggered with the L button
function camera_romhack_allow_centering(allow)
-- ...
end
@@ -9060,6 +9067,24 @@ function camera_romhack_allow_dpad_usage(allow)
-- ...
end
+--- @return integer
+--- Gets if the romhack camera should allow centering
+function camera_romhack_get_allow_centering()
+ -- ...
+end
+
+--- @return integer
+--- Gets if the romhack camera should allow D-Pad movement
+function camera_romhack_get_allow_dpad_usage()
+ -- ...
+end
+
+--- @return integer
+--- Gets if the romhack camera has surface collisions
+function camera_romhack_get_collisions()
+ -- ...
+end
+
--- @param value boolean
--- Sets if the camera should account for surfaces
function camera_set_checking_surfaces(value)
@@ -9077,6 +9102,12 @@ function camera_unfreeze()
-- ...
end
+--- @param enable integer
+--- Toggles collision settings for the ROM hack camera. This enables or disables specific collision behaviors in modded levels
+function rom_hack_cam_set_collisions(enable)
+ -- ...
+end
+
--- @param x number
--- @param y number
--- @param z number
diff --git a/docs/lua/constants.md b/docs/lua/constants.md
index ca72a0d5d..7ac849da9 100644
--- a/docs/lua/constants.md
+++ b/docs/lua/constants.md
@@ -839,6 +839,9 @@
| RCO_ALL | 0 |
| RCO_ALL_EXCEPT_BOWSER | 1 |
| RCO_NONE | 2 |
+| RCO_ALL_INCLUDING_VANILLA | 3 |
+| RCO_ALL_VANILLA_EXCEPT_BOWSER | 4 |
+| RCO_DISABLE | 5 |
[:arrow_up_small:](#)
diff --git a/docs/lua/functions-3.md b/docs/lua/functions-3.md
index 90c277f3f..d32e6bd1b 100644
--- a/docs/lua/functions-3.md
+++ b/docs/lua/functions-3.md
@@ -1534,29 +1534,6 @@ Resolves collisions between the camera and level geometry. Adjusts the camera's
-## [rom_hack_cam_set_collisions](#rom_hack_cam_set_collisions)
-
-### Description
-Toggles collision settings for the ROM hack camera. This enables or disables specific collision behaviors in modded levels
-
-### Lua Example
-`rom_hack_cam_set_collisions(enable)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| enable | `integer` |
-
-### Returns
-- None
-
-### C Prototype
-`void rom_hack_cam_set_collisions(u8 enable);`
-
-[:arrow_up_small:](#)
-
-
-
## [rotate_camera_around_walls](#rotate_camera_around_walls)
### Description
@@ -2242,6 +2219,9 @@ Skips camera interpolation for a frame, locking the camera instantly to the targ
## [snap_to_45_degrees](#snap_to_45_degrees)
+### Description
+Takes in an SM64 angle unit and returns the nearest 45 degree angle, also in SM64 angle units. Useful when needing to align angles (camera, yaw, ect.)
+
### Lua Example
`local integerValue = snap_to_45_degrees(angle)`
diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md
index 38b544c8d..278427d04 100644
--- a/docs/lua/functions-5.md
+++ b/docs/lua/functions-5.md
@@ -7109,13 +7109,13 @@ Checks if Analog Camera is enabled
-## [camera_config_is_camera_collision_enabled](#camera_config_is_camera_collision_enabled)
+## [camera_config_is_free_cam_enabled](#camera_config_is_free_cam_enabled)
### Description
-Checks if Camera Collision is enabled
+Checks if Free Camera is enabled
### Lua Example
-`local booleanValue = camera_config_is_camera_collision_enabled()`
+`local booleanValue = camera_config_is_free_cam_enabled()`
### Parameters
- None
@@ -7124,19 +7124,19 @@ Checks if Camera Collision is enabled
- `boolean`
### C Prototype
-`bool camera_config_is_camera_collision_enabled(void);`
+`bool camera_config_is_free_cam_enabled(void);`
[:arrow_up_small:](#)
-## [camera_config_is_free_cam_enabled](#camera_config_is_free_cam_enabled)
+## [camera_config_is_free_camera_collision_enabled](#camera_config_is_free_camera_collision_enabled)
### Description
-Checks if Free Camera is enabled
+Checks if Camera Collision is enabled
### Lua Example
-`local booleanValue = camera_config_is_free_cam_enabled()`
+`local booleanValue = camera_config_is_free_camera_collision_enabled()`
### Parameters
- None
@@ -7145,7 +7145,7 @@ Checks if Free Camera is enabled
- `boolean`
### C Prototype
-`bool camera_config_is_free_cam_enabled(void);`
+`bool camera_config_is_free_camera_collision_enabled(void);`
[:arrow_up_small:](#)
@@ -7371,6 +7371,27 @@ Freezes the camera by not updating it
+## [camera_get_allow_toxic_gas_camera](#camera_get_allow_toxic_gas_camera)
+
+### Description
+Gets if the romhack camera should fly above poison gas
+
+### Lua Example
+`local integerValue = camera_get_allow_toxic_gas_camera()`
+
+### Parameters
+- None
+
+### Returns
+- `integer`
+
+### C Prototype
+`u8 camera_get_allow_toxic_gas_camera(void);`
+
+[:arrow_up_small:](#)
+
+
+
## [camera_get_checking_surfaces](#camera_get_checking_surfaces)
### Description
@@ -7392,6 +7413,27 @@ Checks if the camera should account for surfaces
+## [camera_get_romhack_override](#camera_get_romhack_override)
+
+### Description
+Gets the current romhack camera override status
+
+### Lua Example
+`local enumValue = camera_get_romhack_override()`
+
+### Parameters
+- None
+
+### Returns
+[enum RomhackCameraOverride](constants.md#enum-RomhackCameraOverride)
+
+### C Prototype
+`enum RomhackCameraOverride camera_get_romhack_override(void);`
+
+[:arrow_up_small:](#)
+
+
+
## [camera_is_frozen](#camera_is_frozen)
### Description
@@ -7437,7 +7479,7 @@ Resets camera config overrides
## [camera_romhack_allow_centering](#camera_romhack_allow_centering)
### Description
-Sets if the romhack camera should allow centering
+Sets if the romhack camera should allow centering, triggered with the L button
### Lua Example
`camera_romhack_allow_centering(allow)`
@@ -7480,6 +7522,69 @@ Sets if the romhack camera should allow D-Pad movement
+## [camera_romhack_get_allow_centering](#camera_romhack_get_allow_centering)
+
+### Description
+Gets if the romhack camera should allow centering
+
+### Lua Example
+`local integerValue = camera_romhack_get_allow_centering()`
+
+### Parameters
+- None
+
+### Returns
+- `integer`
+
+### C Prototype
+`u8 camera_romhack_get_allow_centering(void);`
+
+[:arrow_up_small:](#)
+
+
+
+## [camera_romhack_get_allow_dpad_usage](#camera_romhack_get_allow_dpad_usage)
+
+### Description
+Gets if the romhack camera should allow D-Pad movement
+
+### Lua Example
+`local integerValue = camera_romhack_get_allow_dpad_usage()`
+
+### Parameters
+- None
+
+### Returns
+- `integer`
+
+### C Prototype
+`u8 camera_romhack_get_allow_dpad_usage(void);`
+
+[:arrow_up_small:](#)
+
+
+
+## [camera_romhack_get_collisions](#camera_romhack_get_collisions)
+
+### Description
+Gets if the romhack camera has surface collisions
+
+### Lua Example
+`local integerValue = camera_romhack_get_collisions()`
+
+### Parameters
+- None
+
+### Returns
+- `integer`
+
+### C Prototype
+`u8 camera_romhack_get_collisions(void);`
+
+[:arrow_up_small:](#)
+
+
+
## [camera_set_checking_surfaces](#camera_set_checking_surfaces)
### Description
@@ -7547,6 +7652,29 @@ Unfreezes the camera
+## [rom_hack_cam_set_collisions](#rom_hack_cam_set_collisions)
+
+### Description
+Toggles collision settings for the ROM hack camera. This enables or disables specific collision behaviors in modded levels
+
+### Lua Example
+`rom_hack_cam_set_collisions(enable)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| enable | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void rom_hack_cam_set_collisions(u8 enable);`
+
+[:arrow_up_small:](#)
+
+
+
---
# functions from smlua_collision_utils.h
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index f291114eb..8cac726ff 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -683,7 +683,6 @@
- [random_vec3s](functions-3.md#random_vec3s)
- [reset_camera](functions-3.md#reset_camera)
- [resolve_geometry_collisions](functions-3.md#resolve_geometry_collisions)
- - [rom_hack_cam_set_collisions](functions-3.md#rom_hack_cam_set_collisions)
- [rotate_camera_around_walls](functions-3.md#rotate_camera_around_walls)
- [rotate_in_xz](functions-3.md#rotate_in_xz)
- [rotate_in_yz](functions-3.md#rotate_in_yz)
@@ -1661,8 +1660,8 @@
- [camera_config_invert_x](functions-5.md#camera_config_invert_x)
- [camera_config_invert_y](functions-5.md#camera_config_invert_y)
- [camera_config_is_analog_cam_enabled](functions-5.md#camera_config_is_analog_cam_enabled)
- - [camera_config_is_camera_collision_enabled](functions-5.md#camera_config_is_camera_collision_enabled)
- [camera_config_is_free_cam_enabled](functions-5.md#camera_config_is_free_cam_enabled)
+ - [camera_config_is_free_camera_collision_enabled](functions-5.md#camera_config_is_free_camera_collision_enabled)
- [camera_config_is_freecam_dpad_enabled](functions-5.md#camera_config_is_freecam_dpad_enabled)
- [camera_config_is_mouse_look_enabled](functions-5.md#camera_config_is_mouse_look_enabled)
- [camera_config_is_x_inverted](functions-5.md#camera_config_is_x_inverted)
@@ -1673,14 +1672,20 @@
- [camera_config_set_x_sensitivity](functions-5.md#camera_config_set_x_sensitivity)
- [camera_config_set_y_sensitivity](functions-5.md#camera_config_set_y_sensitivity)
- [camera_freeze](functions-5.md#camera_freeze)
+ - [camera_get_allow_toxic_gas_camera](functions-5.md#camera_get_allow_toxic_gas_camera)
- [camera_get_checking_surfaces](functions-5.md#camera_get_checking_surfaces)
+ - [camera_get_romhack_override](functions-5.md#camera_get_romhack_override)
- [camera_is_frozen](functions-5.md#camera_is_frozen)
- [camera_reset_overrides](functions-5.md#camera_reset_overrides)
- [camera_romhack_allow_centering](functions-5.md#camera_romhack_allow_centering)
- [camera_romhack_allow_dpad_usage](functions-5.md#camera_romhack_allow_dpad_usage)
+ - [camera_romhack_get_allow_centering](functions-5.md#camera_romhack_get_allow_centering)
+ - [camera_romhack_get_allow_dpad_usage](functions-5.md#camera_romhack_get_allow_dpad_usage)
+ - [camera_romhack_get_collisions](functions-5.md#camera_romhack_get_collisions)
- [camera_set_checking_surfaces](functions-5.md#camera_set_checking_surfaces)
- [camera_set_romhack_override](functions-5.md#camera_set_romhack_override)
- [camera_unfreeze](functions-5.md#camera_unfreeze)
+ - [rom_hack_cam_set_collisions](functions-5.md#rom_hack_cam_set_collisions)
diff --git a/lang/English.ini b/lang/English.ini
index 765f90caa..01a45cc76 100644
--- a/lang/English.ini
+++ b/lang/English.ini
@@ -71,6 +71,12 @@ FREE_CAMERA = "Free Camera"
ANALOG_CAMERA = "Analog Camera"
FREE_CAMERA_USE_DPAD = "DPad Behavior"
FREE_CAMERA_COLLISION = "Camera Collisions"
+ROMHACK_CAMERA = "Romhack Camera"
+ROMHACK_CAMERA_IN_BOWSER = "Use in Bowser fights"
+ROMHACK_CAMERA_COLLISION = "Camera Collisions"
+ROMHACK_CAMERA_L_CENTERING = "L Centering"
+ROMHACK_CAMERA_USE_DPAD = "DPad Behavior"
+CAMERA_TOXIC_GAS = "Adjust for toxic gas"
MOUSE_LOOK = "Mouse Look"
INVERT_X = "Invert X"
INVERT_Y = "Invert Y"
diff --git a/src/game/bettercamera.inc.h b/src/game/bettercamera.inc.h
index c7247bbbb..37d9ddff1 100644
--- a/src/game/bettercamera.inc.h
+++ b/src/game/bettercamera.inc.h
@@ -200,7 +200,7 @@ void newcam_init_settings(void) {
newcam_analogue = (s16)camera_config_is_analog_cam_enabled();
newcam_degrade = (f32)camera_config_get_deceleration();
gFreeCameraUseDpad = (u8)camera_config_is_freecam_dpad_enabled();
- gFreeCameraHasCollision = (u8)camera_config_is_camera_collision_enabled();
+ gFreeCameraHasCollision = (u8)camera_config_is_free_camera_collision_enabled();
// setup main menu camera
if (gDjuiInMainMenu) { newcam_tilt = 5; }
@@ -219,7 +219,7 @@ void newcam_init_settings_override(bool override) {
newcam_analogue = (s16)camera_config_is_analog_cam_enabled();
newcam_degrade = (f32)camera_config_get_deceleration();
gFreeCameraUseDpad = (u8)camera_config_is_freecam_dpad_enabled();
- gFreeCameraHasCollision = (u8)camera_config_is_camera_collision_enabled();
+ gFreeCameraHasCollision = (u8)camera_config_is_free_camera_collision_enabled();
// setup main menu camera
if (gDjuiInMainMenu) { newcam_tilt = 5; }
diff --git a/src/game/camera.c b/src/game/camera.c
index a1e00873d..458ea6d38 100644
--- a/src/game/camera.c
+++ b/src/game/camera.c
@@ -3109,17 +3109,27 @@ void update_lakitu(struct Camera *c) {
extern bool gIsDemoActive;
static void update_romhack_camera_override(struct Camera *c) {
if (gOverrideRomhackCamera == RCO_NONE) { return; }
- if (c->mode == CAMERA_MODE_ROM_HACK) { return; }
- if (dynos_level_is_vanilla_level(gCurrLevelNum)) { return; }
+ else if (gOverrideRomhackCamera == RCO_DISABLE) {
+ c->mode = c->defMode;
+ set_camera_mode(c, c->defMode, 0);
+ gOverrideRomhackCamera = RCO_NONE;
+ return;
+ }
if (gIsDemoActive) { return; }
- if (gOverrideRomhackCamera == RCO_ALL_EXCEPT_BOWSER) {
- if (gCurrLevelNum == LEVEL_BOWSER_1 || gCurrLevelNum == LEVEL_BOWSER_2 || gCurrLevelNum == LEVEL_BOWSER_3) {
- return;
+ if ((!(gOverrideRomhackCamera == RCO_ALL_INCLUDING_VANILLA || gOverrideRomhackCamera == RCO_ALL_VANILLA_EXCEPT_BOWSER)) &&
+ dynos_level_is_vanilla_level(gCurrLevelNum)) {
+ return;
+ } else if ((gOverrideRomhackCamera == RCO_ALL_EXCEPT_BOWSER || gOverrideRomhackCamera == RCO_ALL_VANILLA_EXCEPT_BOWSER) &&
+ (gCurrLevelNum == LEVEL_BOWSER_1 || gCurrLevelNum == LEVEL_BOWSER_2 || gCurrLevelNum == LEVEL_BOWSER_3)) {
+ if (c->mode == CAMERA_MODE_ROM_HACK) {
+ c->mode = c->defMode;
+ set_camera_mode(c, c->defMode, 0);
}
+ return;
}
- if (!allow_romhack_camera_override_mode(c->mode)) { return; }
+ if (c->mode == CAMERA_MODE_ROM_HACK || !allow_romhack_camera_override_mode(c->mode)) { return; }
set_camera_mode(c, CAMERA_MODE_ROM_HACK, 0);
}
@@ -3632,6 +3642,7 @@ void init_camera(struct Camera *c) {
newcam_init(c, sSoftResettingCamera);
newcam_init_settings();
+ romhack_camera_init_settings();
sSoftResettingCamera = FALSE;
}
@@ -12159,8 +12170,15 @@ s32 snap_to_45_degrees(s16 angle) {
return angle;
}
-void rom_hack_cam_set_collisions(u8 enable) {
- gRomHackCamSetCollisions = enable;
+void romhack_camera_init_settings(void) {
+ enum RomhackCameraOverride override = configEnableRomhackCamera ?
+ (configRomhackCameraBowserFights ? RCO_ALL_INCLUDING_VANILLA : RCO_ALL_VANILLA_EXCEPT_BOWSER) : RCO_DISABLE;
+ camera_set_romhack_override(override);
+ camera_set_use_course_specific_settings(dynos_level_is_vanilla_level(gCurrLevelNum) ? 1 : 0);
+ rom_hack_cam_set_collisions(configRomhackCameraHasCollision);
+ camera_romhack_allow_centering(configRomhackCameraHasCentering);
+ camera_romhack_allow_dpad_usage(configRomhackCameraDpadBehavior);
+ camera_allow_toxic_gas_camera(configCameraToxicGas);
}
static u8 rom_hack_cam_can_see_mario(Vec3f desiredPos) {
diff --git a/src/game/camera.h b/src/game/camera.h
index 13a129c3d..c44bb070a 100644
--- a/src/game/camera.h
+++ b/src/game/camera.h
@@ -14,6 +14,9 @@ enum RomhackCameraOverride {
RCO_ALL,
RCO_ALL_EXCEPT_BOWSER,
RCO_NONE,
+ RCO_ALL_INCLUDING_VANILLA,
+ RCO_ALL_VANILLA_EXCEPT_BOWSER,
+ RCO_DISABLE
};
extern u8 gOverrideFreezeCamera;
@@ -21,6 +24,7 @@ extern enum RomhackCameraOverride gOverrideRomhackCamera;
extern u8 gRomhackCameraAllowCentering;
extern u8 gOverrideAllowToxicGasCamera;
extern u8 gRomhackCameraAllowDpad;
+extern u8 gRomHackCamSetCollisions;
/**
* @file camera.h
@@ -1246,16 +1250,12 @@ This is useful for enabling or disabling custom behaviors in specific courses or
|descriptionEnd| */
void camera_set_use_course_specific_settings(u8 enable);
-/* |description|
-Toggles collision settings for the ROM hack camera.
-This enables or disables specific collision behaviors in modded levels
-|descriptionEnd| */
-void rom_hack_cam_set_collisions(u8 enable);
-
/* |description|
Centers the ROM hack camera.
This function is designed for non-standard level layouts and modded game environments
|descriptionEnd| */
void center_rom_hack_camera(void);
+void romhack_camera_init_settings(void);
+
#endif // CAMERA_H
diff --git a/src/pc/configfile.c b/src/pc/configfile.c
index 21300beaf..42f5bc8cd 100644
--- a/src/pc/configfile.c
+++ b/src/pc/configfile.c
@@ -125,10 +125,10 @@ bool configBackgroundGamepad = true;
bool configDisableGamepads = false;
bool configUseStandardKeyBindingsChat = false;
// free camera settings
-bool configEnableCamera = false;
-bool configCameraAnalog = false;
-bool configCameraDpadBehavior = false;
-bool configCameraHasCollision = true;
+bool configEnableFreeCamera = false;
+bool configFreeCameraAnalog = false;
+bool configFreeCameraDpadBehavior = false;
+bool configFreeCameraHasCollision = true;
bool configCameraMouse = false;
bool configCameraInvertX = false;
bool configCameraInvertY = true;
@@ -137,6 +137,13 @@ unsigned int configCameraYSens = 50;
unsigned int configCameraAggr = 0;
unsigned int configCameraPan = 0;
unsigned int configCameraDegrade = 50; // 0 - 100%
+// romhack camera settings
+bool configEnableRomhackCamera = false;
+bool configRomhackCameraBowserFights = false;
+bool configRomhackCameraHasCollision = false;
+bool configRomhackCameraHasCentering = false;
+bool configRomhackCameraDpadBehavior = false;
+bool configCameraToxicGas = true;
// debug
bool configLuaProfiler = false;
bool configDebugPrint = false;
@@ -253,10 +260,10 @@ static const struct ConfigOption options[] = {
#endif
{.name = "use_standard_key_bindings_chat", .type = CONFIG_TYPE_BOOL, .boolValue = &configUseStandardKeyBindingsChat},
// free camera settings
- {.name = "bettercam_enable", .type = CONFIG_TYPE_BOOL, .boolValue = &configEnableCamera},
- {.name = "bettercam_analog", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraAnalog},
- {.name = "bettercam_dpad", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraDpadBehavior},
- {.name = "bettercam_collision", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraHasCollision},
+ {.name = "bettercam_enable", .type = CONFIG_TYPE_BOOL, .boolValue = &configEnableFreeCamera},
+ {.name = "bettercam_analog", .type = CONFIG_TYPE_BOOL, .boolValue = &configFreeCameraAnalog},
+ {.name = "bettercam_dpad", .type = CONFIG_TYPE_BOOL, .boolValue = &configFreeCameraDpadBehavior},
+ {.name = "bettercam_collision", .type = CONFIG_TYPE_BOOL, .boolValue = &configFreeCameraHasCollision},
{.name = "bettercam_mouse_look", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraMouse},
{.name = "bettercam_invertx", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraInvertX},
{.name = "bettercam_inverty", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraInvertY},
@@ -265,6 +272,13 @@ static const struct ConfigOption options[] = {
{.name = "bettercam_aggression", .type = CONFIG_TYPE_UINT, .uintValue = &configCameraAggr},
{.name = "bettercam_pan_level", .type = CONFIG_TYPE_UINT, .uintValue = &configCameraPan},
{.name = "bettercam_degrade", .type = CONFIG_TYPE_UINT, .uintValue = &configCameraDegrade},
+ // romhack camera settings
+ {.name = "romhackcam_enable", .type = CONFIG_TYPE_BOOL, .boolValue = &configEnableRomhackCamera},
+ {.name = "romhackcam_bowser", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraBowserFights},
+ {.name = "romhackcam_collision", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraHasCollision},
+ {.name = "romhackcam_centering", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraHasCentering},
+ {.name = "romhackcam_dpad", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraDpadBehavior},
+ {.name = "romhackcam_toxic_gas", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraToxicGas},
// debug
{.name = "debug_offset", .type = CONFIG_TYPE_U64, .u64Value = &gPcDebug.bhvOffset},
{.name = "debug_tags", .type = CONFIG_TYPE_U64, .u64Value = gPcDebug.tags},
diff --git a/src/pc/configfile.h b/src/pc/configfile.h
index b77c2a501..e784f69a5 100644
--- a/src/pc/configfile.h
+++ b/src/pc/configfile.h
@@ -78,10 +78,10 @@ extern bool configBackgroundGamepad;
extern bool configDisableGamepads;
extern bool configUseStandardKeyBindingsChat;
// free camera settings
-extern bool configEnableCamera;
-extern bool configCameraAnalog;
-extern bool configCameraDpadBehavior;
-extern bool configCameraHasCollision;
+extern bool configEnableFreeCamera;
+extern bool configFreeCameraAnalog;
+extern bool configFreeCameraDpadBehavior;
+extern bool configFreeCameraHasCollision;
extern bool configCameraMouse;
extern bool configCameraInvertX;
extern bool configCameraInvertY;
@@ -90,6 +90,13 @@ extern unsigned int configCameraYSens;
extern unsigned int configCameraAggr;
extern unsigned int configCameraPan;
extern unsigned int configCameraDegrade;
+// romhack camera settings
+extern bool configEnableRomhackCamera;
+extern bool configRomhackCameraBowserFights;
+extern bool configRomhackCameraHasCollision;
+extern bool configRomhackCameraHasCentering;
+extern bool configRomhackCameraDpadBehavior;
+extern bool configCameraToxicGas;
// debug
extern bool configLuaProfiler;
extern bool configDebugPrint;
diff --git a/src/pc/djui/djui_panel_camera.c b/src/pc/djui/djui_panel_camera.c
index 6ac3196fc..c2a14d6c4 100644
--- a/src/pc/djui/djui_panel_camera.c
+++ b/src/pc/djui/djui_panel_camera.c
@@ -7,29 +7,63 @@
#include "game/first_person_cam.h"
#include "pc/lua/utils/smlua_misc_utils.h"
-static void djui_panel_camera_value_changed(UNUSED struct DjuiBase* caller) {
+static void djui_panel_free_camera_value_changed(UNUSED struct DjuiBase* caller) {
newcam_init_settings();
}
+static void djui_panel_romhack_camera_value_changed(UNUSED struct DjuiBase* caller) {
+ romhack_camera_init_settings();
+}
+
+void djui_panel_free_camera_create(struct DjuiBase* caller) {
+ struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(CAMERA, FREE_CAMERA), false);
+ struct DjuiBase* body = djui_three_panel_get_body(panel);
+ {
+ djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA), &configEnableFreeCamera, djui_panel_free_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, ANALOG_CAMERA), &configFreeCameraAnalog, djui_panel_free_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA_USE_DPAD), &configFreeCameraDpadBehavior, djui_panel_free_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA_COLLISION), &configFreeCameraHasCollision, djui_panel_free_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, MOUSE_LOOK), &configCameraMouse, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, X_SENSITIVITY), &configCameraXSens, 1, 100, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, Y_SENSITIVITY), &configCameraYSens, 1, 100, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, AGGRESSION), &configCameraAggr, 0, 100, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, PAN_LEVEL), &configCameraPan, 0, 100, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, DECELERATION), &configCameraDegrade, 0, 100, djui_panel_free_camera_value_changed);
+
+ djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back);
+ }
+
+ djui_panel_add(caller, panel, NULL);
+}
+
+void djui_panel_romhack_camera_create(struct DjuiBase* caller) {
+ struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(CAMERA, ROMHACK_CAMERA), false);
+ struct DjuiBase* body = djui_three_panel_get_body(panel);
+ {
+ djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA), &configEnableRomhackCamera, djui_panel_romhack_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_IN_BOWSER), &configRomhackCameraBowserFights, djui_panel_romhack_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_COLLISION), &configRomhackCameraHasCollision, djui_panel_romhack_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_L_CENTERING), &configRomhackCameraHasCentering, djui_panel_romhack_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_USE_DPAD), &configRomhackCameraDpadBehavior, djui_panel_romhack_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, CAMERA_TOXIC_GAS), &configCameraToxicGas, djui_panel_romhack_camera_value_changed);
+
+ djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back);
+ }
+
+ djui_panel_add(caller, panel, NULL);
+}
+
void djui_panel_camera_create(struct DjuiBase* caller) {
struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(CAMERA, CAMERA), false);
struct DjuiBase* body = djui_three_panel_get_body(panel);
{
- djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA), &configEnableCamera, djui_panel_camera_value_changed);
- djui_checkbox_create(body, DLANG(CAMERA, ANALOG_CAMERA), &configCameraAnalog, djui_panel_camera_value_changed);
- djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA_USE_DPAD), &configCameraDpadBehavior, djui_panel_camera_value_changed);
- djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA_COLLISION), &configCameraHasCollision, djui_panel_camera_value_changed);
- djui_checkbox_create(body, DLANG(CAMERA, MOUSE_LOOK), &configCameraMouse, djui_panel_camera_value_changed);
- djui_checkbox_create(body, DLANG(CAMERA, INVERT_X), &configCameraInvertX, djui_panel_camera_value_changed);
- djui_checkbox_create(body, DLANG(CAMERA, INVERT_Y), &configCameraInvertY, djui_panel_camera_value_changed);
- djui_slider_create(body, DLANG(CAMERA, X_SENSITIVITY), &configCameraXSens, 1, 100, djui_panel_camera_value_changed);
- djui_slider_create(body, DLANG(CAMERA, Y_SENSITIVITY), &configCameraYSens, 1, 100, djui_panel_camera_value_changed);
- djui_slider_create(body, DLANG(CAMERA, AGGRESSION), &configCameraAggr, 0, 100, djui_panel_camera_value_changed);
- djui_slider_create(body, DLANG(CAMERA, PAN_LEVEL), &configCameraPan, 0, 100, djui_panel_camera_value_changed);
- djui_slider_create(body, DLANG(CAMERA, DECELERATION), &configCameraDegrade, 0, 100, djui_panel_camera_value_changed);
+ djui_button_create(body, DLANG(CAMERA, FREE_CAMERA), DJUI_BUTTON_STYLE_NORMAL, djui_panel_free_camera_create);
+ djui_button_create(body, DLANG(CAMERA, ROMHACK_CAMERA), DJUI_BUTTON_STYLE_NORMAL, djui_panel_romhack_camera_create);
+ djui_checkbox_create(body, DLANG(CAMERA, INVERT_X), &configCameraInvertX, djui_panel_free_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, INVERT_Y), &configCameraInvertY, djui_panel_free_camera_value_changed);
djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back);
}
djui_panel_add(caller, panel, NULL);
-}
+}
\ No newline at end of file
diff --git a/src/pc/djui/djui_panel_camera.h b/src/pc/djui/djui_panel_camera.h
index 134361e0d..b9a130410 100644
--- a/src/pc/djui/djui_panel_camera.h
+++ b/src/pc/djui/djui_panel_camera.h
@@ -1,4 +1,5 @@
#pragma once
#include "djui.h"
-void djui_panel_camera_create(struct DjuiBase* caller);
+void djui_panel_free_camera_create(struct DjuiBase* caller);
+void djui_panel_camera_create(struct DjuiBase* caller);
\ No newline at end of file
diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c
index 32f94e76d..d93eb625f 100644
--- a/src/pc/lua/smlua_constants_autogen.c
+++ b/src/pc/lua/smlua_constants_autogen.c
@@ -835,6 +835,9 @@ char gSmluaConstants[] = ""
"RCO_ALL = 0\n"
"RCO_ALL_EXCEPT_BOWSER = 1\n"
"RCO_NONE = 2\n"
+"RCO_ALL_INCLUDING_VANILLA = 3\n"
+"RCO_ALL_VANILLA_EXCEPT_BOWSER = 4\n"
+"RCO_DISABLE = 5\n"
"CAM_MODE_MARIO_ACTIVE = 0x01\n"
"CAM_MODE_LAKITU_WAS_ZOOMED_OUT = 0x02\n"
"CAM_MODE_MARIO_SELECTED = 0x04\n"
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index 9ab30e332..8a054b5f3 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -11071,23 +11071,6 @@ int smlua_func_resolve_geometry_collisions(lua_State* L) {
return 1;
}
-int smlua_func_rom_hack_cam_set_collisions(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", "rom_hack_cam_set_collisions", 1, top);
- return 0;
- }
-
- u8 enable = smlua_to_integer(L, 1);
- if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "rom_hack_cam_set_collisions"); return 0; }
-
- rom_hack_cam_set_collisions(enable);
-
- return 1;
-}
-
int smlua_func_rotate_camera_around_walls(lua_State* L) {
if (L == NULL) { return 0; }
@@ -27666,32 +27649,32 @@ int smlua_func_camera_config_is_analog_cam_enabled(UNUSED lua_State* L) {
return 1;
}
-int smlua_func_camera_config_is_camera_collision_enabled(UNUSED lua_State* L) {
+int smlua_func_camera_config_is_free_cam_enabled(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", "camera_config_is_camera_collision_enabled", 0, top);
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "camera_config_is_free_cam_enabled", 0, top);
return 0;
}
- lua_pushboolean(L, camera_config_is_camera_collision_enabled());
+ lua_pushboolean(L, camera_config_is_free_cam_enabled());
return 1;
}
-int smlua_func_camera_config_is_free_cam_enabled(UNUSED lua_State* L) {
+int smlua_func_camera_config_is_free_camera_collision_enabled(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", "camera_config_is_free_cam_enabled", 0, top);
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "camera_config_is_free_camera_collision_enabled", 0, top);
return 0;
}
- lua_pushboolean(L, camera_config_is_free_cam_enabled());
+ lua_pushboolean(L, camera_config_is_free_camera_collision_enabled());
return 1;
}
@@ -27856,6 +27839,21 @@ int smlua_func_camera_freeze(UNUSED lua_State* L) {
return 1;
}
+int smlua_func_camera_get_allow_toxic_gas_camera(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", "camera_get_allow_toxic_gas_camera", 0, top);
+ return 0;
+ }
+
+
+ lua_pushinteger(L, camera_get_allow_toxic_gas_camera());
+
+ return 1;
+}
+
int smlua_func_camera_get_checking_surfaces(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
@@ -27871,6 +27869,21 @@ int smlua_func_camera_get_checking_surfaces(UNUSED lua_State* L) {
return 1;
}
+int smlua_func_camera_get_romhack_override(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", "camera_get_romhack_override", 0, top);
+ return 0;
+ }
+
+
+ lua_pushinteger(L, camera_get_romhack_override());
+
+ return 1;
+}
+
int smlua_func_camera_is_frozen(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
@@ -27935,6 +27948,51 @@ int smlua_func_camera_romhack_allow_dpad_usage(lua_State* L) {
return 1;
}
+int smlua_func_camera_romhack_get_allow_centering(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", "camera_romhack_get_allow_centering", 0, top);
+ return 0;
+ }
+
+
+ lua_pushinteger(L, camera_romhack_get_allow_centering());
+
+ return 1;
+}
+
+int smlua_func_camera_romhack_get_allow_dpad_usage(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", "camera_romhack_get_allow_dpad_usage", 0, top);
+ return 0;
+ }
+
+
+ lua_pushinteger(L, camera_romhack_get_allow_dpad_usage());
+
+ return 1;
+}
+
+int smlua_func_camera_romhack_get_collisions(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", "camera_romhack_get_collisions", 0, top);
+ return 0;
+ }
+
+
+ lua_pushinteger(L, camera_romhack_get_collisions());
+
+ return 1;
+}
+
int smlua_func_camera_set_checking_surfaces(lua_State* L) {
if (L == NULL) { return 0; }
@@ -27984,6 +28042,23 @@ int smlua_func_camera_unfreeze(UNUSED lua_State* L) {
return 1;
}
+int smlua_func_rom_hack_cam_set_collisions(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", "rom_hack_cam_set_collisions", 1, top);
+ return 0;
+ }
+
+ u8 enable = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "rom_hack_cam_set_collisions"); return 0; }
+
+ rom_hack_cam_set_collisions(enable);
+
+ return 1;
+}
+
/////////////////////////////
// smlua_collision_utils.h //
/////////////////////////////
@@ -32732,7 +32807,6 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "random_vec3s", smlua_func_random_vec3s);
smlua_bind_function(L, "reset_camera", smlua_func_reset_camera);
smlua_bind_function(L, "resolve_geometry_collisions", smlua_func_resolve_geometry_collisions);
- smlua_bind_function(L, "rom_hack_cam_set_collisions", smlua_func_rom_hack_cam_set_collisions);
smlua_bind_function(L, "rotate_camera_around_walls", smlua_func_rotate_camera_around_walls);
smlua_bind_function(L, "rotate_in_xz", smlua_func_rotate_in_xz);
smlua_bind_function(L, "rotate_in_yz", smlua_func_rotate_in_yz);
@@ -33649,8 +33723,8 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "camera_config_invert_x", smlua_func_camera_config_invert_x);
smlua_bind_function(L, "camera_config_invert_y", smlua_func_camera_config_invert_y);
smlua_bind_function(L, "camera_config_is_analog_cam_enabled", smlua_func_camera_config_is_analog_cam_enabled);
- smlua_bind_function(L, "camera_config_is_camera_collision_enabled", smlua_func_camera_config_is_camera_collision_enabled);
smlua_bind_function(L, "camera_config_is_free_cam_enabled", smlua_func_camera_config_is_free_cam_enabled);
+ smlua_bind_function(L, "camera_config_is_free_camera_collision_enabled", smlua_func_camera_config_is_free_camera_collision_enabled);
smlua_bind_function(L, "camera_config_is_freecam_dpad_enabled", smlua_func_camera_config_is_freecam_dpad_enabled);
smlua_bind_function(L, "camera_config_is_mouse_look_enabled", smlua_func_camera_config_is_mouse_look_enabled);
smlua_bind_function(L, "camera_config_is_x_inverted", smlua_func_camera_config_is_x_inverted);
@@ -33661,14 +33735,20 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "camera_config_set_x_sensitivity", smlua_func_camera_config_set_x_sensitivity);
smlua_bind_function(L, "camera_config_set_y_sensitivity", smlua_func_camera_config_set_y_sensitivity);
smlua_bind_function(L, "camera_freeze", smlua_func_camera_freeze);
+ smlua_bind_function(L, "camera_get_allow_toxic_gas_camera", smlua_func_camera_get_allow_toxic_gas_camera);
smlua_bind_function(L, "camera_get_checking_surfaces", smlua_func_camera_get_checking_surfaces);
+ smlua_bind_function(L, "camera_get_romhack_override", smlua_func_camera_get_romhack_override);
smlua_bind_function(L, "camera_is_frozen", smlua_func_camera_is_frozen);
smlua_bind_function(L, "camera_reset_overrides", smlua_func_camera_reset_overrides);
smlua_bind_function(L, "camera_romhack_allow_centering", smlua_func_camera_romhack_allow_centering);
smlua_bind_function(L, "camera_romhack_allow_dpad_usage", smlua_func_camera_romhack_allow_dpad_usage);
+ smlua_bind_function(L, "camera_romhack_get_allow_centering", smlua_func_camera_romhack_get_allow_centering);
+ smlua_bind_function(L, "camera_romhack_get_allow_dpad_usage", smlua_func_camera_romhack_get_allow_dpad_usage);
+ smlua_bind_function(L, "camera_romhack_get_collisions", smlua_func_camera_romhack_get_collisions);
smlua_bind_function(L, "camera_set_checking_surfaces", smlua_func_camera_set_checking_surfaces);
smlua_bind_function(L, "camera_set_romhack_override", smlua_func_camera_set_romhack_override);
smlua_bind_function(L, "camera_unfreeze", smlua_func_camera_unfreeze);
+ smlua_bind_function(L, "rom_hack_cam_set_collisions", smlua_func_rom_hack_cam_set_collisions);
// smlua_collision_utils.h
smlua_bind_function(L, "collision_find_ceil", smlua_func_collision_find_ceil);
diff --git a/src/pc/lua/utils/smlua_camera_utils.c b/src/pc/lua/utils/smlua_camera_utils.c
index 5132934bc..4cdbb0aab 100644
--- a/src/pc/lua/utils/smlua_camera_utils.c
+++ b/src/pc/lua/utils/smlua_camera_utils.c
@@ -58,20 +58,44 @@ void camera_romhack_allow_dpad_usage(u8 allow) {
gRomhackCameraAllowDpad = allow;
}
+void rom_hack_cam_set_collisions(u8 enable) {
+ gRomHackCamSetCollisions = enable;
+}
+
+enum RomhackCameraOverride camera_get_romhack_override(void) {
+ return gOverrideRomhackCamera;
+}
+
+u8 camera_romhack_get_allow_centering(void) {
+ return gRomhackCameraAllowCentering;
+}
+
+u8 camera_get_allow_toxic_gas_camera(void) {
+ return gOverrideAllowToxicGasCamera;
+}
+
+u8 camera_romhack_get_allow_dpad_usage(void) {
+ return gRomhackCameraAllowDpad;
+}
+
+u8 camera_romhack_get_collisions(void) {
+ return gRomHackCamSetCollisions;
+}
+
bool camera_config_is_free_cam_enabled(void) {
- return sOverrideEnableCamera.override ? sOverrideEnableCamera.value : configEnableCamera;
+ return sOverrideEnableCamera.override ? sOverrideEnableCamera.value : configEnableFreeCamera;
}
bool camera_config_is_analog_cam_enabled(void) {
- return sOverrideCameraAnalog.override ? sOverrideCameraAnalog.value : configCameraAnalog;
+ return sOverrideCameraAnalog.override ? sOverrideCameraAnalog.value : configFreeCameraAnalog;
}
bool camera_config_is_freecam_dpad_enabled(void) {
- return sOverrideCameraFreecamDpad.override ? sOverrideCameraFreecamDpad.value : configCameraDpadBehavior;
+ return sOverrideCameraFreecamDpad.override ? sOverrideCameraFreecamDpad.value : configFreeCameraDpadBehavior;
}
-bool camera_config_is_camera_collision_enabled(void) {
- return sOverrideCameraFreecamCollision.override ? sOverrideCameraFreecamCollision.value : configCameraHasCollision;
+bool camera_config_is_free_camera_collision_enabled(void) {
+ return sOverrideCameraFreecamCollision.override ? sOverrideCameraFreecamCollision.value : configFreeCameraHasCollision;
}
bool camera_config_is_mouse_look_enabled(void) {
diff --git a/src/pc/lua/utils/smlua_camera_utils.h b/src/pc/lua/utils/smlua_camera_utils.h
index 585bb8f1a..410abef89 100644
--- a/src/pc/lua/utils/smlua_camera_utils.h
+++ b/src/pc/lua/utils/smlua_camera_utils.h
@@ -17,14 +17,31 @@ void camera_freeze(void);
void camera_unfreeze(void);
/* |description|Checks if the camera is frozen|descriptionEnd| */
bool camera_is_frozen(void);
+
/* |description|Sets the romhack camera override status|descriptionEnd| */
void camera_set_romhack_override(enum RomhackCameraOverride rco);
-/* |description|Sets if the romhack camera should allow centering|descriptionEnd| */
+/* |description|Sets if the romhack camera should allow centering, triggered with the L button|descriptionEnd| */
void camera_romhack_allow_centering(u8 allow);
/* |description|Sets if the romhack camera should fly above poison gas|descriptionEnd| */
void camera_allow_toxic_gas_camera(u8 allow);
/* |description|Sets if the romhack camera should allow D-Pad movement|descriptionEnd| */
void camera_romhack_allow_dpad_usage(u8 allow);
+/* |description|
+Toggles collision settings for the ROM hack camera.
+This enables or disables specific collision behaviors in modded levels
+|descriptionEnd| */
+void rom_hack_cam_set_collisions(u8 enable);
+
+/* |description|Gets the current romhack camera override status|descriptionEnd| */
+enum RomhackCameraOverride camera_get_romhack_override(void);
+/* |description|Gets if the romhack camera should allow centering|descriptionEnd| */
+u8 camera_romhack_get_allow_centering(void);
+/* |description|Gets if the romhack camera should fly above poison gas|descriptionEnd| */
+u8 camera_get_allow_toxic_gas_camera(void);
+/* |description|Gets if the romhack camera should allow D-Pad movement|descriptionEnd| */
+u8 camera_romhack_get_allow_dpad_usage(void);
+/* |description|Gets if the romhack camera has surface collisions|descriptionEnd| */
+u8 camera_romhack_get_collisions(void);
/* |description|Checks if Free Camera is enabled|descriptionEnd| */
bool camera_config_is_free_cam_enabled(void);
@@ -33,7 +50,7 @@ bool camera_config_is_analog_cam_enabled(void);
/* |description|Checks if Freecam DPad Behavior is enabled|descriptionEnd| */
bool camera_config_is_freecam_dpad_enabled(void);
/* |description|Checks if Camera Collision is enabled|descriptionEnd| */
-bool camera_config_is_camera_collision_enabled(void);
+bool camera_config_is_free_camera_collision_enabled(void);
/* |description|Checks if Mouse Look is enabled|descriptionEnd| */
bool camera_config_is_mouse_look_enabled(void);
/* |description|Checks if camera X is inverted|descriptionEnd| */
From 4ebb8bf09e323bb665e77ac721b90f427076fd97 Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Tue, 7 Jan 2025 00:09:42 -0500
Subject: [PATCH 06/13] Add slow fall into the options
This shouldn't affect mods at all so no functions for mods
---
lang/English.ini | 1 +
src/game/camera.c | 16 ++++++++++------
src/game/camera.h | 1 +
src/pc/configfile.c | 14 ++++++++------
src/pc/configfile.h | 1 +
src/pc/djui/djui_panel_camera.c | 1 +
6 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/lang/English.ini b/lang/English.ini
index 01a45cc76..0b5df1705 100644
--- a/lang/English.ini
+++ b/lang/English.ini
@@ -76,6 +76,7 @@ ROMHACK_CAMERA_IN_BOWSER = "Use in Bowser fights"
ROMHACK_CAMERA_COLLISION = "Camera Collisions"
ROMHACK_CAMERA_L_CENTERING = "L Centering"
ROMHACK_CAMERA_USE_DPAD = "DPad Behavior"
+ROMHACK_CAMERA_SLOW_FALL = "Slow Fall"
CAMERA_TOXIC_GAS = "Adjust for toxic gas"
MOUSE_LOOK = "Mouse Look"
INVERT_X = "Invert X"
diff --git a/src/game/camera.c b/src/game/camera.c
index 458ea6d38..d11327d2d 100644
--- a/src/game/camera.c
+++ b/src/game/camera.c
@@ -47,6 +47,7 @@ enum RomhackCameraOverride gOverrideRomhackCamera = RCO_ALL;
u8 gRomhackCameraAllowCentering = TRUE;
u8 gOverrideAllowToxicGasCamera = FALSE;
u8 gRomhackCameraAllowDpad = FALSE;
+u8 gRomhackCameraSlowFall = TRUE;
/**
* @file camera.c
@@ -12174,11 +12175,12 @@ void romhack_camera_init_settings(void) {
enum RomhackCameraOverride override = configEnableRomhackCamera ?
(configRomhackCameraBowserFights ? RCO_ALL_INCLUDING_VANILLA : RCO_ALL_VANILLA_EXCEPT_BOWSER) : RCO_DISABLE;
camera_set_romhack_override(override);
- camera_set_use_course_specific_settings(dynos_level_is_vanilla_level(gCurrLevelNum) ? 1 : 0);
- rom_hack_cam_set_collisions(configRomhackCameraHasCollision);
- camera_romhack_allow_centering(configRomhackCameraHasCentering);
- camera_romhack_allow_dpad_usage(configRomhackCameraDpadBehavior);
- camera_allow_toxic_gas_camera(configCameraToxicGas);
+ gCameraUseCourseSpecificSettings = dynos_level_is_vanilla_level(gCurrLevelNum) ? 1 : 0;
+ gRomHackCamSetCollisions = configRomhackCameraHasCollision;
+ gRomhackCameraAllowCentering = configRomhackCameraHasCentering;
+ gRomhackCameraAllowDpad = configRomhackCameraDpadBehavior;
+ gOverrideAllowToxicGasCamera = configCameraToxicGas;
+ gRomhackCameraSlowFall = configRomhackCameraSlowFall;
}
static u8 rom_hack_cam_can_see_mario(Vec3f desiredPos) {
@@ -12399,12 +12401,14 @@ void mode_rom_hack_camera(struct Camera *c) {
// tween
c->pos[0] = c->pos[0] * 0.6 + oldPos[0] * 0.4;
- {
+ if (gRomhackCameraSlowFall) {
f32 approachRate = 20.0f;
f32 goalHeight = c->pos[1];
approachRate += ABS(oldPos[1] - goalHeight) / 20;
c->pos[1] = oldPos[1];
approach_camera_height(c, goalHeight, approachRate);
+ } else {
+ c->pos[1] = c->pos[1] * 0.6 + oldPos[1] * 0.4;
}
c->pos[2] = c->pos[2] * 0.6 + oldPos[2] * 0.4;
diff --git a/src/game/camera.h b/src/game/camera.h
index c44bb070a..7e70fc391 100644
--- a/src/game/camera.h
+++ b/src/game/camera.h
@@ -25,6 +25,7 @@ extern u8 gRomhackCameraAllowCentering;
extern u8 gOverrideAllowToxicGasCamera;
extern u8 gRomhackCameraAllowDpad;
extern u8 gRomHackCamSetCollisions;
+extern u8 gRomhackCameraSlowFall;
/**
* @file camera.h
diff --git a/src/pc/configfile.c b/src/pc/configfile.c
index 42f5bc8cd..876bc5390 100644
--- a/src/pc/configfile.c
+++ b/src/pc/configfile.c
@@ -143,6 +143,7 @@ bool configRomhackCameraBowserFights = false;
bool configRomhackCameraHasCollision = false;
bool configRomhackCameraHasCentering = false;
bool configRomhackCameraDpadBehavior = false;
+bool configRomhackCameraSlowFall = true;
bool configCameraToxicGas = true;
// debug
bool configLuaProfiler = false;
@@ -273,12 +274,13 @@ static const struct ConfigOption options[] = {
{.name = "bettercam_pan_level", .type = CONFIG_TYPE_UINT, .uintValue = &configCameraPan},
{.name = "bettercam_degrade", .type = CONFIG_TYPE_UINT, .uintValue = &configCameraDegrade},
// romhack camera settings
- {.name = "romhackcam_enable", .type = CONFIG_TYPE_BOOL, .boolValue = &configEnableRomhackCamera},
- {.name = "romhackcam_bowser", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraBowserFights},
- {.name = "romhackcam_collision", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraHasCollision},
- {.name = "romhackcam_centering", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraHasCentering},
- {.name = "romhackcam_dpad", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraDpadBehavior},
- {.name = "romhackcam_toxic_gas", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraToxicGas},
+ {.name = "romhackcam_enable", .type = CONFIG_TYPE_BOOL, .boolValue = &configEnableRomhackCamera},
+ {.name = "romhackcam_bowser", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraBowserFights},
+ {.name = "romhackcam_collision", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraHasCollision},
+ {.name = "romhackcam_centering", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraHasCentering},
+ {.name = "romhackcam_dpad", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraDpadBehavior},
+ {.name = "romhackcam_slowfall", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraSlowFall},
+ {.name = "romhackcam_toxic_gas", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraToxicGas},
// debug
{.name = "debug_offset", .type = CONFIG_TYPE_U64, .u64Value = &gPcDebug.bhvOffset},
{.name = "debug_tags", .type = CONFIG_TYPE_U64, .u64Value = gPcDebug.tags},
diff --git a/src/pc/configfile.h b/src/pc/configfile.h
index e784f69a5..05f151eae 100644
--- a/src/pc/configfile.h
+++ b/src/pc/configfile.h
@@ -96,6 +96,7 @@ extern bool configRomhackCameraBowserFights;
extern bool configRomhackCameraHasCollision;
extern bool configRomhackCameraHasCentering;
extern bool configRomhackCameraDpadBehavior;
+extern bool configRomhackCameraSlowFall;
extern bool configCameraToxicGas;
// debug
extern bool configLuaProfiler;
diff --git a/src/pc/djui/djui_panel_camera.c b/src/pc/djui/djui_panel_camera.c
index c2a14d6c4..a13de3df9 100644
--- a/src/pc/djui/djui_panel_camera.c
+++ b/src/pc/djui/djui_panel_camera.c
@@ -45,6 +45,7 @@ void djui_panel_romhack_camera_create(struct DjuiBase* caller) {
djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_COLLISION), &configRomhackCameraHasCollision, djui_panel_romhack_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_L_CENTERING), &configRomhackCameraHasCentering, djui_panel_romhack_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_USE_DPAD), &configRomhackCameraDpadBehavior, djui_panel_romhack_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_SLOW_FALL), &configRomhackCameraSlowFall, djui_panel_romhack_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, CAMERA_TOXIC_GAS), &configCameraToxicGas, djui_panel_romhack_camera_value_changed);
djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back);
From 787c6e8d41df814b8b69965a6ec95f622ff53b7a Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Tue, 7 Jan 2025 15:28:51 -0500
Subject: [PATCH 07/13] Fix bowser fight camera swap
---
src/game/camera.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/game/camera.c b/src/game/camera.c
index d11327d2d..639af95b2 100644
--- a/src/game/camera.c
+++ b/src/game/camera.c
@@ -3128,6 +3128,11 @@ static void update_romhack_camera_override(struct Camera *c) {
set_camera_mode(c, c->defMode, 0);
}
return;
+ } else {
+ if (c->mode == CAMERA_MODE_BOSS_FIGHT) {
+ set_camera_mode(c, CAMERA_MODE_ROM_HACK, 0);
+ return;
+ }
}
if (c->mode == CAMERA_MODE_ROM_HACK || !allow_romhack_camera_override_mode(c->mode)) { return; }
@@ -12174,8 +12179,8 @@ s32 snap_to_45_degrees(s16 angle) {
void romhack_camera_init_settings(void) {
enum RomhackCameraOverride override = configEnableRomhackCamera ?
(configRomhackCameraBowserFights ? RCO_ALL_INCLUDING_VANILLA : RCO_ALL_VANILLA_EXCEPT_BOWSER) : RCO_DISABLE;
- camera_set_romhack_override(override);
- gCameraUseCourseSpecificSettings = dynos_level_is_vanilla_level(gCurrLevelNum) ? 1 : 0;
+ gOverrideRomhackCamera = override;
+ gCameraUseCourseSpecificSettings = (override == RCO_DISABLE && dynos_level_is_vanilla_level(gCurrLevelNum));
gRomHackCamSetCollisions = configRomhackCameraHasCollision;
gRomhackCameraAllowCentering = configRomhackCameraHasCentering;
gRomhackCameraAllowDpad = configRomhackCameraDpadBehavior;
From 0095580e2839f51388e4337906de80abbef446f1 Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Wed, 8 Jan 2025 02:02:35 -0500
Subject: [PATCH 08/13] Add zoomed in/out distance/height as options
---
autogen/lua_definitions/functions.lua | 48 +++
docs/lua/functions-5.md | 466 ++++++++++----------------
docs/lua/functions-6.md | 290 ++++++++++++++++
docs/lua/functions.md | 32 +-
lang/English.ini | 4 +
src/game/camera.c | 4 +-
src/pc/configfile.c | 8 +
src/pc/configfile.h | 4 +
src/pc/djui/djui_panel_camera.c | 4 +
src/pc/lua/smlua_functions_autogen.c | 136 ++++++++
src/pc/lua/utils/smlua_camera_utils.c | 52 +++
src/pc/lua/utils/smlua_camera_utils.h | 18 +
12 files changed, 762 insertions(+), 304 deletions(-)
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index 5e30ac263..ecbe40404 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -9085,6 +9085,54 @@ function camera_romhack_get_collisions()
-- ...
end
+--- @return integer
+--- Gets the romhack camera's zoomed in distance
+function camera_romhack_get_zoomed_in_dist()
+ -- ...
+end
+
+--- @return integer
+--- Gets the romhack camera's zoomed in height
+function camera_romhack_get_zoomed_in_height()
+ -- ...
+end
+
+--- @return integer
+--- Gets the romhack camera's additional zoomed out distance
+function camera_romhack_get_zoomed_out_dist()
+ -- ...
+end
+
+--- @return integer
+--- Gets the romhack camera's additional zoomed out height
+function camera_romhack_get_zoomed_out_height()
+ -- ...
+end
+
+--- @param val integer
+--- Sets the romhack camera's zoomed in distance, between 600 and 1600
+function camera_romhack_set_zoomed_in_dist(val)
+ -- ...
+end
+
+--- @param val integer
+--- Sets the romhack camera's zoomed in height, between 200 and 600
+function camera_romhack_set_zoomed_in_height(val)
+ -- ...
+end
+
+--- @param val integer
+--- Sets the romhack camera's zoomed out additional distance, between 400 and 1000
+function camera_romhack_set_zoomed_out_dist(val)
+ -- ...
+end
+
+--- @param val integer
+--- Sets the romhack camera's zoomed out additional height, between 200 and 600
+function camera_romhack_set_zoomed_out_height(val)
+ -- ...
+end
+
--- @param value boolean
--- Sets if the camera should account for surfaces
function camera_set_checking_surfaces(value)
diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md
index 278427d04..9665fd64e 100644
--- a/docs/lua/functions-5.md
+++ b/docs/lua/functions-5.md
@@ -7585,6 +7585,182 @@ Gets if the romhack camera has surface collisions
+## [camera_romhack_get_zoomed_in_dist](#camera_romhack_get_zoomed_in_dist)
+
+### Description
+Gets the romhack camera's zoomed in distance
+
+### Lua Example
+`local integerValue = camera_romhack_get_zoomed_in_dist()`
+
+### Parameters
+- None
+
+### Returns
+- `integer`
+
+### C Prototype
+`u32 camera_romhack_get_zoomed_in_dist(void);`
+
+[:arrow_up_small:](#)
+
+
+
+## [camera_romhack_get_zoomed_in_height](#camera_romhack_get_zoomed_in_height)
+
+### Description
+Gets the romhack camera's zoomed in height
+
+### Lua Example
+`local integerValue = camera_romhack_get_zoomed_in_height()`
+
+### Parameters
+- None
+
+### Returns
+- `integer`
+
+### C Prototype
+`u32 camera_romhack_get_zoomed_in_height(void);`
+
+[:arrow_up_small:](#)
+
+
+
+## [camera_romhack_get_zoomed_out_dist](#camera_romhack_get_zoomed_out_dist)
+
+### Description
+Gets the romhack camera's additional zoomed out distance
+
+### Lua Example
+`local integerValue = camera_romhack_get_zoomed_out_dist()`
+
+### Parameters
+- None
+
+### Returns
+- `integer`
+
+### C Prototype
+`u32 camera_romhack_get_zoomed_out_dist(void);`
+
+[:arrow_up_small:](#)
+
+
+
+## [camera_romhack_get_zoomed_out_height](#camera_romhack_get_zoomed_out_height)
+
+### Description
+Gets the romhack camera's additional zoomed out height
+
+### Lua Example
+`local integerValue = camera_romhack_get_zoomed_out_height()`
+
+### Parameters
+- None
+
+### Returns
+- `integer`
+
+### C Prototype
+`u32 camera_romhack_get_zoomed_out_height(void);`
+
+[:arrow_up_small:](#)
+
+
+
+## [camera_romhack_set_zoomed_in_dist](#camera_romhack_set_zoomed_in_dist)
+
+### Description
+Sets the romhack camera's zoomed in distance, between 600 and 1600
+
+### Lua Example
+`camera_romhack_set_zoomed_in_dist(val)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| val | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void camera_romhack_set_zoomed_in_dist(u32 val);`
+
+[:arrow_up_small:](#)
+
+
+
+## [camera_romhack_set_zoomed_in_height](#camera_romhack_set_zoomed_in_height)
+
+### Description
+Sets the romhack camera's zoomed in height, between 200 and 600
+
+### Lua Example
+`camera_romhack_set_zoomed_in_height(val)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| val | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void camera_romhack_set_zoomed_in_height(u32 val);`
+
+[:arrow_up_small:](#)
+
+
+
+## [camera_romhack_set_zoomed_out_dist](#camera_romhack_set_zoomed_out_dist)
+
+### Description
+Sets the romhack camera's zoomed out additional distance, between 400 and 1000
+
+### Lua Example
+`camera_romhack_set_zoomed_out_dist(val)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| val | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void camera_romhack_set_zoomed_out_dist(u32 val);`
+
+[:arrow_up_small:](#)
+
+
+
+## [camera_romhack_set_zoomed_out_height](#camera_romhack_set_zoomed_out_height)
+
+### Description
+Sets the romhack camera's zoomed out additional height, between 200 and 600
+
+### Lua Example
+`camera_romhack_set_zoomed_out_height(val)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| val | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void camera_romhack_set_zoomed_out_height(u32 val);`
+
+[:arrow_up_small:](#)
+
+
+
## [camera_set_checking_surfaces](#camera_set_checking_surfaces)
### Description
@@ -8334,296 +8510,6 @@ Sets a value of the global vertex shading color
[:arrow_up_small:](#)
-
-
----
-# functions from smlua_level_utils.h
-
-
-
-
-## [level_is_vanilla_level](#level_is_vanilla_level)
-
-### Description
-Checks if `levelNum` is a vanilla level
-
-### Lua Example
-`local booleanValue = level_is_vanilla_level(levelNum)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| levelNum | `integer` |
-
-### Returns
-- `boolean`
-
-### C Prototype
-`bool level_is_vanilla_level(s16 levelNum);`
-
-[:arrow_up_small:](#)
-
-
-
-## [level_register](#level_register)
-
-### Description
-Registers a fully custom level. Level ID begins at 50
-
-### Lua Example
-`local integerValue = level_register(scriptEntryName, courseNum, fullName, shortName, acousticReach, echoLevel1, echoLevel2, echoLevel3)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| scriptEntryName | `string` |
-| courseNum | `integer` |
-| fullName | `string` |
-| shortName | `string` |
-| acousticReach | `integer` |
-| echoLevel1 | `integer` |
-| echoLevel2 | `integer` |
-| echoLevel3 | `integer` |
-
-### Returns
-- `integer`
-
-### C Prototype
-`s16 level_register(const char* scriptEntryName, s16 courseNum, const char* fullName, const char* shortName, u32 acousticReach, u32 echoLevel1, u32 echoLevel2, u32 echoLevel3);`
-
-[:arrow_up_small:](#)
-
-
-
-## [smlua_level_util_change_area](#smlua_level_util_change_area)
-
-### Description
-Instantly changes the current area to `areaIndex`
-
-### Lua Example
-`smlua_level_util_change_area(areaIndex)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| areaIndex | `integer` |
-
-### Returns
-- None
-
-### C Prototype
-`void smlua_level_util_change_area(s32 areaIndex);`
-
-[:arrow_up_small:](#)
-
-
-
-## [smlua_level_util_get_info](#smlua_level_util_get_info)
-
-### Description
-Gets information on a custom level from `levelNum`
-
-### Lua Example
-`local CustomLevelInfoValue = smlua_level_util_get_info(levelNum)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| levelNum | `integer` |
-
-### Returns
-[CustomLevelInfo](structs.md#CustomLevelInfo)
-
-### C Prototype
-`struct CustomLevelInfo* smlua_level_util_get_info(s16 levelNum);`
-
-[:arrow_up_small:](#)
-
-
-
-## [smlua_level_util_get_info_from_course_num](#smlua_level_util_get_info_from_course_num)
-
-### Description
-Gets information on a custom level from `courseNum`
-
-### Lua Example
-`local CustomLevelInfoValue = smlua_level_util_get_info_from_course_num(courseNum)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| courseNum | `integer` |
-
-### Returns
-[CustomLevelInfo](structs.md#CustomLevelInfo)
-
-### C Prototype
-`struct CustomLevelInfo* smlua_level_util_get_info_from_course_num(u8 courseNum);`
-
-[:arrow_up_small:](#)
-
-
-
-## [smlua_level_util_get_info_from_short_name](#smlua_level_util_get_info_from_short_name)
-
-### Description
-Gets information on a custom level from `shortName`
-
-### Lua Example
-`local CustomLevelInfoValue = smlua_level_util_get_info_from_short_name(shortName)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| shortName | `string` |
-
-### Returns
-[CustomLevelInfo](structs.md#CustomLevelInfo)
-
-### C Prototype
-`struct CustomLevelInfo* smlua_level_util_get_info_from_short_name(const char* shortName);`
-
-[:arrow_up_small:](#)
-
-
-
-## [warp_exit_level](#warp_exit_level)
-
-### Description
-Exits the current level after `aDelay`
-
-### Lua Example
-`local booleanValue = warp_exit_level(aDelay)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| aDelay | `integer` |
-
-### Returns
-- `boolean`
-
-### C Prototype
-`bool warp_exit_level(s32 aDelay);`
-
-[:arrow_up_small:](#)
-
-
-
-## [warp_restart_level](#warp_restart_level)
-
-### Description
-Restarts the current level
-
-### Lua Example
-`local booleanValue = warp_restart_level()`
-
-### Parameters
-- None
-
-### Returns
-- `boolean`
-
-### C Prototype
-`bool warp_restart_level(void);`
-
-[:arrow_up_small:](#)
-
-
-
-## [warp_to_castle](#warp_to_castle)
-
-### Description
-Warps back to the castle from `aLevel`
-
-### Lua Example
-`local booleanValue = warp_to_castle(aLevel)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| aLevel | `integer` |
-
-### Returns
-- `boolean`
-
-### C Prototype
-`bool warp_to_castle(s32 aLevel);`
-
-[:arrow_up_small:](#)
-
-
-
-## [warp_to_level](#warp_to_level)
-
-### Description
-Warps to `aArea` of `aLevel` in `aAct`
-
-### Lua Example
-`local booleanValue = warp_to_level(aLevel, aArea, aAct)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| aLevel | `integer` |
-| aArea | `integer` |
-| aAct | `integer` |
-
-### Returns
-- `boolean`
-
-### C Prototype
-`bool warp_to_level(s32 aLevel, s32 aArea, s32 aAct);`
-
-[:arrow_up_small:](#)
-
-
-
-## [warp_to_start_level](#warp_to_start_level)
-
-### Description
-Warps to the start level (Castle Grounds by default)
-
-### Lua Example
-`local booleanValue = warp_to_start_level()`
-
-### Parameters
-- None
-
-### Returns
-- `boolean`
-
-### C Prototype
-`bool warp_to_start_level(void);`
-
-[:arrow_up_small:](#)
-
-
-
-## [warp_to_warpnode](#warp_to_warpnode)
-
-### Description
-Warps to `aWarpId` of `aArea` in `aLevel` during `aAct`
-
-### Lua Example
-`local booleanValue = warp_to_warpnode(aLevel, aArea, aAct, aWarpId)`
-
-### Parameters
-| Field | Type |
-| ----- | ---- |
-| aLevel | `integer` |
-| aArea | `integer` |
-| aAct | `integer` |
-| aWarpId | `integer` |
-
-### Returns
-- `boolean`
-
-### C Prototype
-`bool warp_to_warpnode(s32 aLevel, s32 aArea, s32 aAct, s32 aWarpId);`
-
-[:arrow_up_small:](#)
-
---
diff --git a/docs/lua/functions-6.md b/docs/lua/functions-6.md
index ffb769811..4b52b3ddd 100644
--- a/docs/lua/functions-6.md
+++ b/docs/lua/functions-6.md
@@ -5,6 +5,296 @@
[< prev](functions-5.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | 6]
+---
+# functions from smlua_level_utils.h
+
+
+
+
+## [level_is_vanilla_level](#level_is_vanilla_level)
+
+### Description
+Checks if `levelNum` is a vanilla level
+
+### Lua Example
+`local booleanValue = level_is_vanilla_level(levelNum)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| levelNum | `integer` |
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool level_is_vanilla_level(s16 levelNum);`
+
+[:arrow_up_small:](#)
+
+
+
+## [level_register](#level_register)
+
+### Description
+Registers a fully custom level. Level ID begins at 50
+
+### Lua Example
+`local integerValue = level_register(scriptEntryName, courseNum, fullName, shortName, acousticReach, echoLevel1, echoLevel2, echoLevel3)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| scriptEntryName | `string` |
+| courseNum | `integer` |
+| fullName | `string` |
+| shortName | `string` |
+| acousticReach | `integer` |
+| echoLevel1 | `integer` |
+| echoLevel2 | `integer` |
+| echoLevel3 | `integer` |
+
+### Returns
+- `integer`
+
+### C Prototype
+`s16 level_register(const char* scriptEntryName, s16 courseNum, const char* fullName, const char* shortName, u32 acousticReach, u32 echoLevel1, u32 echoLevel2, u32 echoLevel3);`
+
+[:arrow_up_small:](#)
+
+
+
+## [smlua_level_util_change_area](#smlua_level_util_change_area)
+
+### Description
+Instantly changes the current area to `areaIndex`
+
+### Lua Example
+`smlua_level_util_change_area(areaIndex)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| areaIndex | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void smlua_level_util_change_area(s32 areaIndex);`
+
+[:arrow_up_small:](#)
+
+
+
+## [smlua_level_util_get_info](#smlua_level_util_get_info)
+
+### Description
+Gets information on a custom level from `levelNum`
+
+### Lua Example
+`local CustomLevelInfoValue = smlua_level_util_get_info(levelNum)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| levelNum | `integer` |
+
+### Returns
+[CustomLevelInfo](structs.md#CustomLevelInfo)
+
+### C Prototype
+`struct CustomLevelInfo* smlua_level_util_get_info(s16 levelNum);`
+
+[:arrow_up_small:](#)
+
+
+
+## [smlua_level_util_get_info_from_course_num](#smlua_level_util_get_info_from_course_num)
+
+### Description
+Gets information on a custom level from `courseNum`
+
+### Lua Example
+`local CustomLevelInfoValue = smlua_level_util_get_info_from_course_num(courseNum)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| courseNum | `integer` |
+
+### Returns
+[CustomLevelInfo](structs.md#CustomLevelInfo)
+
+### C Prototype
+`struct CustomLevelInfo* smlua_level_util_get_info_from_course_num(u8 courseNum);`
+
+[:arrow_up_small:](#)
+
+
+
+## [smlua_level_util_get_info_from_short_name](#smlua_level_util_get_info_from_short_name)
+
+### Description
+Gets information on a custom level from `shortName`
+
+### Lua Example
+`local CustomLevelInfoValue = smlua_level_util_get_info_from_short_name(shortName)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| shortName | `string` |
+
+### Returns
+[CustomLevelInfo](structs.md#CustomLevelInfo)
+
+### C Prototype
+`struct CustomLevelInfo* smlua_level_util_get_info_from_short_name(const char* shortName);`
+
+[:arrow_up_small:](#)
+
+
+
+## [warp_exit_level](#warp_exit_level)
+
+### Description
+Exits the current level after `aDelay`
+
+### Lua Example
+`local booleanValue = warp_exit_level(aDelay)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| aDelay | `integer` |
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool warp_exit_level(s32 aDelay);`
+
+[:arrow_up_small:](#)
+
+
+
+## [warp_restart_level](#warp_restart_level)
+
+### Description
+Restarts the current level
+
+### Lua Example
+`local booleanValue = warp_restart_level()`
+
+### Parameters
+- None
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool warp_restart_level(void);`
+
+[:arrow_up_small:](#)
+
+
+
+## [warp_to_castle](#warp_to_castle)
+
+### Description
+Warps back to the castle from `aLevel`
+
+### Lua Example
+`local booleanValue = warp_to_castle(aLevel)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| aLevel | `integer` |
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool warp_to_castle(s32 aLevel);`
+
+[:arrow_up_small:](#)
+
+
+
+## [warp_to_level](#warp_to_level)
+
+### Description
+Warps to `aArea` of `aLevel` in `aAct`
+
+### Lua Example
+`local booleanValue = warp_to_level(aLevel, aArea, aAct)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| aLevel | `integer` |
+| aArea | `integer` |
+| aAct | `integer` |
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool warp_to_level(s32 aLevel, s32 aArea, s32 aAct);`
+
+[:arrow_up_small:](#)
+
+
+
+## [warp_to_start_level](#warp_to_start_level)
+
+### Description
+Warps to the start level (Castle Grounds by default)
+
+### Lua Example
+`local booleanValue = warp_to_start_level()`
+
+### Parameters
+- None
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool warp_to_start_level(void);`
+
+[:arrow_up_small:](#)
+
+
+
+## [warp_to_warpnode](#warp_to_warpnode)
+
+### Description
+Warps to `aWarpId` of `aArea` in `aLevel` during `aAct`
+
+### Lua Example
+`local booleanValue = warp_to_warpnode(aLevel, aArea, aAct, aWarpId)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| aLevel | `integer` |
+| aArea | `integer` |
+| aAct | `integer` |
+| aWarpId | `integer` |
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool warp_to_warpnode(s32 aLevel, s32 aArea, s32 aAct, s32 aWarpId);`
+
+[:arrow_up_small:](#)
+
+
+
---
# functions from smlua_math_utils.h
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index 8cac726ff..03c44e407 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -1682,6 +1682,14 @@
- [camera_romhack_get_allow_centering](functions-5.md#camera_romhack_get_allow_centering)
- [camera_romhack_get_allow_dpad_usage](functions-5.md#camera_romhack_get_allow_dpad_usage)
- [camera_romhack_get_collisions](functions-5.md#camera_romhack_get_collisions)
+ - [camera_romhack_get_zoomed_in_dist](functions-5.md#camera_romhack_get_zoomed_in_dist)
+ - [camera_romhack_get_zoomed_in_height](functions-5.md#camera_romhack_get_zoomed_in_height)
+ - [camera_romhack_get_zoomed_out_dist](functions-5.md#camera_romhack_get_zoomed_out_dist)
+ - [camera_romhack_get_zoomed_out_height](functions-5.md#camera_romhack_get_zoomed_out_height)
+ - [camera_romhack_set_zoomed_in_dist](functions-5.md#camera_romhack_set_zoomed_in_dist)
+ - [camera_romhack_set_zoomed_in_height](functions-5.md#camera_romhack_set_zoomed_in_height)
+ - [camera_romhack_set_zoomed_out_dist](functions-5.md#camera_romhack_set_zoomed_out_dist)
+ - [camera_romhack_set_zoomed_out_height](functions-5.md#camera_romhack_set_zoomed_out_height)
- [camera_set_checking_surfaces](functions-5.md#camera_set_checking_surfaces)
- [camera_set_romhack_override](functions-5.md#camera_set_romhack_override)
- [camera_unfreeze](functions-5.md#camera_unfreeze)
@@ -1730,18 +1738,18 @@
- smlua_level_utils.h
- - [level_is_vanilla_level](functions-5.md#level_is_vanilla_level)
- - [level_register](functions-5.md#level_register)
- - [smlua_level_util_change_area](functions-5.md#smlua_level_util_change_area)
- - [smlua_level_util_get_info](functions-5.md#smlua_level_util_get_info)
- - [smlua_level_util_get_info_from_course_num](functions-5.md#smlua_level_util_get_info_from_course_num)
- - [smlua_level_util_get_info_from_short_name](functions-5.md#smlua_level_util_get_info_from_short_name)
- - [warp_exit_level](functions-5.md#warp_exit_level)
- - [warp_restart_level](functions-5.md#warp_restart_level)
- - [warp_to_castle](functions-5.md#warp_to_castle)
- - [warp_to_level](functions-5.md#warp_to_level)
- - [warp_to_start_level](functions-5.md#warp_to_start_level)
- - [warp_to_warpnode](functions-5.md#warp_to_warpnode)
+ - [level_is_vanilla_level](functions-6.md#level_is_vanilla_level)
+ - [level_register](functions-6.md#level_register)
+ - [smlua_level_util_change_area](functions-6.md#smlua_level_util_change_area)
+ - [smlua_level_util_get_info](functions-6.md#smlua_level_util_get_info)
+ - [smlua_level_util_get_info_from_course_num](functions-6.md#smlua_level_util_get_info_from_course_num)
+ - [smlua_level_util_get_info_from_short_name](functions-6.md#smlua_level_util_get_info_from_short_name)
+ - [warp_exit_level](functions-6.md#warp_exit_level)
+ - [warp_restart_level](functions-6.md#warp_restart_level)
+ - [warp_to_castle](functions-6.md#warp_to_castle)
+ - [warp_to_level](functions-6.md#warp_to_level)
+ - [warp_to_start_level](functions-6.md#warp_to_start_level)
+ - [warp_to_warpnode](functions-6.md#warp_to_warpnode)
diff --git a/lang/English.ini b/lang/English.ini
index 0b5df1705..f0ba50f74 100644
--- a/lang/English.ini
+++ b/lang/English.ini
@@ -77,6 +77,10 @@ ROMHACK_CAMERA_COLLISION = "Camera Collisions"
ROMHACK_CAMERA_L_CENTERING = "L Centering"
ROMHACK_CAMERA_USE_DPAD = "DPad Behavior"
ROMHACK_CAMERA_SLOW_FALL = "Slow Fall"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "Zoomed In Distance"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "Zoomed Out Distance"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "Zoomed In Height"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "Zoomed Out Height"
CAMERA_TOXIC_GAS = "Adjust for toxic gas"
MOUSE_LOOK = "Mouse Look"
INVERT_X = "Invert X"
diff --git a/src/game/camera.c b/src/game/camera.c
index 639af95b2..7685d4077 100644
--- a/src/game/camera.c
+++ b/src/game/camera.c
@@ -12360,8 +12360,8 @@ void mode_rom_hack_camera(struct Camera *c) {
sRomHackIsUpdate = 0;
// figure out desired position
- f32 desiredDist = sRomHackZoom ? 900 : 1400;
- f32 desiredHeight = sRomHackZoom ? 300 : 450;
+ f32 desiredDist = sRomHackZoom ? configRomhackCameraZoomedInDist : configRomhackCameraZoomedInDist + configRomhackCameraZoomedOutDist;
+ f32 desiredHeight = sRomHackZoom ? configRomhackCameraZoomedInHeight : configRomhackCameraZoomedInHeight + configRomhackCameraZoomedOutHeight;
f32* mPos = &gMarioStates[0].pos[0];
pos[0] = mPos[0] + coss(sRomHackYaw) * desiredDist;
pos[1] = mPos[1] + desiredHeight;
diff --git a/src/pc/configfile.c b/src/pc/configfile.c
index 876bc5390..8f864cccb 100644
--- a/src/pc/configfile.c
+++ b/src/pc/configfile.c
@@ -145,6 +145,10 @@ bool configRomhackCameraHasCentering = false;
bool configRomhackCameraDpadBehavior = false;
bool configRomhackCameraSlowFall = true;
bool configCameraToxicGas = true;
+unsigned int configRomhackCameraZoomedInDist = 900;
+unsigned int configRomhackCameraZoomedOutDist = 1400;
+unsigned int configRomhackCameraZoomedInHeight = 300;
+unsigned int configRomhackCameraZoomedOutHeight = 450;
// debug
bool configLuaProfiler = false;
bool configDebugPrint = false;
@@ -281,6 +285,10 @@ static const struct ConfigOption options[] = {
{.name = "romhackcam_dpad", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraDpadBehavior},
{.name = "romhackcam_slowfall", .type = CONFIG_TYPE_BOOL, .boolValue = &configRomhackCameraSlowFall},
{.name = "romhackcam_toxic_gas", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraToxicGas},
+ {.name = "romhackcam_zi_dist", .type = CONFIG_TYPE_UINT, .uintValue = &configRomhackCameraZoomedInDist},
+ {.name = "romhackcam_zo_dist", .type = CONFIG_TYPE_UINT, .uintValue = &configRomhackCameraZoomedOutDist},
+ {.name = "romhackcam_zi_height", .type = CONFIG_TYPE_UINT, .uintValue = &configRomhackCameraZoomedInHeight},
+ {.name = "romhackcam_zo_height", .type = CONFIG_TYPE_UINT, .uintValue = &configRomhackCameraZoomedOutHeight},
// debug
{.name = "debug_offset", .type = CONFIG_TYPE_U64, .u64Value = &gPcDebug.bhvOffset},
{.name = "debug_tags", .type = CONFIG_TYPE_U64, .u64Value = gPcDebug.tags},
diff --git a/src/pc/configfile.h b/src/pc/configfile.h
index 05f151eae..b4bdfe9e0 100644
--- a/src/pc/configfile.h
+++ b/src/pc/configfile.h
@@ -98,6 +98,10 @@ extern bool configRomhackCameraHasCentering;
extern bool configRomhackCameraDpadBehavior;
extern bool configRomhackCameraSlowFall;
extern bool configCameraToxicGas;
+extern unsigned int configRomhackCameraZoomedInDist;
+extern unsigned int configRomhackCameraZoomedOutDist;
+extern unsigned int configRomhackCameraZoomedInHeight;
+extern unsigned int configRomhackCameraZoomedOutHeight;
// debug
extern bool configLuaProfiler;
extern bool configDebugPrint;
diff --git a/src/pc/djui/djui_panel_camera.c b/src/pc/djui/djui_panel_camera.c
index a13de3df9..e5d8d045d 100644
--- a/src/pc/djui/djui_panel_camera.c
+++ b/src/pc/djui/djui_panel_camera.c
@@ -46,6 +46,10 @@ void djui_panel_romhack_camera_create(struct DjuiBase* caller) {
djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_L_CENTERING), &configRomhackCameraHasCentering, djui_panel_romhack_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_USE_DPAD), &configRomhackCameraDpadBehavior, djui_panel_romhack_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_SLOW_FALL), &configRomhackCameraSlowFall, djui_panel_romhack_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_IN_DIST), &configRomhackCameraZoomedInDist, 700, 1600, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_OUT_DIST), &configRomhackCameraZoomedOutDist, 400, 1000, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_IN_HEIGHT), &configRomhackCameraZoomedInHeight, 200, 600, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT), &configRomhackCameraZoomedOutHeight, 200, 600, djui_panel_free_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, CAMERA_TOXIC_GAS), &configCameraToxicGas, djui_panel_romhack_camera_value_changed);
djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back);
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index 8a054b5f3..edb431514 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -27993,6 +27993,134 @@ int smlua_func_camera_romhack_get_collisions(UNUSED lua_State* L) {
return 1;
}
+int smlua_func_camera_romhack_get_zoomed_in_dist(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", "camera_romhack_get_zoomed_in_dist", 0, top);
+ return 0;
+ }
+
+
+ lua_pushinteger(L, camera_romhack_get_zoomed_in_dist());
+
+ return 1;
+}
+
+int smlua_func_camera_romhack_get_zoomed_in_height(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", "camera_romhack_get_zoomed_in_height", 0, top);
+ return 0;
+ }
+
+
+ lua_pushinteger(L, camera_romhack_get_zoomed_in_height());
+
+ return 1;
+}
+
+int smlua_func_camera_romhack_get_zoomed_out_dist(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", "camera_romhack_get_zoomed_out_dist", 0, top);
+ return 0;
+ }
+
+
+ lua_pushinteger(L, camera_romhack_get_zoomed_out_dist());
+
+ return 1;
+}
+
+int smlua_func_camera_romhack_get_zoomed_out_height(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", "camera_romhack_get_zoomed_out_height", 0, top);
+ return 0;
+ }
+
+
+ lua_pushinteger(L, camera_romhack_get_zoomed_out_height());
+
+ return 1;
+}
+
+int smlua_func_camera_romhack_set_zoomed_in_dist(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", "camera_romhack_set_zoomed_in_dist", 1, top);
+ return 0;
+ }
+
+ u32 val = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "camera_romhack_set_zoomed_in_dist"); return 0; }
+
+ camera_romhack_set_zoomed_in_dist(val);
+
+ return 1;
+}
+
+int smlua_func_camera_romhack_set_zoomed_in_height(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", "camera_romhack_set_zoomed_in_height", 1, top);
+ return 0;
+ }
+
+ u32 val = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "camera_romhack_set_zoomed_in_height"); return 0; }
+
+ camera_romhack_set_zoomed_in_height(val);
+
+ return 1;
+}
+
+int smlua_func_camera_romhack_set_zoomed_out_dist(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", "camera_romhack_set_zoomed_out_dist", 1, top);
+ return 0;
+ }
+
+ u32 val = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "camera_romhack_set_zoomed_out_dist"); return 0; }
+
+ camera_romhack_set_zoomed_out_dist(val);
+
+ return 1;
+}
+
+int smlua_func_camera_romhack_set_zoomed_out_height(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", "camera_romhack_set_zoomed_out_height", 1, top);
+ return 0;
+ }
+
+ u32 val = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "camera_romhack_set_zoomed_out_height"); return 0; }
+
+ camera_romhack_set_zoomed_out_height(val);
+
+ return 1;
+}
+
int smlua_func_camera_set_checking_surfaces(lua_State* L) {
if (L == NULL) { return 0; }
@@ -33745,6 +33873,14 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "camera_romhack_get_allow_centering", smlua_func_camera_romhack_get_allow_centering);
smlua_bind_function(L, "camera_romhack_get_allow_dpad_usage", smlua_func_camera_romhack_get_allow_dpad_usage);
smlua_bind_function(L, "camera_romhack_get_collisions", smlua_func_camera_romhack_get_collisions);
+ smlua_bind_function(L, "camera_romhack_get_zoomed_in_dist", smlua_func_camera_romhack_get_zoomed_in_dist);
+ smlua_bind_function(L, "camera_romhack_get_zoomed_in_height", smlua_func_camera_romhack_get_zoomed_in_height);
+ smlua_bind_function(L, "camera_romhack_get_zoomed_out_dist", smlua_func_camera_romhack_get_zoomed_out_dist);
+ smlua_bind_function(L, "camera_romhack_get_zoomed_out_height", smlua_func_camera_romhack_get_zoomed_out_height);
+ smlua_bind_function(L, "camera_romhack_set_zoomed_in_dist", smlua_func_camera_romhack_set_zoomed_in_dist);
+ smlua_bind_function(L, "camera_romhack_set_zoomed_in_height", smlua_func_camera_romhack_set_zoomed_in_height);
+ smlua_bind_function(L, "camera_romhack_set_zoomed_out_dist", smlua_func_camera_romhack_set_zoomed_out_dist);
+ smlua_bind_function(L, "camera_romhack_set_zoomed_out_height", smlua_func_camera_romhack_set_zoomed_out_height);
smlua_bind_function(L, "camera_set_checking_surfaces", smlua_func_camera_set_checking_surfaces);
smlua_bind_function(L, "camera_set_romhack_override", smlua_func_camera_set_romhack_override);
smlua_bind_function(L, "camera_unfreeze", smlua_func_camera_unfreeze);
diff --git a/src/pc/lua/utils/smlua_camera_utils.c b/src/pc/lua/utils/smlua_camera_utils.c
index 4cdbb0aab..4d152b177 100644
--- a/src/pc/lua/utils/smlua_camera_utils.c
+++ b/src/pc/lua/utils/smlua_camera_utils.c
@@ -14,6 +14,10 @@ static struct CameraOverride sOverrideCameraAnalog = { 0 };
static struct CameraOverride sOverrideCameraMouse = { 0 };
static struct CameraOverride sOverrideCameraFreecamDpad = { 0 };
static struct CameraOverride sOverrideCameraFreecamCollision = { 0 };
+static struct CameraOverride sOverrideCameraRomhackZoomedInDist = { 0 };
+static struct CameraOverride sOverrideCameraRomhackZoomedOutDist = { 0 };
+static struct CameraOverride sOverrideCameraRomhackZoomedInHeight = { 0 };
+static struct CameraOverride sOverrideCameraRomhackZoomedOutHeight = { 0 };
void camera_reset_overrides(void) {
sOverrideCameraXSens.override = false;
@@ -28,6 +32,10 @@ void camera_reset_overrides(void) {
sOverrideCameraMouse.override = false;
sOverrideCameraFreecamDpad.override = false;
sOverrideCameraFreecamCollision.override = false;
+ sOverrideCameraRomhackZoomedInDist.override = false;
+ sOverrideCameraRomhackZoomedOutDist.override = false;
+ sOverrideCameraRomhackZoomedInHeight.override = false;
+ sOverrideCameraRomhackZoomedOutHeight.override = false;
}
void camera_freeze(void) {
@@ -62,6 +70,50 @@ void rom_hack_cam_set_collisions(u8 enable) {
gRomHackCamSetCollisions = enable;
}
+void camera_romhack_set_zoomed_in_dist(u32 val) {
+ if (val < 700) { val = 700; }
+ else if (val > 1600) { val = 1600; }
+ sOverrideCameraRomhackZoomedInDist.value = val;
+ sOverrideCameraRomhackZoomedInDist.override = true;
+}
+
+void camera_romhack_set_zoomed_out_dist(u32 val) {
+ if (val < 400) { val = 400; }
+ else if (val > 1000) { val = 1000; }
+ sOverrideCameraRomhackZoomedOutDist.value = val;
+ sOverrideCameraRomhackZoomedOutDist.override = true;
+}
+
+void camera_romhack_set_zoomed_in_height(u32 val) {
+ if (val < 200) { val = 200; }
+ else if (val > 600) { val = 600; }
+ sOverrideCameraRomhackZoomedInHeight.value = val;
+ sOverrideCameraRomhackZoomedInHeight.override = true;
+}
+
+void camera_romhack_set_zoomed_out_height(u32 val) {
+ if (val < 200) { val = 200; }
+ else if (val > 600) { val = 600; }
+ sOverrideCameraRomhackZoomedOutHeight.value = val;
+ sOverrideCameraRomhackZoomedOutHeight.override = true;
+}
+
+u32 camera_romhack_get_zoomed_in_dist(void) {
+ return sOverrideCameraRomhackZoomedInDist.override ? sOverrideCameraRomhackZoomedInDist.value : configRomhackCameraZoomedInDist;
+}
+
+u32 camera_romhack_get_zoomed_out_dist(void) {
+ return sOverrideCameraRomhackZoomedOutDist.override ? sOverrideCameraRomhackZoomedOutDist.value : configRomhackCameraZoomedOutDist;
+}
+
+u32 camera_romhack_get_zoomed_in_height(void) {
+ return sOverrideCameraRomhackZoomedInHeight.override ? sOverrideCameraRomhackZoomedInHeight.value : configRomhackCameraZoomedInHeight;
+}
+
+u32 camera_romhack_get_zoomed_out_height(void) {
+ return sOverrideCameraRomhackZoomedOutHeight.override ? sOverrideCameraRomhackZoomedOutHeight.value : configRomhackCameraZoomedOutHeight;
+}
+
enum RomhackCameraOverride camera_get_romhack_override(void) {
return gOverrideRomhackCamera;
}
diff --git a/src/pc/lua/utils/smlua_camera_utils.h b/src/pc/lua/utils/smlua_camera_utils.h
index 410abef89..c557499a5 100644
--- a/src/pc/lua/utils/smlua_camera_utils.h
+++ b/src/pc/lua/utils/smlua_camera_utils.h
@@ -32,6 +32,24 @@ This enables or disables specific collision behaviors in modded levels
|descriptionEnd| */
void rom_hack_cam_set_collisions(u8 enable);
+/* |description|Sets the romhack camera's zoomed in distance, between 600 and 1600|descriptionEnd| */
+void camera_romhack_set_zoomed_in_dist(u32 val);
+/* |description|Sets the romhack camera's zoomed out additional distance, between 400 and 1000|descriptionEnd| */
+void camera_romhack_set_zoomed_out_dist(u32 val);
+/* |description|Sets the romhack camera's zoomed in height, between 200 and 600|descriptionEnd| */
+void camera_romhack_set_zoomed_in_height(u32 val);
+/* |description|Sets the romhack camera's zoomed out additional height, between 200 and 600|descriptionEnd| */
+void camera_romhack_set_zoomed_out_height(u32 val);
+
+/* |description|Gets the romhack camera's zoomed in distance|descriptionEnd| */
+u32 camera_romhack_get_zoomed_in_dist(void);
+/* |description|Gets the romhack camera's additional zoomed out distance|descriptionEnd| */
+u32 camera_romhack_get_zoomed_out_dist(void);
+/* |description|Gets the romhack camera's zoomed in height|descriptionEnd| */
+u32 camera_romhack_get_zoomed_in_height(void);
+/* |description|Gets the romhack camera's additional zoomed out height|descriptionEnd| */
+u32 camera_romhack_get_zoomed_out_height(void);
+
/* |description|Gets the current romhack camera override status|descriptionEnd| */
enum RomhackCameraOverride camera_get_romhack_override(void);
/* |description|Gets if the romhack camera should allow centering|descriptionEnd| */
From 08ad9f282cb53d68359a7bcf78f4fead5a3731cb Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Wed, 8 Jan 2025 03:09:21 -0500
Subject: [PATCH 09/13] Fix camera not looking down slopes
Suggestion by Fearl
This most likely affects more than I could think
---
src/game/camera.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/game/camera.c b/src/game/camera.c
index 7685d4077..6008dd22f 100644
--- a/src/game/camera.c
+++ b/src/game/camera.c
@@ -12431,6 +12431,8 @@ void mode_rom_hack_camera(struct Camera *c) {
// update area yaw
sAreaYaw = sRomHackYaw;
sAreaYawChange = sAreaYaw - oldAreaYaw;
+
+ set_camera_height(c, c->pos[1]);
}
s32 update_rom_hack_camera(struct Camera *c, Vec3f focus, Vec3f pos) {
@@ -12457,9 +12459,6 @@ s32 update_rom_hack_camera(struct Camera *c, Vec3f focus, Vec3f pos) {
calc_y_to_curr_floor(&posY, 1.f, 200.f, &focusY, 0.9f, 200.f);
focus_on_mario(focus, pos, posY + yOff, focusY + yOff, sLakituDist + baseDist, pitch, sAreaYaw);
pan_ahead_of_player(c);
- if (gCameraUseCourseSpecificSettings && c->mode != CAMERA_MODE_ROM_HACK && gCurrLevelArea == AREA_DDD_SUB) {
- camYaw = clamp_positions_and_find_yaw(pos, focus, 6839.f, 995.f, 5994.f, -3945.f);
- }
// adjust focus when under water
struct MarioState* m = &gMarioStates[0];
From c925781350d210a007d714f59cbaa5191b4d30fd Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Wed, 8 Jan 2025 03:38:39 -0500
Subject: [PATCH 10/13] Adjust slider ranges
---
autogen/lua_definitions/functions.lua | 8 ++++----
docs/lua/functions-5.md | 8 ++++----
src/pc/djui/djui_panel_camera.c | 8 ++++----
src/pc/lua/utils/smlua_camera_utils.c | 16 ++++------------
src/pc/lua/utils/smlua_camera_utils.h | 8 ++++----
5 files changed, 20 insertions(+), 28 deletions(-)
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index ecbe40404..44b95ae8b 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -9110,25 +9110,25 @@ function camera_romhack_get_zoomed_out_height()
end
--- @param val integer
---- Sets the romhack camera's zoomed in distance, between 600 and 1600
+--- Sets the romhack camera's zoomed in distance, between 700 and 1200 units
function camera_romhack_set_zoomed_in_dist(val)
-- ...
end
--- @param val integer
---- Sets the romhack camera's zoomed in height, between 200 and 600
+--- Sets the romhack camera's zoomed in height, between 150 and 500 units
function camera_romhack_set_zoomed_in_height(val)
-- ...
end
--- @param val integer
---- Sets the romhack camera's zoomed out additional distance, between 400 and 1000
+--- Sets the romhack camera's zoomed out additional distance, between 100 and 600 units
function camera_romhack_set_zoomed_out_dist(val)
-- ...
end
--- @param val integer
---- Sets the romhack camera's zoomed out additional height, between 200 and 600
+--- Sets the romhack camera's zoomed out additional height, between 100 and 500 units
function camera_romhack_set_zoomed_out_height(val)
-- ...
end
diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md
index 9665fd64e..b33f9a691 100644
--- a/docs/lua/functions-5.md
+++ b/docs/lua/functions-5.md
@@ -7672,7 +7672,7 @@ Gets the romhack camera's additional zoomed out height
## [camera_romhack_set_zoomed_in_dist](#camera_romhack_set_zoomed_in_dist)
### Description
-Sets the romhack camera's zoomed in distance, between 600 and 1600
+Sets the romhack camera's zoomed in distance, between 700 and 1200 units
### Lua Example
`camera_romhack_set_zoomed_in_dist(val)`
@@ -7695,7 +7695,7 @@ Sets the romhack camera's zoomed in distance, between 600 and 1600
## [camera_romhack_set_zoomed_in_height](#camera_romhack_set_zoomed_in_height)
### Description
-Sets the romhack camera's zoomed in height, between 200 and 600
+Sets the romhack camera's zoomed in height, between 150 and 500 units
### Lua Example
`camera_romhack_set_zoomed_in_height(val)`
@@ -7718,7 +7718,7 @@ Sets the romhack camera's zoomed in height, between 200 and 600
## [camera_romhack_set_zoomed_out_dist](#camera_romhack_set_zoomed_out_dist)
### Description
-Sets the romhack camera's zoomed out additional distance, between 400 and 1000
+Sets the romhack camera's zoomed out additional distance, between 100 and 600 units
### Lua Example
`camera_romhack_set_zoomed_out_dist(val)`
@@ -7741,7 +7741,7 @@ Sets the romhack camera's zoomed out additional distance, between 400 and 1000
## [camera_romhack_set_zoomed_out_height](#camera_romhack_set_zoomed_out_height)
### Description
-Sets the romhack camera's zoomed out additional height, between 200 and 600
+Sets the romhack camera's zoomed out additional height, between 100 and 500 units
### Lua Example
`camera_romhack_set_zoomed_out_height(val)`
diff --git a/src/pc/djui/djui_panel_camera.c b/src/pc/djui/djui_panel_camera.c
index e5d8d045d..0da06e763 100644
--- a/src/pc/djui/djui_panel_camera.c
+++ b/src/pc/djui/djui_panel_camera.c
@@ -46,10 +46,10 @@ void djui_panel_romhack_camera_create(struct DjuiBase* caller) {
djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_L_CENTERING), &configRomhackCameraHasCentering, djui_panel_romhack_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_USE_DPAD), &configRomhackCameraDpadBehavior, djui_panel_romhack_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_SLOW_FALL), &configRomhackCameraSlowFall, djui_panel_romhack_camera_value_changed);
- djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_IN_DIST), &configRomhackCameraZoomedInDist, 700, 1600, djui_panel_free_camera_value_changed);
- djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_OUT_DIST), &configRomhackCameraZoomedOutDist, 400, 1000, djui_panel_free_camera_value_changed);
- djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_IN_HEIGHT), &configRomhackCameraZoomedInHeight, 200, 600, djui_panel_free_camera_value_changed);
- djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT), &configRomhackCameraZoomedOutHeight, 200, 600, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_IN_DIST), &configRomhackCameraZoomedInDist, 700, 1200, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_OUT_DIST), &configRomhackCameraZoomedOutDist, 100, 600, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_IN_HEIGHT), &configRomhackCameraZoomedInHeight, 150, 500, djui_panel_free_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT), &configRomhackCameraZoomedOutHeight, 100, 500, djui_panel_free_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, CAMERA_TOXIC_GAS), &configCameraToxicGas, djui_panel_romhack_camera_value_changed);
djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back);
diff --git a/src/pc/lua/utils/smlua_camera_utils.c b/src/pc/lua/utils/smlua_camera_utils.c
index 4d152b177..81f208405 100644
--- a/src/pc/lua/utils/smlua_camera_utils.c
+++ b/src/pc/lua/utils/smlua_camera_utils.c
@@ -71,30 +71,22 @@ void rom_hack_cam_set_collisions(u8 enable) {
}
void camera_romhack_set_zoomed_in_dist(u32 val) {
- if (val < 700) { val = 700; }
- else if (val > 1600) { val = 1600; }
- sOverrideCameraRomhackZoomedInDist.value = val;
+ sOverrideCameraRomhackZoomedInDist.value = MIN(MAX(val, 700), 1200);
sOverrideCameraRomhackZoomedInDist.override = true;
}
void camera_romhack_set_zoomed_out_dist(u32 val) {
- if (val < 400) { val = 400; }
- else if (val > 1000) { val = 1000; }
- sOverrideCameraRomhackZoomedOutDist.value = val;
+ sOverrideCameraRomhackZoomedOutDist.value = MIN(MAX(val, 100), 600);
sOverrideCameraRomhackZoomedOutDist.override = true;
}
void camera_romhack_set_zoomed_in_height(u32 val) {
- if (val < 200) { val = 200; }
- else if (val > 600) { val = 600; }
- sOverrideCameraRomhackZoomedInHeight.value = val;
+ sOverrideCameraRomhackZoomedInHeight.value = MIN(MAX(val, 150), 500);
sOverrideCameraRomhackZoomedInHeight.override = true;
}
void camera_romhack_set_zoomed_out_height(u32 val) {
- if (val < 200) { val = 200; }
- else if (val > 600) { val = 600; }
- sOverrideCameraRomhackZoomedOutHeight.value = val;
+ sOverrideCameraRomhackZoomedOutHeight.value = MIN(MAX(val, 100), 500);
sOverrideCameraRomhackZoomedOutHeight.override = true;
}
diff --git a/src/pc/lua/utils/smlua_camera_utils.h b/src/pc/lua/utils/smlua_camera_utils.h
index c557499a5..2e0baead5 100644
--- a/src/pc/lua/utils/smlua_camera_utils.h
+++ b/src/pc/lua/utils/smlua_camera_utils.h
@@ -32,13 +32,13 @@ This enables or disables specific collision behaviors in modded levels
|descriptionEnd| */
void rom_hack_cam_set_collisions(u8 enable);
-/* |description|Sets the romhack camera's zoomed in distance, between 600 and 1600|descriptionEnd| */
+/* |description|Sets the romhack camera's zoomed in distance, between 700 and 1200 units|descriptionEnd| */
void camera_romhack_set_zoomed_in_dist(u32 val);
-/* |description|Sets the romhack camera's zoomed out additional distance, between 400 and 1000|descriptionEnd| */
+/* |description|Sets the romhack camera's zoomed out additional distance, between 100 and 600 units|descriptionEnd| */
void camera_romhack_set_zoomed_out_dist(u32 val);
-/* |description|Sets the romhack camera's zoomed in height, between 200 and 600|descriptionEnd| */
+/* |description|Sets the romhack camera's zoomed in height, between 150 and 500 units|descriptionEnd| */
void camera_romhack_set_zoomed_in_height(u32 val);
-/* |description|Sets the romhack camera's zoomed out additional height, between 200 and 600|descriptionEnd| */
+/* |description|Sets the romhack camera's zoomed out additional height, between 100 and 500 units|descriptionEnd| */
void camera_romhack_set_zoomed_out_height(u32 val);
/* |description|Gets the romhack camera's zoomed in distance|descriptionEnd| */
From 4079859f86c6729a26d3476fa8f454f1c07729ea Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Thu, 9 Jan 2025 00:30:31 -0500
Subject: [PATCH 11/13] Fix titles
Thanks Sherbie
---
lang/English.ini | 2 ++
src/pc/djui/djui_panel_camera.c | 4 ++--
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/lang/English.ini b/lang/English.ini
index f0ba50f74..33514e7d8 100644
--- a/lang/English.ini
+++ b/lang/English.ini
@@ -67,10 +67,12 @@ YES = "Yes"
[CAMERA]
CAMERA = "CAMERA"
+FREE_CAMERA_TITLE = "FREE CAMERA"
FREE_CAMERA = "Free Camera"
ANALOG_CAMERA = "Analog Camera"
FREE_CAMERA_USE_DPAD = "DPad Behavior"
FREE_CAMERA_COLLISION = "Camera Collisions"
+ROMHACK_CAMERA_TITLE = "ROMHACK\nCAMERA"
ROMHACK_CAMERA = "Romhack Camera"
ROMHACK_CAMERA_IN_BOWSER = "Use in Bowser fights"
ROMHACK_CAMERA_COLLISION = "Camera Collisions"
diff --git a/src/pc/djui/djui_panel_camera.c b/src/pc/djui/djui_panel_camera.c
index 0da06e763..b279c3db0 100644
--- a/src/pc/djui/djui_panel_camera.c
+++ b/src/pc/djui/djui_panel_camera.c
@@ -16,7 +16,7 @@ static void djui_panel_romhack_camera_value_changed(UNUSED struct DjuiBase* call
}
void djui_panel_free_camera_create(struct DjuiBase* caller) {
- struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(CAMERA, FREE_CAMERA), false);
+ struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(CAMERA, FREE_CAMERA_TITLE), false);
struct DjuiBase* body = djui_three_panel_get_body(panel);
{
djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA), &configEnableFreeCamera, djui_panel_free_camera_value_changed);
@@ -37,7 +37,7 @@ void djui_panel_free_camera_create(struct DjuiBase* caller) {
}
void djui_panel_romhack_camera_create(struct DjuiBase* caller) {
- struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(CAMERA, ROMHACK_CAMERA), false);
+ struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(CAMERA, ROMHACK_CAMERA_TITLE), false);
struct DjuiBase* body = djui_three_panel_get_body(panel);
{
djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA), &configEnableRomhackCamera, djui_panel_romhack_camera_value_changed);
From 53205e1187c1070320a348be855ad947457b0f0a Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Thu, 9 Jan 2025 00:47:57 -0500
Subject: [PATCH 12/13] Option to toggle free camera centering
Suggestion by Sherbie
---
autogen/lua_definitions/functions.lua | 12 ++++++++
docs/lua/functions-5.md | 44 +++++++++++++++++++++++++++
docs/lua/functions.md | 2 ++
lang/English.ini | 1 +
src/game/bettercamera.inc.h | 5 ++-
src/pc/configfile.c | 7 +++--
src/pc/configfile.h | 6 ++--
src/pc/djui/djui_panel_camera.c | 1 +
src/pc/lua/smlua_functions_autogen.c | 34 +++++++++++++++++++++
src/pc/lua/utils/smlua_camera_utils.c | 12 ++++++++
src/pc/lua/utils/smlua_camera_utils.h | 4 +++
11 files changed, 123 insertions(+), 5 deletions(-)
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index 44b95ae8b..2a65ef7f8 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -8894,6 +8894,12 @@ function camera_config_enable_camera_collisions(enable)
-- ...
end
+--- @param enable boolean
+--- Overrides if the L button will center the camera
+function camera_config_enable_centering(enable)
+ -- ...
+end
+
--- @param enable boolean
--- Overrides if Free Camera is enabled
function camera_config_enable_free_cam(enable)
@@ -8917,6 +8923,12 @@ function camera_config_get_aggression()
-- ...
end
+--- @return boolean
+--- Gets if the L button will center the camera
+function camera_config_get_centering()
+ -- ...
+end
+
--- @return integer
function camera_config_get_deceleration()
-- ...
diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md
index b33f9a691..9b5563092 100644
--- a/docs/lua/functions-5.md
+++ b/docs/lua/functions-5.md
@@ -6883,6 +6883,29 @@ Overrides if Camera Collision is enabled
+## [camera_config_enable_centering](#camera_config_enable_centering)
+
+### Description
+Overrides if the L button will center the camera
+
+### Lua Example
+`camera_config_enable_centering(enable)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| enable | `boolean` |
+
+### Returns
+- None
+
+### C Prototype
+`void camera_config_enable_centering(bool enable);`
+
+[:arrow_up_small:](#)
+
+
+
## [camera_config_enable_free_cam](#camera_config_enable_free_cam)
### Description
@@ -6970,6 +6993,27 @@ Overrides if camera mouse look is enabled
+## [camera_config_get_centering](#camera_config_get_centering)
+
+### Description
+Gets if the L button will center the camera
+
+### Lua Example
+`local booleanValue = camera_config_get_centering()`
+
+### Parameters
+- None
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool camera_config_get_centering(void);`
+
+[:arrow_up_small:](#)
+
+
+
## [camera_config_get_deceleration](#camera_config_get_deceleration)
### Lua Example
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index 03c44e407..36179fb1b 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -1649,10 +1649,12 @@
- [camera_allow_toxic_gas_camera](functions-5.md#camera_allow_toxic_gas_camera)
- [camera_config_enable_analog_cam](functions-5.md#camera_config_enable_analog_cam)
- [camera_config_enable_camera_collisions](functions-5.md#camera_config_enable_camera_collisions)
+ - [camera_config_enable_centering](functions-5.md#camera_config_enable_centering)
- [camera_config_enable_free_cam](functions-5.md#camera_config_enable_free_cam)
- [camera_config_enable_freecam_dpad](functions-5.md#camera_config_enable_freecam_dpad)
- [camera_config_enable_mouse_look](functions-5.md#camera_config_enable_mouse_look)
- [camera_config_get_aggression](functions-5.md#camera_config_get_aggression)
+ - [camera_config_get_centering](functions-5.md#camera_config_get_centering)
- [camera_config_get_deceleration](functions-5.md#camera_config_get_deceleration)
- [camera_config_get_pan_level](functions-5.md#camera_config_get_pan_level)
- [camera_config_get_x_sensitivity](functions-5.md#camera_config_get_x_sensitivity)
diff --git a/lang/English.ini b/lang/English.ini
index 33514e7d8..ce44367bf 100644
--- a/lang/English.ini
+++ b/lang/English.ini
@@ -70,6 +70,7 @@ CAMERA = "CAMERA"
FREE_CAMERA_TITLE = "FREE CAMERA"
FREE_CAMERA = "Free Camera"
ANALOG_CAMERA = "Analog Camera"
+FREE_CAMERA_L_CENTERING = "L Centering"
FREE_CAMERA_USE_DPAD = "DPad Behavior"
FREE_CAMERA_COLLISION = "Camera Collisions"
ROMHACK_CAMERA_TITLE = "ROMHACK\nCAMERA"
diff --git a/src/game/bettercamera.inc.h b/src/game/bettercamera.inc.h
index 37d9ddff1..563ac0be6 100644
--- a/src/game/bettercamera.inc.h
+++ b/src/game/bettercamera.inc.h
@@ -122,6 +122,7 @@ s16 newcam_saved_defmode = -1;
u8 gFreeCameraUseDpad = FALSE;
u8 gFreeCameraHasCollision = TRUE;
u8 sFreeCameraDirectionLocked = FALSE;
+u8 sFreeCameraLCentering = TRUE;
extern bool gDjuiInMainMenu;
@@ -201,6 +202,7 @@ void newcam_init_settings(void) {
newcam_degrade = (f32)camera_config_get_deceleration();
gFreeCameraUseDpad = (u8)camera_config_is_freecam_dpad_enabled();
gFreeCameraHasCollision = (u8)camera_config_is_free_camera_collision_enabled();
+ sFreeCameraLCentering = (u8)camera_config_get_centering();
// setup main menu camera
if (gDjuiInMainMenu) { newcam_tilt = 5; }
@@ -220,6 +222,7 @@ void newcam_init_settings_override(bool override) {
newcam_degrade = (f32)camera_config_get_deceleration();
gFreeCameraUseDpad = (u8)camera_config_is_freecam_dpad_enabled();
gFreeCameraHasCollision = (u8)camera_config_is_free_camera_collision_enabled();
+ sFreeCameraLCentering = configFreeCameraLCentering;
// setup main menu camera
if (gDjuiInMainMenu) { newcam_tilt = 5; }
@@ -456,7 +459,7 @@ static void newcam_zoom_button(void) {
newcam_distance = newcam_distance_target;
}
- if ((gPlayer1Controller->buttonDown & L_TRIG) && (newcam_modeflags & NC_FLAG_ZOOM)) {
+ if (sFreeCameraLCentering && (gPlayer1Controller->buttonDown & L_TRIG) && (newcam_modeflags & NC_FLAG_ZOOM)) {
//When you press L, set the flag for centering the camera. Afterwards, start setting the yaw to the Player's yaw at the time.
newcam_yaw_target = -gMarioStates[0].faceAngle[1]-0x4000;
newcam_centering = 1;
diff --git a/src/pc/configfile.c b/src/pc/configfile.c
index 8f864cccb..365dfb536 100644
--- a/src/pc/configfile.c
+++ b/src/pc/configfile.c
@@ -127,11 +127,10 @@ bool configUseStandardKeyBindingsChat = false;
// free camera settings
bool configEnableFreeCamera = false;
bool configFreeCameraAnalog = false;
+bool configFreeCameraLCentering = false;
bool configFreeCameraDpadBehavior = false;
bool configFreeCameraHasCollision = true;
bool configCameraMouse = false;
-bool configCameraInvertX = false;
-bool configCameraInvertY = true;
unsigned int configCameraXSens = 50;
unsigned int configCameraYSens = 50;
unsigned int configCameraAggr = 0;
@@ -149,6 +148,9 @@ unsigned int configRomhackCameraZoomedInDist = 900;
unsigned int configRomhackCameraZoomedOutDist = 1400;
unsigned int configRomhackCameraZoomedInHeight = 300;
unsigned int configRomhackCameraZoomedOutHeight = 450;
+// common camera settings
+bool configCameraInvertX = false;
+bool configCameraInvertY = true;
// debug
bool configLuaProfiler = false;
bool configDebugPrint = false;
@@ -267,6 +269,7 @@ static const struct ConfigOption options[] = {
// free camera settings
{.name = "bettercam_enable", .type = CONFIG_TYPE_BOOL, .boolValue = &configEnableFreeCamera},
{.name = "bettercam_analog", .type = CONFIG_TYPE_BOOL, .boolValue = &configFreeCameraAnalog},
+ {.name = "bettercam_centering", .type = CONFIG_TYPE_BOOL, .boolValue = &configFreeCameraLCentering},
{.name = "bettercam_dpad", .type = CONFIG_TYPE_BOOL, .boolValue = &configFreeCameraDpadBehavior},
{.name = "bettercam_collision", .type = CONFIG_TYPE_BOOL, .boolValue = &configFreeCameraHasCollision},
{.name = "bettercam_mouse_look", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraMouse},
diff --git a/src/pc/configfile.h b/src/pc/configfile.h
index b4bdfe9e0..22cf0c404 100644
--- a/src/pc/configfile.h
+++ b/src/pc/configfile.h
@@ -80,11 +80,10 @@ extern bool configUseStandardKeyBindingsChat;
// free camera settings
extern bool configEnableFreeCamera;
extern bool configFreeCameraAnalog;
+extern bool configFreeCameraLCentering;
extern bool configFreeCameraDpadBehavior;
extern bool configFreeCameraHasCollision;
extern bool configCameraMouse;
-extern bool configCameraInvertX;
-extern bool configCameraInvertY;
extern unsigned int configCameraXSens;
extern unsigned int configCameraYSens;
extern unsigned int configCameraAggr;
@@ -102,6 +101,9 @@ extern unsigned int configRomhackCameraZoomedInDist;
extern unsigned int configRomhackCameraZoomedOutDist;
extern unsigned int configRomhackCameraZoomedInHeight;
extern unsigned int configRomhackCameraZoomedOutHeight;
+// common camera settings
+extern bool configCameraInvertX;
+extern bool configCameraInvertY;
// debug
extern bool configLuaProfiler;
extern bool configDebugPrint;
diff --git a/src/pc/djui/djui_panel_camera.c b/src/pc/djui/djui_panel_camera.c
index b279c3db0..3dfe96c5d 100644
--- a/src/pc/djui/djui_panel_camera.c
+++ b/src/pc/djui/djui_panel_camera.c
@@ -21,6 +21,7 @@ void djui_panel_free_camera_create(struct DjuiBase* caller) {
{
djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA), &configEnableFreeCamera, djui_panel_free_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, ANALOG_CAMERA), &configFreeCameraAnalog, djui_panel_free_camera_value_changed);
+ djui_checkbox_create(body, DLANG(CAMERA, ROMHACK_CAMERA_L_CENTERING), &configFreeCameraLCentering, djui_panel_free_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA_USE_DPAD), &configFreeCameraDpadBehavior, djui_panel_free_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, FREE_CAMERA_COLLISION), &configFreeCameraHasCollision, djui_panel_free_camera_value_changed);
djui_checkbox_create(body, DLANG(CAMERA, MOUSE_LOOK), &configCameraMouse, djui_panel_free_camera_value_changed);
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index edb431514..38763d726 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -27474,6 +27474,23 @@ int smlua_func_camera_config_enable_camera_collisions(lua_State* L) {
return 1;
}
+int smlua_func_camera_config_enable_centering(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", "camera_config_enable_centering", 1, top);
+ return 0;
+ }
+
+ bool enable = smlua_to_boolean(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "camera_config_enable_centering"); return 0; }
+
+ camera_config_enable_centering(enable);
+
+ return 1;
+}
+
int smlua_func_camera_config_enable_free_cam(lua_State* L) {
if (L == NULL) { return 0; }
@@ -27540,6 +27557,21 @@ int smlua_func_camera_config_get_aggression(UNUSED lua_State* L) {
return 1;
}
+int smlua_func_camera_config_get_centering(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", "camera_config_get_centering", 0, top);
+ return 0;
+ }
+
+
+ lua_pushboolean(L, camera_config_get_centering());
+
+ return 1;
+}
+
int smlua_func_camera_config_get_deceleration(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
@@ -33840,10 +33872,12 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "camera_allow_toxic_gas_camera", smlua_func_camera_allow_toxic_gas_camera);
smlua_bind_function(L, "camera_config_enable_analog_cam", smlua_func_camera_config_enable_analog_cam);
smlua_bind_function(L, "camera_config_enable_camera_collisions", smlua_func_camera_config_enable_camera_collisions);
+ smlua_bind_function(L, "camera_config_enable_centering", smlua_func_camera_config_enable_centering);
smlua_bind_function(L, "camera_config_enable_free_cam", smlua_func_camera_config_enable_free_cam);
smlua_bind_function(L, "camera_config_enable_freecam_dpad", smlua_func_camera_config_enable_freecam_dpad);
smlua_bind_function(L, "camera_config_enable_mouse_look", smlua_func_camera_config_enable_mouse_look);
smlua_bind_function(L, "camera_config_get_aggression", smlua_func_camera_config_get_aggression);
+ smlua_bind_function(L, "camera_config_get_centering", smlua_func_camera_config_get_centering);
smlua_bind_function(L, "camera_config_get_deceleration", smlua_func_camera_config_get_deceleration);
smlua_bind_function(L, "camera_config_get_pan_level", smlua_func_camera_config_get_pan_level);
smlua_bind_function(L, "camera_config_get_x_sensitivity", smlua_func_camera_config_get_x_sensitivity);
diff --git a/src/pc/lua/utils/smlua_camera_utils.c b/src/pc/lua/utils/smlua_camera_utils.c
index 81f208405..0b05b510f 100644
--- a/src/pc/lua/utils/smlua_camera_utils.c
+++ b/src/pc/lua/utils/smlua_camera_utils.c
@@ -12,6 +12,7 @@ static struct CameraOverride sOverrideCameraInvertY = { 0 };
static struct CameraOverride sOverrideEnableCamera = { 0 };
static struct CameraOverride sOverrideCameraAnalog = { 0 };
static struct CameraOverride sOverrideCameraMouse = { 0 };
+static struct CameraOverride sOverrideCameraLCentering = { 0 };
static struct CameraOverride sOverrideCameraFreecamDpad = { 0 };
static struct CameraOverride sOverrideCameraFreecamCollision = { 0 };
static struct CameraOverride sOverrideCameraRomhackZoomedInDist = { 0 };
@@ -30,6 +31,7 @@ void camera_reset_overrides(void) {
sOverrideEnableCamera.override = false;
sOverrideCameraAnalog.override = false;
sOverrideCameraMouse.override = false;
+ sOverrideCameraLCentering.override = false;
sOverrideCameraFreecamDpad.override = false;
sOverrideCameraFreecamCollision.override = false;
sOverrideCameraRomhackZoomedInDist.override = false;
@@ -174,6 +176,10 @@ u32 camera_config_get_deceleration(void) {
return sOverrideCameraDegrade.override ? sOverrideCameraDegrade.value : configCameraDegrade;
}
+bool camera_config_get_centering(void) {
+ return sOverrideCameraLCentering.override ? sOverrideCameraLCentering.value : configCameraDegrade;
+}
+
void camera_config_enable_free_cam(bool enable) {
sOverrideEnableCamera.value = enable;
sOverrideEnableCamera.override = true;
@@ -186,6 +192,12 @@ void camera_config_enable_analog_cam(bool enable) {
newcam_init_settings();
}
+void camera_config_enable_centering(bool enable) {
+ sOverrideCameraLCentering.value = enable;
+ sOverrideCameraLCentering.override = true;
+ newcam_init_settings();
+}
+
void camera_config_enable_freecam_dpad(bool enable) {
sOverrideCameraFreecamDpad.value = enable;
sOverrideCameraFreecamDpad.override = true;
diff --git a/src/pc/lua/utils/smlua_camera_utils.h b/src/pc/lua/utils/smlua_camera_utils.h
index 2e0baead5..f6274a3f0 100644
--- a/src/pc/lua/utils/smlua_camera_utils.h
+++ b/src/pc/lua/utils/smlua_camera_utils.h
@@ -85,11 +85,15 @@ u32 camera_config_get_aggression(void);
u32 camera_config_get_pan_level(void);
/* |description|Gets camera deceleration|descriptionEnd| */
u32 camera_config_get_deceleration(void);
+/* |description|Gets if the L button will center the camera|descriptionEnd| */
+bool camera_config_get_centering(void);
/* |description|Overrides if Free Camera is enabled|descriptionEnd| */
void camera_config_enable_free_cam(bool enable);
/* |description|Overrides if Analog Camera is enabled|descriptionEnd| */
void camera_config_enable_analog_cam(bool enable);
+/* |description|Overrides if the L button will center the camera|descriptionEnd| */
+void camera_config_enable_centering(bool enable);
/* |description|Overrides if Freecam DPad Behavior is enabled|descriptionEnd| */
void camera_config_enable_freecam_dpad(bool enable);
/* |description|Overrides if Camera Collision is enabled|descriptionEnd| */
From f84aade46f204ba7d6ee9d60aad895df99f3741e Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Sat, 18 Jan 2025 14:45:46 -0500
Subject: [PATCH 13/13] Isaac's suggestions
---
autogen/lua_definitions/functions.lua | 8 ++++----
docs/lua/functions-5.md | 8 ++++----
mods/hide-and-seek.lua | 9 +++++++--
src/game/camera.c | 6 +++---
src/pc/lua/utils/smlua_camera_utils.h | 8 ++++----
5 files changed, 22 insertions(+), 17 deletions(-)
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index f3321230f..18884ed3b 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -9122,25 +9122,25 @@ function camera_romhack_get_zoomed_out_height()
end
--- @param val integer
---- Sets the romhack camera's zoomed in distance, between 700 and 1200 units
+--- Sets the romhack camera's zoomed in distance, between 700 and 1200 units (Default: 900)
function camera_romhack_set_zoomed_in_dist(val)
-- ...
end
--- @param val integer
---- Sets the romhack camera's zoomed in height, between 150 and 500 units
+--- Sets the romhack camera's zoomed in height, between 150 and 500 units (Default: 300)
function camera_romhack_set_zoomed_in_height(val)
-- ...
end
--- @param val integer
---- Sets the romhack camera's zoomed out additional distance, between 100 and 600 units
+--- Sets the romhack camera's zoomed out additional distance, between 100 and 600 units (Default: 500)
function camera_romhack_set_zoomed_out_dist(val)
-- ...
end
--- @param val integer
---- Sets the romhack camera's zoomed out additional height, between 100 and 500 units
+--- Sets the romhack camera's zoomed out additional height, between 100 and 500 units (Default: 150)
function camera_romhack_set_zoomed_out_height(val)
-- ...
end
diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md
index 9b5563092..102e0fd25 100644
--- a/docs/lua/functions-5.md
+++ b/docs/lua/functions-5.md
@@ -7716,7 +7716,7 @@ Gets the romhack camera's additional zoomed out height
## [camera_romhack_set_zoomed_in_dist](#camera_romhack_set_zoomed_in_dist)
### Description
-Sets the romhack camera's zoomed in distance, between 700 and 1200 units
+Sets the romhack camera's zoomed in distance, between 700 and 1200 units (Default: 900)
### Lua Example
`camera_romhack_set_zoomed_in_dist(val)`
@@ -7739,7 +7739,7 @@ Sets the romhack camera's zoomed in distance, between 700 and 1200 units
## [camera_romhack_set_zoomed_in_height](#camera_romhack_set_zoomed_in_height)
### Description
-Sets the romhack camera's zoomed in height, between 150 and 500 units
+Sets the romhack camera's zoomed in height, between 150 and 500 units (Default: 300)
### Lua Example
`camera_romhack_set_zoomed_in_height(val)`
@@ -7762,7 +7762,7 @@ Sets the romhack camera's zoomed in height, between 150 and 500 units
## [camera_romhack_set_zoomed_out_dist](#camera_romhack_set_zoomed_out_dist)
### Description
-Sets the romhack camera's zoomed out additional distance, between 100 and 600 units
+Sets the romhack camera's zoomed out additional distance, between 100 and 600 units (Default: 500)
### Lua Example
`camera_romhack_set_zoomed_out_dist(val)`
@@ -7785,7 +7785,7 @@ Sets the romhack camera's zoomed out additional distance, between 100 and 600 un
## [camera_romhack_set_zoomed_out_height](#camera_romhack_set_zoomed_out_height)
### Description
-Sets the romhack camera's zoomed out additional height, between 100 and 500 units
+Sets the romhack camera's zoomed out additional height, between 100 and 500 units (Default: 150)
### Lua Example
`camera_romhack_set_zoomed_out_height(val)`
diff --git a/mods/hide-and-seek.lua b/mods/hide-and-seek.lua
index 7d9bb8779..e5e3959c6 100644
--- a/mods/hide-and-seek.lua
+++ b/mods/hide-and-seek.lua
@@ -137,8 +137,13 @@ local function update()
server_update()
end
- -- Force free camera collisions
+ -- Force several camera configs
camera_config_enable_camera_collisions(true)
+ rom_hack_cam_set_collisions(1)
+ camera_romhack_set_zoomed_in_dist(900)
+ camera_romhack_set_zoomed_out_dist(1400)
+ camera_romhack_set_zoomed_in_height(300)
+ camera_romhack_set_zoomed_out_height(450)
end
local function screen_transition(trans)
@@ -229,7 +234,7 @@ local function mario_update(m)
end
-- pu prevention
- if m.playerIndex == 0 and (m.pos.x > 32767 or m.pos.x < -32768 or m.pos.z > 32767 or m.pos.z < -32768) then
+ if m.playerIndex == 0 and (m.pos.x > 0x7FFF or m.pos.x < -0x8000 or m.pos.z > 0x7FFF or m.pos.z < -0x8000) then
s.seeking = true
warp_restart_level()
end
diff --git a/src/game/camera.c b/src/game/camera.c
index 6008dd22f..37b5155e4 100644
--- a/src/game/camera.c
+++ b/src/game/camera.c
@@ -3118,11 +3118,11 @@ static void update_romhack_camera_override(struct Camera *c) {
}
if (gIsDemoActive) { return; }
- if ((!(gOverrideRomhackCamera == RCO_ALL_INCLUDING_VANILLA || gOverrideRomhackCamera == RCO_ALL_VANILLA_EXCEPT_BOWSER)) &&
- dynos_level_is_vanilla_level(gCurrLevelNum)) {
+ if ((gOverrideRomhackCamera != RCO_ALL_INCLUDING_VANILLA && gOverrideRomhackCamera != RCO_ALL_VANILLA_EXCEPT_BOWSER) &&
+ dynos_level_is_vanilla_level(gCurrLevelNum)) {
return;
} else if ((gOverrideRomhackCamera == RCO_ALL_EXCEPT_BOWSER || gOverrideRomhackCamera == RCO_ALL_VANILLA_EXCEPT_BOWSER) &&
- (gCurrLevelNum == LEVEL_BOWSER_1 || gCurrLevelNum == LEVEL_BOWSER_2 || gCurrLevelNum == LEVEL_BOWSER_3)) {
+ (gCurrLevelNum == LEVEL_BOWSER_1 || gCurrLevelNum == LEVEL_BOWSER_2 || gCurrLevelNum == LEVEL_BOWSER_3)) {
if (c->mode == CAMERA_MODE_ROM_HACK) {
c->mode = c->defMode;
set_camera_mode(c, c->defMode, 0);
diff --git a/src/pc/lua/utils/smlua_camera_utils.h b/src/pc/lua/utils/smlua_camera_utils.h
index f6274a3f0..88c28b604 100644
--- a/src/pc/lua/utils/smlua_camera_utils.h
+++ b/src/pc/lua/utils/smlua_camera_utils.h
@@ -32,13 +32,13 @@ This enables or disables specific collision behaviors in modded levels
|descriptionEnd| */
void rom_hack_cam_set_collisions(u8 enable);
-/* |description|Sets the romhack camera's zoomed in distance, between 700 and 1200 units|descriptionEnd| */
+/* |description|Sets the romhack camera's zoomed in distance, between 700 and 1200 units (Default: 900)|descriptionEnd| */
void camera_romhack_set_zoomed_in_dist(u32 val);
-/* |description|Sets the romhack camera's zoomed out additional distance, between 100 and 600 units|descriptionEnd| */
+/* |description|Sets the romhack camera's zoomed out additional distance, between 100 and 600 units (Default: 500)|descriptionEnd| */
void camera_romhack_set_zoomed_out_dist(u32 val);
-/* |description|Sets the romhack camera's zoomed in height, between 150 and 500 units|descriptionEnd| */
+/* |description|Sets the romhack camera's zoomed in height, between 150 and 500 units (Default: 300)|descriptionEnd| */
void camera_romhack_set_zoomed_in_height(u32 val);
-/* |description|Sets the romhack camera's zoomed out additional height, between 100 and 500 units|descriptionEnd| */
+/* |description|Sets the romhack camera's zoomed out additional height, between 100 and 500 units (Default: 150)|descriptionEnd| */
void camera_romhack_set_zoomed_out_height(u32 val);
/* |description|Gets the romhack camera's zoomed in distance|descriptionEnd| */