Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions include/behavior_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@

#include "types.h"

#ifdef __cplusplus
extern "C" {
#endif

extern const BehaviorScript bhvStarDoor[];
extern const BehaviorScript bhvMrI[];
extern const BehaviorScript bhvMrIBody[];
Expand Down Expand Up @@ -543,4 +547,8 @@ extern const BehaviorScript bhvEndBirds2[];
extern const BehaviorScript bhvIntroScene[];
extern const BehaviorScript bhvUnusedFakeStar[];

#ifdef __cplusplus
}
#endif

#endif // BEHAVIOR_DATA_H
23 changes: 21 additions & 2 deletions src/engine/level_script.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <libultraship.h>
#include <string.h>
#include "port/hooks/list/PlayerEvent.h"

#include "sm64.h"
#include "audio/external.h"
Expand Down Expand Up @@ -443,6 +444,9 @@ static void level_cmd_place_object(void) {

if (sCurrAreaIndex != -1 && ((CMD_GET(u8, 2) & val7) || CMD_GET(u8, 2) == 0x1F)) {
model = CMD_GET(u8, 3);
if (model == MODEL_STAR) {
int hi = 122;
}
spawnInfo = alloc_only_pool_alloc(sLevelPool, sizeof(struct SpawnInfo));

spawnInfo->startPos[0] = CMD_GET(s16, 4);
Expand All @@ -457,11 +461,16 @@ static void level_cmd_place_object(void) {
spawnInfo->activeAreaIndex = sCurrAreaIndex;

spawnInfo->behaviorArg = CMD_GET(u32, 16);
spawnInfo->behaviorScript = CMD_GET(void *, 20);
spawnInfo->behaviorScript = CMD_GET(void*, 20);

spawnInfo->model = gLoadedGraphNodes[model];

spawnInfo->next = gAreas[sCurrAreaIndex].objectSpawnInfos;

gAreas[sCurrAreaIndex].objectSpawnInfos = spawnInfo;
CALL_CANCELLABLE_EVENT(SpawnStar, &model, spawnInfo->startPos[0], spawnInfo->startPos[1],
spawnInfo->startPos[2]) {
gAreas[sCurrAreaIndex].objectSpawnInfos = spawnInfo;
}
}

sCurrentCmd = CMD_NEXT;
Expand Down Expand Up @@ -821,6 +830,7 @@ struct LevelCommand *level_script_execute(struct LevelCommand *cmd) {

while (sScriptStatus == SCRIPT_RUNNING) {
LevelScriptJumpTable[sCurrentCmd->type]();
CALL_EVENT(LevelScriptExecute, sCurrentCmd->type);
}

profiler_log_thread5_time(LEVEL_SCRIPT_EXECUTE);
Expand All @@ -831,3 +841,12 @@ struct LevelCommand *level_script_execute(struct LevelCommand *cmd) {

return sCurrentCmd;
}

// TODO: Move these elsewhere
s16 get_current_area_index(void) {
return sCurrAreaIndex;
}

struct AllocOnlyPool* get_level_pool(void) {
return sLevelPool;
}
8 changes: 4 additions & 4 deletions src/game/area.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
#include "camera.h"
#include "engine/graph_node.h"

#ifdef __cplusplus
extern "C" {
#endif

struct WarpNode {
/*00*/ u8 id;
/*01*/ u8 destLevel;
Expand Down Expand Up @@ -127,10 +131,6 @@ enum MenuOption {
MENU_OPT_CONTINUE_DONT_SAVE = MENU_OPT_3
};

#ifdef __cplusplus
extern "C" {
#endif

extern struct GraphNode **gLoadedGraphNodes;
extern struct SpawnInfo gPlayerSpawnInfos[];
extern struct GraphNode *D_8033A160[];
Expand Down
13 changes: 7 additions & 6 deletions src/game/behaviors/blue_coin.inc.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

/**
* Behavior for bhvHiddenBlueCoin and bhvBlueCoinSwitch.
* bhvHiddenBlueCoin are the stationary blue coins that appear when
* you press a blue coin switch (a.k.a. bhvBlueCoinSwitch).
*/
#include "port/hooks/list/PlayerEvent.h"

/**
* Update function for bhvHiddenBlueCoin.
Expand Down Expand Up @@ -46,11 +46,12 @@ void bhv_hidden_blue_coin_loop(void) {
spawn_object(o, MODEL_SPARKLES, bhvGoldenCoinSparkles);
obj_mark_for_deletion(o);
}

// After 200 frames of waiting and 20 2-frame blinks (for 240 frames total),
// delete the object.
if (cur_obj_wait_then_blink(200, 20)) {
obj_mark_for_deletion(o);
CALL_CANCELLABLE_EVENT(ModifyObjectBehavior, MODEL_BLUE_COIN) {
// After 200 frames of waiting and 20 2-frame blinks (for 240 frames total),
// delete the object.
if (cur_obj_wait_then_blink(200, 20)) {
obj_mark_for_deletion(o);
}
}

break;
Expand Down
23 changes: 14 additions & 9 deletions src/game/behaviors/spawn_star.inc.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,7 @@ void bhv_star_spawn_loop(void) {
}

struct Object *spawn_star(struct Object *sp30, f32 sp34, f32 sp38, f32 sp3C) {
sp30 = spawn_object_abs_with_rot(o, 0, MODEL_STAR, bhvStarSpawnCoordinates, o->oPosX, o->oPosY,
o->oPosZ, 0, 0, 0);
sp30 = spawn_object_abs_with_rot(o, 0, MODEL_STAR, bhvStarSpawnCoordinates, o->oPosX, o->oPosY, o->oPosZ, 0, 0, 0);
sp30->oBehParams = o->oBehParams;
sp30->oHomeX = sp34;
sp30->oHomeY = sp38;
Expand All @@ -124,19 +123,25 @@ struct Object *spawn_star(struct Object *sp30, f32 sp34, f32 sp38, f32 sp3C) {
}

void spawn_default_star(f32 sp20, f32 sp24, f32 sp28) {
struct Object *sp1C = spawn_star(sp1C, sp20, sp24, sp28);
sp1C->oBehParams2ndByte = 0;
CALL_CANCELLABLE_EVENT(ModifyDefaultStar, sp20, sp24, sp28) {
struct Object* sp1C = spawn_star(sp1C, sp20, sp24, sp28);
sp1C->oBehParams2ndByte = 0;
}
}

void spawn_red_coin_cutscene_star(f32 sp20, f32 sp24, f32 sp28) {
struct Object *sp1C = spawn_star(sp1C, sp20, sp24, sp28);
sp1C->oBehParams2ndByte = 1;
CALL_CANCELLABLE_EVENT(ModifyDefaultStar, sp20, sp24, sp28) {
struct Object* sp1C = spawn_star(sp1C, sp20, sp24, sp28);
sp1C->oBehParams2ndByte = 1;
}
}

void spawn_no_exit_star(f32 sp20, f32 sp24, f32 sp28) {
struct Object *sp1C = spawn_star(sp1C, sp20, sp24, sp28);
sp1C->oBehParams2ndByte = 1;
sp1C->oInteractionSubtype |= INT_SUBTYPE_NO_EXIT;
CALL_CANCELLABLE_EVENT(ModifyDefaultStar, sp20, sp24, sp28) {
struct Object* sp1C = spawn_star(sp1C, sp20, sp24, sp28);
sp1C->oBehParams2ndByte = 1;
sp1C->oInteractionSubtype |= INT_SUBTYPE_NO_EXIT;
}
}

void bhv_hidden_red_coin_star_init(void) {
Expand Down
83 changes: 45 additions & 38 deletions src/game/camera.h
Original file line number Diff line number Diff line change
Expand Up @@ -661,51 +661,54 @@ extern struct Object *gSecondCameraFocus;
extern u8 gRecentCutscene;

// TODO: sort all of this extremely messy shit out after the split
#ifdef __cplusplus
extern "C" {
#endif

void set_camera_shake_from_hit(s16 shake);
void set_environmental_camera_shake(s16 shake);
void set_camera_shake_from_point(s16 shake, f32 posX, f32 posY, f32 posZ);
void move_mario_head_c_up(UNUSED struct Camera *c);
void transition_next_state(UNUSED struct Camera *c, s16 frames);
void set_camera_mode(struct Camera *c, s16 mode, s16 frames);
void update_camera(struct Camera *c);
void reset_camera(struct Camera *c);
void init_camera(struct Camera *c);
void move_mario_head_c_up(UNUSED struct Camera* c);
void transition_next_state(UNUSED struct Camera* c, s16 frames);
void set_camera_mode(struct Camera* c, s16 mode, s16 frames);
void update_camera(struct Camera* c);
void reset_camera(struct Camera* c);
void init_camera(struct Camera* c);
void select_mario_cam_mode(void);
Gfx *geo_camera_main(s32 callContext, struct GraphNode *g, void *context);
void stub_camera_2(UNUSED struct Camera *c);
void stub_camera_3(UNUSED struct Camera *c);
Gfx* geo_camera_main(s32 callContext, struct GraphNode* g, void* context);
void stub_camera_2(UNUSED struct Camera* c);
void stub_camera_3(UNUSED struct Camera* c);
void vec3f_sub(Vec3f dst, Vec3f src);
void object_pos_to_vec3f(Vec3f dst, struct Object *o);
void vec3f_to_object_pos(struct Object *o, Vec3f src);
s32 move_point_along_spline(Vec3f p, struct CutsceneSplinePoint spline[], s16 *splineSegment, f32 *progress);
void object_pos_to_vec3f(Vec3f dst, struct Object* o);
void vec3f_to_object_pos(struct Object* o, Vec3f src);
s32 move_point_along_spline(Vec3f p, struct CutsceneSplinePoint spline[], s16* splineSegment, f32* progress);
s32 cam_select_alt_mode(s32 angle);
s32 set_cam_angle(s32 mode);
void set_handheld_shake(u8 mode);
void shake_camera_handheld(Vec3f pos, Vec3f focus);
s32 find_c_buttons_pressed(u16 currentState, u16 buttonsPressed, u16 buttonsDown);
s32 update_camera_hud_status(struct Camera *c);
s32 update_camera_hud_status(struct Camera* c);
s32 collide_with_walls(Vec3f pos, f32 offsetY, f32 radius);
s32 clamp_pitch(Vec3f from, Vec3f to, s16 maxPitch, s16 minPitch);
s32 is_within_100_units_of_mario(f32 posX, f32 posY, f32 posZ);
s32 set_or_approach_f32_asymptotic(f32 *dst, f32 goal, f32 scale);
s32 approach_f32_asymptotic_bool(f32 *current, f32 target, f32 multiplier);
s32 set_or_approach_f32_asymptotic(f32* dst, f32 goal, f32 scale);
s32 approach_f32_asymptotic_bool(f32* current, f32 target, f32 multiplier);
f32 approach_f32_asymptotic(f32 current, f32 target, f32 multiplier);
s32 approach_s16_asymptotic_bool(s16 *current, s16 target, s16 divisor);
s32 approach_s16_asymptotic_bool(s16* current, s16 target, s16 divisor);
s32 approach_s16_asymptotic(s16 current, s16 target, s16 divisor);
void approach_vec3f_asymptotic(Vec3f current, Vec3f target, f32 xMul, f32 yMul, f32 zMul);
void set_or_approach_vec3f_asymptotic(Vec3f dst, Vec3f goal, f32 xMul, f32 yMul, f32 zMul);
s32 camera_approach_s16_symmetric_bool(s16 *current, s16 target, s16 increment);
s32 set_or_approach_s16_symmetric(s16 *current, s16 target, s16 increment);
s32 camera_approach_f32_symmetric_bool(f32 *current, f32 target, f32 increment);
s32 camera_approach_s16_symmetric_bool(s16* current, s16 target, s16 increment);
s32 set_or_approach_s16_symmetric(s16* current, s16 target, s16 increment);
s32 camera_approach_f32_symmetric_bool(f32* current, f32 target, f32 increment);
f32 camera_approach_f32_symmetric(f32 value, f32 target, f32 increment);
void random_vec3s(Vec3s dst, s16 xRange, s16 yRange, s16 zRange);
s32 clamp_positions_and_find_yaw(Vec3f pos, Vec3f origin, f32 xMax, f32 xMin, f32 zMax, f32 zMin);
s32 is_range_behind_surface(Vec3f from, Vec3f to, struct Surface *surf, s16 range, s16 surfType);
s32 is_range_behind_surface(Vec3f from, Vec3f to, struct Surface* surf, s16 range, s16 surfType);
void scale_along_line(Vec3f dest, Vec3f from, Vec3f to, f32 scale);
s16 calculate_pitch(Vec3f from, Vec3f to);
s16 calculate_yaw(Vec3f from, Vec3f to);
void calculate_angles(Vec3f from, Vec3f to, s16 *pitch, s16 *yaw);
void calculate_angles(Vec3f from, Vec3f to, s16* pitch, s16* yaw);
f32 calc_abs_dist(Vec3f a, Vec3f b);
f32 calc_hor_dist(Vec3f a, Vec3f b);
void rotate_in_xz(Vec3f dst, Vec3f src, s16 yaw);
Expand All @@ -716,8 +719,8 @@ void set_camera_roll_shake(s16 mag, s16 decay, s16 inc);
void set_pitch_shake_from_point(s16 mag, s16 decay, s16 inc, f32 maxDist, f32 posX, f32 posY, f32 posZ);
void shake_camera_pitch(Vec3f pos, Vec3f focus);
void shake_camera_yaw(Vec3f pos, Vec3f focus);
void shake_camera_roll(s16 *roll);
s32 offset_yaw_outward_radial(struct Camera *c, s16 areaYaw);
void shake_camera_roll(s16* roll);
s32 offset_yaw_outward_radial(struct Camera* c, s16 areaYaw);
void play_camera_buzz_if_cdown(void);
void play_camera_buzz_if_cbutton(void);
void play_camera_buzz_if_c_sideways(void);
Expand All @@ -727,34 +730,38 @@ void play_sound_cbutton_side(void);
void play_sound_button_change_blocked(void);
void play_sound_rbutton_changed(void);
void play_sound_if_cam_switched_to_lakitu_or_mario(void);
s32 radial_camera_input(struct Camera *c, UNUSED f32 unused);
s32 radial_camera_input(struct Camera* c, UNUSED f32 unused);
s32 trigger_cutscene_dialog(s32 trigger);
void handle_c_button_movement(struct Camera *c);
void start_cutscene(struct Camera *c, u8 cutscene);
u8 get_cutscene_from_mario_status(struct Camera *c);
void handle_c_button_movement(struct Camera* c);
void start_cutscene(struct Camera* c, u8 cutscene);
u8 get_cutscene_from_mario_status(struct Camera* c);
void warp_camera(f32 displacementX, f32 displacementY, f32 displacementZ);
void approach_camera_height(struct Camera *c, f32 goal, f32 inc);
void approach_camera_height(struct Camera* c, f32 goal, f32 inc);
void offset_rotated(Vec3f dst, Vec3f from, Vec3f to, Vec3s rotation);
s16 next_lakitu_state(Vec3f newPos, Vec3f newFoc, Vec3f curPos, Vec3f curFoc, Vec3f oldPos, Vec3f oldFoc, s16 yaw);
void set_fixed_cam_axis_sa_lobby(UNUSED s16 preset);
s16 camera_course_processing(struct Camera *c);
s16 camera_course_processing(struct Camera* c);
void resolve_geometry_collisions(Vec3f pos, UNUSED Vec3f lastGood);
s32 rotate_camera_around_walls(struct Camera *c, Vec3f cPos, s16 *avoidYaw, s16 yawRange);
void find_mario_floor_and_ceil(struct PlayerGeometry *pg);
s32 rotate_camera_around_walls(struct Camera* c, Vec3f cPos, s16* avoidYaw, s16 yawRange);
void find_mario_floor_and_ceil(struct PlayerGeometry* pg);
u8 start_object_cutscene_without_focus(u8 cutscene);
s16 cutscene_object_with_dialog(u8 cutscene, struct Object *o, s16 dialogID);
s16 cutscene_object_without_dialog(u8 cutscene, struct Object *o);
s16 cutscene_object(u8 cutscene, struct Object *o);
void play_cutscene(struct Camera *c);
s32 cutscene_event(CameraEvent event, struct Camera * c, s16 start, s16 end);
s16 cutscene_object_with_dialog(u8 cutscene, struct Object* o, s16 dialogID);
s16 cutscene_object_without_dialog(u8 cutscene, struct Object* o);
s16 cutscene_object(u8 cutscene, struct Object* o);
void play_cutscene(struct Camera* c);
s32 cutscene_event(CameraEvent event, struct Camera* c, s16 start, s16 end);
s32 cutscene_spawn_obj(u32 obj, s16 frame);
void set_fov_shake(s16 amplitude, s16 decay, s16 shakeSpeed);

void set_fov_function(u8 func);
void cutscene_set_fov_shake_preset(u8 preset);
void set_fov_shake_from_point_preset(u8 preset, f32 posX, f32 posY, f32 posZ);
void obj_rotate_towards_point(struct Object *o, Vec3f point, s16 pitchOff, s16 yawOff, s16 pitchDiv, s16 yawDiv);
void obj_rotate_towards_point(struct Object* o, Vec3f point, s16 pitchOff, s16 yawOff, s16 pitchDiv, s16 yawDiv);

Gfx* geo_camera_fov(s32 callContext, struct GraphNode* g, UNUSED void* context);

Gfx *geo_camera_fov(s32 callContext, struct GraphNode *g, UNUSED void *context);
#ifdef __cplusplus
}
#endif

#endif // CAMERA_H
1 change: 1 addition & 0 deletions src/game/interaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -807,6 +807,7 @@ u32 interact_star_or_key(struct MarioState *m, UNUSED u32 interactType, struct O
m->interactObj = o;
m->usedObj = o;

// TODO: Set starIndex data in RandoStaticCheck.
starIndex = (o->oBehParams >> 24) & 0x1F;
save_file_collect_star_or_key(m->numCoins, starIndex);

Expand Down
46 changes: 26 additions & 20 deletions src/game/macro_special_objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@

#include "special_presets.h"

#include "port/hooks/list/PlayerEvent.h"
#include "port/mods/PortEnhancements.h"

/*
* Converts the rotation value supplied by macro objects into one
* that can be used by in-game objects.
Expand Down Expand Up @@ -147,26 +150,29 @@ void spawn_macro_objects(s16 areaIndex, s16 *macroObjList) {
if (((macroObject[MACRO_OBJ_PARAMS] >> 8) & RESPAWN_INFO_DONT_RESPAWN)
!= RESPAWN_INFO_DONT_RESPAWN) {
// Spawn the new macro object.
newObj = spawn_object_abs_with_rot(
&gMacroObjectDefaultParent, // Parent object
0, // Unused
preset.model, // Model ID
preset.behavior, // Behavior address
macroObject[MACRO_OBJ_X], // X-position
macroObject[MACRO_OBJ_Y], // Y-position
macroObject[MACRO_OBJ_Z], // Z-position
0, // X-rotation
convert_rotation(macroObject[MACRO_OBJ_Y_ROT]), // Y-rotation
0 // Z-rotation
);

newObj->oUnk1A8 = macroObject[MACRO_OBJ_PARAMS];
newObj->oBehParams = ((macroObject[MACRO_OBJ_PARAMS] & 0x00FF) << 16)
+ (macroObject[MACRO_OBJ_PARAMS] & 0xFF00);
newObj->oBehParams2ndByte = macroObject[MACRO_OBJ_PARAMS] & 0x00FF;
newObj->respawnInfoType = RESPAWN_INFO_TYPE_16;
newObj->respawnInfo = macroObjList - 1;
newObj->parentObj = newObj;
CALL_CANCELLABLE_EVENT(SpawnObject, preset.model, macroObject[MACRO_OBJ_X], macroObject[MACRO_OBJ_Y],
macroObject[MACRO_OBJ_Z]) {
newObj = spawn_object_abs_with_rot(
&gMacroObjectDefaultParent, // Parent object
0, // Unused
preset.model, // Model ID
preset.behavior, // Behavior address
macroObject[MACRO_OBJ_X], // X-position
macroObject[MACRO_OBJ_Y], // Y-position
macroObject[MACRO_OBJ_Z], // Z-position
0, // X-rotation
convert_rotation(macroObject[MACRO_OBJ_Y_ROT]), // Y-rotation
0 // Z-rotation
);

newObj->oUnk1A8 = macroObject[MACRO_OBJ_PARAMS];
newObj->oBehParams = ((macroObject[MACRO_OBJ_PARAMS] & 0x00FF) << 16)
+ (macroObject[MACRO_OBJ_PARAMS] & 0xFF00);
newObj->oBehParams2ndByte = macroObject[MACRO_OBJ_PARAMS] & 0x00FF;
newObj->respawnInfoType = RESPAWN_INFO_TYPE_16;
newObj->respawnInfo = macroObjList - 1;
newObj->parentObj = newObj;
}
}
}
}
Expand Down
4 changes: 4 additions & 0 deletions src/game/save_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
#include "course_table.h"
#include "rumble_init.h"

#include "port/hooks/list/PlayerEvent.h"
#include "port/mods/PortEnhancements.h"

#define MENU_DATA_MAGIC 0x4849
#define SAVE_FILE_MAGIC 0x4441

Expand Down Expand Up @@ -250,6 +253,7 @@ static void restore_save_file_data(s32 fileIndex, s32 srcSlot) {
}

void save_file_do_save(s32 fileIndex) {
CALL_EVENT(OnGameFileSave, fileIndex);
if (gSaveFileModified) {
// Compute checksum
add_save_block_signature(&gSaveBuffer.files[fileIndex][0],
Expand Down
Loading