Fix palette editor cap on/off invulnerability

This commit is contained in:
PeachyPeachSM64 2025-08-13 21:01:39 +02:00
parent a38a7525b5
commit a2b4ac8f08
23 changed files with 237 additions and 172 deletions

View file

@ -91,6 +91,7 @@ override_field_mutable = {
override_field_invisible = {
"Mod": [ "files", "showedScriptWarning" ],
"Camera": [ "paletteEditorCapState" ],
"MarioState": [ "visibleToEnemies" ],
"NetworkPlayer": [ "gag", "moderator", "discordId" ],
"GraphNode": [ "_guard1", "_guard2", "padding" ],

View file

@ -7367,6 +7367,9 @@ ACT_COUGHING = 0x0C40020A
--- @type integer
ACT_SHIVERING = 0x0C40020B
--- @type integer
ACT_PALETTE_EDITOR_CAP = 0x0000020C
--- @type integer
ACT_IN_QUICKSAND = 0x0002020D
@ -7949,9 +7952,6 @@ ACT_FEET_STUCK_IN_GROUND = 0x0002033C
--- @type integer
ACT_PUTTING_ON_CAP = 0x0000133D
--- @type integer
ACT_TAKING_OFF_CAP = 0x0000133E
--- @type integer
ACT_HOLDING_POLE = 0x08100340

View file

@ -6247,6 +6247,13 @@ function check_common_landing_cancels(m, action)
-- ...
end
--- @param m MarioState
--- @param c Camera
--- @return integer
function mario_exit_palette_editor(m, c)
-- ...
end
--- @param m MarioState
--- @return integer
--- Checks for and handles common conditions that would cancel Mario's current stationary action.

View file

@ -225,7 +225,6 @@
--- @field public mode integer
--- @field public mtx Mat4
--- @field public nextYaw integer
--- @field public paletteEditorCap boolean
--- @field public pos Vec3f
--- @field public unusedVec1 Vec3f
--- @field public yaw integer

View file

@ -3221,6 +3221,7 @@
- ACT_STANDING_AGAINST_WALL
- ACT_COUGHING
- ACT_SHIVERING
- ACT_PALETTE_EDITOR_CAP
- ACT_IN_QUICKSAND
- ACT_UNKNOWN_0002020E
- ACT_CROUCHING
@ -3415,7 +3416,6 @@
- ACT_BUTT_STUCK_IN_GROUND
- ACT_FEET_STUCK_IN_GROUND
- ACT_PUTTING_ON_CAP
- ACT_TAKING_OFF_CAP
- ACT_HOLDING_POLE
- ACT_GRAB_POLE_SLOW
- ACT_GRAB_POLE_FAST

View file

@ -2,7 +2,7 @@
---
[< prev](functions.md) | [1](functions.md) | 2 | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [next >](functions-3.md)]
[< prev](functions.md) | [1](functions.md) | 2 | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [7](functions-7.md) | [next >](functions-3.md)]
---
@ -12081,5 +12081,5 @@ Spawns a Star that won't make Mario exit the level with an ID corresponding to t
<br />
---
[< prev](functions.md) | [1](functions.md) | 2 | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [next >](functions-3.md)]
[< prev](functions.md) | [1](functions.md) | 2 | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [7](functions-7.md) | [next >](functions-3.md)]

View file

@ -2,7 +2,7 @@
---
[< prev](functions-2.md) | [1](functions.md) | [2](functions-2.md) | 3 | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [next >](functions-4.md)]
[< prev](functions-2.md) | [1](functions.md) | [2](functions-2.md) | 3 | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [7](functions-7.md) | [next >](functions-4.md)]
---
@ -7183,5 +7183,5 @@ Sets whether a lighting engine point light will use a surface's normals to deter
<br />
---
[< prev](functions-2.md) | [1](functions.md) | [2](functions-2.md) | 3 | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [next >](functions-4.md)]
[< prev](functions-2.md) | [1](functions.md) | [2](functions-2.md) | 3 | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [7](functions-7.md) | [next >](functions-4.md)]

