From edacdcc7e42cb9d015e002053268454add8b94c6 Mon Sep 17 00:00:00 2001
From: Sunk <69110309+Sunketchupm@users.noreply.github.com>
Date: Thu, 13 Mar 2025 23:01:51 -0400
Subject: [PATCH] More settings to the Camera settings menu (#555)
Sherbie's suggestions from #497 and #538, as well as suggestions from others on discord.
Add 2 new camera settings to free camera, being camera collision and dpad usage.
Add an entire new camera submenu for romhack camera, which are now no longer exclusive to romhacks.
---
autogen/convert_functions.py | 2 +-
autogen/lua_definitions/constants.lua | 9 +
autogen/lua_definitions/functions.lua | 141 ++++-
autogen/lua_definitions/structs.lua | 12 +
docs/lua/constants.md | 3 +
docs/lua/functions-3.md | 46 +-
docs/lua/functions-5.md | 751 ++++++++++++++++----------
docs/lua/functions-6.md | 290 ++++++++++
docs/lua/functions.md | 47 +-
docs/lua/structs.md | 20 +
lang/Czech.ini | 16 +
lang/Dutch.ini | 16 +
lang/English.ini | 16 +
lang/French.ini | 16 +
lang/German.ini | 16 +
lang/Italian.ini | 16 +
lang/Japanese.ini | 16 +
lang/Polish.ini | 16 +
lang/Portuguese.ini | 16 +
lang/Russian.ini | 16 +
lang/Spanish.ini | 16 +
mods/hide-and-seek.lua | 22 +-
src/game/bettercamera.h | 3 +
src/game/bettercamera.inc.h | 75 ++-
src/game/camera.c | 96 +++-
src/game/camera.h | 35 +-
src/pc/configfile.c | 43 +-
src/pc/configfile.h | 24 +-
src/pc/djui/djui_panel_camera.c | 68 ++-
src/pc/djui/djui_panel_camera.h | 3 +-
src/pc/lua/smlua_cobject_autogen.c | 15 +
src/pc/lua/smlua_cobject_autogen.h | 1 +
src/pc/lua/smlua_constants_autogen.c | 3 +
src/pc/lua/smlua_functions_autogen.c | 390 ++++++++++++-
src/pc/lua/utils/smlua_camera_utils.c | 126 ++++-
src/pc/lua/utils/smlua_camera_utils.h | 51 +-
src/pc/network/network.c | 5 +-
37 files changed, 1997 insertions(+), 460 deletions(-)
diff --git a/autogen/convert_functions.py b/autogen/convert_functions.py
index ef252cfb6..e545b8618 100644
--- a/autogen/convert_functions.py
+++ b/autogen/convert_functions.py
@@ -116,7 +116,7 @@ override_disallowed_functions = {
"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", "romhack_camera_reset_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 8fa368ae2..e7a840861 100644
--- a/autogen/lua_definitions/constants.lua
+++ b/autogen/lua_definitions/constants.lua
@@ -2530,6 +2530,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 63dd1f7e5..ed9a7f276 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
@@ -3614,6 +3608,13 @@ function skip_camera_interpolation()
-- ...
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, etc.)
+function snap_to_45_degrees(angle)
+ -- ...
+end
+
--- @param c Camera
--- Resets the camera's state while retaining some settings, such as position or mode. This is often used when soft-resetting gameplay without reinitialization
function soft_reset_camera(c)
@@ -8884,12 +8885,30 @@ 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 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)
-- ...
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)
@@ -8901,6 +8920,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()
-- ...
@@ -8945,6 +8970,18 @@ function camera_config_is_free_cam_enabled()
-- ...
end
+--- @return boolean
+--- Checks if Camera Collision is enabled
+function camera_config_is_free_camera_collision_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()
@@ -8998,12 +9035,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()
@@ -9016,7 +9065,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
@@ -9027,6 +9076,78 @@ function camera_romhack_allow_dpad_usage(allow)
-- ...
end
+--- @param allow integer
+--- Sets if only mods are allowed to modify the camera (Enabling prevents the player from modifying the camera through the settings)
+function camera_romhack_allow_only_mods(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
+
+--- @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 (Default: 900)
+function camera_romhack_set_zoomed_in_dist(val)
+ -- ...
+end
+
+--- @param val integer
+--- Sets the romhack camera's zoomed in height (Default: 300)
+function camera_romhack_set_zoomed_in_height(val)
+ -- ...
+end
+
+--- @param val integer
+--- Sets the romhack camera's zoomed out additional distance (Default: 500)
+function camera_romhack_set_zoomed_out_dist(val)
+ -- ...
+end
+
+--- @param val integer
+--- Sets the romhack camera's zoomed out additional height (Default: 150)
+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)
@@ -9044,6 +9165,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/autogen/lua_definitions/structs.lua b/autogen/lua_definitions/structs.lua
index d5c730bcb..d61b72bc7 100644
--- a/autogen/lua_definitions/structs.lua
+++ b/autogen/lua_definitions/structs.lua
@@ -2197,6 +2197,18 @@
--- @field public hitPos Vec3f
--- @field public surface Surface
+--- @class RomhackCameraSettings
+--- @field public centering integer
+--- @field public collisions integer
+--- @field public dpad integer
+--- @field public enable RomhackCameraOverride
+--- @field public modsOnly integer
+--- @field public slowFall integer
+--- @field public zoomedInDist integer
+--- @field public zoomedInHeight integer
+--- @field public zoomedOutDist integer
+--- @field public zoomedOutHeight integer
+
--- @class ServerSettings
--- @field public bouncyLevelBounds BouncyLevelBounds
--- @field public bubbleDeath integer
diff --git a/docs/lua/constants.md b/docs/lua/constants.md
index a31d1ca01..91480a8a1 100644
--- a/docs/lua/constants.md
+++ b/docs/lua/constants.md
@@ -843,6 +843,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 8f270e70e..260c58bbe 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
@@ -2240,6 +2217,29 @@ 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, etc.)
+
+### 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)
### Description
diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md
index 6d91f0674..579739aca 100644
--- a/docs/lua/functions-5.md
+++ b/docs/lua/functions-5.md
@@ -6838,6 +6838,52 @@ 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_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
@@ -6861,6 +6907,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
@@ -6902,6 +6971,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
@@ -7062,6 +7152,48 @@ Checks if Free Camera is enabled
+## [camera_config_is_free_camera_collision_enabled](#camera_config_is_free_camera_collision_enabled)
+
+### Description
+Checks if Camera Collision is enabled
+
+### Lua Example
+`local booleanValue = camera_config_is_free_camera_collision_enabled()`
+
+### Parameters
+- None
+
+### Returns
+- `boolean`
+
+### C Prototype
+`bool camera_config_is_free_camera_collision_enabled(void);`
+
+[:arrow_up_small:](#)
+
+
+
+## [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
@@ -7261,6 +7393,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
@@ -7282,6 +7435,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
@@ -7327,7 +7501,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)`
@@ -7370,6 +7544,268 @@ Sets if the romhack camera should allow D-Pad movement
+## [camera_romhack_allow_only_mods](#camera_romhack_allow_only_mods)
+
+### Description
+Sets if only mods are allowed to modify the camera (Enabling prevents the player from modifying the camera through the settings)
+
+### Lua Example
+`camera_romhack_allow_only_mods(allow)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| allow | `integer` |
+
+### Returns
+- None
+
+### C Prototype
+`void camera_romhack_allow_only_mods(u8 allow);`
+
+[:arrow_up_small:](#)
+
+
+
+## [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_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 (Default: 900)
+
+### 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 (Default: 300)
+
+### 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 (Default: 500)
+
+### 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 (Default: 150)
+
+### 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
@@ -7437,6 +7873,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
@@ -8210,296 +8669,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 bb3316d36..ce79dab48 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 b1c49c509..a0ecb56fc 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -685,7 +685,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)
@@ -714,6 +713,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)
@@ -1650,9 +1650,13 @@
- 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_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)
@@ -1661,6 +1665,8 @@
- [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_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)
- [camera_config_is_y_inverted](functions-5.md#camera_config_is_y_inverted)
@@ -1670,14 +1676,29 @@
- [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_allow_only_mods](functions-5.md#camera_romhack_allow_only_mods)
+ - [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)
+ - [rom_hack_cam_set_collisions](functions-5.md#rom_hack_cam_set_collisions)
@@ -1726,18 +1747,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/docs/lua/structs.md b/docs/lua/structs.md
index 40ede289e..a85b3feff 100644
--- a/docs/lua/structs.md
+++ b/docs/lua/structs.md
@@ -92,6 +92,7 @@
- [PlayerGeometry](#PlayerGeometry)
- [PlayerPalette](#PlayerPalette)
- [RayIntersectionInfo](#RayIntersectionInfo)
+- [RomhackCameraSettings](#RomhackCameraSettings)
- [SPTask](#SPTask)
- [ServerSettings](#ServerSettings)
- [SoundState](#SoundState)
@@ -2971,6 +2972,25 @@
+## [RomhackCameraSettings](#RomhackCameraSettings)
+
+| Field | Type | Access |
+| ----- | ---- | ------ |
+| centering | `integer` | |
+| collisions | `integer` | |
+| dpad | `integer` | |
+| enable | [enum RomhackCameraOverride](constants.md#enum-RomhackCameraOverride) | |
+| modsOnly | `integer` | |
+| slowFall | `integer` | |
+| zoomedInDist | `integer` | |
+| zoomedInHeight | `integer` | |
+| zoomedOutDist | `integer` | |
+| zoomedOutHeight | `integer` | |
+
+[:arrow_up_small:](#)
+
+
+
## [ServerSettings](#ServerSettings)
| Field | Type | Access |
diff --git a/lang/Czech.ini b/lang/Czech.ini
index 9ba4a2a65..ecb291b78 100644
--- a/lang/Czech.ini
+++ b/lang/Czech.ini
@@ -69,6 +69,22 @@ YES = "Ano"
CAMERA = "KAMERA"
FREE_CAMERA = "Volná kamera"
ANALOG_CAMERA = "Analogová kamera"
+FREE_CAMERA_TITLE = "KAMERA ZDARMA"
+FREE_CAMERA_L_CENTERING = "L Centrování"
+FREE_CAMERA_USE_DPAD = "Chování DPad"
+FREE_CAMERA_COLLISION = "Kolize kamery"
+ROMHACK_CAMERA_TITLE = "ROMHACK\KAMERA"
+ROMHACK_CAMERA = "Romhack kamera"
+ROMHACK_CAMERA_IN_BOWSER = "Použít v soubojích s Bowserem"
+ROMHACK_CAMERA_COLLISION = "Kolize kamery"
+ROMHACK_CAMERA_L_CENTERING = "L Centrování"
+ROMHACK_CAMERA_USE_DPAD = "Chování DPadu"
+ROMHACK_CAMERA_SLOW_FALL = "Pomalý pád"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "Přiblížená vzdálenost"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "Zvětšená vzdálenost“"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "Přiblížená výška"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "Zvětšená výška"
+CAMERA_TOXIC_GAS = "Nastavení pro toxický plyn"
MOUSE_LOOK = "Myš pro ovládání kamery"
INVERT_X = "Převrátit X"
INVERT_Y = "Převrátit Y"
diff --git a/lang/Dutch.ini b/lang/Dutch.ini
index 34e5388a9..7612dbaa6 100644
--- a/lang/Dutch.ini
+++ b/lang/Dutch.ini
@@ -69,6 +69,22 @@ YES = "Ja"
CAMERA = "CAMERA"
FREE_CAMERA = "Vrije Camera"
ANALOG_CAMERA = "Analoge Camera"
+FREE_CAMERA_TITLE = "GRATIS CAMERA"
+FREE_CAMERA_L_CENTERING = "L Centreren"
+FREE_CAMERA_USE_DPAD = "DPad-gedrag"
+FREE_CAMERA_COLLISION = "Camera-botsingen"
+ROMHACK_CAMERA_TITLE = "ROMHACK\nCAMERA"
+ROMHACK_CAMERA = "Romhack Camera"
+ROMHACK_CAMERA_IN_BOWSER = "Gebruik in Bowser-gevechten"
+ROMHACK_CAMERA_COLLISION = "Camera botsingen"
+ROMHACK_CAMERA_L_CENTERING = "L-centrering"
+ROMHACK_CAMERA_USE_DPAD = "DPad gedrag"
+ROMHACK_CAMERA_SLOW_FALL = "Langzame val"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "Ingezoomde afstand"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "Uitzoom afstand"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "Ingezoomde hoogte"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "Uitzoomhoogte"
+CAMERA_TOXIC_GAS = "Aanpassen voor giftig gas"
MOUSE_LOOK = "Muis Camera"
INVERT_X = "Keer X om"
INVERT_Y = "Keer Y om"
diff --git a/lang/English.ini b/lang/English.ini
index 596aba37c..fbe4e04e0 100644
--- a/lang/English.ini
+++ b/lang/English.ini
@@ -69,6 +69,22 @@ YES = "Yes"
CAMERA = "CAMERA"
FREE_CAMERA = "Free Camera"
ANALOG_CAMERA = "Analog Camera"
+FREE_CAMERA_TITLE = "FREE CAMERA"
+FREE_CAMERA_L_CENTERING = "L Centering"
+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"
+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"
INVERT_Y = "Invert Y"
diff --git a/lang/French.ini b/lang/French.ini
index e47bc1204..e6aa72c8d 100644
--- a/lang/French.ini
+++ b/lang/French.ini
@@ -69,6 +69,22 @@ YES = "Oui"
CAMERA = "CAMÉRA"
FREE_CAMERA = "Caméra Libre"
ANALOG_CAMERA = "Caméra Analogique"
+FREE_CAMERA_TITLE = "CAMÉRA LIBRE"
+FREE_CAMERA_L_CENTERING = "Centrage en L"
+FREE_CAMERA_USE_DPAD = "Comportement du DPAD"
+FREE_CAMERA_COLLISION = "Collisions de la caméra"
+ROMHACK_CAMERA_TITLE = "CAMÉRA\nROMHACK"
+ROMHACK_CAMERA = "Caméra Romhack"
+ROMHACK_CAMERA_IN_BOWSER = "Utiliser dans les combats contre Bowser"
+ROMHACK_CAMERA_COLLISION = "Collisions de caméra"
+ROMHACK_CAMERA_L_CENTERING = "Centrage en L"
+ROMHACK_CAMERA_USE_DPAD = "Comportement du DPAD"
+ROMHACK_CAMERA_SLOW_FALL = "Chute lente"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "Distance zoomée"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "Distance zoomée"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "Hauteur du zoom avant"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "Hauteur du zoom arrière"
+CAMERA_TOXIC_GAS = "Ajustement pour les gaz toxiques"
MOUSE_LOOK = "Souris comme Caméra"
INVERT_X = "Inverser l'axe X"
INVERT_Y = "Inverser l'axe Y"
diff --git a/lang/German.ini b/lang/German.ini
index 0323a78d2..ea612a579 100644
--- a/lang/German.ini
+++ b/lang/German.ini
@@ -69,6 +69,22 @@ YES = "Ja"
CAMERA = "KAMERA"
FREE_CAMERA = "Freie Kamera"
ANALOG_CAMERA = "Analoge Kamera"
+FREE_CAMERA_TITLE = "FREIE KAMERA"
+FREE_CAMERA_L_CENTERING = "L-Zentrierung"
+FREE_CAMERA_USE_DPAD = "DPad-Verhalten"
+FREE_CAMERA_COLLISION = "Kamerakollisionen"
+ROMHACK_CAMERA_TITLE = "ROMHACK\nKAMERA"
+ROMHACK_CAMERA = "Romhack-Kamera"
+ROMHACK_CAMERA_IN_BOWSER = "In Bowser-Kämpfen verwenden"
+ROMHACK_CAMERA_COLLISION = "Kamerakollisionen"
+ROMHACK_CAMERA_L_CENTERING = "L-Zentrierung"
+ROMHACK_CAMERA_USE_DPAD = "DPad-Verhalten"
+ROMHACK_CAMERA_SLOW_FALL = "Langsamer Fall"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "Vergrößerter Abstand"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "Herausgezoomte Entfernung"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "Vergrößerte Höhe"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "Herausgezoomte Höhe"
+CAMERA_TOXIC_GAS = "Einstellung für giftige Gase"
MOUSE_LOOK = "Mausansicht"
INVERT_X = "X invertieren"
INVERT_Y = "Y invertieren"
diff --git a/lang/Italian.ini b/lang/Italian.ini
index 4e774cf59..08f2551f0 100644
--- a/lang/Italian.ini
+++ b/lang/Italian.ini
@@ -69,6 +69,22 @@ YES = "Si"
CAMERA = "TELECAMERA"
FREE_CAMERA = "Telecamera libera"
ANALOG_CAMERA = "Telecamera analogica"
+FREE_CAMERA_TITLE = "FOTOCAMERA\nLIBERA"
+FREE_CAMERA_L_CENTERING = "Centratura a L"
+FREE_CAMERA_USE_DPAD = "Comportamento del DPad"
+FREE_CAMERA_COLLISION = "Collisioni della telecamera"
+ROMHACK_CAMERA_TITLE = "TELECAMERA\nROMHACK"
+ROMHACK_CAMERA = "Telecamera Romhack"
+ROMHACK_CAMERA_IN_BOWSER = "Da usare nei combattimenti con Bowser"
+ROMHACK_CAMERA_COLLISION = "Collisioni della telecamera"
+ROMHACK_CAMERA_L_CENTERING = "Centratura a L"
+ROMHACK_CAMERA_USE_DPAD = "Comportamento del DPad"
+ROMHACK_CAMERA_SLOW_FALL = "Caduta lenta"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "Distanza zoomata"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "Distanza ingrandita"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "Altezza ingrandita"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "Altezza ingrandimento"
+CAMERA_TOXIC_GAS = "Regola per i gas tossici"
MOUSE_LOOK = "Telecamera con mouse"
INVERT_X = "Inverti X"
INVERT_Y = "Inverti Y"
diff --git a/lang/Japanese.ini b/lang/Japanese.ini
index e02d567ee..3395bfd2e 100644
--- a/lang/Japanese.ini
+++ b/lang/Japanese.ini
@@ -69,6 +69,22 @@ YES = "はい"
CAMERA = "CAMERA"
FREE_CAMERA = "フリーカメラ"
ANALOG_CAMERA = "アナログカメラ"
+FREE_CAMERA_TITLE = "FREE CAMERA"
+FREE_CAMERA_L_CENTERING = "Lセンタリング"
+FREE_CAMERA_USE_DPAD = "DPad の動作"
+FREE_CAMERA_COLLISION = "カメラの衝突"
+ROMHACK_CAMERA_TITLE = "ROMHACK\nCAMERA"
+ROMHACK_CAMERA = "ロムハックカメラ"
+ROMHACK_CAMERA_IN_BOWSER = "クッパ戦で使用"
+ROMHACK_CAMERA_COLLISION = "カメラの衝突"
+ROMHACK_CAMERA_L_CENTERING = "Lセンタリング"
+ROMHACK_CAMERA_USE_DPAD = "DPad の動作"
+ROMHACK_CAMERA_SLOW_FALL = "スローフォール"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "ズームイン距離"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "ズームアウトした距離"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "ズームした高さ"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "ズームアウトした高さ"
+CAMERA_TOXIC_GAS = "有毒ガスの調整"
MOUSE_LOOK = "マウスでの操作"
INVERT_X = "X方向のカメラ反転"
INVERT_Y = "Y方向のカメラ反転"
diff --git a/lang/Polish.ini b/lang/Polish.ini
index 80478d812..26141e4a6 100644
--- a/lang/Polish.ini
+++ b/lang/Polish.ini
@@ -69,6 +69,22 @@ YES = "Tak"
CAMERA = "KAMERA"
FREE_CAMERA = "Wolna Kamera"
ANALOG_CAMERA = "Analogowa Kamera"
+FREE_CAMERA_TITLE = "DARMOWA\nKAMERA"
+FREE_CAMERA_L_CENTERING = "Wyśrodkowanie L"
+FREE_CAMERA_USE_DPAD = "Zachowanie DPada"
+FREE_CAMERA_COLLISION = "Kolizje kamery"
+ROMHACK_CAMERA_TITLE = "KAMERA\nROMHACK"
+ROMHACK_CAMERA = "Kamera Romhack"
+ROMHACK_CAMERA_IN_BOWSER = "Używaj w walkach z Bowserem"
+ROMHACK_CAMERA_COLLISION = "Kolizje kamery"
+ROMHACK_CAMERA_L_CENTERING = "Wyśrodkowanie L"
+ROMHACK_CAMERA_USE_DPAD = "Zachowanie DPada"
+ROMHACK_CAMERA_SLOW_FALL = "Powolne opadanie"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "Powiększona odległość"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "Powiększona odległość"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "Powiększona wysokość"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "Powiększona wysokość"
+CAMERA_TOXIC_GAS = "Dostosuj dla toksycznego gazu"
MOUSE_LOOK = "Patrzenie Myszą"
INVERT_X = "Odwróć Oś X"
INVERT_Y = "Odwróć Oś Y"
diff --git a/lang/Portuguese.ini b/lang/Portuguese.ini
index 1b2e16179..0b22b5e6d 100644
--- a/lang/Portuguese.ini
+++ b/lang/Portuguese.ini
@@ -69,6 +69,22 @@ YES = "Sim"
CAMERA = "CÂMERA"
FREE_CAMERA = "Câmera livre"
ANALOG_CAMERA = "Câmera analógica"
+FREE_CAMERA_TITLE = "CÂMARA LIVRE"
+FREE_CAMERA_L_CENTERING = "Centragem em L"
+FREE_CAMERA_USE_DPAD = "Comportamento do DPad"
+FREE_CAMERA_COLLISION = "Colisões de Câmara"
+ROMHACK_CAMERA_TITLE = "CÂMERA\nROMHACK"
+ROMHACK_CAMERA = "Câmera Romhack"
+ROMHACK_CAMERA_IN_BOWSER = "Usar em combates com o Bowser"
+ROMHACK_CAMERA_COLLISION = "Colisões de Câmara"
+ROMHACK_CAMERA_L_CENTERING = "Centragem em L"
+ROMHACK_CAMERA_USE_DPAD = "Comportamento do DPad"
+ROMHACK_CAMERA_SLOW_FALL = "Queda lenta"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "Distância de Ampliação"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "Distância de zoom reduzido"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "Altura da ampliação"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "Altura da ampliação"
+CAMERA_TOXIC_GAS = "Ajustar para gás tóxico"
MOUSE_LOOK = "Movimento com mouse"
INVERT_X = "Inverter eixo X"
INVERT_Y = "Inverter eixo Y"
diff --git a/lang/Russian.ini b/lang/Russian.ini
index 8aa608004..a1dd39eea 100644
--- a/lang/Russian.ini
+++ b/lang/Russian.ini
@@ -69,6 +69,22 @@ YES = "Да"
CAMERA = "CAMERA"
FREE_CAMERA = "Свободная камера"
ANALOG_CAMERA = "Аналоговая камера"
+FREE_CAMERA_TITLE = "FREE CAMERA"
+FREE_CAMERA_L_CENTERING = "Центрирование L"
+FREE_CAMERA_USE_DPAD = "Поведение DPad"
+FREE_CAMERA_COLLISION = "Коллизии камеры"
+ROMHACK_CAMERA_TITLE = "ROMHACK\nCAMERA"
+ROMHACK_CAMERA = "Камера Romhack"
+ROMHACK_CAMERA_IN_BOWSER = "Использовать в боях с Боузером"
+ROMHACK_CAMERA_COLLISION = "Коллизии камеры"
+ROMHACK_CAMERA_L_CENTERING = "Центрирование L"
+ROMHACK_CAMERA_USE_DPAD = "Поведение DPad"
+ROMHACK_CAMERA_SLOW_FALL = "Медленное падение"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "Расстояние приближения"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "Увеличенное расстояние"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "Увеличенная высота"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "Высота уменьшенного изображения"
+CAMERA_TOXIC_GAS = "Настроить на токсичный газ"
MOUSE_LOOK = "Использовать мышь"
INVERT_X = "Инвертировать X"
INVERT_Y = "Инвертировать Y"
diff --git a/lang/Spanish.ini b/lang/Spanish.ini
index 555eaad91..074c8bf44 100644
--- a/lang/Spanish.ini
+++ b/lang/Spanish.ini
@@ -69,6 +69,22 @@ YES = "Sí"
CAMERA = "CÁMARA"
FREE_CAMERA = "Cámara libre"
ANALOG_CAMERA = "Cámara analógica"
+FREE_CAMERA_TITLE = "CÁMARA LIBRE"
+FREE_CAMERA_L_CENTERING = "Centrado L"
+FREE_CAMERA_USE_DPAD = "Comportamiento del DPad"
+FREE_CAMERA_COLLISION = "Colisiones de la cámara"
+ROMHACK_CAMERA_TITLE = "CÁMARA\nROMHACK"
+ROMHACK_CAMERA = "Cámara Romhack"
+ROMHACK_CAMERA_IN_BOWSER = "Usar en peleas con Bowser"
+ROMHACK_CAMERA_COLLISION = "Colisiones de cámara"
+ROMHACK_CAMERA_L_CENTERING = "Centrado L"
+ROMHACK_CAMERA_USE_DPAD = "Comportamiento del DPad"
+ROMHACK_CAMERA_SLOW_FALL = "Caída lenta"
+ROMHACK_CAMERA_ZOOMED_IN_DIST = "Distancia ampliada"
+ROMHACK_CAMERA_ZOOMED_OUT_DIST = "Distancia de alejamiento"
+ROMHACK_CAMERA_ZOOMED_IN_HEIGHT = "Altura ampliada"
+ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT = "Altura de reducción"
+CAMERA_TOXIC_GAS = "Ajuste para gases tóxicos"
MOUSE_LOOK = "Movimiento con mouse"
INVERT_X = "Invertir eje X"
INVERT_Y = "Invertir eje Y"
diff --git a/mods/hide-and-seek.lua b/mods/hide-and-seek.lua
index 121a53f7c..e5e3959c6 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
@@ -138,6 +136,14 @@ local function update()
if network_is_server() then
server_update()
end
+
+ -- 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)
@@ -228,17 +234,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 > 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/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 673fc8de8..ddd672e63 100644
--- a/src/game/bettercamera.inc.h
+++ b/src/game/bettercamera.inc.h
@@ -119,6 +119,11 @@ u16 newcam_modeflags;
s16 newcam_saved_mode = -1;
s16 newcam_saved_defmode = -1;
+u8 gFreeCameraUseDpad = FALSE;
+u8 gFreeCameraHasCollision = TRUE;
+u8 sFreeCameraDirectionLocked = FALSE;
+u8 sFreeCameraLCentering = TRUE;
+
extern bool gDjuiInMainMenu;
///This is called at every level initialisation.
@@ -186,15 +191,18 @@ 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_free_camera_collision_enabled();
+ sFreeCameraLCentering = (u8)camera_config_get_centering();
// setup main menu camera
if (gDjuiInMainMenu) { newcam_tilt = 5; }
@@ -203,15 +211,18 @@ 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_free_camera_collision_enabled();
+ sFreeCameraLCentering = (u8)camera_config_get_centering();
// setup main menu camera
if (gDjuiInMainMenu) { newcam_tilt = 5; }
@@ -288,6 +299,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.
@@ -402,9 +414,30 @@ 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;
}
+
+ // 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) {
@@ -426,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;
@@ -692,7 +725,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.c b/src/game/camera.c
index 384014880..3a8046607 100644
--- a/src/game/camera.c
+++ b/src/game/camera.c
@@ -43,10 +43,33 @@
static u8 sSoftResettingCamera = FALSE;
u8 gCameraUseCourseSpecificSettings = TRUE;
u8 gOverrideFreezeCamera = FALSE;
-enum RomhackCameraOverride gOverrideRomhackCamera = RCO_ALL;
-u8 gRomhackCameraAllowCentering = TRUE;
u8 gOverrideAllowToxicGasCamera = FALSE;
-u8 gRomhackCameraAllowDpad = FALSE;
+
+struct RomhackCameraSettings gRomhackCameraSettings = {
+ .enable = RCO_ALL,
+ .centering = FALSE,
+ .collisions = FALSE,
+ .dpad = FALSE,
+ .slowFall = TRUE,
+ .zoomedInDist = 900,
+ .zoomedOutDist = 1400,
+ .zoomedInHeight = 300,
+ .zoomedOutHeight = 450,
+ .modsOnly = FALSE
+};
+
+void romhack_camera_reset_settings(void) {
+ gRomhackCameraSettings.enable = RCO_ALL;
+ gRomhackCameraSettings.centering = FALSE;
+ gRomhackCameraSettings.collisions = FALSE;
+ gRomhackCameraSettings.dpad = FALSE;
+ gRomhackCameraSettings.slowFall = TRUE;
+ gRomhackCameraSettings.zoomedInDist = 900;
+ gRomhackCameraSettings.zoomedOutDist = 1400;
+ gRomhackCameraSettings.zoomedInHeight = 300;
+ gRomhackCameraSettings.zoomedOutHeight = 450;
+ gRomhackCameraSettings.modsOnly = FALSE;
+}
/**
* @file camera.c
@@ -3108,18 +3131,33 @@ 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; }
+ if (gRomhackCameraSettings.enable == RCO_NONE) { return; }
+ else if (gRomhackCameraSettings.enable == RCO_DISABLE) {
+ c->mode = c->defMode;
+ set_camera_mode(c, c->defMode, 0);
+ gRomhackCameraSettings.enable = 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) {
+ if ((gRomhackCameraSettings.enable != RCO_ALL_INCLUDING_VANILLA && gRomhackCameraSettings.enable != RCO_ALL_VANILLA_EXCEPT_BOWSER) &&
+ dynos_level_is_vanilla_level(gCurrLevelNum)) {
+ return;
+ } else if ((gRomhackCameraSettings.enable == RCO_ALL_EXCEPT_BOWSER || gRomhackCameraSettings.enable == 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;
+ } else {
+ if (c->mode == CAMERA_MODE_BOSS_FIGHT) {
+ set_camera_mode(c, CAMERA_MODE_ROM_HACK, 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 +3670,7 @@ void init_camera(struct Camera *c) {
newcam_init(c, sSoftResettingCamera);
newcam_init_settings();
+ romhack_camera_init_settings();
sSoftResettingCamera = FALSE;
}
@@ -12142,7 +12181,6 @@ static u8 sRomHackZoom = 1;
static s8 sRomHackIsUpdate = 0;
static f32 sRomHackWaterFocus = 0;
static f32 sRomHackWaterPitchOffset = 0;
-u8 gRomHackCamSetCollisions = TRUE;
s32 snap_to_45_degrees(s16 angle) {
if (angle % DEGREES(45)) {
@@ -12159,14 +12197,27 @@ 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) {
+ if (gRomhackCameraSettings.modsOnly) { return; }
+ enum RomhackCameraOverride override = configEnableRomhackCamera ?
+ (configRomhackCameraBowserFights ? RCO_ALL_INCLUDING_VANILLA : RCO_ALL_VANILLA_EXCEPT_BOWSER) : RCO_DISABLE;
+ gRomhackCameraSettings.enable = override;
+ gCameraUseCourseSpecificSettings = (override == RCO_DISABLE && dynos_level_is_vanilla_level(gCurrLevelNum));
+ gRomhackCameraSettings.collisions = configRomhackCameraHasCollision;
+ gRomhackCameraSettings.centering = configRomhackCameraHasCentering;
+ gRomhackCameraSettings.dpad = configRomhackCameraDpadBehavior;
+ gOverrideAllowToxicGasCamera = configCameraToxicGas;
+ gRomhackCameraSettings.slowFall = configRomhackCameraSlowFall;
+ gRomhackCameraSettings.zoomedInDist = configRomhackCameraZoomedInDist;
+ gRomhackCameraSettings.zoomedOutDist = configRomhackCameraZoomedOutDist;
+ gRomhackCameraSettings.zoomedInHeight = configRomhackCameraZoomedInHeight;
+ gRomhackCameraSettings.zoomedOutHeight = configRomhackCameraZoomedOutHeight;
}
static u8 rom_hack_cam_can_see_mario(Vec3f desiredPos) {
// do collision checking
struct Surface *surf = NULL;
- if (!gRomHackCamSetCollisions) {
+ if (!gRomhackCameraSettings.collisions) {
return true;
}
@@ -12306,7 +12357,7 @@ void mode_rom_hack_camera(struct Camera *c) {
}
// Thank you hackersm64
- if (gRomhackCameraAllowDpad) {
+ if (gRomhackCameraSettings.dpad) {
if (gMarioStates[0].controller->buttonPressed & U_JPAD) {
sRomHackYaw = DEGREES(180 + 90) - gMarioStates[0].faceAngle[1];
} else if (gMarioStates[0].controller->buttonDown & L_JPAD) {
@@ -12319,12 +12370,12 @@ void mode_rom_hack_camera(struct Camera *c) {
}
// center
- if (gMarioStates[0].controller->buttonPressed & L_TRIG && gRomhackCameraAllowCentering) {
+ if (gMarioStates[0].controller->buttonPressed & L_TRIG && gRomhackCameraSettings.centering) {
center_rom_hack_camera();
}
// clamp yaw
- if (!gRomhackCameraAllowDpad) {
+ if (!gRomhackCameraSettings.dpad) {
sRomHackYaw = (sRomHackYaw / DEGREES(45)) * DEGREES(45);
}
@@ -12335,8 +12386,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 ? gRomhackCameraSettings.zoomedInDist : gRomhackCameraSettings.zoomedInDist + gRomhackCameraSettings.zoomedOutDist;
+ f32 desiredHeight = sRomHackZoom ? gRomhackCameraSettings.zoomedInHeight : gRomhackCameraSettings.zoomedInHeight + gRomhackCameraSettings.zoomedOutHeight;
f32* mPos = &gMarioStates[0].pos[0];
pos[0] = mPos[0] + coss(sRomHackYaw) * desiredDist;
pos[1] = mPos[1] + desiredHeight;
@@ -12381,12 +12432,14 @@ void mode_rom_hack_camera(struct Camera *c) {
// tween
c->pos[0] = c->pos[0] * 0.6 + oldPos[0] * 0.4;
- {
+ if (gRomhackCameraSettings.slowFall) {
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;
@@ -12404,6 +12457,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) {
@@ -12430,9 +12485,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];
diff --git a/src/game/camera.h b/src/game/camera.h
index 8918aa091..ffda0647a 100644
--- a/src/game/camera.h
+++ b/src/game/camera.h
@@ -14,13 +14,27 @@ enum RomhackCameraOverride {
RCO_ALL,
RCO_ALL_EXCEPT_BOWSER,
RCO_NONE,
+ RCO_ALL_INCLUDING_VANILLA,
+ RCO_ALL_VANILLA_EXCEPT_BOWSER,
+ RCO_DISABLE
};
+struct RomhackCameraSettings {
+ enum RomhackCameraOverride enable;
+ u8 centering;
+ u8 dpad;
+ u8 collisions;
+ u8 slowFall;
+ u32 zoomedInDist;
+ u32 zoomedOutDist;
+ u32 zoomedInHeight;
+ u32 zoomedOutHeight;
+ u8 modsOnly;
+};
+extern struct RomhackCameraSettings gRomhackCameraSettings;
+
extern u8 gOverrideFreezeCamera;
-extern enum RomhackCameraOverride gOverrideRomhackCamera;
-extern u8 gRomhackCameraAllowCentering;
extern u8 gOverrideAllowToxicGasCamera;
-extern u8 gRomhackCameraAllowDpad;
/**
* @file camera.h
@@ -1234,22 +1248,25 @@ This is useful for predefined static views in specific areas
|descriptionEnd| */
s32 set_camera_mode_fixed(struct Camera* c, s16 x, s16 y, s16 z);
+/* |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, etc.)
+|descriptionEnd| */
+s32 snap_to_45_degrees(s16 angle);
+
/* |description|
Toggles whether the camera uses course-specific settings.
This is useful for enabling or disabling custom behaviors in specific courses or areas
|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);
+void romhack_camera_reset_settings(void);
+
#endif // CAMERA_H
diff --git a/src/pc/configfile.c b/src/pc/configfile.c
index 3acd300f2..440b6160b 100644
--- a/src/pc/configfile.c
+++ b/src/pc/configfile.c
@@ -126,16 +126,32 @@ bool configBackgroundGamepad = true;
bool configDisableGamepads = false;
bool configUseStandardKeyBindingsChat = false;
// free camera settings
-bool configEnableCamera = false;
-bool configCameraAnalog = false;
+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;
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 configRomhackCameraSlowFall = true;
+bool configCameraToxicGas = true;
+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;
@@ -253,8 +269,11 @@ 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_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},
{.name = "bettercam_invertx", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraInvertX},
{.name = "bettercam_inverty", .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraInvertY},
@@ -263,6 +282,18 @@ 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_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 cbefa1f39..cf88e88b7 100644
--- a/src/pc/configfile.h
+++ b/src/pc/configfile.h
@@ -78,16 +78,32 @@ extern bool configBackgroundGamepad;
extern bool configDisableGamepads;
extern bool configUseStandardKeyBindingsChat;
// free camera settings
-extern bool configEnableCamera;
-extern bool configCameraAnalog;
+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;
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 configRomhackCameraSlowFall;
+extern bool configCameraToxicGas;
+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 9cc35aa95..b89906631 100644
--- a/src/pc/djui/djui_panel_camera.c
+++ b/src/pc/djui/djui_panel_camera.c
@@ -7,27 +7,69 @@
#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();
}
-void djui_panel_camera_create(struct DjuiBase* caller) {
- struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(CAMERA, CAMERA), false);
+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_TITLE), 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, 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_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);
+ 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_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);
+ 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, ROMHACK_CAMERA_SLOW_FALL), &configRomhackCameraSlowFall, djui_panel_romhack_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_IN_DIST), &configRomhackCameraZoomedInDist, 700, 1200, djui_panel_romhack_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_OUT_DIST), &configRomhackCameraZoomedOutDist, 100, 600, djui_panel_romhack_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_IN_HEIGHT), &configRomhackCameraZoomedInHeight, 150, 500, djui_panel_romhack_camera_value_changed);
+ djui_slider_create(body, DLANG(CAMERA, ROMHACK_CAMERA_ZOOMED_OUT_HEIGHT), &configRomhackCameraZoomedOutHeight, 100, 500, 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_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_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c
index b727936ab..0a0f09049 100644
--- a/src/pc/lua/smlua_cobject_autogen.c
+++ b/src/pc/lua/smlua_cobject_autogen.c
@@ -2545,6 +2545,20 @@ static struct LuaObjectField sRayIntersectionInfoFields[LUA_RAY_INTERSECTION_INF
{ "surface", LVT_COBJECT_P, offsetof(struct RayIntersectionInfo, surface), false, LOT_SURFACE, 1, sizeof(struct Surface*) },
};
+#define LUA_ROMHACK_CAMERA_SETTINGS_FIELD_COUNT 10
+static struct LuaObjectField sRomhackCameraSettingsFields[LUA_ROMHACK_CAMERA_SETTINGS_FIELD_COUNT] = {
+ { "centering", LVT_U8, offsetof(struct RomhackCameraSettings, centering), false, LOT_NONE, 1, sizeof(u8) },
+ { "collisions", LVT_U8, offsetof(struct RomhackCameraSettings, collisions), false, LOT_NONE, 1, sizeof(u8) },
+ { "dpad", LVT_U8, offsetof(struct RomhackCameraSettings, dpad), false, LOT_NONE, 1, sizeof(u8) },
+ { "enable", LVT_S32, offsetof(struct RomhackCameraSettings, enable), false, LOT_NONE, 1, sizeof(enum RomhackCameraOverride) },
+ { "modsOnly", LVT_U8, offsetof(struct RomhackCameraSettings, modsOnly), false, LOT_NONE, 1, sizeof(u8) },
+ { "slowFall", LVT_U8, offsetof(struct RomhackCameraSettings, slowFall), false, LOT_NONE, 1, sizeof(u8) },
+ { "zoomedInDist", LVT_U32, offsetof(struct RomhackCameraSettings, zoomedInDist), false, LOT_NONE, 1, sizeof(u32) },
+ { "zoomedInHeight", LVT_U32, offsetof(struct RomhackCameraSettings, zoomedInHeight), false, LOT_NONE, 1, sizeof(u32) },
+ { "zoomedOutDist", LVT_U32, offsetof(struct RomhackCameraSettings, zoomedOutDist), false, LOT_NONE, 1, sizeof(u32) },
+ { "zoomedOutHeight", LVT_U32, offsetof(struct RomhackCameraSettings, zoomedOutHeight), false, LOT_NONE, 1, sizeof(u32) },
+};
+
#define LUA_SERVER_SETTINGS_FIELD_COUNT 13
static struct LuaObjectField sServerSettingsFields[LUA_SERVER_SETTINGS_FIELD_COUNT] = {
{ "bouncyLevelBounds", LVT_S32, offsetof(struct ServerSettings, bouncyLevelBounds), false, LOT_NONE, 1, sizeof(enum BouncyLevelBounds) },
@@ -2867,6 +2881,7 @@ struct LuaObjectTable sLuaObjectAutogenTable[LOT_AUTOGEN_MAX - LOT_AUTOGEN_MIN]
{ LOT_PLAYERGEOMETRY, sPlayerGeometryFields, LUA_PLAYER_GEOMETRY_FIELD_COUNT },
{ LOT_PLAYERPALETTE, sPlayerPaletteFields, LUA_PLAYER_PALETTE_FIELD_COUNT },
{ LOT_RAYINTERSECTIONINFO, sRayIntersectionInfoFields, LUA_RAY_INTERSECTION_INFO_FIELD_COUNT },
+ { LOT_ROMHACKCAMERASETTINGS, sRomhackCameraSettingsFields, LUA_ROMHACK_CAMERA_SETTINGS_FIELD_COUNT },
{ LOT_SERVERSETTINGS, sServerSettingsFields, LUA_SERVER_SETTINGS_FIELD_COUNT },
{ LOT_SOUNDSTATE, sSoundStateFields, LUA_SOUND_STATE_FIELD_COUNT },
{ LOT_SPAWNINFO, sSpawnInfoFields, LUA_SPAWN_INFO_FIELD_COUNT },
diff --git a/src/pc/lua/smlua_cobject_autogen.h b/src/pc/lua/smlua_cobject_autogen.h
index 980ac0736..3a2cd4bd2 100644
--- a/src/pc/lua/smlua_cobject_autogen.h
+++ b/src/pc/lua/smlua_cobject_autogen.h
@@ -106,6 +106,7 @@ enum LuaObjectAutogenType {
LOT_PLAYERGEOMETRY,
LOT_PLAYERPALETTE,
LOT_RAYINTERSECTIONINFO,
+ LOT_ROMHACKCAMERASETTINGS,
LOT_SERVERSETTINGS,
LOT_SOUNDSTATE,
LOT_SPAWNINFO,
diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c
index 250bef1e8..ff8753821 100644
--- a/src/pc/lua/smlua_constants_autogen.c
+++ b/src/pc/lua/smlua_constants_autogen.c
@@ -837,6 +837,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 5a8a59b4d..9984421fc 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; }
@@ -11716,6 +11699,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; }
@@ -27476,6 +27476,40 @@ 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_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; }
@@ -27493,6 +27527,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; }
@@ -27525,6 +27576,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; }
@@ -27649,6 +27715,36 @@ int smlua_func_camera_config_is_free_cam_enabled(UNUSED lua_State* L) {
return 1;
}
+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_camera_collision_enabled", 0, top);
+ return 0;
+ }
+
+
+ lua_pushboolean(L, camera_config_is_free_camera_collision_enabled());
+
+ 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; }
@@ -27794,6 +27890,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; }
@@ -27809,6 +27920,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; }
@@ -27873,6 +27999,196 @@ int smlua_func_camera_romhack_allow_dpad_usage(lua_State* L) {
return 1;
}
+int smlua_func_camera_romhack_allow_only_mods(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_allow_only_mods", 1, top);
+ return 0;
+ }
+
+ u8 allow = smlua_to_integer(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "camera_romhack_allow_only_mods"); return 0; }
+
+ camera_romhack_allow_only_mods(allow);
+
+ 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_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; }
@@ -27922,6 +28238,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 //
/////////////////////////////
@@ -32805,7 +33138,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);
@@ -32834,6 +33166,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);
@@ -33710,9 +34043,13 @@ 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_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);
@@ -33721,6 +34058,8 @@ void smlua_bind_functions_autogen(void) {
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_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);
smlua_bind_function(L, "camera_config_is_y_inverted", smlua_func_camera_config_is_y_inverted);
@@ -33730,14 +34069,29 @@ 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_allow_only_mods", smlua_func_camera_romhack_allow_only_mods);
+ 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);
+ 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 68e715861..88cdb30c7 100644
--- a/src/pc/lua/utils/smlua_camera_utils.c
+++ b/src/pc/lua/utils/smlua_camera_utils.c
@@ -2,16 +2,19 @@
#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 sOverrideCameraLCentering = { 0 };
+static struct CameraOverride sOverrideCameraFreecamDpad = { 0 };
+static struct CameraOverride sOverrideCameraFreecamCollision = { 0 };
void camera_reset_overrides(void) {
sOverrideCameraXSens.override = false;
@@ -24,6 +27,9 @@ void camera_reset_overrides(void) {
sOverrideEnableCamera.override = false;
sOverrideCameraAnalog.override = false;
sOverrideCameraMouse.override = false;
+ sOverrideCameraLCentering.override = false;
+ sOverrideCameraFreecamDpad.override = false;
+ sOverrideCameraFreecamCollision.override = false;
}
void camera_freeze(void) {
@@ -38,12 +44,16 @@ bool camera_is_frozen(void) {
return gOverrideFreezeCamera;
}
+void camera_romhack_allow_only_mods(u8 allow) {
+ gRomhackCameraSettings.modsOnly = allow;
+}
+
void camera_set_romhack_override(enum RomhackCameraOverride rco) {
- gOverrideRomhackCamera = rco;
+ gRomhackCameraSettings.enable = rco;
}
void camera_romhack_allow_centering(u8 allow) {
- gRomhackCameraAllowCentering = allow;
+ gRomhackCameraSettings.centering = allow;
}
void camera_allow_toxic_gas_camera(u8 allow) {
@@ -51,15 +61,79 @@ void camera_allow_toxic_gas_camera(u8 allow) {
}
void camera_romhack_allow_dpad_usage(u8 allow) {
- gRomhackCameraAllowDpad = allow;
+ gRomhackCameraSettings.dpad = allow;
+}
+
+void rom_hack_cam_set_collisions(u8 enable) {
+ gRomhackCameraSettings.collisions = enable;
+}
+
+void camera_romhack_set_zoomed_in_dist(u32 val) {
+ gRomhackCameraSettings.zoomedInDist = val;
+}
+
+void camera_romhack_set_zoomed_out_dist(u32 val) {
+ gRomhackCameraSettings.zoomedOutDist = val;
+}
+
+void camera_romhack_set_zoomed_in_height(u32 val) {
+ gRomhackCameraSettings.zoomedInHeight = val;
+}
+
+void camera_romhack_set_zoomed_out_height(u32 val) {
+ gRomhackCameraSettings.zoomedOutHeight = val;
+}
+
+u32 camera_romhack_get_zoomed_in_dist(void) {
+ return gRomhackCameraSettings.zoomedInDist;
+}
+
+u32 camera_romhack_get_zoomed_out_dist(void) {
+ return gRomhackCameraSettings.zoomedOutDist;
+}
+
+u32 camera_romhack_get_zoomed_in_height(void) {
+ return gRomhackCameraSettings.zoomedInHeight;
+}
+
+u32 camera_romhack_get_zoomed_out_height(void) {
+ return gRomhackCameraSettings.zoomedOutHeight;
+}
+
+enum RomhackCameraOverride camera_get_romhack_override(void) {
+ return gRomhackCameraSettings.enable;
+}
+
+u8 camera_romhack_get_allow_centering(void) {
+ return gRomhackCameraSettings.centering;
+}
+
+u8 camera_get_allow_toxic_gas_camera(void) {
+ return gOverrideAllowToxicGasCamera;
+}
+
+u8 camera_romhack_get_allow_dpad_usage(void) {
+ return gRomhackCameraSettings.dpad;
+}
+
+u8 camera_romhack_get_collisions(void) {
+ return gRomhackCameraSettings.collisions;
}
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 : configFreeCameraDpadBehavior;
+}
+
+bool camera_config_is_free_camera_collision_enabled(void) {
+ return sOverrideCameraFreecamCollision.override ? sOverrideCameraFreecamCollision.value : configFreeCameraHasCollision;
}
bool camera_config_is_mouse_look_enabled(void) {
@@ -94,6 +168,10 @@ u32 camera_config_get_deceleration(void) {
return sOverrideCameraDegrade.override ? sOverrideCameraDegrade.value : configCameraDegrade;
}
+bool camera_config_get_centering(void) {
+ return sOverrideCameraLCentering.override ? sOverrideCameraLCentering.value : configFreeCameraLCentering;
+}
+
void camera_config_enable_free_cam(bool enable) {
sOverrideEnableCamera.value = enable;
sOverrideEnableCamera.override = true;
@@ -106,6 +184,24 @@ 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;
+ 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..eb0a3a3e8 100644
--- a/src/pc/lua/utils/smlua_camera_utils.h
+++ b/src/pc/lua/utils/smlua_camera_utils.h
@@ -17,19 +17,60 @@ void camera_freeze(void);
void camera_unfreeze(void);
/* |description|Checks if the camera is frozen|descriptionEnd| */
bool camera_is_frozen(void);
+
+/* |description|Sets if only mods are allowed to modify the camera (Enabling prevents the player from modifying the camera through the settings)|descriptionEnd| */
+void camera_romhack_allow_only_mods(u8 allow);
/* |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|Sets the romhack camera's zoomed in distance (Default: 900)|descriptionEnd| */
+void camera_romhack_set_zoomed_in_dist(u32 val);
+/* |description|Sets the romhack camera's zoomed out additional distance (Default: 500)|descriptionEnd| */
+void camera_romhack_set_zoomed_out_dist(u32 val);
+/* |description|Sets the romhack camera's zoomed in height (Default: 300)|descriptionEnd| */
+void camera_romhack_set_zoomed_in_height(u32 val);
+/* |description|Sets the romhack camera's zoomed out additional height (Default: 150)|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| */
+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);
/* |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_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| */
@@ -46,11 +87,19 @@ 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| */
+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| */
diff --git a/src/pc/network/network.c b/src/pc/network/network.c
index 70f571537..b27297c8e 100644
--- a/src/pc/network/network.c
+++ b/src/pc/network/network.c
@@ -689,10 +689,11 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup, bool reconnect
gFogIntensity = 1.0f;
gOverrideBackground = -1;
gOverrideEnvFx = ENVFX_MODE_NO_OVERRIDE;
- gRomhackCameraAllowCentering = TRUE;
+ gRomhackCameraSettings.centering = FALSE;
gOverrideAllowToxicGasCamera = FALSE;
- gRomhackCameraAllowDpad = FALSE;
+ gRomhackCameraSettings.dpad = FALSE;
camera_reset_overrides();
+ romhack_camera_reset_settings();
free_vtx_scroll_targets();
dynos_mod_shutdown();
mods_clear(&gActiveMods);