sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

object_helpers.h (14525B)


      1 #ifndef OBJECT_HELPERS_H
      2 #define OBJECT_HELPERS_H
      3 
      4 #include <PR/ultratypes.h>
      5 
      6 #include "macros.h"
      7 #include "types.h"
      8 
      9 // used for chain chomp and wiggler
     10 struct ChainSegment {
     11     f32 posX;
     12     f32 posY;
     13     f32 posZ;
     14     s16 pitch;
     15     s16 yaw;
     16     s16 roll;
     17 };
     18 
     19 #define WATER_DROPLET_FLAG_RAND_ANGLE                0x02
     20 #define WATER_DROPLET_FLAG_RAND_OFFSET_XZ            0x04 // Unused
     21 #define WATER_DROPLET_FLAG_RAND_OFFSET_XYZ           0x08 // Unused
     22 #define WATER_DROPLET_FLAG_SET_Y_TO_WATER_LEVEL      0x20
     23 #define WATER_DROPLET_FLAG_RAND_ANGLE_INCR_PLUS_8000 0x40
     24 #define WATER_DROPLET_FLAG_RAND_ANGLE_INCR           0x80 // Unused
     25 
     26 // Call spawn_water_droplet with this struct to spawn an object.
     27 struct WaterDropletParams {
     28     s16 flags; // Droplet spawn flags, see defines above
     29     s16 model;
     30     const BehaviorScript *behavior;
     31     s16 moveAngleRange; // Only used for RAND_ANGLE_INCR flags
     32     s16 moveRange;      // Only used for RAND_OFFSET flags
     33     f32 randForwardVelOffset;
     34     f32 randForwardVelScale;
     35     f32 randYVelOffset;
     36     f32 randYVelScale;
     37     f32 randSizeOffset;
     38     f32 randSizeScale;
     39 };
     40 
     41 struct struct802A1230 {
     42     /*0x00*/ s16 unk00;
     43     /*0x02*/ s16 unk02;
     44 };
     45 
     46 struct Struct802A272C {
     47     Vec3f vecF;
     48     Vec3s vecS;
     49 };
     50 
     51 struct SpawnParticlesInfo {
     52     /*0x00*/ s8 bhvParam;
     53     /*0x01*/ s8 count;
     54     /*0x02*/ u8 model;
     55     /*0x03*/ s8 offsetY;
     56     /*0x04*/ s8 forwardVelBase;
     57     /*0x05*/ s8 forwardVelRange;
     58     /*0x06*/ s8 velYBase;
     59     /*0x07*/ s8 velYRange;
     60     /*0x08*/ s8 gravity;
     61     /*0x09*/ s8 dragStrength;
     62     /*0x0C*/ f32 sizeBase;
     63     /*0x10*/ f32 sizeRange;
     64 };
     65 
     66 Gfx *geo_update_projectile_pos_from_parent(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx);
     67 Gfx *geo_update_layer_transparency(s32 callContext, struct GraphNode *node, UNUSED void *context);
     68 #ifdef AVOID_UB
     69 Gfx *geo_switch_anim_state(s32 callContext, struct GraphNode *node, UNUSED void *context);
     70 Gfx *geo_switch_area(s32 callContext, struct GraphNode *node, UNUSED void *context);
     71 #else
     72 Gfx *geo_switch_anim_state(s32 callContext, struct GraphNode *node);
     73 Gfx *geo_switch_area(s32 callContext, struct GraphNode *node);
     74 #endif
     75 void obj_update_pos_from_parent_transformation(Mat4 a0, struct Object *a1);
     76 void obj_apply_scale_to_matrix(struct Object *obj, Mat4 dst, Mat4 src);
     77 void create_transformation_from_matrices(Mat4 a0, Mat4 a1, Mat4 a2);
     78 void obj_set_held_state(struct Object *obj, const BehaviorScript *heldBehavior);
     79 f32 lateral_dist_between_objects(struct Object *obj1, struct Object *obj2);
     80 f32 dist_between_objects(struct Object *obj1, struct Object *obj2);
     81 void cur_obj_forward_vel_approach_upward(f32 target, f32 increment);
     82 s32 approach_f32_signed(f32 *value, f32 target, f32 increment);
     83 f32 approach_f32_symmetric(f32 value, f32 target, f32 increment);
     84 s16 approach_s16_symmetric(s16 value, s16 target, s16 increment);
     85 s32 cur_obj_rotate_yaw_toward(s16 target, s16 increment);
     86 s16 obj_angle_to_object(struct Object *obj1, struct Object *obj2);
     87 s16 obj_turn_toward_object(struct Object *obj, struct Object *target, s16 angleIndex, s16 turnAmount);
     88 void obj_set_parent_relative_pos(struct Object *obj, s16 relX, s16 relY, s16 relZ);
     89 void obj_set_pos(struct Object *obj, s16 x, s16 y, s16 z);
     90 void obj_set_angle(struct Object *obj, s16 pitch, s16 yaw, s16 roll);
     91 struct Object *spawn_object_abs_with_rot(struct Object *parent, s16 uselessArg, u32 model,
     92                                          const BehaviorScript *behavior,
     93                                          s16 x, s16 y, s16 z, s16 pitch, s16 yaw, s16 roll);
     94 struct Object *spawn_object_rel_with_rot(struct Object *parent, u32 model, const BehaviorScript *behavior,
     95                                          s16 xOff, s16 yOff, s16 zOff, s16 pitch, s16 yaw, UNUSED s16 roll);
     96 struct Object *spawn_obj_with_transform_flags(struct Object *sp20, s32 model, const BehaviorScript *sp28);
     97 struct Object *spawn_water_droplet(struct Object *parent, struct WaterDropletParams *params);
     98 struct Object *spawn_object_at_origin(struct Object *, s32, u32, const BehaviorScript *);
     99 struct Object *spawn_object_at_origin(struct Object *parent, UNUSED s32 unusedArg, u32 model, const BehaviorScript *behavior);
    100 struct Object *spawn_object(struct Object *parent, s32 model, const BehaviorScript *behavior);
    101 struct Object *try_to_spawn_object(s16 offsetY, f32 scale, struct Object *parent, s32 model, const BehaviorScript *behavior);
    102 struct Object *spawn_object_with_scale(struct Object *parent, s32 model, const BehaviorScript *behavior, f32 scale);
    103 struct Object *spawn_object_relative(s16 behaviorParam, s16 relativePosX, s16 relativePosY, s16 relativePosZ,
    104                                      struct Object *parent, s32 model, const BehaviorScript *behavior);
    105 struct Object *spawn_object_relative_with_scale(s16 behaviorParam, s16 relativePosX, s16 relativePosY,
    106                                                 s16 relativePosZ, f32 scale, struct Object *parent,
    107                                                 s32 model, const BehaviorScript *behavior);
    108 void cur_obj_move_using_vel(void);
    109 void obj_copy_graph_y_offset(struct Object *dst, struct Object *src);
    110 void obj_copy_pos_and_angle(struct Object *dst, struct Object *src);
    111 void obj_copy_pos(struct Object *dst, struct Object *src);
    112 void obj_copy_angle(struct Object *dst, struct Object *src);
    113 void obj_set_gfx_pos_from_pos(struct Object *obj);
    114 void linear_mtxf_mul_vec3f(Mat4 m, Vec3f dst, Vec3f v);
    115 void linear_mtxf_transpose_mul_vec3f(Mat4 m, Vec3f dst, Vec3f v);
    116 void obj_apply_scale_to_transform(struct Object *obj);
    117 void obj_copy_scale(struct Object *dst, struct Object *src);
    118 void obj_scale_xyz(struct Object *obj, f32 xScale, f32 yScale, f32 zScale);
    119 void obj_scale(struct Object *obj, f32 scale);
    120 void cur_obj_scale(f32 scale);
    121 void cur_obj_init_animation_with_sound(s32 animIndex);
    122 void cur_obj_init_animation_with_accel_and_sound(s32 animIndex, f32 accel);
    123 void cur_obj_init_animation(s32 animIndex);
    124 void obj_init_animation_with_sound(struct Object *obj, const struct Animation * const* animations, s32 animIndex);
    125 void cur_obj_enable_rendering(void);
    126 void cur_obj_disable_rendering(void);
    127 void cur_obj_unhide(void);
    128 void cur_obj_hide(void);
    129 void cur_obj_set_pos_relative(struct Object *other, f32 dleft, f32 dy, f32 dforward);
    130 void cur_obj_set_pos_relative_to_parent(f32 dleft, f32 dy, f32 dforward);
    131 void cur_obj_enable_rendering_2(void);
    132 void obj_set_face_angle_to_move_angle(struct Object *obj);
    133 u32 get_object_list_from_behavior(const BehaviorScript *behavior);
    134 struct Object *cur_obj_nearest_object_with_behavior(const BehaviorScript *behavior);
    135 f32 cur_obj_dist_to_nearest_object_with_behavior(const BehaviorScript* behavior);
    136 struct Object *cur_obj_find_nearest_object_with_behavior(const BehaviorScript * behavior, f32 *dist);
    137 struct Object *find_unimportant_object(void);
    138 s32 count_unimportant_objects(void);
    139 s32 count_objects_with_behavior(const BehaviorScript *behavior);
    140 struct Object *cur_obj_find_nearby_held_actor(const BehaviorScript *behavior, f32 maxDist);
    141 void cur_obj_change_action(s32 action);
    142 void cur_obj_set_vel_from_mario_vel(f32 objBaseForwardVel, f32 multiplier);
    143 BAD_RETURN(s16) cur_obj_reverse_animation(void);
    144 BAD_RETURN(s32) cur_obj_extend_animation_if_at_end(void);
    145 s32 cur_obj_check_if_near_animation_end(void);
    146 s32 cur_obj_check_if_at_animation_end(void);
    147 s32 cur_obj_check_anim_frame(s32 frame);
    148 s32 cur_obj_check_anim_frame_in_range(s32 startFrame, s32 rangeLength);
    149 s32 cur_obj_check_frame_prior_current_frame(s16 *a0);
    150 s32 mario_is_in_air_action(void);
    151 s32 mario_is_dive_sliding(void);
    152 void cur_obj_set_y_vel_and_animation(f32 sp18, s32 sp1C);
    153 void cur_obj_unrender_set_action_and_anim(s32 sp18, s32 sp1C);
    154 void cur_obj_get_thrown_or_placed(f32 forwardVel, f32 velY, s32 thrownAction);
    155 void cur_obj_get_dropped(void);
    156 void cur_obj_set_model(s32 modelID);
    157 void mario_set_flag(s32 flag);
    158 s32 cur_obj_clear_interact_status_flag(s32 flag);
    159 void obj_mark_for_deletion(struct Object *obj);
    160 void cur_obj_disable(void);
    161 void cur_obj_become_intangible(void);
    162 void cur_obj_become_tangible(void);
    163 void obj_become_tangible(struct Object *obj);
    164 void cur_obj_update_floor_height(void);
    165 struct Surface *cur_obj_update_floor_height_and_get_floor(void);
    166 void cur_obj_apply_drag_xz(f32 dragStrength);
    167 void cur_obj_move_y(f32 gravity, f32 bounciness, f32 buoyancy);
    168 void cur_obj_unused_resolve_wall_collisions(f32 offsetY, f32 radius);
    169 s16 abs_angle_diff(s16 x0, s16 x1);
    170 void cur_obj_move_xz_using_fvel_and_yaw(void);
    171 void cur_obj_move_y_with_terminal_vel(void);
    172 void cur_obj_compute_vel_xz(void);
    173 f32 increment_velocity_toward_range(f32 value, f32 center, f32 zeroThreshold, f32 increment);
    174 s32 obj_check_if_collided_with_object(struct Object *obj1, struct Object *obj2);
    175 void cur_obj_set_behavior(const BehaviorScript *behavior);
    176 void obj_set_behavior(struct Object *obj, const BehaviorScript *behavior);
    177 s32 cur_obj_has_behavior(const BehaviorScript *behavior);
    178 s32 obj_has_behavior(struct Object *obj, const BehaviorScript *behavior);
    179 f32 cur_obj_lateral_dist_from_mario_to_home(void);
    180 f32 cur_obj_lateral_dist_to_home(void);
    181 void cur_obj_set_pos_to_home(void);
    182 void cur_obj_set_pos_to_home_and_stop(void);
    183 void cur_obj_shake_y(f32 amount);
    184 void cur_obj_start_cam_event(UNUSED struct Object *obj, s32 cameraEvent);
    185 void set_mario_interact_true_if_in_range(UNUSED s32 arg0, UNUSED s32 arg1, f32 range);
    186 void obj_set_billboard(struct Object *obj);
    187 void cur_obj_set_hitbox_radius_and_height(f32 radius, f32 height);
    188 void cur_obj_set_hurtbox_radius_and_height(f32 radius, f32 height);
    189 void obj_spawn_loot_blue_coins(struct Object *obj, s32 numCoins, f32 baseVelY, s16 posJitter);
    190 void obj_spawn_loot_yellow_coins(struct Object *obj, s32 numCoins, f32 baseVelY);
    191 void cur_obj_spawn_loot_coin_at_mario_pos(void);
    192 s32 cur_obj_advance_looping_anim(void);
    193 s32 cur_obj_resolve_wall_collisions(void);
    194 void cur_obj_update_floor_and_walls(void);
    195 void cur_obj_move_standard(s16 steepSlopeAngleDegrees);
    196 void cur_obj_move_using_vel_and_gravity(void);
    197 void cur_obj_move_using_fvel_and_gravity(void);
    198 s16 cur_obj_angle_to_home(void);
    199 void obj_set_gfx_pos_at_obj_pos(struct Object *obj1, struct Object *obj2);
    200 void obj_translate_local(struct Object *obj, s16 posIndex, s16 localTranslateIndex);
    201 void obj_build_transform_from_pos_and_angle(struct Object *obj, s16 posIndex, s16 angleIndex);
    202 void obj_set_throw_matrix_from_transform(struct Object *obj);
    203 void obj_build_transform_relative_to_parent(struct Object *obj);
    204 void obj_create_transform_from_self(struct Object *obj);
    205 void  cur_obj_rotate_face_angle_using_vel(void);
    206 s32 cur_obj_follow_path(UNUSED s32 unused);
    207 void chain_segment_init(struct ChainSegment *segment);
    208 f32 random_f32_around_zero(f32 diameter);
    209 void obj_scale_random(struct Object *obj, f32 rangeLength, f32 minScale);
    210 void obj_translate_xyz_random(struct Object *obj, f32 rangeLength);
    211 void obj_translate_xz_random(struct Object *obj, f32 rangeLength);
    212 void cur_obj_set_pos_via_transform(void);
    213 void cur_obj_spawn_particles(struct SpawnParticlesInfo *info);
    214 s16 cur_obj_reflect_move_angle_off_wall(void);
    215 
    216 #define WAYPOINT_FLAGS_END -1
    217 #define WAYPOINT_FLAGS_INITIALIZED 0x8000
    218 #define WAYPOINT_MASK_00FF 0x00FF
    219 #define WAYPOINT_FLAGS_PLATFORM_ON_TRACK_PAUSE 3
    220 
    221 #define PATH_NONE 0
    222 #define PATH_REACHED_END -1
    223 #define PATH_REACHED_WAYPOINT 1
    224 
    225 void obj_set_hitbox(struct Object *obj, struct ObjectHitbox *hitbox);
    226 s32 signum_positive(s32 x);
    227 f32 absf(f32 x);
    228 s32 absi(s32 a0);
    229 s32 cur_obj_wait_then_blink(s32 timeUntilBlinking, s32 numBlinks);
    230 s32 cur_obj_is_mario_ground_pounding_platform(void);
    231 void spawn_mist_particles(void);
    232 void spawn_mist_particles_with_sound(u32 soundMagic);
    233 void cur_obj_push_mario_away(f32 radius);
    234 void cur_obj_push_mario_away_from_cylinder(f32 radius, f32 extentY);
    235 s32 cur_obj_set_action_table(s8 *actionTable);
    236 s32 cur_obj_progress_action_table(void);
    237 void stub_obj_helpers_3(UNUSED s32 arg0, UNUSED s32 arg1);
    238 void cur_obj_scale_over_time(s32 a0, s32 a1, f32 sp10, f32 sp14);
    239 void cur_obj_set_pos_to_home_with_debug(void);
    240 s32 cur_obj_is_mario_on_platform(void);
    241 s32 jiggle_bbh_stair(s32 a0);
    242 void cur_obj_call_action_function(void (*actionFunctions[])(void));
    243 void spawn_base_star_with_no_lvl_exit(void);
    244 s32 bit_shift_left(s32 a0);
    245 s32 cur_obj_mario_far_away(void);
    246 s32 is_mario_moving_fast_or_in_air(s32 speedThreshold);
    247 s32 is_item_in_array(s8 item, s8 *array);
    248 void cur_obj_enable_rendering_if_mario_in_room(void);
    249 s32 cur_obj_set_hitbox_and_die_if_attacked(struct ObjectHitbox *hitbox, s32 deathSound, s32 noLootCoins);
    250 void obj_explode_and_spawn_coins(f32 mistParticleSize, s32 sp1C);
    251 void obj_set_collision_data(struct Object *obj, const void *segAddr);
    252 void cur_obj_if_hit_wall_bounce_away(void);
    253 s32 cur_obj_hide_if_mario_far_away_y(f32 distY);
    254 Gfx *geo_offset_klepto_held_object(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx);
    255 Gfx *geo_offset_klepto_debug(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx);
    256 s32 obj_is_hidden(struct Object *obj);
    257 void enable_time_stop(void);
    258 void disable_time_stop(void);
    259 void set_time_stop_flags(s32 flags);
    260 void clear_time_stop_flags(s32 flags);
    261 s32 cur_obj_can_mario_activate_textbox(f32 radius, f32 height, UNUSED s32 unused);
    262 s32 cur_obj_can_mario_activate_textbox_2(f32 radius, f32 height);
    263 s32 cur_obj_update_dialog(s32 actionArg, s32 dialogFlags, s32 dialogID, UNUSED s32 unused);
    264 s32 cur_obj_update_dialog_with_cutscene(s32 actionArg, s32 dialogFlags, s32 cutsceneTable, s32 dialogID);
    265 s32 cur_obj_has_model(u16 modelID);
    266 void cur_obj_align_gfx_with_floor(void);
    267 s32 mario_is_within_rectangle(s16 minX, s16 maxX, s16 minZ, s16 maxZ);
    268 void cur_obj_shake_screen(s32 shake);
    269 s32 obj_attack_collided_from_other_object(struct Object *obj);
    270 s32 cur_obj_was_attacked_or_ground_pounded(void);
    271 void obj_copy_behavior_params(struct Object *dst, struct Object *src);
    272 void cur_obj_init_animation_and_anim_frame(s32 animIndex, s32 animFrame);
    273 s32 cur_obj_init_animation_and_check_if_near_end(s32 animIndex);
    274 void cur_obj_init_animation_and_extend_if_at_end(s32 animIndex);
    275 s32 cur_obj_check_grabbed_mario(void);
    276 s32 player_performed_grab_escape_action(void);
    277 void cur_obj_unused_play_footstep_sound(s32 animFrame1, s32 animFrame2, s32 sound);
    278 void enable_time_stop_including_mario(void);
    279 void disable_time_stop_including_mario(void);
    280 s32 cur_obj_check_interacted(void);
    281 void cur_obj_spawn_loot_blue_coin(void);
    282 
    283 #ifndef VERSION_JP
    284 void cur_obj_spawn_star_at_y_offset(f32 targetX, f32 targetY, f32 targetZ, f32 offsetY);
    285 #endif
    286 
    287 #endif // OBJECT_HELPERS_H