View file

@ -2,7 +2,7 @@
---
[< prev](functions-3.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | 4 | [5](functions-5.md) | [6](functions-6.md) | [next >](functions-5.md)]
[< prev](functions-3.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | 4 | [5](functions-5.md) | [6](functions-6.md) | [7](functions-7.md) | [next >](functions-5.md)]
---
@ -3526,6 +3526,27 @@ Checks for and handles common conditions that would cancel Mario's current landi
<br />
## [mario_exit_palette_editor](#mario_exit_palette_editor)
### Lua Example
`local integerValue = mario_exit_palette_editor(m, c)`
### Parameters
| Field | Type |
| ----- | ---- |
| m | [MarioState](structs.md#MarioState) |
| c | [Camera](structs.md#Camera) |
### Returns
- `integer`
### C Prototype
`s32 mario_exit_palette_editor(struct MarioState *m, struct Camera *c);`
[:arrow_up_small:](#)
<br />
## [check_common_stationary_cancels](#check_common_stationary_cancels)
### Description
@ -6738,5 +6759,5 @@ Converts a 3D short integer vector `a` into a 3D integer vector and stores the r
<br />
---
[< prev](functions-3.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | 4 | [5](functions-5.md) | [6](functions-6.md) | [next >](functions-5.md)]
[< prev](functions-3.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | 4 | [5](functions-5.md) | [6](functions-6.md) | [7](functions-7.md) | [next >](functions-5.md)]

View file

@ -2,7 +2,7 @@
---
[< prev](functions-4.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | 5 | [6](functions-6.md) | [next >](functions-6.md)]
[< prev](functions-4.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | 5 | [6](functions-6.md) | [7](functions-7.md) | [next >](functions-6.md)]
---
@ -8206,5 +8206,5 @@ Gets a trajectory's length
<br />
---
[< prev](functions-4.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | 5 | [6](functions-6.md) | [next >](functions-6.md)]
[< prev](functions-4.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | 5 | [6](functions-6.md) | [7](functions-7.md) | [next >](functions-6.md)]

View file

@ -2,7 +2,7 @@
---
[< prev](functions-5.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | 6]
[< prev](functions-5.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | 6 | [7](functions-7.md) | [next >](functions-7.md)]
---
@ -8517,83 +8517,7 @@ Checks if a surface has force
[:arrow_up_small:](#)
<br />
---
# functions from sync_object.h
<br />
## [sync_object_get_object](#sync_object_get_object)
### Description
Retrieves an object from a sync ID
### Lua Example
`local ObjectValue = sync_object_get_object(syncId)`
### Parameters
| Field | Type |
| ----- | ---- |
| syncId | `integer` |
### Returns
[Object](structs.md#Object)
### C Prototype
`struct Object* sync_object_get_object(u32 syncId);`
[:arrow_up_small:](#)
<br />
## [sync_object_is_initialized](#sync_object_is_initialized)
### Description
Checks if a sync object is initialized using a `syncId`
### Lua Example
`local booleanValue = sync_object_is_initialized(syncId)`
### Parameters
| Field | Type |
| ----- | ---- |
| syncId | `integer` |
### Returns
- `boolean`
### C Prototype
`bool sync_object_is_initialized(u32 syncId);`
[:arrow_up_small:](#)
<br />
## [sync_object_is_owned_locally](#sync_object_is_owned_locally)
### Description
Checks if a sync object is owned locally using a `syncId`
### Lua Example
`local booleanValue = sync_object_is_owned_locally(syncId)`
### Parameters
| Field | Type |
| ----- | ---- |
| syncId | `integer` |
### Returns
- `boolean`
### C Prototype
`bool sync_object_is_owned_locally(u32 syncId);`
[:arrow_up_small:](#)
<br />
---
[< prev](functions-5.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | 6]
[< prev](functions-5.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | 6 | [7](functions-7.md) | [next >](functions-7.md)]

86
docs/lua/functions-7.md Normal file
View file

@ -0,0 +1,86 @@
## [:rewind: Lua Functions](functions.md)
---
[< prev](functions-6.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | 7]
---
# functions from sync_object.h
<br />
## [sync_object_get_object](#sync_object_get_object)
### Description
Retrieves an object from a sync ID
### Lua Example
`local ObjectValue = sync_object_get_object(syncId)`
### Parameters
| Field | Type |
| ----- | ---- |
| syncId | `integer` |
### Returns
[Object](structs.md#Object)
### C Prototype
`struct Object* sync_object_get_object(u32 syncId);`
[:arrow_up_small:](#)
<br />
## [sync_object_is_initialized](#sync_object_is_initialized)
### Description
Checks if a sync object is initialized using a `syncId`
### Lua Example
`local booleanValue = sync_object_is_initialized(syncId)`
### Parameters
| Field | Type |
| ----- | ---- |
| syncId | `integer` |
### Returns
- `boolean`
### C Prototype
`bool sync_object_is_initialized(u32 syncId);`
[:arrow_up_small:](#)
<br />
## [sync_object_is_owned_locally](#sync_object_is_owned_locally)
### Description
Checks if a sync object is owned locally using a `syncId`
### Lua Example
`local booleanValue = sync_object_is_owned_locally(syncId)`
### Parameters
| Field | Type |
| ----- | ---- |
| syncId | `integer` |
### Returns
- `boolean`
### C Prototype
`bool sync_object_is_owned_locally(u32 syncId);`
[:arrow_up_small:](#)
<br />
---
[< prev](functions-6.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | 7]

View file

@ -2,7 +2,7 @@
---
1 | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [next >](functions-2.md)]
1 | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [7](functions-7.md) | [next >](functions-2.md)]
---
@ -1159,6 +1159,7 @@
- [stopping_step](functions-4.md#stopping_step)
- [landing_step](functions-4.md#landing_step)
- [check_common_landing_cancels](functions-4.md#check_common_landing_cancels)
- [mario_exit_palette_editor](functions-4.md#mario_exit_palette_editor)
- [check_common_stationary_cancels](functions-4.md#check_common_stationary_cancels)
- [mario_execute_stationary_action](functions-4.md#mario_execute_stationary_action)
@ -2186,9 +2187,9 @@
<br />
- sync_object.h
- [sync_object_get_object](functions-6.md#sync_object_get_object)
- [sync_object_is_initialized](functions-6.md#sync_object_is_initialized)
- [sync_object_is_owned_locally](functions-6.md#sync_object_is_owned_locally)
- [sync_object_get_object](functions-7.md#sync_object_get_object)
- [sync_object_is_initialized](functions-7.md#sync_object_is_initialized)
- [sync_object_is_owned_locally](functions-7.md#sync_object_is_owned_locally)
<br />
@ -2834,5 +2835,5 @@ Plays a screen transition after a `delay` in frames
<br />
---
1 | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [next >](functions-2.md)]
1 | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [5](functions-5.md) | [6](functions-6.md) | [7](functions-7.md) | [next >](functions-2.md)]

View file

@ -413,7 +413,6 @@
| mode | `integer` | |
| mtx | [Mat4](structs.md#Mat4) | read-only |
| nextYaw | `integer` | |
| paletteEditorCap | `boolean` | |
| pos | [Vec3f](structs.md#Vec3f) | read-only |
| unusedVec1 | [Vec3f](structs.md#Vec3f) | read-only |
| yaw | `integer` | |

View file

@ -194,6 +194,7 @@
#define ACT_STANDING_AGAINST_WALL 0x0C400209 // (0x009 | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
#define ACT_COUGHING 0x0C40020A // (0x00A | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
#define ACT_SHIVERING 0x0C40020B // (0x00B | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
#define ACT_PALETTE_EDITOR_CAP 0x0000020C // (0x00C | ACT_FLAG_STATIONARY) // ! COOP ACTION
#define ACT_IN_QUICKSAND 0x0002020D // (0x00D | ACT_FLAG_STATIONARY | ACT_FLAG_INVULNERABLE)
#define ACT_UNKNOWN_0002020E 0x0002020E // (0x00E | ACT_FLAG_STATIONARY | ACT_FLAG_INVULNERABLE)
#define ACT_CROUCHING 0x0C008220 // (0x020 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
@ -396,7 +397,6 @@
#define ACT_BUTT_STUCK_IN_GROUND 0x0002033B // (0x13B | ACT_FLAG_STATIONARY | ACT_FLAG_INVULNERABLE)
#define ACT_FEET_STUCK_IN_GROUND 0x0002033C // (0x13C | ACT_FLAG_STATIONARY | ACT_FLAG_INVULNERABLE)
#define ACT_PUTTING_ON_CAP 0x0000133D // (0x13D | ACT_FLAG_STATIONARY | ACT_FLAG_INTANGIBLE)
#define ACT_TAKING_OFF_CAP 0x0000133E // (0x13E | ACT_FLAG_STATIONARY | ACT_FLAG_INTANGIBLE) // ! COOP ACTION
// group 0x140: "automatic" actions
#define ACT_HOLDING_POLE 0x08100340 // (0x140 | ACT_FLAG_STATIONARY | ACT_FLAG_ON_POLE | ACT_FLAG_PAUSE_EXIT)

View file

@ -17,6 +17,7 @@
#include "engine/behavior_script.h"
#include "level_update.h"
#include "ingame_menu.h"
#include "mario_actions_stationary.h"
#include "mario_actions_cutscene.h"
#include "save_file.h"
#include "object_helpers.h"
@ -500,8 +501,6 @@ s32 update_slide_or_0f_camera(struct Camera *c, Vec3f, Vec3f);
s32 update_spiral_stairs_camera(struct Camera *c, Vec3f, Vec3f);
s32 update_rom_hack_camera(struct Camera *c, Vec3f, Vec3f);
void mode_rom_hack_camera(struct Camera *c);
void cutscene_take_cap_off(struct MarioState *m);
void cutscene_put_cap_on(struct MarioState *m);
typedef s32 (*CameraTransition)(struct Camera *c, Vec3f, Vec3f);
CameraTransition sModeTransitions[] = {
@ -3396,13 +3395,8 @@ void update_camera(struct Camera *c) {
// Make sure the palette editor cutscene is properly reset
struct MarioState *m = gMarioState;
if (c->paletteEditorCap) {
if (m->flags & MARIO_CAP_ON_HEAD) {
c->paletteEditorCap = false;
} else if (c->cutscene != CUTSCENE_PALETTE_EDITOR && m->action != ACT_PUTTING_ON_CAP) {
cutscene_put_cap_on(m);
c->paletteEditorCap = false;
}
if (c->cutscene != CUTSCENE_PALETTE_EDITOR && c->paletteEditorCapState) {
mario_exit_palette_editor(m, c);
}
}
@ -10930,19 +10924,14 @@ void cutscene_palette_editor(struct Camera *c) {
if (!c) { return; }
struct MarioState* m = gMarioState;
// Init cap state
// Ensures that Mario regains his correct cap state when exiting the palette editor
if (!c->paletteEditorCapState) {
c->paletteEditorCapState = (m->flags & MARIO_CAP_ON_HEAD) ? 1 : 2;
}
if (!gDjuiInPlayerMenu) {
if (c->paletteEditorCap) {
if (m->flags & MARIO_CAP_ON_HEAD) {
gCamera->paletteEditorCap = false;
} else {
if (m->action == ACT_IDLE) {
set_mario_action(m, ACT_PUTTING_ON_CAP, 0);
} else {
cutscene_put_cap_on(m);
gCamera->paletteEditorCap = false;
}
}
}
mario_exit_palette_editor(m, c);
gCutsceneTimer = CUTSCENE_STOP;
c->cutscene = 0;
skip_camera_interpolation();
@ -10953,11 +10942,7 @@ void cutscene_palette_editor(struct Camera *c) {
static bool pressed = false;
if (gInteractablePad.button & PAD_BUTTON_Z) {
if (!pressed && m->action == ACT_IDLE) {
if (m->flags & MARIO_CAP_ON_HEAD) {
set_mario_action(m, ACT_TAKING_OFF_CAP, 1); // Add palette editor action arg
} else {
set_mario_action(m, ACT_PUTTING_ON_CAP, 0);
}
set_mario_action(m, ACT_PALETTE_EDITOR_CAP, (m->flags & MARIO_CAP_ON_HEAD) != 0);
}
pressed = true;
} else {
@ -10969,8 +10954,7 @@ void cutscene_palette_editor(struct Camera *c) {
djui_base_set_visible(
&gDjuiPaletteToggle->base,
m->action == ACT_IDLE ||
m->action == ACT_TAKING_OFF_CAP ||
m->action == ACT_PUTTING_ON_CAP
m->action == ACT_PALETTE_EDITOR_CAP
);
}

View file

@ -596,7 +596,7 @@ struct Camera
/// when paused. See zoom_out_if_paused_and_outside
/*0x68*/ f32 areaCenY;
/*????*/ Mat4 mtx;
/*????*/ bool paletteEditorCap;
/*????*/ u8 paletteEditorCapState;
};
/**

View file

@ -1897,13 +1897,12 @@ s32 act_squished(struct MarioState *m) {
s32 act_putting_on_cap(struct MarioState *m) {
s32 animFrame = set_character_animation(m, CHAR_ANIM_PUT_CAP_ON);
if (animFrame == 0 && !gCamera->paletteEditorCap) {
if (animFrame == 0) {
enable_time_stop_if_alone();
}
if (animFrame == 28) {
cutscene_put_cap_on(m);
gCamera->paletteEditorCap = false;
}
if (is_anim_at_end(m)) {
@ -1915,30 +1914,6 @@ s32 act_putting_on_cap(struct MarioState *m) {
return FALSE;
}
// coop custom action
// actionArg == 1: the action was inited from CUTSCENE_PALETTE_EDITOR
s32 act_taking_off_cap(struct MarioState *m) {
s16 animFrame = set_character_animation(m, CHAR_ANIM_TAKE_CAP_OFF_THEN_ON);
switch (animFrame) {
case 0:
if (m->actionArg != 1) {
enable_time_stop_if_alone();
}
break;
case 12:
cutscene_take_cap_off(m);
if (m->actionArg == 1) { gCamera->paletteEditorCap = true; }
break;
}
if (animFrame >= 30 || gCamera->cutscene != CUTSCENE_PALETTE_EDITOR) {
set_mario_action(m, ACT_IDLE, 0);
disable_time_stop();
}
stationary_ground_step(m);
return FALSE;
}
/* |description|
Handles the cutscene and animation sequence for when Mario is stuck in the ground (head, butt, or feet). Plays a designated `animation`, checks specific frames (`unstuckFrame`, `target2`, `target3`) for sound effects or transitions, and frees Mario to the `endAction` once the animation completes
|descriptionEnd| */
@ -3215,7 +3190,6 @@ s32 mario_execute_cutscene_action(struct MarioState *m) {
case ACT_BUTT_STUCK_IN_GROUND: cancel = act_butt_stuck_in_ground(m); break;
case ACT_FEET_STUCK_IN_GROUND: cancel = act_feet_stuck_in_ground(m); break;
case ACT_PUTTING_ON_CAP: cancel = act_putting_on_cap(m); break;
case ACT_TAKING_OFF_CAP: cancel = act_taking_off_cap(m); break;
default:
LOG_ERROR("Attempted to execute unimplemented action '%04X'", m->action);
set_mario_action(m, ACT_IDLE, 0);

View file

@ -14,5 +14,7 @@ s32 mario_ready_to_speak(struct MarioState* m);
u8 should_start_or_continue_dialog(struct MarioState* m, struct Object* object);
s32 set_mario_npc_dialog(struct MarioState* m, s32 actionArg, u8(*inContinueDialogFunction)(void));
s32 mario_execute_cutscene_action(struct MarioState *m);
void cutscene_take_cap_off(struct MarioState *m);
void cutscene_put_cap_on(struct MarioState *m);
#endif // MARIO_ACTIONS_CUTSCENE_H

View file

@ -10,6 +10,7 @@
#include "level_update.h"
#include "mario.h"
#include "mario_actions_stationary.h"
#include "mario_actions_cutscene.h"
#include "mario_step.h"
#include "memory.h"
#include "save_file.h"
@ -1160,6 +1161,47 @@ s32 act_first_person(struct MarioState *m) {
return FALSE;
}
s32 mario_exit_palette_editor(struct MarioState *m, struct Camera *c) {
switch (c->paletteEditorCapState) {
case 0: return FALSE;
case 1: cutscene_put_cap_on(m); break;
case 2: cutscene_take_cap_off(m); break;
}
c->paletteEditorCapState = 0;
return set_mario_action(m, ACT_IDLE, 0);
}
s32 act_palette_editor_cap(struct MarioState *m) {
if (gCamera->cutscene != CUTSCENE_PALETTE_EDITOR) {
return mario_exit_palette_editor(m, gCamera);
}
// Put cap on
if (m->actionArg == 0) {
s16 animFrame = set_character_animation(m, CHAR_ANIM_PUT_CAP_ON);
if (animFrame == 28) {
cutscene_put_cap_on(m);
}
if (is_anim_at_end(m)) {
set_mario_action(m, ACT_IDLE, 0);
}
}
// Take cap off
else {
s16 animFrame = set_character_animation(m, CHAR_ANIM_TAKE_CAP_OFF_THEN_ON);
if (animFrame == 12) {
cutscene_take_cap_off(m);
}
if (animFrame >= 30) {
set_mario_action(m, ACT_IDLE, 0);
}
}
stationary_ground_step(m);
return FALSE;
}
/* |description|
Checks for and handles common conditions that would cancel Mario's current stationary action.
|descriptionEnd| */
@ -1249,6 +1291,7 @@ s32 mario_execute_stationary_action(struct MarioState *m) {
case ACT_BRAKING_STOP: cancel = act_braking_stop(m); break;
case ACT_BUTT_SLIDE_STOP: cancel = act_butt_slide_stop(m); break;
case ACT_HOLD_BUTT_SLIDE_STOP: cancel = act_hold_butt_slide_stop(m); break;
case ACT_PALETTE_EDITOR_CAP: cancel = act_palette_editor_cap(m); break;
default:
LOG_ERROR("Attempted to execute unimplemented action '%04X'", m->action);
set_mario_action(m, ACT_IDLE, 0);

View file

@ -5,6 +5,8 @@
#include "types.h"
struct Camera;
s32 check_common_idle_cancels(struct MarioState *m);
s32 check_common_hold_idle_cancels(struct MarioState *m);
s32 act_idle(struct MarioState *m);
@ -44,6 +46,8 @@ s32 act_air_throw_land(struct MarioState *m);
s32 act_twirl_land(struct MarioState *m);
s32 act_ground_pound_land(struct MarioState *m);
s32 act_first_person(struct MarioState *m);
s32 mario_exit_palette_editor(struct MarioState *m, struct Camera *c);
s32 act_palette_editor_cap(struct MarioState *m);
s32 check_common_stationary_cancels(struct MarioState *m);
s32 mario_execute_stationary_action(struct MarioState *m);

View file

@ -393,24 +393,23 @@ static struct LuaObjectField sBullyCollisionDataFields[LUA_BULLY_COLLISION_DATA_
{ "velZ", LVT_F32, offsetof(struct BullyCollisionData, velZ), false, LOT_NONE, 1, sizeof(f32) },
};
#define LUA_CAMERA_FIELD_COUNT 16
#define LUA_CAMERA_FIELD_COUNT 15
static struct LuaObjectField sCameraFields[LUA_CAMERA_FIELD_COUNT] = {
{ "areaCenX", LVT_F32, offsetof(struct Camera, areaCenX), false, LOT_NONE, 1, sizeof(f32) },
{ "areaCenY", LVT_F32, offsetof(struct Camera, areaCenY), false, LOT_NONE, 1, sizeof(f32) },
{ "areaCenZ", LVT_F32, offsetof(struct Camera, areaCenZ), false, LOT_NONE, 1, sizeof(f32) },
{ "cutscene", LVT_U8, offsetof(struct Camera, cutscene), false, LOT_NONE, 1, sizeof(u8) },
{ "defMode", LVT_U8, offsetof(struct Camera, defMode), false, LOT_NONE, 1, sizeof(u8) },
{ "doorStatus", LVT_U8, offsetof(struct Camera, doorStatus), false, LOT_NONE, 1, sizeof(u8) },
{ "filler31", LVT_U8, offsetof(struct Camera, filler31), false, LOT_NONE, 8, sizeof(u8) },
{ "filler3C", LVT_U8, offsetof(struct Camera, filler3C), false, LOT_NONE, 40, sizeof(u8) },
{ "focus", LVT_COBJECT, offsetof(struct Camera, focus), true, LOT_VEC3F, 1, sizeof(Vec3f) },
{ "mode", LVT_U8, offsetof(struct Camera, mode), false, LOT_NONE, 1, sizeof(u8) },
{ "mtx", LVT_COBJECT, offsetof(struct Camera, mtx), true, LOT_MAT4, 1, sizeof(Mat4) },
{ "nextYaw", LVT_S16, offsetof(struct Camera, nextYaw), false, LOT_NONE, 1, sizeof(s16) },
{ "paletteEditorCap", LVT_BOOL, offsetof(struct Camera, paletteEditorCap), false, LOT_NONE, 1, sizeof(bool) },
{ "pos", LVT_COBJECT, offsetof(struct Camera, pos), true, LOT_VEC3F, 1, sizeof(Vec3f) },
{ "unusedVec1", LVT_COBJECT, offsetof(struct Camera, unusedVec1), true, LOT_VEC3F, 1, sizeof(Vec3f) },
{ "yaw", LVT_S16, offsetof(struct Camera, yaw), false, LOT_NONE, 1, sizeof(s16) },
{ "areaCenX", LVT_F32, offsetof(struct Camera, areaCenX), false, LOT_NONE, 1, sizeof(f32) },
{ "areaCenY", LVT_F32, offsetof(struct Camera, areaCenY), false, LOT_NONE, 1, sizeof(f32) },
{ "areaCenZ", LVT_F32, offsetof(struct Camera, areaCenZ), false, LOT_NONE, 1, sizeof(f32) },
{ "cutscene", LVT_U8, offsetof(struct Camera, cutscene), false, LOT_NONE, 1, sizeof(u8) },
{ "defMode", LVT_U8, offsetof(struct Camera, defMode), false, LOT_NONE, 1, sizeof(u8) },
{ "doorStatus", LVT_U8, offsetof(struct Camera, doorStatus), false, LOT_NONE, 1, sizeof(u8) },
{ "filler31", LVT_U8, offsetof(struct Camera, filler31), false, LOT_NONE, 8, sizeof(u8) },
{ "filler3C", LVT_U8, offsetof(struct Camera, filler3C), false, LOT_NONE, 40, sizeof(u8) },
{ "focus", LVT_COBJECT, offsetof(struct Camera, focus), true, LOT_VEC3F, 1, sizeof(Vec3f) },
{ "mode", LVT_U8, offsetof(struct Camera, mode), false, LOT_NONE, 1, sizeof(u8) },
{ "mtx", LVT_COBJECT, offsetof(struct Camera, mtx), true, LOT_MAT4, 1, sizeof(Mat4) },
{ "nextYaw", LVT_S16, offsetof(struct Camera, nextYaw), false, LOT_NONE, 1, sizeof(s16) },
{ "pos", LVT_COBJECT, offsetof(struct Camera, pos), true, LOT_VEC3F, 1, sizeof(Vec3f) },
{ "unusedVec1", LVT_COBJECT, offsetof(struct Camera, unusedVec1), true, LOT_VEC3F, 1, sizeof(Vec3f) },
{ "yaw", LVT_S16, offsetof(struct Camera, yaw), false, LOT_NONE, 1, sizeof(s16) },
};
#define LUA_CAMERA_FOVSTATUS_FIELD_COUNT 8

View file

@ -3195,6 +3195,7 @@ char gSmluaConstants[] = ""
"ACT_STANDING_AGAINST_WALL=0x0C400209\n"
"ACT_COUGHING=0x0C40020A\n"
"ACT_SHIVERING=0x0C40020B\n"
"ACT_PALETTE_EDITOR_CAP=0x0000020C\n"
"ACT_IN_QUICKSAND=0x0002020D\n"
"ACT_UNKNOWN_0002020E=0x0002020E\n"
"ACT_CROUCHING=0x0C008220\n"
@ -3389,7 +3390,6 @@ char gSmluaConstants[] = ""
"ACT_BUTT_STUCK_IN_GROUND=0x0002033B\n"
"ACT_FEET_STUCK_IN_GROUND=0x0002033C\n"
"ACT_PUTTING_ON_CAP=0x0000133D\n"
"ACT_TAKING_OFF_CAP=0x0000133E\n"
"ACT_HOLDING_POLE=0x08100340\n"
"ACT_GRAB_POLE_SLOW=0x00100341\n"
"ACT_GRAB_POLE_FAST=0x00100342\n"

View file

@ -18875,6 +18875,26 @@ int smlua_func_check_common_landing_cancels(lua_State* L) {
return 1;
}
int smlua_func_mario_exit_palette_editor(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 2) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "mario_exit_palette_editor", 2, top);
return 0;
}
struct MarioState* m = (struct MarioState*)smlua_to_cobject(L, 1, LOT_MARIOSTATE);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "mario_exit_palette_editor"); return 0; }
struct Camera* c = (struct Camera*)smlua_to_cobject(L, 2, LOT_CAMERA);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "mario_exit_palette_editor"); return 0; }
extern s32 mario_exit_palette_editor(struct MarioState *m, struct Camera *c);
lua_pushinteger(L, mario_exit_palette_editor(m, c));
return 1;
}
int smlua_func_check_common_stationary_cancels(lua_State* L) {
if (L == NULL) { return 0; }
@ -37505,6 +37525,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "stopping_step", smlua_func_stopping_step);
smlua_bind_function(L, "landing_step", smlua_func_landing_step);
smlua_bind_function(L, "check_common_landing_cancels", smlua_func_check_common_landing_cancels);
smlua_bind_function(L, "mario_exit_palette_editor", smlua_func_mario_exit_palette_editor);
smlua_bind_function(L, "check_common_stationary_cancels", smlua_func_check_common_stationary_cancels);
smlua_bind_function(L, "mario_execute_stationary_action", smlua_func_mario_execute_stationary_action);