diff --git a/include/rnc/overlay/l18/drek_boss_states.h b/include/rnc/overlay/l18/drek_boss_states.h new file mode 100644 index 0000000000..a9b485876b --- /dev/null +++ b/include/rnc/overlay/l18/drek_boss_states.h @@ -0,0 +1,31 @@ +#ifndef LOMBYTE_RNC_OVERLAY_L18_DREK_BOSS_STATES_H +#define LOMBYTE_RNC_OVERLAY_L18_DREK_BOSS_STATES_H + +/* Moby state IDs shared by the final boss update and its supporting handlers. */ +enum { + DREK_BOSS_INITIALIZE = 0, + DREK_BOSS_WAIT_FOR_ENCOUNTER_TRIGGER = 1, + DREK_BOSS_CIRCLE_AND_FIRE_AT_HERO = 2, + DREK_BOSS_WAIT_TO_RESTORE_SAVED_TRANSFORM = 3, + DREK_BOSS_WAIT_FOR_GROUNDED_HERO_TO_START_SCENE = 4, + DREK_BOSS_INITIALIZE_PAIRED_TRANSFORM_TRANSITION = 5, + DREK_BOSS_WAIT_FOR_SCENE = 7, + DREK_BOSS_WAIT_FOR_PAIRED_TRANSFORM_TRANSITION = 8, + DREK_BOSS_APPROACH_PATH_START = 9, + DREK_BOSS_FOLLOW_PATH_AND_FIRE_AT_MOBYS = 10, + DREK_BOSS_FINISH_PATH_AND_WAIT_FOR_HERO = 0xB, + DREK_BOSS_SELECT_NEXT_ACTION = 0xC, + DREK_BOSS_LAUNCH_FORWARD_WITH_LATERAL_OFFSET = 0xD, + DREK_BOSS_ACTION_REPOSITION_AND_AIM = 0xE, + DREK_BOSS_TARGET_GROUND_POINTS = 0xF, + DREK_BOSS_TARGET_RANDOM_ARENA_POINTS = 0x10, + DREK_BOSS_TARGET_SIDE_GROUND_POINTS = 0x11, + DREK_BOSS_APPROACH_AIM_NODE = 0x12, + DREK_BOSS_FOLLOW_HERO = 0x13, + DREK_BOSS_ACTIVATE_MISSILE_GROUP = 0x14, + DREK_BOSS_APPROACH_SELECTED_MOBY = 0x15, + DREK_BOSS_DEATH_EXPLOSIONS = 0x1A, + DREK_BOSS_RUN_ENDING_SEQUENCE = 0x1B +}; + +#endif /* LOMBYTE_RNC_OVERLAY_L18_DREK_BOSS_STATES_H */ diff --git a/include/rnc/overlay/shared/hero/set_hero_animation.h b/include/rnc/overlay/shared/hero/set_hero_animation.h index f31b2d7e64..400adfb4fb 100644 --- a/include/rnc/overlay/shared/hero/set_hero_animation.h +++ b/include/rnc/overlay/shared/hero/set_hero_animation.h @@ -12,8 +12,8 @@ void show_health_hud(void) __asm__("FUN_L00_00234e00"); s32 get_ammo(s32) __asm__("FUN_L00_00233e98"); s32 get_hero_target_pose_status(void) __asm__("FUN_L00_00233f38"); -void FUN_L00_00232fe8(void); -void FUN_L00_002330d0(void); +void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); +void update_hero_item_moby_flags(void) __asm__("FUN_L00_002330d0"); s32 use_ammo(s32, s32) __asm__("FUN_L00_00233db8"); #endif /* LOMBYTE_RNC_OVERLAY_SHARED_HERO_SET_HERO_ANIMATION_H */ diff --git a/include/rnc/overlay/shared/math/interpolation/spring_turn.h b/include/rnc/overlay/shared/math/interpolation/spring_turn.h index f05ddb6378..980cff2ac2 100644 --- a/include/rnc/overlay/shared/math/interpolation/spring_turn.h +++ b/include/rnc/overlay/shared/math/interpolation/spring_turn.h @@ -8,7 +8,8 @@ s32 get_first_moby_in_group(void *, s32, s32, s32) __asm__("FUN_L00_002591d0"); s32 solve_quadratic_equation(f32 *, f32 *, f32, f32, f32) __asm__("FUN_L00_002595a0"); s32 get_next_moby_in_group(void *, void *, s32, s32) __asm__("FUN_L00_002592b8"); -void FUN_L00_00258490(void *, void *, void *, s32, f32, f32, f32, f32); +void move_moby_xy_with_collision_constraints( + void *, void *, void *, s32, f32, f32, f32, f32) __asm__("FUN_L00_00258490"); float calculate_triangular_corrected_scalar(float *, float *, int *, diff --git a/include/rnc/overlay/shared/math/vu0_vector_ops.h b/include/rnc/overlay/shared/math/vu0_vector_ops.h index 0b474060b1..4b7455eae0 100644 --- a/include/rnc/overlay/shared/math/vu0_vector_ops.h +++ b/include/rnc/overlay/shared/math/vu0_vector_ops.h @@ -6,6 +6,6 @@ s32 fast_subtract_rotations_cf(void *) __asm__("FUN_L00_001fefc8"); void add_vectors(void *, void *, void *) __asm__("FUN_L00_001ff290"); void reflect_vector(void *, void *, void *) __asm__("FUN_L00_001ff660"); -void rotation_2D5FA8(void *, s32, f32) __asm__("FUN_L00_001fff28"); +void build_axis_rotation_quaternion(void *, s32, f32) __asm__("FUN_L00_001fff28"); #endif /* LOMBYTE_RNC_OVERLAY_SHARED_MATH_VU0_VECTOR_OPS_H */ diff --git a/include/rnc/overlay/shared/rendering/effects/particles.h b/include/rnc/overlay/shared/rendering/effects/particles.h index a6e59e759b..b815c507d8 100644 --- a/include/rnc/overlay/shared/rendering/effects/particles.h +++ b/include/rnc/overlay/shared/rendering/effects/particles.h @@ -14,7 +14,8 @@ void *spawn_mode_controlled_rotating_alpha_fade_particle(void *, struct EmberParticle; struct EffectParticle; -unsigned char *FUN_L00_00272f68(u128 *, int, unsigned char, int, int, int, int, float); +unsigned char *spawn_timed_hero_relative_particle( + u128 *, int, unsigned char, int, int, int, int, float) __asm__("FUN_L00_00272f68"); unsigned char *spawn_color_tween_emitter_particle(void *, unsigned char, unsigned char, diff --git a/include/rnc/overlay/shared/weapons.h b/include/rnc/overlay/shared/weapons.h index 6542875a5c..2b5c37c2eb 100644 --- a/include/rnc/overlay/shared/weapons.h +++ b/include/rnc/overlay/shared/weapons.h @@ -26,7 +26,7 @@ void linked_moby_states_update(unsigned char *) __asm__("FUN_L00_002b3 void metal_detector_update(struct Moby *) __asm__("FUN_L00_002d2ee8"); void mine_glove_update(struct Moby *) __asm__("FUN_L00_002c1ad0"); void morphoray_update() __asm__("FUN_L00_002bc7e8"); -s32 FUN_L00_002caf40(s32); +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); int cancel_suck_cannon_suction_and_set_moby_state_5(struct Moby *) __asm__("FUN_L00_002caf10"); int launch_suck_cannon_projectile_and_update_moby_state(struct Moby *, int, diff --git a/src/audio/decoder/audio_dec_begin_put.c b/src/audio/decoder/audio_dec_begin_put.c index f679fca03d..c0a8bee47f 100644 --- a/src/audio/decoder/audio_dec_begin_put.c +++ b/src/audio/decoder/audio_dec_begin_put.c @@ -10,9 +10,12 @@ void audio_dec_begin_put(struct AudioDec *dec, void **second_destination, s32 *size2) { + enum { + AUDIO_DEC_STATE_HEADER_PENDING = 0 + }; s32 writable_byte_count; - if (dec->state == 0) { + if (dec->state == AUDIO_DEC_STATE_HEADER_PENDING) { if (dec->strType != 4) { *first_destination = ((u8 *)&dec->hdr + dec->hdrCount); *size1 = 0x28 - dec->hdrCount; diff --git a/src/audio/decoder/audio_dec_create.c b/src/audio/decoder/audio_dec_create.c index 0b5b3dcbce..a9b8cde1b2 100644 --- a/src/audio/decoder/audio_dec_create.c +++ b/src/audio/decoder/audio_dec_create.c @@ -15,6 +15,9 @@ s32 audio_dec_create(struct AudioDec *dec, s32 buffer_size, s32 globals_address) { + enum { + AUDIO_DEC_STATE_INITIAL = 0 + }; s32 movie_handle; s32 three; s32 four; @@ -24,7 +27,7 @@ s32 audio_dec_create(struct AudioDec *dec, dec->size = buffer_size; three = 3; dec->strType = three; - dec->state = 0; + dec->state = AUDIO_DEC_STATE_INITIAL; dec->hdrCount = 0; dec->put = 0; dec->count = 0; diff --git a/src/audio/decoder/audio_dec_end_put.c b/src/audio/decoder/audio_dec_end_put.c index 9360bf677d..59ac5830ed 100644 --- a/src/audio/decoder/audio_dec_end_put.c +++ b/src/audio/decoder/audio_dec_end_put.c @@ -4,20 +4,24 @@ void audio_dec_end_put(struct AudioDec *ad, s32 n) __asm__("FUN_0023ae28"); void audio_dec_end_put(struct AudioDec *ad, s32 byte_count) { + enum { + AUDIO_DEC_STATE_HEADER_PENDING = 0, + AUDIO_DEC_STATE_HEADER_HANDLED = 1 + }; s32 k; s32 room; - if (ad->state == 0) { + if (ad->state == AUDIO_DEC_STATE_HEADER_PENDING) { if (ad->strType != 4) { room = 40 - ad->hdrCount; k = room < byte_count ? room : byte_count; ad->hdrCount += k; if (ad->hdrCount >= 40) { - ad->state = 1; + ad->state = AUDIO_DEC_STATE_HEADER_HANDLED; } byte_count -= k; } else { - ad->state = 1; + ad->state = AUDIO_DEC_STATE_HEADER_HANDLED; } } ad->size = ad->size / 1024 * 1024; diff --git a/src/audio/decoder/audio_dec_reset.c b/src/audio/decoder/audio_dec_reset.c index dec9bd089d..c52f9bf426 100644 --- a/src/audio/decoder/audio_dec_reset.c +++ b/src/audio/decoder/audio_dec_reset.c @@ -5,8 +5,11 @@ extern s32 snd_reset_movie_sound() __asm__("func_0012F0A8"); void audio_dec_reset(struct AudioDec *dec) __asm__("FUN_0023ad10"); void audio_dec_reset(struct AudioDec *dec) { + enum { + AUDIO_DEC_STATE_RESET = 0 + }; snd_reset_movie_sound(); - dec->state = 0; + dec->state = AUDIO_DEC_STATE_RESET; dec->hdrCount = 0; dec->put = 0; dec->count = 0; diff --git a/src/audio/decoder/audio_dec_send.c b/src/audio/decoder/audio_dec_send.c index a3a1fe1dfa..33ffa535c3 100644 --- a/src/audio/decoder/audio_dec_send.c +++ b/src/audio/decoder/audio_dec_send.c @@ -5,7 +5,10 @@ extern s32 send_adpcm() __asm__("FUN_0023afc0"); void audio_dec_send(struct AudioDec *dec) __asm__("FUN_0023aef0"); void audio_dec_send(struct AudioDec *dec) { - if (dec->state != 0) { + enum { + AUDIO_DEC_SEND_DISABLED = 0 + }; + if (dec->state != AUDIO_DEC_SEND_DISABLED) { send_adpcm(); } } diff --git a/src/audio/decoder/audio_dec_start.c b/src/audio/decoder/audio_dec_start.c index 923df9c409..49817395c2 100644 --- a/src/audio/decoder/audio_dec_start.c +++ b/src/audio/decoder/audio_dec_start.c @@ -5,6 +5,9 @@ extern s32 snd_start_movie_sound() __asm__("func_0012F108"); void audio_dec_start(struct AudioDec *dec) __asm__("FUN_0023acb8"); void audio_dec_start(struct AudioDec *dec) { + enum { + AUDIO_DEC_STATE_STARTED = 2 + }; s32 buff_size; s32 channel_count; s32 four; @@ -18,7 +21,7 @@ void audio_dec_start(struct AudioDec *dec) { dec->iopZero, dec->hdr.rate, channel_count); - dec->state = 2; + dec->state = AUDIO_DEC_STATE_STARTED; /* Fakematch: GCC removes both stores, but the read-modify-write sequence gives hdr.ch retail's register. */ dec->hdr.ch++; diff --git a/src/audio/music/music_stop.c b/src/audio/music/music_stop.c index 9235a63927..5a104e3ebf 100644 --- a/src/audio/music/music_stop.c +++ b/src/audio/music/music_stop.c @@ -8,6 +8,9 @@ extern s32 snd_stream_safe_check_cd_idle() __asm__("func_0012ED30"); void music_stop(void) __asm__("FUN_00215ee8"); void music_stop(void) { + enum { + MUSIC_CROSSFADE_IDLE = 0 + }; s32 requested_track; if (music_stream_state.primary.handle == 0xFFFFFFFF) { @@ -42,7 +45,7 @@ void music_stop(void) { music_stream_state.transition.state = 0; music_stream_state.transition.flags = 0; music_stream_state.transition.handle = 0; - music_stream_state.crossfade_state = 0; + music_stream_state.crossfade_state = MUSIC_CROSSFADE_IDLE; music_stream_state.requested_track = -1; music_stream_state.requested_transition_track = -1; } diff --git a/src/audio/music/music_update.c b/src/audio/music/music_update.c index f3342106f5..12c069c962 100644 --- a/src/audio/music/music_update.c +++ b/src/audio/music/music_update.c @@ -28,6 +28,11 @@ void music_update(void) { CROSSFADE_WAIT_TO_CONTINUE_PRIMARY = 4, CROSSFADE_WAIT_TO_RESET = 5 }; + enum { + CROSSFADE_IDLE = 0, + CD_READ_STATE_IDLE = 0, + CD_READ_STATE_PENDING_RETRY = 2 + }; s8 requested_track; s32 fade_volume; s32 handle; @@ -55,7 +60,7 @@ void music_update(void) { } if (fast_dec_timer(&music_stream_state.retry_timer) != 0) { requested_track = music_stream_state.requested_track; - if (requested_track != -1 && music_stream_state.crossfade_state == 0) { + if (requested_track != -1 && music_stream_state.crossfade_state == CROSSFADE_IDLE) { if (music_stream_state.primary.track != requested_track) { if (music_stream_state.requested_transition_track == -1 || music_transition(requested_track, @@ -97,7 +102,7 @@ void music_update(void) { music_stream_state.transition.crossfade_enabled == 0) && music_stream_state.transition.handle == 0) || (handle = music_stream_state.primary.handle) == 0) { - music_stream_state.crossfade_state = 3; + music_stream_state.crossfade_state = CROSSFADE_WAIT_TO_PRESEEK_PRIMARY; music_stream_state.primary.state = 5; } else if (music_stream_state.primary.state != 9) { /* The callback receives the old handle; mark its slot pending before submission. */ @@ -120,7 +125,7 @@ void music_update(void) { music_stream_state.primary.flags, music_stream_state.primary.volume); music_stream_state.requested_track = -1; - music_stream_state.crossfade_state = 4; + music_stream_state.crossfade_state = CROSSFADE_WAIT_TO_CONTINUE_PRIMARY; } break; case CROSSFADE_WAIT_TO_CONTINUE_PRIMARY: @@ -132,14 +137,14 @@ void music_update(void) { music_stream_state.transition.handle == 0)) { snd_continue_vag_stream(music_stream_state.primary.handle); music_stream_state.primary.state = 8; - music_stream_state.crossfade_state = 5; + music_stream_state.crossfade_state = CROSSFADE_WAIT_TO_RESET; } } break; case CROSSFADE_WAIT_TO_RESET: if (music_stream_state.transition.state != 4 || music_stream_state.transition.crossfade_enabled == 0) { - music_stream_state.crossfade_state = 0; + music_stream_state.crossfade_state = CROSSFADE_IDLE; } break; } @@ -149,17 +154,17 @@ void music_update(void) { music_update_stream(&music_stream_state.secondary.handle); if (music_stream_state.break_requested != 0) { if (snd_stream_safe_cd_sync(1) == 0) { - music_stream_state.read_state = 0; + music_stream_state.read_state = CD_READ_STATE_IDLE; music_stream_state.break_requested = 0; } } else { pending_state = music_stream_state.read_state; - if (pending_state == 2) { - music_stream_state.read_state = 0; + if (pending_state == CD_READ_STATE_PENDING_RETRY) { + music_stream_state.read_state = CD_READ_STATE_IDLE; start_audio_stream_read(music_stream_state.read_dst, music_stream_state.read_sector, music_stream_state.read_sector_count); - if (music_stream_state.read_state == 0) { + if (music_stream_state.read_state == CD_READ_STATE_IDLE) { music_stream_state.read_state = pending_state; } } diff --git a/src/audio/music/music_update_stream.c b/src/audio/music/music_update_stream.c index 1c9a5a5f36..36794746b4 100644 --- a/src/audio/music/music_update_stream.c +++ b/src/audio/music/music_update_stream.c @@ -36,20 +36,26 @@ extern void set_sound_handle_id(int, long) __asm__("func_00216B68"); void music_update_stream(MusicPlaying *p) __asm__("FUN_002160a8"); void music_update_stream(MusicPlaying *music_stream) { + enum { + MUSIC_STREAM_STATE_INACTIVE = 0, + MUSIC_STREAM_STATE_WAITING_FOR_BUFFER = 2, + MUSIC_STREAM_STATE_STOP_REQUESTED = 5, + MUSIC_STREAM_STATE_STOPPING = 6 + }; int sound_handle; if (music_stream->state != 9 && music_stream->handle != 0 && music_stream->handle != 0xFFFFFFFF) { - if (music_stream->state == 5) { + if (music_stream->state == MUSIC_STREAM_STATE_STOP_REQUESTED) { if (music_stream->handle != 0) { snd_stop_sound(music_stream->handle); - music_stream->state = 6; + music_stream->state = MUSIC_STREAM_STATE_STOPPING; } else { - music_stream->state = 0; + music_stream->state = MUSIC_STREAM_STATE_INACTIVE; } - } else if (music_stream->state == 6) { + } else if (music_stream->state == MUSIC_STREAM_STATE_STOPPING) { if (music_stream->handle == 0) { - music_stream->state = 0; + music_stream->state = MUSIC_STREAM_STATE_INACTIVE; } } if (music_stream->handle == 0) { @@ -73,7 +79,8 @@ void music_update_stream(MusicPlaying *music_stream) { if (music_stream->state == 1 || music_stream->state == 8 || music_stream->state == 9) { return; } - if (music_stream->state != 2 && music_stream->state != 3) { + if (music_stream->state != MUSIC_STREAM_STATE_WAITING_FOR_BUFFER && + music_stream->state != 3) { sound_handle = music_stream->handle; music_stream->handle = 0xFFFFFFFF; snd_get_vag_stream_time_remaining_cb( @@ -82,13 +89,14 @@ void music_update_stream(MusicPlaying *music_stream) { sound_handle, set_sound_handle_id, (long)(unsigned int)music_stream); return; } - if (music_stream->handle != 0xFFFFFFFF && music_stream->state == 2) { + if (music_stream->handle != 0xFFFFFFFF && + music_stream->state == MUSIC_STREAM_STATE_WAITING_FOR_BUFFER) { snd_is_vag_stream_buffered_cb(music_stream->handle, music_channel_ready_callback, (long)(unsigned int)music_stream); } } else if (music_stream->state == 7 || music_stream->handle == 0) { - music_stream->state = 0; + music_stream->state = MUSIC_STREAM_STATE_INACTIVE; } } diff --git a/src/audio/sound/voice_start_callback.c b/src/audio/sound/voice_start_callback.c index 755ecbaf60..dd03306ac5 100644 --- a/src/audio/sound/voice_start_callback.c +++ b/src/audio/sound/voice_start_callback.c @@ -14,7 +14,7 @@ void voice_start_callback(int handle, long voice_record_address) { } else { voice->owner = 0; voice->owner_context = 0; - voice->state = 0; + voice->state = VOICE_SLOT_FREE; } } } diff --git a/src/audio/sound/voice_update_callback.c b/src/audio/sound/voice_update_callback.c index fdc46f4be9..813af24c8c 100644 --- a/src/audio/sound/voice_update_callback.c +++ b/src/audio/sound/voice_update_callback.c @@ -10,7 +10,7 @@ void voice_update_callback(int handle, long voice_state_address) { if (handle == 0) { voice->owner = 0; voice->owner_context = 0; - voice->state = 0; + voice->state = VOICE_SLOT_FREE; } } } diff --git a/src/audio/streaming/advance_audio_stream_state.c b/src/audio/streaming/advance_audio_stream_state.c index 815018ebd0..54f7e37dc3 100644 --- a/src/audio/streaming/advance_audio_stream_state.c +++ b/src/audio/streaming/advance_audio_stream_state.c @@ -34,10 +34,13 @@ s32 advance_audio_stream_state(struct AudioStream *stream) { AUDIO_STREAM_START_SECOND_READ = 2, AUDIO_STREAM_WAIT_SECOND_READ = 3 }; + enum { + CD_READ_STATE_IDLE = 0 + }; switch (stream->unk44) { case AUDIO_STREAM_START_FIRST_READ: - if (stream->unk48 == 0 || music_stream_state.read_state != 0) { + if (stream->unk48 == 0 || music_stream_state.read_state != CD_READ_STATE_IDLE) { break; } if (disc_table.unk2C8[game_language].size == 0) { @@ -52,12 +55,12 @@ s32 advance_audio_stream_state(struct AudioStream *stream) { } break; case AUDIO_STREAM_WAIT_FIRST_READ: - if (music_stream_state.read_state == 0) { + if (music_stream_state.read_state == CD_READ_STATE_IDLE) { stream->unk44 = 2; } break; case AUDIO_STREAM_START_SECOND_READ: - if (stream->unk4C == 0 || music_stream_state.read_state != 0) { + if (stream->unk4C == 0 || music_stream_state.read_state != CD_READ_STATE_IDLE) { break; } if (disc_table.unk2F8[game_language].size == 0) { @@ -72,7 +75,7 @@ s32 advance_audio_stream_state(struct AudioStream *stream) { } break; case AUDIO_STREAM_WAIT_SECOND_READ: - if (music_stream_state.read_state == 0) { + if (music_stream_state.read_state == CD_READ_STATE_IDLE) { stream->unk44 = 4; } break; diff --git a/src/audio/streaming/finish_audio_stream_read.c b/src/audio/streaming/finish_audio_stream_read.c index 46b204b961..eb2f00cf6e 100644 --- a/src/audio/streaming/finish_audio_stream_read.c +++ b/src/audio/streaming/finish_audio_stream_read.c @@ -7,10 +7,14 @@ extern s32 snd_stream_safe_cd_get_error() __asm__("func_0012EEF0"); void finish_audio_stream_read(s32 callback_value) __asm__("FUN_00216950"); void finish_audio_stream_read(s32 callback_value) { + enum { + MUSIC_STREAM_READ_IDLE = 0, + MUSIC_STREAM_READ_RETRY_PENDING = 2 + }; if (callback_value == 1) { - music_stream_state.read_state = 0; + music_stream_state.read_state = MUSIC_STREAM_READ_IDLE; if (snd_stream_safe_cd_get_error() != 0) { - music_stream_state.read_state = 2; + music_stream_state.read_state = MUSIC_STREAM_READ_RETRY_PENDING; } } } diff --git a/src/audio/streaming/music_callbacks/music_primary_preseek_callback.c b/src/audio/streaming/music_callbacks/music_primary_preseek_callback.c index d3e1bfa357..3597b30d9d 100644 --- a/src/audio/streaming/music_callbacks/music_primary_preseek_callback.c +++ b/src/audio/streaming/music_callbacks/music_primary_preseek_callback.c @@ -5,13 +5,17 @@ extern void music_preseek_track(s32, s32, s32) __asm__("func_00215B68"); void music_primary_preseek_callback(u32 handle, s64 context) __asm__("FUN_00216a20"); void music_primary_preseek_callback(u32 handle, s64 stream_channel_address) { + enum { + MUSIC_STREAM_STATE_PRESEEK_PENDING = 1, + MUSIC_STREAM_STATE_PRESEEK_HANDLE_RECEIVED = 2 + }; struct MusicStreamChannel *channel = (struct MusicStreamChannel *)(s32)stream_channel_address; if (channel != 0) { channel->handle = handle; if (handle != 0) { - if (channel->state == 1) { - channel->state = 2; + if (channel->state == MUSIC_STREAM_STATE_PRESEEK_PENDING) { + channel->state = MUSIC_STREAM_STATE_PRESEEK_HANDLE_RECEIVED; } } else { music_preseek_track(music_stream_state.primary.track, diff --git a/src/audio/streaming/music_callbacks/music_primary_replace_callback.c b/src/audio/streaming/music_callbacks/music_primary_replace_callback.c index 8cfa95f54d..7da9c8864b 100644 --- a/src/audio/streaming/music_callbacks/music_primary_replace_callback.c +++ b/src/audio/streaming/music_callbacks/music_primary_replace_callback.c @@ -6,7 +6,7 @@ void music_primary_replace_callback(int result, long context) __asm__("FUN_00216 void music_primary_replace_callback(int callback_result, long channel_state_address) { short *channel_state = (short *)(int)channel_state_address; - if (channel_state != 0) { + if (channel_state != NULL) { if (callback_result < 0) { *(int *)channel_state = callback_result; } diff --git a/src/audio/streaming/music_callbacks/music_remaining_time_callback.c b/src/audio/streaming/music_callbacks/music_remaining_time_callback.c index dca2f8c472..8191e0c675 100644 --- a/src/audio/streaming/music_callbacks/music_remaining_time_callback.c +++ b/src/audio/streaming/music_callbacks/music_remaining_time_callback.c @@ -8,6 +8,10 @@ void music_remaining_time_callback(int remaining_time, long context) __asm__("FU enabled on the channel and crossfade_state 1, moves crossfade_state to 2 and copies the time (and a quarter of it) into the crossfade fields. */ void music_remaining_time_callback(int remaining_time, long channel_context) { + enum { + MUSIC_CROSSFADE_AWAITING_REMAINING_TIME = 1, + MUSIC_CROSSFADE_TIMING_INITIALIZED = 2 + }; struct MusicStreamChannel *channel = (struct MusicStreamChannel *)(int)channel_context; struct MusicStreamState *music_state; if (channel == 0) { @@ -18,13 +22,13 @@ void music_remaining_time_callback(int remaining_time, long channel_context) { return; } music_state = &music_stream_state; - if (music_state->crossfade_state != 1) { + if (music_state->crossfade_state != MUSIC_CROSSFADE_AWAITING_REMAINING_TIME) { return; } if (remaining_time == 0) { return; } - music_state->crossfade_state = 2; + music_state->crossfade_state = MUSIC_CROSSFADE_TIMING_INITIALIZED; music_state->crossfade_remaining_time = channel->remaining_time; music_state->crossfade_interval = channel->remaining_time / 4; } diff --git a/src/audio/streaming/music_callbacks/music_secondary_start_callback.c b/src/audio/streaming/music_callbacks/music_secondary_start_callback.c index 850dbdc9ad..152bf79269 100644 --- a/src/audio/streaming/music_callbacks/music_secondary_start_callback.c +++ b/src/audio/streaming/music_callbacks/music_secondary_start_callback.c @@ -5,13 +5,17 @@ extern void music_start_track_by_id(s32, s32, s32) __asm__("func_00215970"); void music_secondary_start_callback(u32 handle, s64 context) __asm__("FUN_002169c0"); void music_secondary_start_callback(u32 handle, s64 channel_context) { + enum { + MUSIC_CHANNEL_START_PENDING = 1, + MUSIC_CHANNEL_START_ACKNOWLEDGED = 2 + }; struct MusicStreamChannel *channel = (struct MusicStreamChannel *)(s32)channel_context; if (channel != 0) { channel->handle = handle; if (handle != 0) { - if (channel->state == 1) { - channel->state = 2; + if (channel->state == MUSIC_CHANNEL_START_PENDING) { + channel->state = MUSIC_CHANNEL_START_ACKNOWLEDGED; } } else { music_start_track_by_id(music_stream_state.secondary.track, diff --git a/src/audio/streaming/music_callbacks/music_transition_start_callback.c b/src/audio/streaming/music_callbacks/music_transition_start_callback.c index 8766d91afd..32dae6bc5e 100644 --- a/src/audio/streaming/music_callbacks/music_transition_start_callback.c +++ b/src/audio/streaming/music_callbacks/music_transition_start_callback.c @@ -6,7 +6,7 @@ void music_transition_start_callback(int handle, long context) __asm__("FUN_0021 void music_transition_start_callback(int handle, long channel_state_address) { short *channel_state = (short *)(int)channel_state_address; - if (channel_state != 0) { + if (channel_state != NULL) { *(int *)channel_state = handle; if (handle != 0) { short previous_state = channel_state[5]; diff --git a/src/audio/streaming/read_disc_sectors_and_wait.c b/src/audio/streaming/read_disc_sectors_and_wait.c index 86d4494379..eb5cb96ceb 100644 --- a/src/audio/streaming/read_disc_sectors_and_wait.c +++ b/src/audio/streaming/read_disc_sectors_and_wait.c @@ -12,16 +12,19 @@ extern s32 start_audio_stream_read(s32 dst, s32 sector, s32 sector_count) __asm_ s32 read_disc_sectors_and_wait(s32 dst, s32 sector, s32 sector_count) __asm__("FUN_00216828"); s32 read_disc_sectors_and_wait(s32 cd_read_destination, s32 sector, s32 sector_count) { + enum { + CD_READ_STATE_IDLE = 0 + }; s32 read_byte_count = start_audio_stream_read(cd_read_destination, sector, sector_count); - if (read_byte_count != 0 && music_stream_state.read_state != 0) { + if (read_byte_count != 0 && music_stream_state.read_state != CD_READ_STATE_IDLE) { do { sceGsSyncV(0); music_update(); snd_reset_state_and_flush_commands(); snd_flush_sound_commands(); snd_hold_command_batches(); - } while (music_stream_state.read_state != 0); + } while (music_stream_state.read_state != CD_READ_STATE_IDLE); } return read_byte_count; } diff --git a/src/audio/streaming/request_audio_stream_break.c b/src/audio/streaming/request_audio_stream_break.c index 34f885f6cb..28a609c6f5 100644 --- a/src/audio/streaming/request_audio_stream_break.c +++ b/src/audio/streaming/request_audio_stream_break.c @@ -7,7 +7,10 @@ extern s32 snd_stream_safe_cd_break() __asm__("func_0012EEA8"); void request_audio_stream_break(s32 unused_parameter) __asm__("FUN_002166e8"); void request_audio_stream_break(s32 unused_parameter) { - if (music_stream_state.read_state != 0) { + enum { + MUSIC_STREAM_READ_INACTIVE = 0 + }; + if (music_stream_state.read_state != MUSIC_STREAM_READ_INACTIVE) { snd_stream_safe_cd_break(); music_stream_state.break_requested = 1; } diff --git a/src/audio/streaming/safe_cd/snd_stream_safe_cd_sync.c b/src/audio/streaming/safe_cd/snd_stream_safe_cd_sync.c index 13119d9638..1950675f50 100644 --- a/src/audio/streaming/safe_cd/snd_stream_safe_cd_sync.c +++ b/src/audio/streaming/safe_cd/snd_stream_safe_cd_sync.c @@ -10,6 +10,9 @@ extern void snd_flush_sound_commands(void) __asm__("func_0012DC80"); s32 snd_stream_safe_cd_sync(s32 mode) __asm__("FUN_0012ee08"); s32 snd_stream_safe_cd_sync(s32 mode) { + enum { + SND_CD_SYNC_NONBLOCKING = 1 + }; s32 ready; s32 next_ready; if (snd_cd_stream_active == 0) { @@ -19,7 +22,7 @@ s32 snd_stream_safe_cd_sync(s32 mode) { ready = sound_read_work.read_active == 0; snd_cd_stream_end_pending = ready; if (ready != 1) { - if (mode == 1) { + if (mode == SND_CD_SYNC_NONBLOCKING) { return 1; } if (ready == 0) { diff --git a/src/audio/streaming/start_audio_stream_read.c b/src/audio/streaming/start_audio_stream_read.c index 537a4f85e8..3f0578b7ab 100644 --- a/src/audio/streaming/start_audio_stream_read.c +++ b/src/audio/streaming/start_audio_stream_read.c @@ -8,11 +8,15 @@ extern s32 snd_stream_safe_cd_read() __asm__("func_0012ED58"); s32 start_audio_stream_read(s32 dst, s32 sector, s32 sector_count) __asm__("FUN_00216788"); s32 start_audio_stream_read(s32 read_destination, s32 sector, s32 sector_count) { - if ((music_stream_state.read_state == 0) && (sector_count != 0)) { + enum { + CD_READ_STATE_IDLE = 0, + CD_READ_STATE_ACTIVE = 1 + }; + if ((music_stream_state.read_state == CD_READ_STATE_IDLE) && (sector_count != 0)) { if (snd_stream_safe_cd_read( sector, sector_count, read_destination, &music_stream_state.cd_mode) != 0) { music_stream_state.read_dst = read_destination; - music_stream_state.read_state = 1; + music_stream_state.read_state = CD_READ_STATE_ACTIVE; music_stream_state.read_sector = sector; music_stream_state.read_sector_count = sector_count; return sector_count << 0xB; diff --git a/src/audio/streaming/update_audio_stream_until_idle.c b/src/audio/streaming/update_audio_stream_until_idle.c index 5b2e61c2ef..6e195dbb9b 100644 --- a/src/audio/streaming/update_audio_stream_until_idle.c +++ b/src/audio/streaming/update_audio_stream_until_idle.c @@ -10,15 +10,18 @@ extern s32 music_update() __asm__("func_00216290"); s16 update_audio_stream_until_idle(s32 wait_for_completion) __asm__("FUN_002168a8"); s16 update_audio_stream_until_idle(s32 wait_for_completion) { + enum { + AUDIO_STREAM_READ_IDLE = 0 + }; if (wait_for_completion != 0) { - if (music_stream_state.read_state != 0) { + if (music_stream_state.read_state != AUDIO_STREAM_READ_IDLE) { do { sceGsSyncV(0); music_update(); snd_reset_state_and_flush_commands(); snd_flush_sound_commands(); snd_hold_command_batches(); - } while (music_stream_state.read_state != 0); + } while (music_stream_state.read_state != AUDIO_STREAM_READ_IDLE); } } else { music_update(); diff --git a/src/audio/voices/allocate_voice_slot.c b/src/audio/voices/allocate_voice_slot.c index 44fcf095d7..8e35bc7a49 100644 --- a/src/audio/voices/allocate_voice_slot.c +++ b/src/audio/voices/allocate_voice_slot.c @@ -28,6 +28,9 @@ s32 allocate_voice_slot(VoiceDefinition *, u32, VoiceMoby *, VoiceVector *, s32) s32 allocate_voice_slot( VoiceDefinition *definition, u32 flags, VoiceMoby *moby, VoiceVector *position, s32 volume) { + enum { + VOICE_DEFINITION_SOURCE_INACTIVE = 0 + }; s32 volume_offset; s32 pitch_bend_max; s32 pitch_bend_min; @@ -41,7 +44,7 @@ s32 allocate_voice_slot( VoicePoolWindow *pitch_slot; VoicePoolWindow *position_slot; - source_inactive = definition->source_state == 0; + source_inactive = definition->source_state == VOICE_DEFINITION_SOURCE_INACTIVE; if ((flags & 4) == 0) { if ((source_inactive ^ 1) != 0) { volume_or_slot_index = -1; diff --git a/src/audio/voices/pause_all_sounds.c b/src/audio/voices/pause_all_sounds.c index 3165f6326f..a8fbf4c650 100644 --- a/src/audio/voices/pause_all_sounds.c +++ b/src/audio/voices/pause_all_sounds.c @@ -30,7 +30,8 @@ extern s32 D_00141660[]; extern u8 D_0014161B NOT_SDA; extern s32 D_0015EEA0_macro __asm__("D_0015EEA0") MACRO_ADDR; extern s32 alternate_animation_sequence_macro __asm__("D_0015EE20") MACRO_ADDR; -extern s32 D_001D0398[]; /* help_history_list list.selected */ +extern s32 + help_history_selected_index[] __asm__("D_001D0398"); /* help_history_list list.selected */ extern void update_skill_point_and_gold_weapon_menu_entries() __asm__("func_00226E58"); @@ -93,7 +94,7 @@ void pause_all_sounds(s32 mode) { } } update_mission_list(); - D_001D0398[0] = 0; + help_history_selected_index[0] = 0; update_skill_point_and_gold_weapon_menu_entries(); { struct MenuSystem *g = &menu_system; diff --git a/src/audio/voices/sound_update.c b/src/audio/voices/sound_update.c index f82d5fa629..c72f174ecc 100644 --- a/src/audio/voices/sound_update.c +++ b/src/audio/voices/sound_update.c @@ -145,7 +145,7 @@ s32 sound_update(void) { for (slot_index = 0; slot_index < 30; slot_index++) { { s32 state = voice_pool.voices[slot_index].state; - if (state != 7) { + if (state != VOICE_SLOT_START_QUEUED) { if (voice_pool.voices[slot_index].handle == 0) { continue; } @@ -172,15 +172,16 @@ s32 sound_update(void) { } { s32 state = voice_pool.voices[slot_index].state; - if (state == 4 || (state != 6 && owner_removed && - voice_pool.voices[slot_index].definition->source_state != 0)) { + if (state == VOICE_SLOT_STOP_REQUESTED || + (state != VOICE_SLOT_STOP_PENDING && owner_removed && + voice_pool.voices[slot_index].definition->source_state != 0)) { voice_flags[slot_index] = 0x20; continue; } } if (game_mode != 0 && game_mode != 2 && game_mode != 6) { s32 state = voice_pool.voices[slot_index].state; - if (state != 7) { + if (state != VOICE_SLOT_START_QUEUED) { voice_flags[slot_index] = 0x10; continue; } @@ -252,7 +253,7 @@ s32 sound_update(void) { } { s32 state = voice_pool.voices[slot_index].state; - if (state == 7) { + if (state == VOICE_SLOT_START_QUEUED) { if ((game_mode != 0 && game_mode != 2) || boot_level_active != 0) { continue; } @@ -342,7 +343,7 @@ s32 sound_update(void) { if (command_flags & 0x20) { { s32 state = voice_pool.voices[slot_index].state; - if (state == 7) { + if (state == VOICE_SLOT_START_QUEUED) { voice_pool.voices[slot_index].owner = NULL; voice_pool.voices[slot_index].owner_context = 0; voice_pool.voices[slot_index].state = 0; @@ -378,7 +379,7 @@ s32 sound_update(void) { } { s32 state = voice_pool.voices[slot_index].state; - if (state != 7) { + if (state != VOICE_SLOT_START_QUEUED) { snd_set_sound_params_cb(handle, parameter_mask, voice_volumes[slot_index], diff --git a/src/camera/advance_alternate_camera_transition.c b/src/camera/advance_alternate_camera_transition.c index 81cdee2b1d..49d5a1ffa4 100644 --- a/src/camera/advance_alternate_camera_transition.c +++ b/src/camera/advance_alternate_camera_transition.c @@ -38,6 +38,9 @@ int advance_alternate_camera_transition(char *target_camera, struct CameraOrbit *orbit) __asm__("FUN_001eccd8"); int advance_alternate_camera_transition(char *target_camera, struct CameraOrbit *orbit) { + enum { + CAMERA_TRANSITION_KIND_STORED_FOCUS_ORBIT = 2 + }; CameraVector orbit_angles; CameraVector forward_axis; CameraVector horizontal_axis; @@ -66,7 +69,7 @@ int advance_alternate_camera_transition(char *target_camera, struct CameraOrbit } step = 1.0f / cosine_interpolate( 1.0f, (f32)orbit->start_count, (f32)orbit->frames * orbit->frame_step); - if (cam_trans_state.kind == 2) { + if (cam_trans_state.kind == CAMERA_TRANSITION_KIND_STORED_FOCUS_ORBIT) { qcopy(&focus_position, D_0013F3D0); qcopy(&forward_axis, orbit->forward); qcopy(&vertical_axis, orbit->up); diff --git a/src/camera/camera_activation_check_priority.c b/src/camera/camera_activation_check_priority.c index 9e32090a7d..c957200651 100644 --- a/src/camera/camera_activation_check_priority.c +++ b/src/camera/camera_activation_check_priority.c @@ -37,6 +37,9 @@ int camera_activation_check_priority(struct UpdateCam *candidate, struct UpdateC enum { CAMERA_COMPARE_ACCEPT = 1 }; + enum { + CAMERA_TRANSITION_PRIORITY_GATED = 0 + }; struct CameraActivation *activation = (struct CameraActivation *)&candidate->state; if (candidate->active == 0) { @@ -64,7 +67,7 @@ int camera_activation_check_priority(struct UpdateCam *candidate, struct UpdateC if (current == 0) { return 1; } - if (current->transition_state != 0) { + if (current->transition_state != CAMERA_TRANSITION_PRIORITY_GATED) { return 1; } if (activation->priority > current->active) { @@ -74,7 +77,7 @@ int camera_activation_check_priority(struct UpdateCam *candidate, struct UpdateC case CAMERA_ACTIVATION_IN_CLIP_VOLUME: { char *camera_descriptor_bytes = (char *)D_0015EF90[candidate->descriptor_index].unk1C; - if (current != 0 && current->transition_state == 0 && + if (current != 0 && current->transition_state == CAMERA_TRANSITION_PRIORITY_GATED && !(activation->priority > current->active)) { return 0; } @@ -90,7 +93,8 @@ int camera_activation_check_priority(struct UpdateCam *candidate, struct UpdateC if (listener_group != hero_state->unk2284) { return 0; } - if (current->transition_state == 0 && !(activation->priority > current->active)) { + if (current->transition_state == CAMERA_TRANSITION_PRIORITY_GATED && + !(activation->priority > current->active)) { return 0; } if (listener_group != 3) { diff --git a/src/camera/refresh_camera_control_flags.c b/src/camera/refresh_camera_control_flags.c index 5952577363..6b6c05c812 100644 --- a/src/camera/refresh_camera_control_flags.c +++ b/src/camera/refresh_camera_control_flags.c @@ -20,6 +20,9 @@ extern struct CameraTrackingControl cam_coll_state __asm__("D_001870D0"); void refresh_camera_control_flags(void) __asm__("FUN_001ed940"); void refresh_camera_control_flags(void) { + enum { + CAMERA_TRACKING_BASE_CONTROL_MASK = 0xB4 + }; struct CameraTrackingControl *tracking; tracking = &cam_coll_state; @@ -32,7 +35,7 @@ void refresh_camera_control_flags(void) { } cam_coll_flag_prev = cam_coll_flag; cam_coll_flag |= 0x80; - cam_coll_mode = 0xB4; + cam_coll_mode = CAMERA_TRACKING_BASE_CONTROL_MASK; if (hero.selector_1 != 0) { tracking->control_selector = 0x100; cam_coll_mode = 0x1B4; @@ -47,7 +50,7 @@ void refresh_camera_control_flags(void) { cam_coll_mode = 0xDB4; } else if (hero.base_condition != 0) { tracking->control_selector = 0; - cam_coll_mode = 0xB4; + cam_coll_mode = CAMERA_TRACKING_BASE_CONTROL_MASK; } else { cam_coll_mode = tracking->control_selector | 0xB4; } diff --git a/src/camera/save_camera_vectors.c b/src/camera/save_camera_vectors.c index 34c87cba13..e7745f7167 100644 --- a/src/camera/save_camera_vectors.c +++ b/src/camera/save_camera_vectors.c @@ -7,8 +7,11 @@ void save_camera_vectors(void) __asm__("FUN_001ec7f0"); void save_camera_vectors(void) { + enum { + CAMERA_TRANSITION_PRIMARY_SOLVER = 0 + }; struct CameraTransition *transition = &cam_trans_state; - if (transition->kind == 0) { + if (transition->kind == CAMERA_TRANSITION_PRIMARY_SOLVER) { qcopy(transition->orbit.saved_position, transition->blend.position); if (transition->requested_kind == 2) { fast_vec_add( diff --git a/src/camera/start_camera_blend.c b/src/camera/start_camera_blend.c index 564ff78f14..b361de0c31 100644 --- a/src/camera/start_camera_blend.c +++ b/src/camera/start_camera_blend.c @@ -17,13 +17,17 @@ extern void extract_matrix_rotation_quaternion(void *, void *) __asm__("func_00 void start_camera_blend(struct UpdateCam *source) __asm__("FUN_001ec8a0"); void start_camera_blend(struct UpdateCam *source) { + enum { + CAMERA_TRANSITION_KIND_BLEND = 0, + CAMERA_TRANSITION_PHASE_SEED_FROM_SOURCE = 1 + }; struct CameraTransition *transition = &cam_trans_state; char orbit_reference_direction[16]; char orbit_yaw_side_direction[16]; char orbit_axis[16]; unsigned char sub; - if (transition->mode == 1) { + if (transition->mode == CAMERA_TRANSITION_PHASE_SEED_FROM_SOURCE) { sub = transition->requested_kind; if (sub == 0) { qcopy(transition->blend.position, &source->pos); @@ -33,11 +37,13 @@ void start_camera_blend(struct UpdateCam *source) { extract_matrix_rotation_quaternion(transition->orbit.saved_rotation, source); capture_camera_orientation(); } else { - struct Hero *g = &hero; + struct Hero *orbit_reference_hero = &hero; - fast_vec_normalize(orbit_reference_direction, &g->moby->rot_row0, 1.0f); - fast_vec_normalize(orbit_yaw_side_direction, &g->moby->rot_row1, 1.0f); - fast_vec_normalize(orbit_axis, &g->moby->rot_row2, 1.0f); + fast_vec_normalize( + orbit_reference_direction, &orbit_reference_hero->moby->rot_row0, 1.0f); + fast_vec_normalize( + orbit_yaw_side_direction, &orbit_reference_hero->moby->rot_row1, 1.0f); + fast_vec_normalize(orbit_axis, &orbit_reference_hero->moby->rot_row2, 1.0f); /* PreviewCamera.current_camera, reached from this base. */ compute_camera_angles(transition->orbit.angles, &source->pos, @@ -62,7 +68,7 @@ void start_camera_blend(struct UpdateCam *source) { } cam_trans_state_lui = 3; transition->kind = transition->requested_kind; - if (transition->kind == 0) { + if (transition->kind == CAMERA_TRANSITION_KIND_BLEND) { struct CameraBlend *blend = &transition->blend; blend->position_rate = blend->configured_position_rate; diff --git a/src/camera/switch_active_camera_record.c b/src/camera/switch_active_camera_record.c index 7565689b40..c2a944f5bc 100644 --- a/src/camera/switch_active_camera_record.c +++ b/src/camera/switch_active_camera_record.c @@ -50,6 +50,26 @@ void switch_active_camera_record(struct UpdateCam *next_camera) __asm__("FUN_001 extern CameraDescriptor *D_0015EF90; void switch_active_camera_record(struct UpdateCam *next_camera) { + enum { + CAMERA_TRANSITION_RATE_BASED = 0, + CAMERA_HANDOFF_NONE = 0, + CAMERA_DESCRIPTOR_RATE_TRANSITION = 1, + CAMERA_HANDOFF_INHERITED_TRANSFORM = 2, + CAMERA_TRANSITION_FRAME_COUNT_BASED = 2, + CAMERA_DESCRIPTOR_INHERIT_TRANSFORM = 3, + CAMERA_DESCRIPTOR_FRAME_COUNT_TRANSITION = 5, + CAMERA_DESCRIPTOR_INHERIT_TRANSFORM_WITH_RATE_TRANSITION = 6 + }; + enum { + CAMERA_TRANSITION_STATE_CLEARED = 0, + CAMERA_TRANSITION_STATE_REQUEST_TRANSITION = 2, + CAMERA_TRANSITION_STATE_INHERIT_TRANSFORM = 3, + CAMERA_TRANSITION_STATE_BLOCK_ACTIVATION = 4, + CAMERA_TRANSITION_STATE_INHERIT_TRANSFORM_WITH_RATE_TRANSITION = 5 + }; + enum { + CAMERA_DESCRIPTOR_NULL_FALLBACK = 0 + }; struct UpdateCam *previous_camera; CameraDescriptorInfo *descriptor; f32 transition_duration; @@ -57,7 +77,7 @@ void switch_active_camera_record(struct UpdateCam *next_camera) { f32 handoff_duration; f32 *previous_position; Vec4f *position; - s32 descriptor_kind = 0; + s32 descriptor_kind = CAMERA_DESCRIPTOR_NULL_FALLBACK; s32 previous_transition_state; descriptor = D_0015EF90[next_camera->descriptor_index].descriptor; @@ -66,12 +86,14 @@ void switch_active_camera_record(struct UpdateCam *next_camera) { if (descriptor != 0) { descriptor_kind = descriptor->descriptor_kind; } - if (previous_transition_state == 4) { + if (previous_transition_state == CAMERA_TRANSITION_STATE_BLOCK_ACTIVATION) { next_camera->activation_blocked = 1; - } else if (previous_transition_state == 2 || descriptor_kind == 1 || descriptor_kind == 5) { - if (descriptor_kind == 1) { + } else if (previous_transition_state == CAMERA_TRANSITION_STATE_REQUEST_TRANSITION || + descriptor_kind == CAMERA_DESCRIPTOR_RATE_TRANSITION || + descriptor_kind == CAMERA_DESCRIPTOR_FRAME_COUNT_TRANSITION) { + if (descriptor_kind == CAMERA_DESCRIPTOR_RATE_TRANSITION) { mode_one_duration = next_camera->transition_duration; - preview_camera.transition_mode = 0; + preview_camera.transition_mode = CAMERA_TRANSITION_RATE_BASED; if (mode_one_duration > 0.0f) { preview_camera.configured_position_rate = mode_one_duration; preview_camera.configured_rotation_rate = mode_one_duration; @@ -79,9 +101,9 @@ void switch_active_camera_record(struct UpdateCam *next_camera) { preview_camera.configured_position_rate = 0.018f; preview_camera.configured_rotation_rate = 0.018f; } - } else if (descriptor_kind == 5) { + } else if (descriptor_kind == CAMERA_DESCRIPTOR_FRAME_COUNT_TRANSITION) { transition_duration = next_camera->transition_duration; - preview_camera.transition_mode = 2; + preview_camera.transition_mode = CAMERA_TRANSITION_FRAME_COUNT_BASED; if (transition_duration > 0.0f) { preview_camera.configured_frames = truncate_float_to_s32(transition_duration); } else { @@ -93,16 +115,21 @@ void switch_active_camera_record(struct UpdateCam *next_camera) { } else { preview_camera.transition_phase = 2; } - } else if (previous_transition_state == 3 || previous_transition_state == 5 || - descriptor_kind == 3 || descriptor_kind == 6) { + } else if (previous_transition_state == CAMERA_TRANSITION_STATE_INHERIT_TRANSFORM || + previous_transition_state == + CAMERA_TRANSITION_STATE_INHERIT_TRANSFORM_WITH_RATE_TRANSITION || + descriptor_kind == CAMERA_DESCRIPTOR_INHERIT_TRANSFORM || + descriptor_kind == CAMERA_DESCRIPTOR_INHERIT_TRANSFORM_WITH_RATE_TRANSITION) { qcopy(&next_camera->pos, &previous_camera->pos); qcopy(&next_camera->m0, &previous_camera->m0); qcopy(&next_camera->m1, &previous_camera->m1); qcopy(&next_camera->m2, &previous_camera->m2); - next_camera->handoff_state = 2; - if (previous_camera->transition_state == 5 || descriptor_kind == 6) { + next_camera->handoff_state = CAMERA_HANDOFF_INHERITED_TRANSFORM; + if (previous_camera->transition_state == + CAMERA_TRANSITION_STATE_INHERIT_TRANSFORM_WITH_RATE_TRANSITION || + descriptor_kind == CAMERA_DESCRIPTOR_INHERIT_TRANSFORM_WITH_RATE_TRANSITION) { handoff_duration = next_camera->transition_duration; - preview_camera.transition_mode = 0; + preview_camera.transition_mode = CAMERA_TRANSITION_RATE_BASED; if (handoff_duration > 0.0f) { preview_camera.configured_position_rate = handoff_duration; preview_camera.configured_rotation_rate = handoff_duration; @@ -125,8 +152,8 @@ void switch_active_camera_record(struct UpdateCam *next_camera) { } position = &next_camera->pos; - previous_camera->transition_state = 0; - previous_camera->handoff_state = 0; + previous_camera->transition_state = CAMERA_TRANSITION_STATE_CLEARED; + previous_camera->handoff_state = CAMERA_HANDOFF_NONE; previous_camera->activation_blocked = 0; preview_camera.previous = previous_camera; fast_mem_copy(&camera_saved_states[1], &camera_saved_states[0], 0x280); diff --git a/src/camera/update_camera.c b/src/camera/update_camera.c index 87b25ca3b9..dd2be1a649 100644 --- a/src/camera/update_camera.c +++ b/src/camera/update_camera.c @@ -30,6 +30,13 @@ void update_camera(void) __asm__("FUN_001edaa8"); extern s32 game_mode_macro __asm__("D_0015F604") MACRO_ADDR; void update_camera(void) { + enum { + CAMERA_TRANSITION_PHASE_IDLE = 0 + }; + enum { + CAMERA_TRANSITION_KIND_PRIMARY = 0, + CAMERA_TRANSITION_PHASE_BLENDING = 3 + }; struct PreviewCamera *camera; struct UpdateCam *target; char *camera_shake_base; @@ -39,8 +46,8 @@ void update_camera(void) { if (text_screen_active[0] != 0) { return; } - cam_trans_state.mode = 0; - cam_trans_state.kind = 0; + cam_trans_state.mode = CAMERA_TRANSITION_PHASE_IDLE; + cam_trans_state.kind = CAMERA_TRANSITION_KIND_PRIMARY; } camera = &preview_camera; camera->frame_count++; @@ -52,7 +59,7 @@ void update_camera(void) { if ((unsigned short)(*(unsigned short *)&camera->transition_mode - 1) < 2) { start_camera_blend(camera->previous_camera); } - if (camera->transition_mode == 3) { + if (camera->transition_mode == CAMERA_TRANSITION_PHASE_BLENDING) { update_camera_blend((char *)target); } else { struct OcclCamState *occlusion = &occl_cam_state; diff --git a/src/camera/update_camera_blend.c b/src/camera/update_camera_blend.c index 156aadb933..0813905d39 100644 --- a/src/camera/update_camera_blend.c +++ b/src/camera/update_camera_blend.c @@ -15,10 +15,16 @@ extern int step_camera_blend(void *, struct CameraBlend *) __asm__("func_001ECAF void update_camera_blend(char *to_cam) __asm__("FUN_001ed2b0"); void update_camera_blend(char *to_cam) { + enum { + CAMERA_TRANSITION_PHASE_IDLE = 0 + }; + enum { + CAMERA_TRANSITION_KIND_PRIMARY = 0 + }; struct CameraTransition *transition = &cam_trans_state; int transition_complete; - if (transition->kind == 0) { + if (transition->kind == CAMERA_TRANSITION_KIND_PRIMARY) { transition_complete = step_camera_blend(to_cam, &transition->blend); } else { transition_complete = advance_alternate_camera_transition(to_cam, &transition->orbit); @@ -30,8 +36,8 @@ void update_camera_blend(char *to_cam) { qcopy(camera_rows + 0x20, to_cam + 0x20); qcopy(camera_rows - 0x210, to_cam + 0x30); } - transition->mode = 0; - transition->kind = 0; + transition->mode = CAMERA_TRANSITION_PHASE_IDLE; + transition->kind = CAMERA_TRANSITION_KIND_PRIMARY; } } diff --git a/src/game/initialize_level_runtime.c b/src/game/initialize_level_runtime.c index e2e6019c53..9621560897 100644 --- a/src/game/initialize_level_runtime.c +++ b/src/game/initialize_level_runtime.c @@ -149,6 +149,9 @@ extern void store_sound_bank_handle_callback() __asm__("func_0022DD78"); extern s32 snd_flush_sound_commands(void) __asm__("func_0012DC80"); void initialize_level_runtime(void) { + enum { + LEVEL_SCENE_MODE_EARLY_PROGRESSION = 4 + }; s64 texture_packet[4]; LevelHeader *header; s32 data_base; @@ -276,7 +279,7 @@ void initialize_level_runtime(void) { level_render_state.history_count = 0; qcopy(&D_001604F0, &D_001604E0); if (current_level_index == 0 || (current_level_index == 1 && level_available[3] == 0)) { - level_render_state.scene_mode = 4; + level_render_state.scene_mode = LEVEL_SCENE_MODE_EARLY_PROGRESSION; level_render_state.scene_state = 2; } fill_transfer_words(&render_sequence, 0, 0x1C0); diff --git a/src/game/missions/update_mission_list.c b/src/game/missions/update_mission_list.c index 8f11371d05..00853a9bb0 100644 --- a/src/game/missions/update_mission_list.c +++ b/src/game/missions/update_mission_list.c @@ -31,6 +31,11 @@ extern s32 check_mission_condition(s16, s32) __asm__("func_0020BAF0"); s32 update_mission_list(void) __asm__("FUN_0020b950"); s32 update_mission_list(void) { + enum { + MISSION_STATE_UNAVAILABLE = 0, + MISSION_STATE_AVAILABLE = 1, + MISSION_STATE_BOTH_CONDITIONS_MET = 2 + }; struct MenuItem *it; struct MenuItem *items; @@ -41,13 +46,13 @@ s32 update_mission_list(void) { } for (it = items; it->id != 0; it++) { if ((it->flags & 4) && level_visit_state[level_map_selection.level] == 0) { - it->state = 0; + it->state = MISSION_STATE_UNAVAILABLE; } else if (!check_mission_condition(it->kind1, it->value1)) { - it->state = 0; + it->state = MISSION_STATE_UNAVAILABLE; } else if (!check_mission_condition(it->kind2, it->value2)) { - it->state = 1; + it->state = MISSION_STATE_AVAILABLE; } else { - it->state = 2; + it->state = MISSION_STATE_BOTH_CONDITIONS_MET; } } for (it = D_001A2C10.items; it->id != 0; it++) { @@ -57,7 +62,7 @@ s32 update_mission_list(void) { } D_001A2C10.available = 0; for (it = D_001A2C10.items; it->id != 0; it++) { - if (it->state == 1 && !(it->flags & 2)) { + if (it->state == MISSION_STATE_AVAILABLE && !(it->flags & 2)) { D_001A2C10.available++; } } diff --git a/src/game/mode_freeze_init.c b/src/game/mode_freeze_init.c index 678ba08ce1..9466bb2533 100644 --- a/src/game/mode_freeze_init.c +++ b/src/game/mode_freeze_init.c @@ -19,6 +19,9 @@ void mode_freeze_init(u32 mode, s32 freeze_context) { FREEZE_PUSH_HELP_HISTORY = 5, FREEZE_VIDEO_MODE_CHANGE = 6 }; + enum { + GAME_MODE_FREEZE = 4 + }; FreezeModeState *freeze_state; if (game_mode != 3) { @@ -27,7 +30,7 @@ void mode_freeze_init(u32 mode, s32 freeze_context) { } freeze.return_game_mode = game_mode; freeze.context = freeze_context; - game_mode = 4; + game_mode = GAME_MODE_FREEZE; freeze.state = mode; switch (mode) { case FREEZE_CONTROL_MODE_16_PAUSE: diff --git a/src/game/service_level_archive_load.c b/src/game/service_level_archive_load.c index f4f47ab8fe..cc8420d32e 100644 --- a/src/game/service_level_archive_load.c +++ b/src/game/service_level_archive_load.c @@ -87,7 +87,7 @@ s32 service_level_archive_load(void) { stage = (s16)D_0015EE48; switch (stage) { case LOAD_SHARED_ARCHIVE: - if (pal_mode != 0) { + if (pal_mode != FALSE) { sound_aligned_bytes = ((disc_table.sound_archive_alt.size << 11) + 0xFFF) & 0xFFFFF000; } else { sound_aligned_bytes = ((disc_table.sound_archive.size << 11) + 0xFFF) & 0xFFFFF000; @@ -115,7 +115,7 @@ s32 service_level_archive_load(void) { D_0015EE48 = D_0015EE48 + 1; break; case LOAD_SOUND_ARCHIVE: - if (pal_mode != 0) { + if (pal_mode != FALSE) { submit_audio_stream_io_request(sound_archive_base, disc_table.sound_archive_alt.sector, disc_table.sound_archive_alt.size); diff --git a/src/game/start_level.c b/src/game/start_level.c index eb4b10a0cd..ded1dfea95 100644 --- a/src/game/start_level.c +++ b/src/game/start_level.c @@ -32,6 +32,9 @@ void start_level(int level) __asm__("FUN_001e9488"); extern s32 game_mode_macro __asm__("D_0015F604") MACRO_ADDR; void start_level(int level) { + enum { + VIDEO_MODE_NTSC = 0 + }; int movie_size_bytes; int movie_start_sector; int movie_work_area_base; @@ -39,7 +42,7 @@ void start_level(int level) { if (level < 0) { return; } - if (pal_mode != 0) { + if (pal_mode != VIDEO_MODE_NTSC) { movie_start_sector = disc_table.start_movies_alt[level].sector; movie_size_bytes = disc_table.start_movies_alt[level].size; } else { @@ -59,7 +62,7 @@ void start_level(int level) { snd_stream_safe_cd_sync(0); for (;;) { struct MemoryCardState *ld = &memory_card_state; - if (ld->state < 3 && ld->pending_state < 0) { + if (ld->state < MEMCARD_REQUEST_FORMAT && ld->pending_state < MEMCARD_QUERY_INFO) { break; } memcard_update_state(); diff --git a/src/game/transitions/do_space_transition.c b/src/game/transitions/do_space_transition.c index 84168626fe..3030829a40 100644 --- a/src/game/transitions/do_space_transition.c +++ b/src/game/transitions/do_space_transition.c @@ -117,7 +117,8 @@ void do_space_transition(void) { view_context.fog_far_int = 128.0f; set_background_color(0, 0, 0); if (space_load_macro < 0) { - while (memory_card_state.state >= 3 || memory_card_state.pending_state >= 0) { + while (memory_card_state.state >= MEMCARD_REQUEST_FORMAT || + memory_card_state.pending_state >= MEMCARD_QUERY_INFO) { memcard_update_state(); run_state_handler(); } @@ -223,7 +224,8 @@ void do_space_transition(void) { tick_space_transition(); } while (service_level_archive_load() == 0); } - while (memory_card_state.state != 2 || memory_card_state.pending_state >= 0) { + while (memory_card_state.state != MEMCARD_DISPATCH_PENDING_OPERATION || + memory_card_state.pending_state >= MEMCARD_QUERY_INFO) { FlushCache(0); sceGsSyncV(0); memcard_update_state(); diff --git a/src/game/transitions/play_level_transition_movie.c b/src/game/transitions/play_level_transition_movie.c index 89f922c324..6298d51e1a 100644 --- a/src/game/transitions/play_level_transition_movie.c +++ b/src/game/transitions/play_level_transition_movie.c @@ -12,11 +12,14 @@ extern void fade_to_black(s32) __asm__("func_001F4A58"); void play_level_transition_movie(s32 movie_index) __asm__("FUN_00231608"); void play_level_transition_movie(s32 movie_index) { + enum { + PAL_MODE_NTSC = 0 + }; s32 stream_size; s32 stream_start; s32 archive_base; - if (pal_mode != 0) { + if (pal_mode != PAL_MODE_NTSC) { stream_start = disc_table.movies_alt[movie_index].sector; stream_size = disc_table.movies_alt[movie_index].size; } else { diff --git a/src/game/transitions/tick_space_transition.c b/src/game/transitions/tick_space_transition.c index bd12328b82..1110cb2d19 100644 --- a/src/game/transitions/tick_space_transition.c +++ b/src/game/transitions/tick_space_transition.c @@ -15,7 +15,7 @@ void tick_space_transition(void) { fifty = 50; new_value = old_value + 1; D_0015EE24 = new_value; - if (((new_value % fifty) == 0) && (pal_mode != 0)) { + if (((new_value % fifty) == 0) && (pal_mode != FALSE)) { D_0015EE24 = old_value + 0xB; } } diff --git a/src/game/transitions/transition_default_draw.c b/src/game/transitions/transition_default_draw.c index f14ed885d0..8109f06ff7 100644 --- a/src/game/transitions/transition_default_draw.c +++ b/src/game/transitions/transition_default_draw.c @@ -54,6 +54,9 @@ extern s32 light_ties() __asm__("func_00237370"); void transition_default_draw(s32 *unused_parameter) __asm__("FUN_001eb410"); void transition_default_draw(s32 *unused_parameter) { + enum { + GAME_MODE_DIALOG = 4 + }; s32 language_overlay_index; if (level_sky_effect_data == 0 || level_sky_effect_data->unk4 != 0) { @@ -132,7 +135,7 @@ void transition_default_draw(s32 *unused_parameter) { } vu0_load_micro_program(D_00100AE0); FlushCache(0); - if (game_mode == 4) { + if (game_mode == GAME_MODE_DIALOG) { draw_dialog_text(); } vu1_sync_chain(2); diff --git a/src/game/update_gameplay_frame.c b/src/game/update_gameplay_frame.c index da27dea9b6..7ff3aae725 100644 --- a/src/game/update_gameplay_frame.c +++ b/src/game/update_gameplay_frame.c @@ -64,6 +64,12 @@ extern void sound_update(void) __asm__("func_0022CA50"); void update_gameplay_frame(void) __asm__("FUN_001eb0a8"); void update_gameplay_frame(void) { + enum { + GAME_MODE_MAIN_MENU = 3 + }; + enum { + GAME_MODE_FREEZE = 4 + }; Vec4 first_position; Vec4 next_position; RenderSequenceActor *actor; @@ -133,7 +139,7 @@ void update_gameplay_frame(void) { enter_main_menu(); } sound_update(); - } else if (game_mode == 3) { + } else if (game_mode == GAME_MODE_MAIN_MENU) { intro_overlay_timer = scale_game_frames(0x3C); if ((intro_overlay_alpha -= 0x10) < 0) { intro_overlay_alpha = 0; @@ -143,7 +149,7 @@ void update_gameplay_frame(void) { } update_menu_system(); sound_update(); - } else if (game_mode == 4) { + } else if (game_mode == GAME_MODE_FREEZE) { update_mode_freeze(); sound_update(); } diff --git a/src/game/update_level_gameplay_frame.c b/src/game/update_level_gameplay_frame.c index 50af0b1364..3136f23694 100644 --- a/src/game/update_level_gameplay_frame.c +++ b/src/game/update_level_gameplay_frame.c @@ -156,6 +156,11 @@ extern void build_object_rotation_matrix(void) __asm__("func_0022DE10"); void update_level_gameplay_frame(void) __asm__("FUN_0022eaa8"); void update_level_gameplay_frame(void) { + enum { + LEVEL_RENDER_PHASE_SELECT_RANDOM_MODE = 0, + LEVEL_RENDER_PHASE_REQUEST_LOAD = 2, + LEVEL_RENDER_MODE_FADE_OUT = 4 + }; Vector4 first_position; Vector4 second_position; Matrix4x4 first_transform; @@ -221,14 +226,14 @@ void update_level_gameplay_frame(void) { } if (current_level_index != 0 && (current_level_index != 1 || level_available[3] != 0) && D_0015EE48 < 3) { - level_render_state.state = 0; + level_render_state.state = LEVEL_RENDER_PHASE_SELECT_RANDOM_MODE; } - if (level_render_state.state < 2) { - if (level_render_state.state == 0) { + if (level_render_state.state < LEVEL_RENDER_PHASE_REQUEST_LOAD) { + if (level_render_state.state == LEVEL_RENDER_PHASE_SELECT_RANDOM_MODE) { mode_advance = (RandomNext() >> 16) % 3 + 1; level_render_state.mode = (level_render_state.mode + mode_advance) & 3; } else { - level_render_state.mode = 4; + level_render_state.mode = LEVEL_RENDER_MODE_FADE_OUT; } level_render_state.history_index = 0; level_render_state.history_count = 0; @@ -267,7 +272,7 @@ void update_level_gameplay_frame(void) { } update_view_context(); scale = 1.0f; - if (level_render_state.mode == 4) { + if (level_render_state.mode == LEVEL_RENDER_MODE_FADE_OUT) { scale = (f32)(render_sequence.end - render_sequence.time) / (f32)render_sequence.end; scale_vector(&first_position, &mode4_render_vector_delta_gp, scale); fast_vec_add(&D_001604F0, &D_001604F0, &first_position); @@ -324,7 +329,7 @@ void update_level_gameplay_frame(void) { &first_transform.rows[3]); qcopy(&level_render_state.secondary_history_positions[history_slot], &second_transform.rows[3]); - if (level_render_state.mode == 4) { + if (level_render_state.mode == LEVEL_RENDER_MODE_FADE_OUT) { if (current_level_index == 0 || (current_level_index == 1 && level_available[3] == 0)) { interpolated_object->flags |= 1; diff --git a/src/game/update_mode_freeze.c b/src/game/update_mode_freeze.c index 11039f62e7..2d22fcec8d 100644 --- a/src/game/update_mode_freeze.c +++ b/src/game/update_mode_freeze.c @@ -60,6 +60,11 @@ void update_mode_freeze(void) { MODE_FREEZE_RESUME_WITH_ACTION_LIST = 16, MODE_FREEZE_BOOT_GATED_CROSS_RELOAD = 19 }; + enum { + GAME_MODE_CONTINUE = 0, + VIDEO_MODE_REQUEST_PAL_DISABLED = 0, + VIDEO_MODE_REQUEST_PAL_ENABLED = 1 + }; s32 video_mode; s32 step; sound_update(); @@ -78,7 +83,7 @@ void update_mode_freeze(void) { state = &freeze; if (scale_game_frames(0x78) < state->unk20) { if (controller_state.pressed & PAD_CROSS) { - game_mode = 0; + game_mode = GAME_MODE_CONTINUE; if (current_level_index == 1) { memcard_save_data(0, -1); } @@ -95,9 +100,9 @@ void update_mode_freeze(void) { moby->flags = (u16)(moby->flags | 1); noop_main_callback(); noop_callback_k(hero.saved_pos_rot, hero.saved_pos_rot + 0x10, 0, 1); - game_mode = 0; + game_mode = GAME_MODE_CONTINUE; } else if (controller_state.pressed & PAD_CROSS) { - game_mode = 0; + game_mode = GAME_MODE_CONTINUE; } break; @@ -118,7 +123,7 @@ void update_mode_freeze(void) { game_mode = freeze.return_game_mode; } else if (controller_state.pressed & PAD_CROSS) { fade_to_black(4); - requested_video_mode = 0; + requested_video_mode = VIDEO_MODE_REQUEST_PAL_DISABLED; freeze.choice = 2; freeze.unk20 = scale_game_frames(0x258); } @@ -126,14 +131,14 @@ void update_mode_freeze(void) { case VIDEO_MODE_TEST_PREVIEW_ACTIVE: if ((freeze.unk20 == 0) || ((--freeze.unk20) == 0)) { - requested_video_mode = 1; + requested_video_mode = VIDEO_MODE_REQUEST_PAL_ENABLED; freeze.choice = 3; } else if (controller_state.pressed & PAD_TRIANGLE) { fade_to_black(4); - requested_video_mode = 1; + requested_video_mode = VIDEO_MODE_REQUEST_PAL_ENABLED; game_mode = freeze.return_game_mode; } else if (controller_state.pressed & PAD_CROSS) { - requested_video_mode = 0; + requested_video_mode = VIDEO_MODE_REQUEST_PAL_DISABLED; game_mode = freeze.return_game_mode; } break; @@ -154,17 +159,17 @@ void update_mode_freeze(void) { case FREEZE_MODE_TRIANGLE_SET_SHIP_FLAG_CONTINUE: D_0015F648 = 2; if (controller_state.pressed & PAD_TRIANGLE) { - game_mode = 0; + game_mode = GAME_MODE_CONTINUE; hero.ship_flags = (u8)(hero.ship_flags | 1); } else if (controller_state.pressed & PAD_CROSS) { - game_mode = 0; + game_mode = GAME_MODE_CONTINUE; } break; case FREEZE_MODE_AWAIT_CROSS_CONTINUE: D_0015F648 = 2; if (controller_state.pressed & PAD_CROSS) { - game_mode = 0; + game_mode = GAME_MODE_CONTINUE; } break; @@ -217,10 +222,10 @@ void update_mode_freeze(void) { D_0015EE3C++; } } - game_mode = 0; + game_mode = GAME_MODE_CONTINUE; noop_callback_k(saved_camera_vectors, saved_camera_vectors + 0x10, 0, 1); } else { - game_mode = 0; + game_mode = GAME_MODE_CONTINUE; if (hero.race_lap >= 3) { hero.race_lap = (s16)(((u16)hero.race_lap) - 1); hero.unk890[0xBC] = 3; diff --git a/src/game/update_resident_gameplay_state.c b/src/game/update_resident_gameplay_state.c index aeb04cf11e..9edefe59b1 100644 --- a/src/game/update_resident_gameplay_state.c +++ b/src/game/update_resident_gameplay_state.c @@ -145,6 +145,9 @@ void update_resident_gameplay_state(void) { LEVEL_RENDER_STATE_GAMEPLAY = 4, LEVEL_RENDER_STATE_PLAYBACK_WITH_MUSIC_RESUME = 8 }; + enum { + RESIDENT_OBJECT_STATE_LIST_END = 0xFF + }; Vector4 scratch_vectors[4]; s32 keyframe_flags; s32 ticks_per_bank; @@ -188,13 +191,13 @@ void update_resident_gameplay_state(void) { skip = level_render_state.skip; if ((controller_state.pressed & (PAD_TRIANGLE | PAD_CROSS)) && scale_game_frames(30) < render_sequence.time && sequence == 0.0f) { - if (level_render_state.state == 0 && + if (level_render_state.state == LEVEL_RENDER_STATE_PLAYBACK_TO_MENU && render_sequence.time < scale_game_frames( playback_skip_target_frames[level_render_state.content_variant] - 30)) { skip = 1; } - if (level_render_state.state == 8 && + if (level_render_state.state == LEVEL_RENDER_STATE_PLAYBACK_WITH_MUSIC_RESUME && render_sequence.time < render_sequence.end - scale_game_frames(30)) { skip = 1; } @@ -204,7 +207,7 @@ void update_resident_gameplay_state(void) { music_stream_state.secondary.state != 7) { music_stream_state.secondary.state = 5; } - if (level_render_state.state == 0) { + if (level_render_state.state == LEVEL_RENDER_STATE_PLAYBACK_TO_MENU) { render_sequence.time = scale_game_frames( playback_skip_target_frames[level_render_state.content_variant]); render_sequence.sequence_frame = render_sequence.time / ticks_per_bank; @@ -241,13 +244,15 @@ void update_resident_gameplay_state(void) { } } level_render_state.player->flags &= ~1; - for (object_cursor = moby_instance_end; object_cursor->state != 0xFF; object_cursor++) { + for (object_cursor = moby_instance_end; + object_cursor->state != RESIDENT_OBJECT_STATE_LIST_END; + object_cursor++) { if (!(object_cursor->state & 0x80) && (object_cursor->class_id == 0x4A || object_cursor->class_id == 0xCB)) { object_cursor->flags &= ~0x80; } } - if (level_render_state.state == 0) { + if (level_render_state.state == LEVEL_RENDER_STATE_PLAYBACK_TO_MENU) { pause_all_sounds(0); menu_system.state = 0xE; space_load_in_progress[0] = 1; @@ -328,7 +333,7 @@ void update_resident_gameplay_state(void) { playback_object->cached_selector = 0xFF; refresh_moby_spatial_bounds(playback_object); if (playback_object->class_id == 0) { - if (level_render_state.state == 0) { + if (level_render_state.state == LEVEL_RENDER_STATE_PLAYBACK_TO_MENU) { if (current_level_index == 10 && item_available[6] == 0) { playback_object->unk7F = 0; } else if (render_sequence.time <= scale_game_frames(0x3E)) { @@ -346,7 +351,7 @@ void update_resident_gameplay_state(void) { playback_object->unk7F = 0; } } else if (playback_object->class_id == 10) { - if (level_render_state.state == 0) { + if (level_render_state.state == LEVEL_RENDER_STATE_PLAYBACK_TO_MENU) { if (render_sequence.time <= scale_game_frames(350)) { playback_object->unk7F = 0x18; } else { @@ -384,7 +389,7 @@ void update_resident_gameplay_state(void) { if ((u16)playback_object->class_id - 0x213U < 3) { enqueue_callback_list_4(render_environment_mapped_object, playback_object); add_draw_callback(draw_light_flare, playback_object); - if (level_render_state.state == 0) { + if (level_render_state.state == LEVEL_RENDER_STATE_PLAYBACK_TO_MENU) { if (render_sequence.time < scale_game_frames(360)) { s32 color_intensity = (s32)(fast_cos( diff --git a/src/input/poll_pad_device_state.c b/src/input/poll_pad_device_state.c index 46f7070fe6..8a1fa50661 100644 --- a/src/input/poll_pad_device_state.c +++ b/src/input/poll_pad_device_state.c @@ -12,6 +12,9 @@ void poll_pad_device_state(struct PadState *pad_state) { PAD_INPUT_POLLING = 1, PAD_BUTTON_PROFILE_TOO_LARGE = 2 }; + enum { + PAD_DEVICE_READY = 1 + }; s32 saved_pad_value; s32 pad_device_state; s32 byte_count; @@ -25,7 +28,7 @@ void poll_pad_device_state(struct PadState *pad_state) { pad_state->prev_raw_held = saved_pad_value; pad_device_state = scePad2GetState(pad_state->socket); pad_state->device_state = pad_device_state; - if (pad_device_state == 1) { + if (pad_device_state == PAD_DEVICE_READY) { switch (pad_state->profile_state) { case PAD_PROFILE_INITIALIZATION: { byte_count = scePad2GetButtonProfile(pad_state->socket, pad_response_buffer); diff --git a/src/input/process_pad_input.c b/src/input/process_pad_input.c index c6ee4c6ad8..14db100139 100644 --- a/src/input/process_pad_input.c +++ b/src/input/process_pad_input.c @@ -16,6 +16,10 @@ extern float fast_difference_between_rotations(float, float) __asm__("func void process_pad_input(struct PadState *p, u8 *buf, s32 len) __asm__("FUN_00217328"); void process_pad_input(struct PadState *pad_state, u8 *pad_read_data, s32 pad_read_byte_count) { + enum { + PAD_INPUT_FILTER_NONE = 0, + PAD_INPUT_FILTER_SUPPRESS_DIRECTIONS = 2 + }; float axis_vector[2]; s32 i, j, k; s32 held_buttons, old, ncur, nold; @@ -99,9 +103,9 @@ void process_pad_input(struct PadState *pad_state, u8 *pad_read_data, s32 pad_re pad_state->released &= ~0x5030; pad_state->analog[0] = 0.0f; pad_state->analog[1] = 0.0f; - pad_state->mode = 0; + pad_state->mode = PAD_INPUT_FILTER_NONE; } - if (pad_state->mode == 2) { + if (pad_state->mode == PAD_INPUT_FILTER_SUPPRESS_DIRECTIONS) { pad_state->held = *(volatile s32 *)&pad_state->held & 0x900; pad_state->pressed &= 0x900; pad_state->released &= 0x900; @@ -109,7 +113,7 @@ void process_pad_input(struct PadState *pad_state, u8 *pad_read_data, s32 pad_re pad_state->no_direction = 1; pad_state->analog[2] = 0.0f; pad_state->analog[3] = 0.0f; - pad_state->mode = 0; + pad_state->mode = PAD_INPUT_FILTER_NONE; } axis_vector[0] = pad_state->analog[2]; axis_vector[1] = pad_state->analog[3]; diff --git a/src/mobys/animation/update_resident_dialogue_animation_state.c b/src/mobys/animation/update_resident_dialogue_animation_state.c index 189af9ede4..fac998151d 100644 --- a/src/mobys/animation/update_resident_dialogue_animation_state.c +++ b/src/mobys/animation/update_resident_dialogue_animation_state.c @@ -86,7 +86,7 @@ void update_resident_dialogue_animation_state(Moby *resident_moby) { if (resident_moby->anim != 2) { blend_moby_animation(resident_moby, 2, 0, scale_game_frames(0x12)); } - resident_moby->state = 12; + resident_moby->state = RESIDENT_WAIT_TO_START_DIALOGUE_ANIMATION; D_001E63C0.timer = 0; } D_001E63C0.timer++; @@ -96,7 +96,7 @@ void update_resident_dialogue_animation_state(Moby *resident_moby) { if (resident_moby->anim != 3) { blend_moby_animation(resident_moby, 3, 0, scale_game_frames(0x12)); } - resident_moby->state = 3; + resident_moby->state = RESIDENT_WAIT_TO_RESTORE_IDLE_ANIMATION; D_001E63C0.timer = 0; } D_001E63C0.timer++; @@ -106,7 +106,7 @@ void update_resident_dialogue_animation_state(Moby *resident_moby) { if (resident_moby->anim != 0) { blend_moby_animation(resident_moby, 0, 0, scale_game_frames(0x12)); } - resident_moby->state = 0; + resident_moby->state = RESIDENT_IDLE_WAIT_TO_REQUEST_DIALOGUE; } break; case RESIDENT_DIALOGUE_ANIMATION_AFTER_COMPLETION_WAIT: @@ -121,7 +121,7 @@ void update_resident_dialogue_animation_state(Moby *resident_moby) { if (resident_moby->anim != 2) { blend_moby_animation(resident_moby, 2, 0, scale_game_frames(0x12)); } - resident_moby->state = 2; + resident_moby->state = RESIDENT_TIMED_WAIT_TO_RESTORE_IDLE_ANIMATION; D_001E63C0.timer = 0; } break; @@ -137,7 +137,7 @@ void update_resident_dialogue_animation_state(Moby *resident_moby) { if (resident_moby->anim != 2) { blend_moby_animation(resident_moby, 2, 0, scale_game_frames(0x12)); } - resident_moby->state = 2; + resident_moby->state = RESIDENT_TIMED_WAIT_TO_RESTORE_IDLE_ANIMATION; D_001E63C0.timer = 0; } break; @@ -153,7 +153,7 @@ void update_resident_dialogue_animation_state(Moby *resident_moby) { if (resident_moby->anim != 2) { blend_moby_animation(resident_moby, 2, 0, scale_game_frames(0x12)); } - resident_moby->state = 2; + resident_moby->state = RESIDENT_TIMED_WAIT_TO_RESTORE_IDLE_ANIMATION; D_001E63C0.timer = 0; } break; @@ -167,7 +167,7 @@ void update_resident_dialogue_animation_state(Moby *resident_moby) { if (resident_moby->anim != target_animation) { blend_moby_animation(resident_moby, target_animation, 0, scale_game_frames(0xC)); } - resident_moby->state = 4; + resident_moby->state = RESIDENT_DIALOGUE_ANIMATION_AFTER_COMPLETION_WAIT; } break; case RESIDENT_WAIT_TO_START_DIALOGUE_ANIMATION: @@ -178,7 +178,7 @@ void update_resident_dialogue_animation_state(Moby *resident_moby) { if (resident_moby->anim != target_animation) { blend_moby_animation(resident_moby, target_animation, 0, scale_game_frames(0x12)); } - resident_moby->state = 5; + resident_moby->state = RESIDENT_DIALOGUE_ANIMATION_AFTER_START_WAIT; } break; case RESIDENT_WAIT_TO_START_DIALOGUE_ANIMATION_BEFORE_TIMED_IDLE_RESTORE: @@ -189,7 +189,7 @@ void update_resident_dialogue_animation_state(Moby *resident_moby) { if (resident_moby->anim != target_animation) { blend_moby_animation(resident_moby, target_animation, 0, scale_game_frames(0x12)); } - resident_moby->state = 6; + resident_moby->state = RESIDENT_DIALOGUE_ANIMATION_WAIT_TO_RESTORE_TIMED_IDLE; } break; } diff --git a/src/mobys/create_moby.c b/src/mobys/create_moby.c index 3902b1ec25..5424052b36 100644 --- a/src/mobys/create_moby.c +++ b/src/mobys/create_moby.c @@ -16,10 +16,14 @@ extern void init_moby_instance(struct Moby *, s32) __asm__("func_0020C5F struct Moby *create_moby(s32 oclass) __asm__("FUN_0020c4f8"); struct Moby *create_moby(s32 oclass) { + enum { + MOBY_STATE_REUSE_THRESHOLD = 0xFE + }; struct Moby *moby_slot; for (moby_slot = moby_instance_end; moby_slot < moby_instance_perm_end; moby_slot++) { - if (moby_slot->state >= 0xFE && moby_slot->spawn_frame <= (u32)world_update_time) { + if (moby_slot->state >= MOBY_STATE_REUSE_THRESHOLD && + moby_slot->spawn_frame <= (u32)world_update_time) { if (moby_slot->state == 0xFF) { moby_slot[1].state = 0xFF; } diff --git a/src/mobys/mark_moby_for_removal.c b/src/mobys/mark_moby_for_removal.c index 87b4d16df1..b5099f1d91 100644 --- a/src/mobys/mark_moby_for_removal.c +++ b/src/mobys/mark_moby_for_removal.c @@ -10,10 +10,14 @@ extern void update_moby_grids(struct Moby *, u32) __asm__("func_0020DC20 void mark_moby_for_removal(struct Moby *moby) __asm__("FUN_0020c828"); void mark_moby_for_removal(struct Moby *moby) { + enum { + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xFD, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xFE + }; if (moby < moby_instance_end) { - moby->state = 0xFD; + moby->state = MOBY_STATE_REMOVAL_BELOW_INSTANCE_END; } else { - moby->state = 0xFE; + moby->state = MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END; } moby->spawn_frame = world_update_time + 2; update_moby_grids(moby, 0x80807F7F); diff --git a/src/mobys/resolve_moby_hit_response.c b/src/mobys/resolve_moby_hit_response.c index 929a90e182..05d2f4da10 100644 --- a/src/mobys/resolve_moby_hit_response.c +++ b/src/mobys/resolve_moby_hit_response.c @@ -92,6 +92,12 @@ s32 resolve_moby_hit_response(O_25a478 *hit_recipient_moby, SUBSTATE_GATED_AUXILIARY_FLAG_HIT_STATE = 5, SUBSTATE_GATED_COOLDOWN_DAMAGE_CLEARING_HIT_STATE = 7 }; + enum { + FALLBACK_RESPONSE_HIT_STATE = 8 + }; + enum { + FALLBACK_HIT_KIND = 0x47 + }; V_25a478 hit_blend_vector; V_25a478 combined_hit_vector; s32 hit_response_index; @@ -141,7 +147,7 @@ s32 resolve_moby_hit_response(O_25a478 *hit_recipient_moby, hit_vector_scale_table[hit_vector_scale_row][hit_record->state]); kind = hit_record->kind; hit_record->u.s.f1C = 5627.9248f; - if (kind == 0x47) { + if (kind == FALLBACK_HIT_KIND) { hit_blend_vector.f[0] = fast_cos(fast_arc_tan(hit_recipient_moby->x - hero.motion.pos.f[0], hit_recipient_moby->y - hero.motion.pos.f[1])); @@ -158,11 +164,11 @@ s32 resolve_moby_hit_response(O_25a478 *hit_recipient_moby, } } else { if (!hit_record->tgt) { - hit_record->state = 8; - kind = 0x47; + hit_record->state = FALLBACK_RESPONSE_HIT_STATE; + kind = FALLBACK_HIT_KIND; } else { kind = hit_record->tgt->hA6; - hit_record->state = 8; + hit_record->state = FALLBACK_RESPONSE_HIT_STATE; } } switch (hit_record->state) { diff --git a/src/mobys/update_instance_attachment_points_and_lengths.c b/src/mobys/update_instance_attachment_points_and_lengths.c index 54c0e7f9de..b3275c7e6b 100644 --- a/src/mobys/update_instance_attachment_points_and_lengths.c +++ b/src/mobys/update_instance_attachment_points_and_lengths.c @@ -21,14 +21,15 @@ void update_instance_attachment_points_and_lengths(struct Moby *instance) __asm_ void update_instance_attachment_points_and_lengths(struct Moby *instance) { u8 offsets[0x30]; - struct AttachmentVars *vars; - vars = (struct AttachmentVars *)instance->pvars; + struct AttachmentVars *attachment_points_and_lengths; + attachment_points_and_lengths = (struct AttachmentVars *)instance->pvars; *(struct Pair64 *)(offsets + 0x20) = *(struct Pair64 *)attachment_point_indices; - transform_scaled_vertex_batch(instance, 4, offsets + 0x20, vars); - fast_vec_sub(offsets, vars->points[1], vars); - fast_vec_sub(offsets + 0x10, vars->points[2], vars); - vars->first_length = fast_vec_length(offsets); - vars->second_length = fast_vec_length(offsets + 0x10); + transform_scaled_vertex_batch(instance, 4, offsets + 0x20, attachment_points_and_lengths); + fast_vec_sub(offsets, attachment_points_and_lengths->points[1], attachment_points_and_lengths); + fast_vec_sub( + offsets + 0x10, attachment_points_and_lengths->points[2], attachment_points_and_lengths); + attachment_points_and_lengths->first_length = fast_vec_length(offsets); + attachment_points_and_lengths->second_length = fast_vec_length(offsets + 0x10); } extern __typeof__(update_instance_attachment_points_and_lengths) func_0023A318 diff --git a/src/mobys/update_visible_mobys.c b/src/mobys/update_visible_mobys.c index 472248bbf8..d3eea080d5 100644 --- a/src/mobys/update_visible_mobys.c +++ b/src/mobys/update_visible_mobys.c @@ -17,12 +17,15 @@ void update_visible_mobys(void) __asm__("FUN_00212e28"); * bounds refresh can change flags or the list link, so each field is read at * its point of use. */ void update_visible_mobys(void) { + enum { + MOBY_MIN_UPDATABLE_STATE = 0 + }; struct Moby *moby; visible_moby_list = build_resident_visibility_list(); moby = visible_moby_list; while (moby != 0) { - if ((s8)moby->state >= 0) { + if ((s8)moby->state >= MOBY_MIN_UPDATABLE_STATE) { if (!(moby->flags & MOBY_SKIP_ANIMATION)) { advance_moby_animation(moby); } diff --git a/src/movies/decoder/buffers/read_buf_begin_get.c b/src/movies/decoder/buffers/read_buf_begin_get.c index 0974415977..956ade4155 100644 --- a/src/movies/decoder/buffers/read_buf_begin_get.c +++ b/src/movies/decoder/buffers/read_buf_begin_get.c @@ -2,11 +2,13 @@ s32 read_buf_begin_get(struct ReadBuf *buf, u8 **ptr) __asm__("FUN_0023b9d8"); -s32 read_buf_begin_get(struct ReadBuf *buf, u8 **ptr) { - if (buf->count != 0) { - *ptr = buf->data + (buf->put - buf->count + buf->size) % buf->size; +s32 read_buf_begin_get(struct ReadBuf *ring_buffer, u8 **read_start_out) { + if (ring_buffer->count != 0) { + *read_start_out = + ring_buffer->data + + (ring_buffer->put - ring_buffer->count + ring_buffer->size) % ring_buffer->size; } - return buf->count; + return ring_buffer->count; } extern __typeof__(read_buf_begin_get) func_0023B9D8 __attribute__((alias("FUN_0023b9d8"))); diff --git a/src/movies/decoder/buffers/read_buf_begin_put.c b/src/movies/decoder/buffers/read_buf_begin_put.c index 065c2f6d34..1f8b6b2b7a 100644 --- a/src/movies/decoder/buffers/read_buf_begin_put.c +++ b/src/movies/decoder/buffers/read_buf_begin_put.c @@ -2,11 +2,11 @@ s32 read_buf_begin_put(struct ReadBuf *buf, u8 **ptr) __asm__("func_0023B960"); -s32 read_buf_begin_put(struct ReadBuf *buf, u8 **ptr) { +s32 read_buf_begin_put(struct ReadBuf *buf, u8 **put_destination_out) { s32 free = buf->size - buf->count; if (free != 0) { - *ptr = buf->data + buf->put; + *put_destination_out = buf->data + buf->put; } return free; } diff --git a/src/movies/decoder/buffers/read_buf_create.c b/src/movies/decoder/buffers/read_buf_create.c index 7a44d8a009..270651ec7c 100644 --- a/src/movies/decoder/buffers/read_buf_create.c +++ b/src/movies/decoder/buffers/read_buf_create.c @@ -2,12 +2,12 @@ void read_buf_create(struct ReadBuf *buf) __asm__("func_0023B940"); -void read_buf_create(struct ReadBuf *buf) { - struct ReadBuf *b = buf; +void read_buf_create(struct ReadBuf *read_buffer_to_initialize) { + struct ReadBuf *buffer_to_initialize = read_buffer_to_initialize; - b->size = READ_BUF_SIZE; - b->put = 0; - b->count = 0; + buffer_to_initialize->size = READ_BUF_SIZE; + buffer_to_initialize->put = 0; + buffer_to_initialize->count = 0; } /* Recovered original symbol name. */ diff --git a/src/movies/decoder/buffers/read_buf_end_get.c b/src/movies/decoder/buffers/read_buf_end_get.c index f20e98f31e..bf6a81a3e8 100644 --- a/src/movies/decoder/buffers/read_buf_end_get.c +++ b/src/movies/decoder/buffers/read_buf_end_get.c @@ -2,16 +2,16 @@ s32 read_buf_end_get(struct ReadBuf *buf, s32 size) __asm__("GetStateTableWord"); -s32 read_buf_end_get(struct ReadBuf *buf, s32 size) { +s32 read_buf_end_get(struct ReadBuf *read_source, s32 size) { s32 taken; s32 remaining_count; - taken = buf->count; + taken = read_source->count; remaining_count = taken; if (size < taken) { taken = size; } remaining_count -= taken; - buf->count = remaining_count; + read_source->count = remaining_count; return taken; } diff --git a/src/movies/decoder/buffers/read_buf_end_put.c b/src/movies/decoder/buffers/read_buf_end_put.c index 443037e0ad..369b46672f 100644 --- a/src/movies/decoder/buffers/read_buf_end_put.c +++ b/src/movies/decoder/buffers/read_buf_end_put.c @@ -3,12 +3,12 @@ void read_buf_end_put(struct ReadBuf *buf, s32 size) __asm__("FUN_0023b990"); /* Commits size bytes after a put, clamped to the free space. */ -void read_buf_end_put(struct ReadBuf *buf, s32 size) { - s32 free = buf->size - buf->count; +void read_buf_end_put(struct ReadBuf *read_ring_buffer, s32 size) { + s32 free = read_ring_buffer->size - read_ring_buffer->count; s32 committed = (size < free) ? size : free; - buf->put = (buf->put + committed) % buf->size; - buf->count += committed; + read_ring_buffer->put = (read_ring_buffer->put + committed) % read_ring_buffer->size; + read_ring_buffer->count += committed; } extern __typeof__(read_buf_end_put) func_0023B990 __attribute__((alias("FUN_0023b990"))); diff --git a/src/movies/decoder/dec_bs0.c b/src/movies/decoder/dec_bs0.c index 5a947d5843..3ad58a17e0 100644 --- a/src/movies/decoder/dec_bs0.c +++ b/src/movies/decoder/dec_bs0.c @@ -20,8 +20,11 @@ extern char mpeg_get_picture_decode_error_message[] __asm__("D_001E8B50"); int dec_bs0(struct VideoDec *vd) __asm__("FUN_0023cec8"); int dec_bs0(struct VideoDec *vd) { + enum { + DEC_BS0_COMPLETED = 1 + }; struct VoData *voData; - int status = 1; + int status = DEC_BS0_COMPLETED; int i; while (!sceMpegIsEnd(&vd->mpeg)) { diff --git a/src/movies/decoder/read_mpeg.c b/src/movies/decoder/read_mpeg.c index dfc8217ff7..518c42a81e 100644 --- a/src/movies/decoder/read_mpeg.c +++ b/src/movies/decoder/read_mpeg.c @@ -59,6 +59,9 @@ s32 read_mpeg(struct VideoDec *video_dec, struct ReadBuf *read_buf, struct MpegCdStream *cd_stream) { + enum { + MOVIE_SKIP_MODE_ANY_BUTTON = 2 + }; u8 *write_ptr; u8 *read_ptr; s32 skipped; @@ -82,7 +85,7 @@ s32 read_mpeg(struct VideoDec *video_dec, update_primary_pad_state(); mode = DECODE_MODE; if (mode != -1) { - if ((mode == 2 && pad_pressed(&controller_state, -1)) || + if ((mode == MOVIE_SKIP_MODE_ANY_BUTTON && pad_pressed(&controller_state, -1)) || ((D_0015EEA0 != 0 || alternate_animation_sequence != 0 || DECODE_MODE != 0 || current_level_index <= 0) && pad_pressed(&controller_state, 0x800))) { diff --git a/src/movies/decoder/video_output/vo_buf_create.c b/src/movies/decoder/video_output/vo_buf_create.c index 79a16fbed6..c0db1aecd0 100644 --- a/src/movies/decoder/video_output/vo_buf_create.c +++ b/src/movies/decoder/video_output/vo_buf_create.c @@ -6,16 +6,20 @@ void vo_buf_create(struct VoBuf *buf, struct VoTag *tag, s32 size) __asm__("FUN_0023d190"); -void vo_buf_create(struct VoBuf *buf, struct VoData *data, struct VoTag *tag, s32 size) { +void vo_buf_create(struct VoBuf *buffer_descriptor, + struct VoData *data, + struct VoTag *tag, + + s32 size) { s32 i; - buf->count = 0; - buf->data = data; - buf->tag = tag; - buf->size = size; - buf->write = 0; + buffer_descriptor->count = 0; + buffer_descriptor->data = data; + buffer_descriptor->tag = tag; + buffer_descriptor->size = size; + buffer_descriptor->write = 0; for (i = 0; i < size; i++) { - buf->tag[i].status = 0; + buffer_descriptor->tag[i].status = 0; } } diff --git a/src/movies/decoder/video_output/vo_buf_dec_count.c b/src/movies/decoder/video_output/vo_buf_dec_count.c index 6900a93f8f..7e0c5b5720 100644 --- a/src/movies/decoder/video_output/vo_buf_dec_count.c +++ b/src/movies/decoder/video_output/vo_buf_dec_count.c @@ -3,8 +3,8 @@ void vo_buf_dec_count(struct VoBuf *buf) __asm__("func_0023D340"); -void vo_buf_dec_count(struct VoBuf *buf) { - if (buf->count > 0) { - buf->count--; +void vo_buf_dec_count(struct VoBuf *video_output_buffer) { + if (video_output_buffer->count > 0) { + video_output_buffer->count--; } } diff --git a/src/movies/decoder/video_output/vo_buf_delete.c b/src/movies/decoder/video_output/vo_buf_delete.c index 9ae05ee47b..0232b8165e 100644 --- a/src/movies/decoder/video_output/vo_buf_delete.c +++ b/src/movies/decoder/video_output/vo_buf_delete.c @@ -3,7 +3,7 @@ void vo_buf_delete(struct VoBuf *buf) __asm__("func_0023D1E0"); -void vo_buf_delete(struct VoBuf *buf) { +void vo_buf_delete(struct VoBuf *video_output_buffer) { } /* Recovered original symbol name. */ diff --git a/src/movies/decoder/video_output/vo_buf_get_data.c b/src/movies/decoder/video_output/vo_buf_get_data.c index bb49ed7e93..2d3b01a154 100644 --- a/src/movies/decoder/video_output/vo_buf_get_data.c +++ b/src/movies/decoder/video_output/vo_buf_get_data.c @@ -3,11 +3,11 @@ struct VoData *vo_buf_get_data(struct VoBuf *buf) __asm__("FUN_0023d288"); -struct VoData *vo_buf_get_data(struct VoBuf *buf) { - if (vo_buf_is_full(buf) != 0) { +struct VoData *vo_buf_get_data(struct VoBuf *video_output_buffer) { + if (vo_buf_is_full(video_output_buffer) != 0) { return 0; } - return buf->data + buf->write; + return video_output_buffer->data + video_output_buffer->write; } /* Recovered original symbol name. */ diff --git a/src/movies/decoder/video_output/vo_buf_get_tag.c b/src/movies/decoder/video_output/vo_buf_get_tag.c index 90c76a12c6..851b821a5f 100644 --- a/src/movies/decoder/video_output/vo_buf_get_tag.c +++ b/src/movies/decoder/video_output/vo_buf_get_tag.c @@ -4,9 +4,11 @@ struct VoTag *vo_buf_get_tag(struct VoBuf *buf) __asm__("FUN_0023d2d8"); /* The oldest picture not yet shown. */ -struct VoTag *vo_buf_get_tag(struct VoBuf *buf) { - if (vo_buf_is_empty(buf) != 0) { +struct VoTag *vo_buf_get_tag(struct VoBuf *picture_queue) { + if (vo_buf_is_empty(picture_queue) != 0) { return 0; } - return buf->tag + (buf->write - buf->count + buf->size) % buf->size; + return picture_queue->tag + + (picture_queue->write - picture_queue->count + picture_queue->size) % + picture_queue->size; } diff --git a/src/movies/decoder/video_output/vo_buf_inc_count.c b/src/movies/decoder/video_output/vo_buf_inc_count.c index a746710854..c6513460ae 100644 --- a/src/movies/decoder/video_output/vo_buf_inc_count.c +++ b/src/movies/decoder/video_output/vo_buf_inc_count.c @@ -5,11 +5,11 @@ extern s32 DIntr(void); void vo_buf_inc_count(struct VoBuf *buf) __asm__("FUN_0023d210"); -void vo_buf_inc_count(struct VoBuf *buf) { +void vo_buf_inc_count(struct VoBuf *video_output_buffer) { DIntr(); - buf->tag[buf->write].status = VO_TAG_FILLED; - buf->count++; - buf->write = (buf->write + 1) % buf->size; + video_output_buffer->tag[video_output_buffer->write].status = VO_TAG_FILLED; + video_output_buffer->count++; + video_output_buffer->write = (video_output_buffer->write + 1) % video_output_buffer->size; EnableInterrupts(); } diff --git a/src/movies/decoder/video_output/vo_buf_is_empty.c b/src/movies/decoder/video_output/vo_buf_is_empty.c index f21f49cf99..0aea032261 100644 --- a/src/movies/decoder/video_output/vo_buf_is_empty.c +++ b/src/movies/decoder/video_output/vo_buf_is_empty.c @@ -3,6 +3,6 @@ s32 vo_buf_is_empty(struct VoBuf *buf) __asm__("func_0023D2C8"); -s32 vo_buf_is_empty(struct VoBuf *buf) { - return buf->count == 0; +s32 vo_buf_is_empty(struct VoBuf *video_output_buffer) { + return video_output_buffer->count == 0; } diff --git a/src/movies/decoder/video_output/vo_buf_is_full.c b/src/movies/decoder/video_output/vo_buf_is_full.c index 6a7074c1de..3a833a04f1 100644 --- a/src/movies/decoder/video_output/vo_buf_is_full.c +++ b/src/movies/decoder/video_output/vo_buf_is_full.c @@ -3,6 +3,6 @@ s32 vo_buf_is_full(struct VoBuf *buf) __asm__("func_0023D1F8"); -s32 vo_buf_is_full(struct VoBuf *buf) { - return buf->count == buf->size; +s32 vo_buf_is_full(struct VoBuf *video_output_buffer) { + return video_output_buffer->count == video_output_buffer->size; } diff --git a/src/movies/decoder/video_output/vo_buf_reset.c b/src/movies/decoder/video_output/vo_buf_reset.c index 3555991e93..008e119850 100644 --- a/src/movies/decoder/video_output/vo_buf_reset.c +++ b/src/movies/decoder/video_output/vo_buf_reset.c @@ -3,9 +3,9 @@ void vo_buf_reset(struct VoBuf *buf) __asm__("func_0023D1E8"); -void vo_buf_reset(struct VoBuf *buf) { - buf->count = 0; - buf->write = 0; +void vo_buf_reset(struct VoBuf *video_output_buffer) { + video_output_buffer->count = 0; + video_output_buffer->write = 0; } /* Recovered original symbol name. */ diff --git a/src/movies/display/set_pal_mode.c b/src/movies/display/set_pal_mode.c index 8d217b21bd..43959835cd 100644 --- a/src/movies/display/set_pal_mode.c +++ b/src/movies/display/set_pal_mode.c @@ -30,7 +30,7 @@ void set_pal_mode(void) { s16 display_width; FlushCache(0); - if (pal_mode != 0) { + if (pal_mode != FALSE) { draw_buffer_address = 0x100000; depth_buffer_address = 0x1E0000; display_buffer_address = 0; diff --git a/src/movies/player/proceed_audio.c b/src/movies/player/proceed_audio.c index 253ed00f4b..32a0249e1d 100644 --- a/src/movies/player/proceed_audio.c +++ b/src/movies/player/proceed_audio.c @@ -8,9 +8,9 @@ extern s32 audio_dec_send() __asm__("func_0023AEF0"); s32 proceed_audio(void) __asm__("FUN_0023aba0"); s32 proceed_audio(void) { - s32 result; - result = audio_dec_send(&movie_player->audio_dec); - return result; + s32 audio_send_result; + audio_send_result = audio_dec_send(&movie_player->audio_dec); + return audio_send_result; } extern s32 func_0023ABA0(void) __attribute__((alias("FUN_0023aba0"))); diff --git a/src/overlays/l00/level_class_tables.c b/src/overlays/l00/level_class_tables.c index a794a6ce65..128edd5695 100644 --- a/src/overlays/l00/level_class_tables.c +++ b/src/overlays/l00/level_class_tables.c @@ -17,6 +17,9 @@ #include "rnc/overlay/shared/vehicles.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -50,7 +53,7 @@ void *D_L00_001EA7D4[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L00_001EA7EC[6] diff --git a/src/overlays/l00/mobys/beam_slot_controller.c b/src/overlays/l00/mobys/beam_slot_controller.c index 9a3c987c8c..ebda9723c4 100644 --- a/src/overlays/l00/mobys/beam_slot_controller.c +++ b/src/overlays/l00/mobys/beam_slot_controller.c @@ -22,6 +22,10 @@ void beam_slot_controller_update(SlotMoby *slot_controller) { SLOT_CONTROLLER_STATE_INITIALIZE = 0, SLOT_CONTROLLER_STATE_PROCESS_SLOTS = 1 }; + enum { + BEAM_SLOT_STATE_INACTIVE = 0, + BEAM_SLOT_STATE_PENDING_RELEASE = 4 + }; s32 i; s32 j; s32 dispatched_slot_count; @@ -33,7 +37,7 @@ void beam_slot_controller_update(SlotMoby *slot_controller) { beam_slot_state[j] = 0; beam_slot_id[j] = 0; } - slot_controller->state = 1; + slot_controller->state = SLOT_CONTROLLER_STATE_PROCESS_SLOTS; slot_controller->alpha = 0xFF; break; case SLOT_CONTROLLER_STATE_PROCESS_SLOTS: @@ -41,9 +45,9 @@ void beam_slot_controller_update(SlotMoby *slot_controller) { for (i = 0; i < 3; i++) { slot_state = beam_slot_state[i]; if (slot_state == 1) { - } else if (slot_state == 4) { + } else if (slot_state == BEAM_SLOT_STATE_PENDING_RELEASE) { release_beam_slot(i); - } else if (slot_state != 0) { + } else if (slot_state != BEAM_SLOT_STATE_INACTIVE) { dispatched_slot_count++; update_slot_panes_and_effects(beam_slot_id[i], i); beam_slot_state[i] = 4; diff --git a/src/overlays/l00/mobys/clank_cutscene_trigger.c b/src/overlays/l00/mobys/clank_cutscene_trigger.c index dfb14b913f..50ca1dd7f1 100644 --- a/src/overlays/l00/mobys/clank_cutscene_trigger.c +++ b/src/overlays/l00/mobys/clank_cutscene_trigger.c @@ -324,7 +324,7 @@ void clank_cutscene_trigger_update(DoorMoby *moby) { } alternate_item_available[8] = 1; moby->alpha = 0xFF; - moby->state = 1; + moby->state = CLANK_TRIGGER_POLL_DIALOGUE; break; case CLANK_TRIGGER_POLL_DIALOGUE: if (vars->unk56 != 0) { @@ -335,7 +335,7 @@ void clank_cutscene_trigger_update(DoorMoby *moby) { } } if (update_npc_dialogue(moby, vars->unk20) != 0) { - moby->state = 2; + moby->state = CLANK_TRIGGER_WAIT_TO_REPOLL_DIALOGUE; vars->unk2C = 3.0f; } if (vars->unk24 >= 4 && D_L00_0015F5C4 != 6) { @@ -344,7 +344,7 @@ void clank_cutscene_trigger_update(DoorMoby *moby) { break; case CLANK_TRIGGER_WAIT_TO_REPOLL_DIALOGUE: if (D_L00_0015F5C4 != 2) { - moby->state = 1; + moby->state = CLANK_TRIGGER_POLL_DIALOGUE; } break; } diff --git a/src/overlays/l00/mobys/cutscene_effects.c b/src/overlays/l00/mobys/cutscene_effects.c index 8f00d8fd30..75ac6e6b5f 100644 --- a/src/overlays/l00/mobys/cutscene_effects.c +++ b/src/overlays/l00/mobys/cutscene_effects.c @@ -70,7 +70,7 @@ void phase_effect_controller_update(FlockMoby *moby) { switch (moby->state) { case FLOCK_EFFECT_STATE_INITIALIZE: moby->unk30 = 0xFF; - moby->state = 1; + moby->state = FLOCK_EFFECT_STATE_PROCESS_PHASE_EFFECTS; break; case FLOCK_EFFECT_STATE_PROCESS_PHASE_EFFECTS: if ((D_L00_0015F5C4 == 2 && D_L00_0016C860.phase == 2 && diff --git a/src/overlays/l00/mobys/help_hints.c b/src/overlays/l00/mobys/help_hints.c index a1f6dc852f..68d0984c4e 100644 --- a/src/overlays/l00/mobys/help_hints.c +++ b/src/overlays/l00/mobys/help_hints.c @@ -27,6 +27,10 @@ void help_hints_update(HelpMoby *moby) __asm__("FUN_L00_002e0988"); /* Moby class 1413 */ void help_hints_update(HelpMoby *moby) { + enum { + HELP_HINTS_STATE_UNINITIALIZED = 0, + HELP_HINTS_STATE_INITIALIZED = 1 + }; s32 *vars; s32 *target_index_ptr; s32 i; @@ -34,8 +38,8 @@ void help_hints_update(HelpMoby *moby) { struct Hero *hero_ptr; vars = moby->vars; - if (moby->state == 0) { - moby->state = 1; + if (moby->state == HELP_HINTS_STATE_UNINITIALIZED) { + moby->state = HELP_HINTS_STATE_INITIALIZED; moby->alpha = 0xFF; } if (D_00141968[0x18 / 2] == 0) { diff --git a/src/overlays/l00/mobys/veldin_robot_enemy.c b/src/overlays/l00/mobys/veldin_robot_enemy.c index f7b42b6899..7c3ae43a65 100644 --- a/src/overlays/l00/mobys/veldin_robot_enemy.c +++ b/src/overlays/l00/mobys/veldin_robot_enemy.c @@ -25,6 +25,18 @@ #include "rnc/overlay/shared/world/collision.h" #include "rnc/overlay/l00/mobys/veldin_robot_enemy_globals.h" +enum { + VELDIN_ROBOT_STATE_INITIALIZE = 0, + VELDIN_ROBOT_STATE_WAIT_TO_FOLLOW_PATH = 1, + VELDIN_ROBOT_STATE_FOLLOW_PATH = 2, + VELDIN_ROBOT_STATE_FACE_TARGET = 3, + VELDIN_ROBOT_STATE_WAIT_TO_START_COLLISION_PROBES = 4, + VELDIN_ROBOT_STATE_PROCESS_COLLISION_PROBES = 5, + VELDIN_ROBOT_STATE_WAIT_TO_RETURN_TO_FACE_TARGET = 6, + VELDIN_ROBOT_STATE_DAMAGE_KNOCKBACK = 7, + VELDIN_ROBOT_STATE_DEATH_KNOCKBACK = 8 +}; + typedef union { u128 q; f32 f[4]; @@ -170,17 +182,6 @@ void veldin_robot_enemy_update(ElectroidMoby *moby) __asm__("FUN_L00_002e0 /* Moby class 1440 */ void veldin_robot_enemy_update(ElectroidMoby *moby) { - enum { - VELDIN_ROBOT_STATE_INITIALIZE = 0, - VELDIN_ROBOT_STATE_WAIT_TO_FOLLOW_PATH = 1, - VELDIN_ROBOT_STATE_FOLLOW_PATH = 2, - VELDIN_ROBOT_STATE_FACE_TARGET = 3, - VELDIN_ROBOT_STATE_WAIT_TO_START_COLLISION_PROBES = 4, - VELDIN_ROBOT_STATE_PROCESS_COLLISION_PROBES = 5, - VELDIN_ROBOT_STATE_WAIT_TO_RETURN_TO_FACE_TARGET = 6, - VELDIN_ROBOT_STATE_DAMAGE_KNOCKBACK = 7, - VELDIN_ROBOT_STATE_DEATH_KNOCKBACK = 8 - }; ElectroidVars *vars; ElectroidMoby *target; Path *path; @@ -223,10 +224,10 @@ void veldin_robot_enemy_update(ElectroidMoby *moby) { return; } qcopy(&moby->pos, &toad_paths[vars->pathIdx]->pts[0]); - moby->state = 1; + moby->state = VELDIN_ROBOT_STATE_WAIT_TO_FOLLOW_PATH; ELECTROID_ANIM(moby, 1, 5); } else { - moby->state = 3; + moby->state = VELDIN_ROBOT_STATE_FACE_TARGET; ELECTROID_ANIM(moby, 1, 5); } break; @@ -239,7 +240,7 @@ void veldin_robot_enemy_update(ElectroidMoby *moby) { } } if (vars->unk114 != 2) { - moby->state = 2; + moby->state = VELDIN_ROBOT_STATE_FOLLOW_PATH; ELECTROID_ANIM(moby, 9, scale_game_frames_s32(10)); } break; @@ -261,7 +262,7 @@ void veldin_robot_enemy_update(ElectroidMoby *moby) { if (fast_vec_length(&dir) < vars->speed + vars->speed) { vars->pathPt++; if (vars->pathPt == path->count) { - moby->state = 3; + moby->state = VELDIN_ROBOT_STATE_FACE_TARGET; ELECTROID_ANIM(moby, 1, scale_game_frames_s32(10)); } } @@ -280,7 +281,7 @@ void veldin_robot_enemy_update(ElectroidMoby *moby) { ELECTROID_ANIM(moby, random_integer_below(2) + 1, scale_game_frames_s32(20)); } if (vars->unk114 != 2 && register_beam_slot(moby, 0, 0) != 0) { - moby->state = 4; + moby->state = VELDIN_ROBOT_STATE_WAIT_TO_START_COLLISION_PROBES; ELECTROID_ANIM(moby, 5, scale_game_frames_s32(10)); } break; @@ -292,7 +293,7 @@ void veldin_robot_enemy_update(ElectroidMoby *moby) { 12.566371f); if (moby->unk70 & 2) { vars->timer = 0; - moby->state = 5; + moby->state = VELDIN_ROBOT_STATE_PROCESS_COLLISION_PROBES; ELECTROID_ANIM(moby, 6, scale_game_frames_s32(10)); } break; @@ -335,14 +336,14 @@ void veldin_robot_enemy_update(ElectroidMoby *moby) { if (collision_line(&mtx[3], &probe, 0, moby, &query) != 0 && hit != 0 && coll_hit.moby == (*(s32 *)&D_001413D0_lui)) { release_beam_slot_by_id(moby); - moby->state = 6; + moby->state = VELDIN_ROBOT_STATE_WAIT_TO_RETURN_TO_FACE_TARGET; ELECTROID_ANIM(moby, 7, scale_game_frames_s32(10)); } if (collision_line(&mtx[3], &dir, 0, moby, &query) != 0) { qcopy(&dir, &coll_hit.point); if (hit != 0 && coll_hit.moby == (*(s32 *)&D_001413D0_lui)) { release_beam_slot_by_id(moby); - moby->state = 6; + moby->state = VELDIN_ROBOT_STATE_WAIT_TO_RETURN_TO_FACE_TARGET; ELECTROID_ANIM(moby, 7, scale_game_frames_s32(10)); } } @@ -350,7 +351,7 @@ void veldin_robot_enemy_update(ElectroidMoby *moby) { if (moby->unk70 & 2) { if (vars->timer++ == veldin_robot_beam_hit_frames) { release_beam_slot_by_id(moby); - moby->state = 6; + moby->state = VELDIN_ROBOT_STATE_WAIT_TO_RETURN_TO_FACE_TARGET; ELECTROID_ANIM(moby, 12, scale_game_frames_s32(10)); } } @@ -363,13 +364,13 @@ void veldin_robot_enemy_update(ElectroidMoby *moby) { fast_arc_tan(target->pos.f[0] - moby->pos.f[0], target->pos.f[1] - moby->pos.f[1]), 12.566371f); if (moby->unk70 & 2) { - moby->state = 3; + moby->state = VELDIN_ROBOT_STATE_FACE_TARGET; ELECTROID_ANIM(moby, 1, scale_game_frames_s32(10)); } break; case VELDIN_ROBOT_STATE_DAMAGE_KNOCKBACK: if (step_moby_motion(moby, vars->unk70) & 0x140) { - moby->state = 3; + moby->state = VELDIN_ROBOT_STATE_FACE_TARGET; ELECTROID_ANIM(moby, 1, scale_game_frames_s32(10)); } break; @@ -450,7 +451,7 @@ void update_veldin_robot_damage_and_targeting(ElectroidMoby *moby) { f32 range; vars = moby->vars; - if (moby->state == 0) { + if (moby->state == VELDIN_ROBOT_STATE_INITIALIZE) { return; } if (vars->unk38 != 0) { @@ -462,7 +463,7 @@ void update_veldin_robot_damage_and_targeting(ElectroidMoby *moby) { dmg = 0.0f; coll = find_moby_hit(moby, 0x330000, 0); hit_reaction(moby, coll, &vars->health, 0, &hit, &dmg, 0, 4); - if (hit != 1 && moby->state != 8 && dmg != 0.0f) { + if (hit != 1 && moby->state != VELDIN_ROBOT_STATE_DEATH_KNOCKBACK && dmg != 0.0f) { vars->health -= dmg; vars->unk90 = 0x200; vars->unk80 = veldin_robot_knockback_gravity_gp * frame_time_sq; @@ -481,7 +482,7 @@ void update_veldin_robot_damage_and_targeting(ElectroidMoby *moby) { trooper_start_knockback(moby, vars->unk70, 0xB, 1, 0, angle); vars->unkC0 = 7.0f; vars->unkC4 = 16.0f; - moby->state = 8; + moby->state = VELDIN_ROBOT_STATE_DEATH_KNOCKBACK; moby->unk94 = 0; vars->unk67 = 0x78; trooper_anim_update(moby, anim); @@ -494,7 +495,7 @@ void update_veldin_robot_damage_and_targeting(ElectroidMoby *moby) { trooper_start_knockback( moby, vars->unk70, 8, 1, 0, fast_arc_tan(coll->pos.f[0], coll->pos.f[1])); vars->unkC4 = vars->unkC0 = -1.0f; - moby->state = 7; + moby->state = VELDIN_ROBOT_STATE_DAMAGE_KNOCKBACK; vars->unk67 = 0xFA; vars->unk26 = scale_game_frames(0x3C); trooper_anim_update(moby, anim); @@ -503,10 +504,10 @@ void update_veldin_robot_damage_and_targeting(ElectroidMoby *moby) { } moby->unkA4 = 0xFF; trooper_anim_finish(moby, anim); - if (moby->state == 1) { + if (moby->state == VELDIN_ROBOT_STATE_WAIT_TO_FOLLOW_PATH) { path = toad_paths[vars->unk1B4]; FUN_L00_0025ff38(moby, &vars->targetPos, 0, 0, path->pts, path->count, 64.0f); - } else if (moby->state != 5) { + } else if (moby->state != VELDIN_ROBOT_STATE_PROCESS_COLLISION_PROBES) { range = veldin_robot_default_target_range_gp; if (vars->unk1DA != 0) { range = 37.0f; diff --git a/src/overlays/l01/hero/hero_set_state.c b/src/overlays/l01/hero/hero_set_state.c index f21ab013e6..d4b383aeb7 100644 --- a/src/overlays/l01/hero/hero_set_state.c +++ b/src/overlays/l01/hero/hero_set_state.c @@ -68,22 +68,32 @@ extern int l01_hero_set_state(int, int) __asm__("FUN_L01_0023cf98"); extern char level_01_transform_trail_jump_velocity_keys[] __asm__("D_L01_0017C3A0"); extern char level_01_water_surface_jump_velocity_keys[] __asm__("D_L01_0017C3E0"); -int l01_hero_set_state(int a, int b) { +int l01_hero_set_state(int requested_state, int animation_setup_mode) { int saved_state_step; char *moby; int old20A7; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || + animation_setup_mode != 2)) return 0; } - if ((cutscene_mode == 2 || cutscene_mode == 6) && b != 2) + if ((cutscene_mode == 2 || cutscene_mode == 6) && animation_setup_mode != 2) return 0; { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -96,11 +106,11 @@ int l01_hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -121,14 +131,14 @@ int l01_hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); return 1; } @@ -141,7 +151,7 @@ int l01_hero_set_state(int a, int b) { struct Hero *q = &hero; q->rand_timer.range = 0x68; } - if (b) { + if (animation_setup_mode) { if (get_hero_idle_animation_index(0) == 0x54) { set_hero_animation( get_hero_idle_animation_index(0), 0, (float)scale_game_frames(0x12)); @@ -157,7 +167,7 @@ int l01_hero_set_state(int a, int b) { p->unk2284 = 0; clear_u64_value(&p->motion.momentum); p->rand_timer.range = 0x68; - if (b) { + if (animation_setup_mode) { if (get_hero_idle_animation_index(0) == 0x54) { set_hero_animation( get_hero_idle_animation_index(0), 0, (float)scale_game_frames(0x12)); @@ -183,7 +193,7 @@ int l01_hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (animation_setup_mode) set_hero_animation(0x45, 0, (float)scale_game_frames(0xC)); break; } @@ -194,7 +204,7 @@ int l01_hero_set_state(int a, int b) { p->health.hp = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); FUN_L00_0025f730(&p->motion.momentum, frame_time * 3.5f); - if (b) + if (animation_setup_mode) set_hero_animation(0x7C, 0, (float)scale_game_frames(0xC)); break; } @@ -210,7 +220,7 @@ int l01_hero_set_state(int a, int b) { p->item_select_blocked = 1; p->unk6A0 = 0; p->unk690 = p->motion.pos.f[2] - p->unk69C; - if (b) + if (animation_setup_mode) set_hero_animation(0x74, 0, (float)scale_game_frames(0xB)); break; } @@ -232,7 +242,7 @@ int l01_hero_set_state(int a, int b) { q->rand_timer.range = 0x68; q->unk8E0 = 0; n = scale_game_frames(0xC); - if (b) + if (animation_setup_mode) set_hero_animation(0x3B, 0, (float)n); } break; @@ -253,7 +263,7 @@ int l01_hero_set_state(int a, int b) { n = scale_game_frames(0xB); if (p->state.prev == 0x33) n = scale_game_frames(0xF); - if (b) + if (animation_setup_mode) set_hero_animation(0x3D, 0, (float)n); break; } @@ -268,7 +278,7 @@ int l01_hero_set_state(int a, int b) { n = scale_game_frames(0x23); if (p->state.prev == 0x35) n = -2; - if (b) + if (animation_setup_mode) set_hero_animation(0x3C, 0, (float)n); break; } @@ -336,7 +346,7 @@ int l01_hero_set_state(int a, int b) { s->motion.momentum.f[2] = 0.0f; FUN_L00_0025f730(&s->motion.momentum, frame_time * 5.5f); s->rand_timer.range = 0x68; - if (b) + if (animation_setup_mode) set_hero_animation(0x3A, 0, (float)scale_game_frames(0x16)); } break; @@ -360,7 +370,7 @@ int l01_hero_set_state(int a, int b) { int t = scale_game_frames(0x4D); struct Hero *q = &hero; q->invulnerable_frames = t; - if (b) { + if (animation_setup_mode) { if (q->state.current == 0x75) { set_hero_animation(0x70, 3, -3.0f); } else { @@ -384,7 +394,7 @@ int l01_hero_set_state(int a, int b) { *(int *)&p->drown_sink_speed = 0; p->unk698 = scale_game_frames(0x2D); p->rand_timer.range = 0x68; - if (b) + if (animation_setup_mode) set_hero_animation(0x65, 0, (float)scale_game_frames(0x11)); break; } @@ -426,7 +436,7 @@ int l01_hero_set_state(int a, int b) { char *v = (char *)&hero.motion.momentum; qcopy(v, v - 0x40); } - if (b) + if (animation_setup_mode) set_hero_animation(0x5F, 0, (float)scale_game_frames(0xA)); break; } @@ -437,7 +447,7 @@ int l01_hero_set_state(int a, int b) { p->unk2284 = 0; p->health.hp = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (animation_setup_mode) set_hero_animation(0x80, 0, (float)scale_game_frames(0xA)); break; } @@ -449,7 +459,7 @@ int l01_hero_set_state(int a, int b) { *(int *)&D_L01_0015F688 = scale_game_frames(0x3C); if (p->unk20AA == 0) { t = get_hero_idle_animation_index(1); - if (p->moby->prev_seq != t && b) { + if (p->moby->prev_seq != t && animation_setup_mode) { set_hero_animation(t, 0, (float)scale_game_frames(0x12)); } } @@ -538,7 +548,7 @@ int l01_hero_set_state(int a, int b) { scale_game_frames(5) < u->rail_land_frames) n = scale_game_frames(0xD); } - if (b) { + if (animation_setup_mode) { struct Hero *v = &hero; set_hero_animation(v->state.step + 3, D_L01_0015F6D8[v->state.step], (float)n); } @@ -552,14 +562,14 @@ int l01_hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); - if (b) { + if (animation_setup_mode) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L01_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -573,7 +583,7 @@ int l01_hero_set_state(int a, int b) { p->item_select_blocked = 1; fill_transfer_words((char *)p + 0x9D0, 0, 0x20); qcopy(&p->motion.momentum, &p->motion.displacement); - if (b) + if (animation_setup_mode) set_hero_animation(0x64, 0, (float)scale_game_frames(0xF)); break; } @@ -595,7 +605,7 @@ int l01_hero_set_state(int a, int b) { } return 0; } - if (b) { + if (animation_setup_mode) { struct Hero *q = &hero; float d = q->anim_frame; int id = 6; @@ -612,7 +622,7 @@ int l01_hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = gravity_length_xy((float *)v); qcopy(&p->motion.momentum, v); - if (b) { + if (animation_setup_mode) { int id = 6; float d = p->anim_frame; if (return_hero_animation_id_unchanged(MOBY(moby)->seq) == 4 && 3.0f < d && d < 16.0f) @@ -639,7 +649,7 @@ int l01_hero_set_state(int a, int b) { FUN_L00_0025f730(&q->motion.momentum, frame_time * 7.0f); if (frame_time * 3.5f < q->motion.forward_speed) allocate_hero_voice_for_entry(0xC, 0); - if (b) { + if (animation_setup_mode) { if (q->moby->seq == get_hero_idle_animation_index(0)) { set_hero_animation(0xD, 2, (float)scale_game_frames(9)); } else { @@ -658,7 +668,7 @@ int l01_hero_set_state(int a, int b) { *(int *)&p->past_apex = 0; p->rise_fall_land_frames = 0; p->rise_fall_gravity = frame_time_sq * 100.0f; - if (b) + if (animation_setup_mode) set_hero_animation(0x2A, 0, (float)scale_game_frames(6)); break; } @@ -673,7 +683,7 @@ int l01_hero_set_state(int a, int b) { p->unk4F0 = p->smoothed_ground_z; } p->item_select_blocked = 1; - if (b) { + if (animation_setup_mode) { if (frame_time * 3.5f < p->motion.flat_speed) { set_hero_animation(0x20, 0, (float)scale_game_frames(9)); } else { @@ -688,7 +698,7 @@ int l01_hero_set_state(int a, int b) { p->unk2284 = 0xD; p->item_select_blocked = 1; p->rand_timer.range = 0x68; - if (b) + if (animation_setup_mode) set_hero_animation(0x21, 0, (float)scale_game_frames(6)); break; } @@ -697,7 +707,7 @@ int l01_hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (animation_setup_mode) set_hero_animation(0x24, 0, (float)scale_game_frames(6)); break; } @@ -706,7 +716,7 @@ int l01_hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (animation_setup_mode) set_hero_animation(0x25, 0, (float)scale_game_frames(6)); break; } @@ -715,7 +725,7 @@ int l01_hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_setup_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xC)); break; } @@ -727,7 +737,7 @@ int l01_hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -739,7 +749,7 @@ int l01_hero_set_state(int a, int b) { q->rand_timer.range = 0x68; q->state.step = 0; qcopy(&q->motion.velocity, &q->motion.resolved_velocity); - if (b) { + if (animation_setup_mode) { if (q->vehicle_mode == 3) { set_hero_animation(6, 0, (float)scale_game_frames(8)); return 1; @@ -765,7 +775,7 @@ int l01_hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) { + if (animation_setup_mode) { set_hero_animation(0x13, 0, (float)animation_timing_override); } break; @@ -780,7 +790,7 @@ int l01_hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.displacement); - if (b) { + if (animation_setup_mode) { set_hero_animation(0x13, 0, (float)animation_timing_override); } break; @@ -812,7 +822,8 @@ int l01_hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; @@ -1025,7 +1036,7 @@ int l01_hero_set_state(int a, int b) { u->unk4A6 = scale_game_frames(0x55); u->ledge_probe_cooldown = scale_game_frames(0x46); u->velocity_keys_active = 1; - if (pal_mode != 0) { + if (pal_mode != FALSE) { u->unk3D0 = scale_game_frames(0x22); } else { u->unk3D0 = scale_game_frames(0x23); @@ -1088,7 +1099,7 @@ int l01_hero_set_state(int a, int b) { struct Hero *q = &hero; if (q->fall_start_distance == 0.0f) q->fall_start_distance = q->unk430 * 1.5f; - if (b) { + if (animation_setup_mode) { int s = q->state.current; if (s == 7) { set_hero_animation(7, 0, (float)scale_game_frames(5)); @@ -1178,7 +1189,7 @@ int l01_hero_set_state(int a, int b) { update_hero_target_heading(8.0f, 1.0471976f, -1.0f); *(int *)&q->slam_descending = 0; q->items[0].timer = 0xA; - if (b) { + if (animation_setup_mode) { char *m; int n = scale_game_frames(0xB); if (q->state.prev == 0xB && scale_game_frames(0x2A) > q->state.prev_timer) @@ -1216,7 +1227,7 @@ int l01_hero_set_state(int a, int b) { q->saved_item[0] = 0; update_hero_target_heading(14.0f, 0.5235988f, -1.0f); q->unkA7C = q->unkA7C == 0; - if (b) { + if (animation_setup_mode) { int n = scale_game_frames(0xA); if (q->moby->prev_seq == 0x1A) n = scale_game_frames(3); @@ -1231,7 +1242,7 @@ int l01_hero_set_state(int a, int b) { struct Hero *q = &hero; if (((void *)q->items[0].moby) == 0) break; - if (b) { + if (animation_setup_mode) { set_hero_animation(0x67, 4, -1.0f); blend_moby_animation(((void *)q->items[0].moby), 3, 4, -1); } @@ -1262,7 +1273,7 @@ int l01_hero_set_state(int a, int b) { r->attack_record = k; } update_hero_target_heading(5.0f, 0.7853982f, 0.7853982f); - if (b) { + if (animation_setup_mode) { char *m; int j = 0; int n; @@ -1293,7 +1304,7 @@ int l01_hero_set_state(int a, int b) { } case HERO_STATE_ANIMATION_RECOVERY_WITH_JUMP_CANCEL: { struct Hero *q; - if (b) + if (animation_setup_mode) set_hero_animation(0x2C, 7, (float)scale_game_frames(9)); q = &hero; if (q->items[0].item_id == 0xA && ((char *)q->throw_target) != 0) { @@ -1312,7 +1323,7 @@ int l01_hero_set_state(int a, int b) { p->state.control_mode = 0xA; p->unk2284 = 0; p->ground_speed = frame_time * 9.0f; - if (b) { + if (animation_setup_mode) { char *m; HeroTableRow2C *e = &D_L01_0017C0A8[p->attack_record]; int k = e->kind; @@ -1333,7 +1344,7 @@ int l01_hero_set_state(int a, int b) { p->unk2284 = 0; p->pushback_yaw = fast_add_rotations(p->motion.rot.f[2], 3.1415927f); p->ground_speed = frame_time * 9.0f; - if (b) + if (animation_setup_mode) set_hero_animation(0x29, 5, (float)scale_game_frames(8)); break; } @@ -1355,7 +1366,7 @@ int l01_hero_set_state(int a, int b) { { struct Hero *q = &hero; q->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (animation_setup_mode) { set_hero_animation(0x10, 3, -3.0f); q->moby->anim_time = level_01_hero_animation_blend_curves[q->anim_blend_curve] [(q->anim_blend_step)++]; @@ -1367,7 +1378,7 @@ int l01_hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) + if (animation_setup_mode) set_hero_animation(0, 0, (float)scale_game_frames(0xE)); break; } @@ -1375,7 +1386,7 @@ int l01_hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) { + if (animation_setup_mode) { set_hero_animation(4, 0, (float)scale_game_frames(7)); hero_queue_sequence(0xE, 0x22); } @@ -1386,7 +1397,7 @@ int l01_hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_setup_mode) set_hero_animation(6, 0, (float)scale_game_frames(0xC)); break; } @@ -1397,7 +1408,7 @@ int l01_hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_setup_mode) set_hero_animation(6, 0, (float)scale_game_frames(7)); break; } @@ -1414,7 +1425,7 @@ int l01_hero_set_state(int a, int b) { if (frame_time * 1.5f < planar_speed) hero_base->ground_speed = frame_time * 1.5f; hero_base->unk3B8 = 0; - if (b) + if (animation_setup_mode) set_hero_animation(1, 0, (float)scale_game_frames(8)); } break; @@ -1424,7 +1435,7 @@ int l01_hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (animation_setup_mode) set_hero_animation(3, 0, (float)scale_game_frames(0xC)); break; } @@ -1437,7 +1448,7 @@ int l01_hero_set_state(int a, int b) { FUN_L00_0025f730(&p->motion.velocity, frame_time * 5.0f); hero_change_health(1); p->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (animation_setup_mode) { set_hero_animation(2, 3, -3.0f); p->moby->anim_time = level_01_hero_animation_blend_curves[p->anim_blend_curve][(p->anim_blend_step)++]; @@ -1458,7 +1469,7 @@ int l01_hero_set_state(int a, int b) { clear_u64_value(&p->motion.velocity); clear_u64_value(&p->motion.displacement); p->motion.velocity.f[2] = frame_time * 10.0f; - if (b) + if (animation_setup_mode) set_hero_animation(0x10, 2, -3.0f); break; } @@ -1510,7 +1521,7 @@ int l01_hero_set_state(int a, int b) { p->item_select_blocked = 1; p->tilt_disabled = 1; p->item_use_locked = 1; - if (b) + if (animation_setup_mode) set_hero_animation(get_hero_idle_animation_index(0), 0, -1.0f); break; } @@ -1521,7 +1532,7 @@ int l01_hero_set_state(int a, int b) { p->item_select_blocked = 1; p->item_use_locked = 1; clear_u64_value(&p->motion.velocity); - if (b) + if (animation_setup_mode) set_hero_animation(0xB, 0, -1.0f); break; } @@ -1545,7 +1556,7 @@ int l01_hero_set_state(int a, int b) { p->state.control_mode = 0x18; p->item_use_locked = 1; cancel_hero_item_animation(); - if (b) + if (animation_setup_mode) set_hero_animation(get_hero_idle_animation_index(0), 0, -1.0f); break; } @@ -1611,6 +1622,9 @@ extern int get_ammo(int) __asm__("FUN_L00_00233e98"); int handle_hero_gadget_button(void) __asm__("FUN_L01_00240ed8"); int handle_hero_gadget_button(void) { + enum { + WRENCH_MOBY_STATE_READY_FOR_ATTACK = 0 + }; int wrench_button_history_age; int item_animation_button_history_age; int item_state_button_history_age; @@ -1624,7 +1638,7 @@ int handle_hero_gadget_button(void) { if (hero.item_use_locked != 0 && (hero.items[0].item_id != 8 || hero.unk308 != 1)) return 0; - if (hero.vehicle_mode != 0) + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) return 0; if (hero.items[0].moby == 0) return 0; @@ -1641,7 +1655,8 @@ int handle_hero_gadget_button(void) { pad_pressed_within(buttons, scale_game_frames(7), &wrench_button_history_age) != 0) { moby = hero.items[0].moby; - if (moby != 0 && is_wrench_moby((char *)moby) != 0 && moby->state == 0) { + if (moby != 0 && is_wrench_moby((char *)moby) != 0 && + moby->state == WRENCH_MOBY_STATE_READY_FOR_ATTACK) { if ((controller_state.held & 0xa) != 0 || ((hero.state.current == 1 || hero.state.current == 0x1e) && scale_game_frames(0x14) < hero.state_timer)) { @@ -1702,7 +1717,7 @@ int handle_hero_gadget_button(void) { } break; case ITEM_VEHICLE_MODE_TOGGLE: - if (hero.vehicle_mode == 0 && can_select_hero_item_31() != 0 && + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT && can_select_hero_item_31() != 0 && pad_pressed_within(buttons, scale_game_frames(7), 0) != 0 && D_00141660 == 0x1f && hero.items[0].moby->oclass == 0x1e3 && hero.vehicle_toggle_timer == 0) { allocate_hero_voice_for_entry(0x18, 0); diff --git a/src/overlays/l01/hero/update_hero_motion_for_current_state.c b/src/overlays/l01/hero/update_hero_motion_for_current_state.c index ab149dd91a..eafef45818 100644 --- a/src/overlays/l01/hero/update_hero_motion_for_current_state.c +++ b/src/overlays/l01/hero/update_hero_motion_for_current_state.c @@ -217,11 +217,11 @@ void update_hero_airborne_planar_motion(void) { s32 state; state = hero.state.current; - if (state == 10) { + if (state == HERO_STATE_PACK_JUMP) { build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); qcopy(&hero.motion.momentum, &hero.move_impulse); hero.ground_speed = hero.motion.flat_speed; - } else if (state == 16) { + } else if (state == HERO_STATE_PACK_LONG_JUMP) { if (scale_game_frames(0x36) < hero.state_timer) { approach_value(frame_time_sq * 25.0f, frame_time_sq * 7.0f, &hero.jump_gravity); } @@ -233,7 +233,7 @@ void update_hero_airborne_planar_motion(void) { speed_step(frame_time_sq * 44.0f, frame_time_sq * 45.0f); set_gravity_relative_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, 0.0f); add_hero_forward_offset(&hero.motion.velocity, &hero.motion.velocity, hero.ground_speed); - } else if (state == 0x1C) { + } else if (state == HERO_STATE_LEDGE_JUMP) { if (scale_game_frames(0x28) < hero.state_timer) { turn_to(0, frame_scale_sq * 0.04f, frame_scale_sq * 0.2f, frame_time * 15.009831f); air_accel(frame_time_sq * 20.0f); @@ -247,7 +247,7 @@ void update_hero_airborne_planar_motion(void) { } hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * hero.ledge_jump_speed; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * hero.ledge_jump_speed; - } else if (state == 11 || state == 12) { + } else if (state == HERO_STATE_HIGH_JUMP || state == HERO_STATE_STORED_HEADING_JUMP) { hero.motion.move_yaw = hero.takeoff_yaw; turn_to(0, frame_scale_sq * 0.04f, frame_scale_sq * 0.2f, frame_time * 6.981317f); if (hero.unk450 != 3) { @@ -272,7 +272,7 @@ void update_hero_airborne_planar_motion(void) { hero.motion.velocity.f[1] += fast_sin(hero.takeoff_yaw) * additional_planar_speed; build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); qcopy(&hero.motion.momentum, &hero.move_impulse); - } else if (state == 0x11) { + } else if (state == HERO_STATE_REPEATABLE_JUMP) { hero.motion.move_yaw = hero.unk470.f[3]; qcopy(&hero.motion.move_dir, &hero.unk470); if (scale_game_frames(9) < hero.state_timer) { @@ -394,7 +394,7 @@ extern int scale_game_frames(int); #include "rnc/overlay/shared/world/level_labels.h" extern s32 D_L01_0015F68C __attribute__((sda)); -extern void FUN_001efa68_cf(float *, float *, float) __asm__("FUN_L00_00233810"); +extern void add_hero_up_offset(float *, float *, float) __asm__("FUN_L00_00233810"); extern void rotate_hero_about_fixed_local_pivot(float, float, float) __asm__("FUN_L00_002091d8"); extern void emit_hero_periodic_surface_effect(int, int) __asm__("FUN_L00_00209540"); extern void emit_hero_periodic_surface_particles(int, int) __asm__("FUN_L00_00209848"); @@ -421,7 +421,7 @@ extern void stop_hero_motion_without_forward_support(float, float) __asm__("FUN_ extern void emit_filtered_entry_sparkles(int, int) __asm__("FUN_L00_00217368"); extern void launch_hero_wrench(void) __asm__("FUN_L00_00217658"); extern void set_hero_animation(int, int, float) __asm__("FUN_L00_002323b8"); -extern void FUN_L00_002334d0(float *, float *, float); +extern void add_hero_gravity_offset(float *, float *, float) __asm__("FUN_L00_002334d0"); extern void offset_hero_position_against_gravity(float *, float *, float) __asm__("FUN_L00_002336e8"); extern void add_hero_forward_offset(void *, void *, float) __asm__("FUN_L00_00233708"); @@ -592,10 +592,10 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && ((unsigned char *)item_available)[0x1C] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity.f, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); if (((Moby *)hero.ground_moby) != 0) { qcopy(hero.motion.pos.f, hero.ground_point.f); @@ -606,12 +606,12 @@ void update_hero_motion_for_current_state(void) { } else { clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0(hero.motion.velocity.f, - hero.motion.resolved_velocity_z.f, - frame_time_sq * 25.0f); + add_hero_gravity_offset(hero.motion.velocity.f, + hero.motion.resolved_velocity_z.f, + frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } @@ -1137,11 +1137,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(hero.motion.velocity.f); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.displacement.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } if (anim != -1 && hero.moby->seq != 0x36) { set_hero_animation(anim, 0, frames); @@ -1170,7 +1171,7 @@ void update_hero_motion_for_current_state(void) { fast_cos_cf(&z, a, b); FUN_L00_00233b20(hero.motion.velocity.f, hero.motion.velocity.f, z); } else if (hero.state_timer > window_end) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.velocity.f, hero.rise_fall_gravity); if (FUN_L00_00233a78(hero.motion.velocity.f) < 0.0f) { hero.past_apex = 1.0f; @@ -1264,7 +1265,7 @@ void update_hero_motion_for_current_state(void) { fast_cos_cf(&z, v, acc); FUN_L00_00233b20(hero.motion.velocity.f, hero.motion.velocity.f, z); } else if (hero.state_timer > window_end) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 130.0f); if (FUN_L00_00233a78(hero.motion.velocity.f) < 0.0f) { hero.slam_descending = 1.0f; @@ -1323,7 +1324,7 @@ void update_hero_motion_for_current_state(void) { ok = 0; } if (ok) { - if (hero.gravity_mode == 0) { + if (hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1335,10 +1336,11 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_WRENCH_COMBO: { @@ -1360,11 +1362,11 @@ void update_hero_motion_for_current_state(void) { if (d < 0.0f) { d = 0.0f; } - if (r->kind == 0) { + if (r->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { attack_kind_distance_offset = 0.75f; range = 0.8f; cap = 4.0f; - } else if (r->kind == 1) { + } else if (r->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { attack_kind_distance_offset = 0.6f; range = 1.7f; cap = 4.0f; @@ -1411,7 +1413,7 @@ void update_hero_motion_for_current_state(void) { } fast_cos_cf(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || ((Moby *)hero.melee_target) != 0) { - if (r->kind == 1 && + if (r->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1423,7 +1425,8 @@ void update_hero_motion_for_current_state(void) { int ok; ok = 1; - if (r->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (r->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && hero.anim_changing == 0 && + hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1437,10 +1440,11 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); } break; @@ -1560,11 +1564,12 @@ void update_hero_motion_for_current_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity.f, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_ANIMATION_RECOVERY_WITH_JUMP_CANCEL: @@ -1685,11 +1690,12 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_VOICE_SLOT_CLEANUP_IDLE_EXIT: @@ -1841,7 +1847,7 @@ void update_hero_motion_for_current_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -1852,7 +1858,8 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, hero.fall_state_gravity); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, hero.fall_state_gravity); if (FUN_L00_00233a78(hero.motion.velocity.f) < -(frame_time * 50.0f)) { FUN_L00_00233b20(hero.motion.velocity.f, hero.motion.velocity.f, -(frame_time * 50.0f)); } @@ -1872,7 +1879,8 @@ void update_hero_motion_for_current_state(void) { hero.motion.velocity.f, hero.motion.velocity.f); } - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, hero.fall_state_gravity); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, hero.fall_state_gravity); if (FUN_L00_00233a78(hero.motion.velocity.f) < -(frame_time * 50.0f)) { FUN_L00_00233b20(hero.motion.velocity.f, hero.motion.velocity.f, -(frame_time * 50.0f)); } @@ -1916,7 +1924,7 @@ void update_hero_motion_for_current_state(void) { clip_hero_horizontal_velocity(1); if (fast) { FUN_L00_002338d0(hero.motion.velocity.f, hero.motion.velocity.f); - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, a * 0.72f); + add_hero_gravity_offset(hero.motion.velocity.f, hero.motion.velocity.f, a * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -1961,7 +1969,7 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); FUN_L00_002338d0(hero.motion.velocity.f, hero.motion.velocity.f); - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, v * 0.72f); + add_hero_gravity_offset(hero.motion.velocity.f, hero.motion.velocity.f, v * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { fast_cos_cf(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2069,7 +2077,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.state_timer < scale_game_frames(0xA) && hero.stick_magnitude > 0.2f) { qcopy(vector_and_hit_scratch[0], hero.motion.pos.f); - FUN_001efa68_cf(vector_and_hit_scratch[0], vector_and_hit_scratch[0], 0.5f); + add_hero_up_offset(vector_and_hit_scratch[0], vector_and_hit_scratch[0], 0.5f); qcopy(vector_and_hit_scratch[1], vector_and_hit_scratch[0]); vector_and_hit_scratch[1][0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; vector_and_hit_scratch[1][1] += fast_sin(hero.motion.rot.f[2]) * 0.85f; @@ -2111,7 +2119,7 @@ void update_hero_motion_for_current_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2165,7 +2173,7 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(hero.motion.velocity.f, hero.motion.velocity.f, len); - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, 0.004f); + add_hero_gravity_offset(hero.motion.velocity.f, hero.motion.velocity.f, 0.004f); } break; case HERO_STATE_APPROACH_TARGET_POSE: { float len; @@ -2187,7 +2195,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = frame_time * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = frame_time * 0.9f; } } else { @@ -2198,29 +2206,30 @@ void update_hero_motion_for_current_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { clip_hero_horizontal_velocity(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.displacement.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_BRAKE_AT_TARGET_POSITION: { @@ -2232,11 +2241,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.displacement.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_FIDGET: @@ -2254,18 +2264,19 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -2273,7 +2284,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { update_hero_airborne_planar_motion(); } - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 21.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -2303,11 +2315,12 @@ void update_hero_motion_for_current_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_VEHICLE_MODE_3_HURT: { @@ -2323,10 +2336,10 @@ void update_hero_motion_for_current_state(void) { hero.motion.velocity.f); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity.f, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, 0.004f); + add_hero_gravity_offset(hero.motion.velocity.f, hero.motion.velocity.f, 0.004f); } } break; case HERO_STATE_CANCEL_ITEM_WITH_OPTIONAL_IDLE_ANIMATION: diff --git a/src/overlays/l01/hero/update_hero_state_machine.c b/src/overlays/l01/hero/update_hero_state_machine.c index 482d602fc2..badbb2d55b 100644 --- a/src/overlays/l01/hero/update_hero_state_machine.c +++ b/src/overlays/l01/hero/update_hero_state_machine.c @@ -165,9 +165,11 @@ void update_hero_state_machine(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && D_L01_0015F594 == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -230,7 +232,7 @@ void update_hero_state_machine(void) { } } if (fatal_fall_trigger_z > hero.motion.pos.f[2] && hero.ground_distance > 2.0f && - hero.vehicle_mode != 2 && hero.state.current != 0x77) { + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { l01_hero_set_state(0x77, 1); } else { switch (hero.state.current) { @@ -628,7 +630,7 @@ void update_hero_state_machine(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -655,7 +657,7 @@ void update_hero_state_machine(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); break; } @@ -911,7 +913,8 @@ void update_hero_state_machine(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { l01_hero_set_state(0x66, 1); } break; @@ -1934,7 +1937,7 @@ void update_hero_state_machine(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l01/level_class_tables.c b/src/overlays/l01/level_class_tables.c index 57e65ffe8f..303af41250 100644 --- a/src/overlays/l01/level_class_tables.c +++ b/src/overlays/l01/level_class_tables.c @@ -6,7 +6,7 @@ #include "rnc/camera/update_cam.h" #include "rnc/mobys/moby_class_tables.h" -void FUN_L00_002caf40(); +void get_morphoray_chicken_slot_record() __asm__("FUN_L00_002caf40"); void FUN_L00_002ea7a0(); void FUN_L00_002ed230(); void agnogg_ship_front_update() __asm__("FUN_L01_002fad68"); @@ -174,7 +174,7 @@ void *D_L01_0020C3C4[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L01_0020C3DC[6] diff --git a/src/overlays/l01/mobys/agnogg_ship_front.c b/src/overlays/l01/mobys/agnogg_ship_front.c index 5f020c0ae3..2bd5ab29d2 100644 --- a/src/overlays/l01/mobys/agnogg_ship_front.c +++ b/src/overlays/l01/mobys/agnogg_ship_front.c @@ -45,9 +45,12 @@ extern MobyList fx_cutscene __asm__("D_L01_0016CCE0"); void apply_cutscene_big_head_cheat(void) __asm__("FUN_L01_002fac80"); void apply_cutscene_big_head_cheat(void) { + enum { + CUTSCENE_MODE_PLAYING = 2 + }; s32 i; - if (cutscene_mode == 2 && big_head_cheat_enabled != 0) { + if (cutscene_mode == CUTSCENE_MODE_PLAYING && big_head_cheat_enabled != 0) { for (i = 0; i < fx_cutscene.count; i++) { if (fx_cutscene.list[i]->type == 0x32B && D_L01_0017C8C0.active == 0) { attach_manipulator(fx_cutscene.list[i], 0, &D_L01_0017C8C0); @@ -179,7 +182,7 @@ void agnogg_ship_front_update(Moby_2FC140 *moby) { case AGNOGG_SHIP_INITIALIZE: fz = moby->pos.z - 0.75f; moby->f30 = 0xFF; - moby->state = 1; + moby->state = AGNOGG_SHIP_WAIT_FOR_DESCENT_TRIGGER; data->timer = 0; fd = data->f0; data->fC = fz; @@ -194,7 +197,7 @@ void agnogg_ship_front_update(Moby_2FC140 *moby) { if (moby->f53 != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(0x14)); } - moby->state = 10; + moby->state = AGNOGG_SHIP_HOLD_TARGET_HEIGHT; moby->flags = moby->flags & 0xFFBE; moby->f32 = level_table_byte; moby->f94 = moby->pclass->f10; @@ -224,7 +227,7 @@ void agnogg_ship_front_update(Moby_2FC140 *moby) { fast_arc_tan(moby->pos.x - l01_cuboids_macro[linked_moby_data->rec].pos.x, moby->pos.y - l01_cuboids_macro[linked_moby_data->rec].pos.y); } - moby->state = 2; + moby->state = AGNOGG_SHIP_DESCEND_TO_TARGET_HEIGHT; } } break; @@ -246,7 +249,7 @@ void agnogg_ship_front_update(Moby_2FC140 *moby) { } if (moby->pos.z <= data->fC) { moby->pos.z = data->fC; - moby->state = 3; + moby->state = AGNOGG_SHIP_WAIT_FOR_ANIMATION_1_GATE; } break; case AGNOGG_SHIP_WAIT_FOR_ANIMATION_1_GATE: @@ -260,9 +263,9 @@ void agnogg_ship_front_update(Moby_2FC140 *moby) { blend_moby_animation(moby, 2, 0, scale_game_frames(0x14)); } if (moby->oclass == 0x2DA) { - moby->state = 10; + moby->state = AGNOGG_SHIP_HOLD_TARGET_HEIGHT; } else { - moby->state = 4; + moby->state = AGNOGG_SHIP_WAIT_FOR_LINKED_MOBIES_INACTIVE; } break; case AGNOGG_SHIP_WAIT_FOR_LINKED_MOBIES_INACTIVE: @@ -290,7 +293,7 @@ void agnogg_ship_front_update(Moby_2FC140 *moby) { break; } data->timer = scale_game_frames(0x2D); - moby->state = 5; + moby->state = AGNOGG_SHIP_WAIT_BEFORE_SCENE; break; case AGNOGG_SHIP_WAIT_BEFORE_SCENE: if (data->timer != 0) { @@ -299,21 +302,21 @@ void agnogg_ship_front_update(Moby_2FC140 *moby) { data->fA = moby->f32; moby->flags = moby->flags | 0x41; start_scene(3); - moby->state = 6; + moby->state = AGNOGG_SHIP_WAIT_FOR_SCENE_3_END; break; case AGNOGG_SHIP_WAIT_FOR_SCENE_3_END: if (cutscene_mode_macro == 2) { break; } queue_scene_movie_with_game_language(3); - moby->state = 7; + moby->state = AGNOGG_SHIP_WAIT_TO_START_SCENE_4; break; case AGNOGG_SHIP_WAIT_TO_START_SCENE_4: if (cutscene_mode_macro == 2) { break; } start_scene(4); - moby->state = 8; + moby->state = AGNOGG_SHIP_WAIT_FOR_SCENE_4_END; break; case AGNOGG_SHIP_WAIT_FOR_SCENE_4_END: if (cutscene_mode_macro == 2) { @@ -351,7 +354,7 @@ void agnogg_ship_front_update(Moby_2FC140 *moby) { } memcard_save_data(0, -1); show_tracked_moby(); - moby->state = 10; + moby->state = AGNOGG_SHIP_HOLD_TARGET_HEIGHT; break; case AGNOGG_SHIP_HOLD_TARGET_HEIGHT: moby->pos.z = data->fC; diff --git a/src/overlays/l01/mobys/beehive.c b/src/overlays/l01/mobys/beehive.c index af18f33ee3..a2e9907c56 100644 --- a/src/overlays/l01/mobys/beehive.c +++ b/src/overlays/l01/mobys/beehive.c @@ -104,7 +104,7 @@ void beehive_update(SpawnerMoby *beehive_moby) { switch (beehive_moby->state) { case BEEHIVE_INITIALIZE: - beehive_moby->state = 1; + beehive_moby->state = BEEHIVE_TRY_SPAWN_CLONE; break; case BEEHIVE_TRY_SPAWN_CLONE: if (beehive_vars->src_id < 0) { diff --git a/src/overlays/l01/mobys/birdbot.c b/src/overlays/l01/mobys/birdbot.c index 407f839820..d1ba587343 100644 --- a/src/overlays/l01/mobys/birdbot.c +++ b/src/overlays/l01/mobys/birdbot.c @@ -546,7 +546,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (birdbot_vars->w1C8 > 0) { birdbot_vars->w1C8--; } - if (birdbot_moby->state != 0) { + if (birdbot_moby->state != BIRDBOT_STATE_INITIALIZE) { path_reposition_requested = select_birdbot_path_node(birdbot_moby, &idx); } target_search_radius = flag ? birdbot_vars->f1A0 * 2.0f : birdbot_vars->f1A0; @@ -574,7 +574,7 @@ void birdbot_update(PeMoby *birdbot_moby) { birdbot_vars->h1E2 = scale_game_frames(0x258); birdbot_vars->f20 -= dmg; if (birdbot_vars->f20 <= 0.0f) { - kind = 1; + kind = BIRDBOT_HIT_REACTION_FATAL_KNOCKBACK; } switch (kind) { case BIRDBOT_HIT_REACTION_KEEP_CURRENT_STATE: @@ -600,7 +600,7 @@ void birdbot_update(PeMoby *birdbot_moby) { FUN_L00_0025c558_u( knockback_heading, birdbot_moby, birdbot_vars->x70, 9, scale_game_frames(2), 0); birdbot_vars->b67 = 0xB4; - birdbot_moby->state = 0xE; + birdbot_moby->state = BIRDBOT_STATE_FATAL_KNOCKBACK; birdbot_moby->h34 &= 0xEFFF; trooper_anim_update(birdbot_moby, (short *)birdbot_vars->x60); birdbot_vars->h26 = scale_game_frames(0x3C); @@ -623,7 +623,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (birdbot_moby->b53 != 0xB) { blend_moby_animation(birdbot_moby, 0xB, 0, scale_game_frames(6)); } - birdbot_moby->state = 0xC; + birdbot_moby->state = BIRDBOT_STATE_NONFATAL_KNOCKBACK; trooper_anim_update(birdbot_moby, (short *)birdbot_vars->x60); break; case BIRDBOT_HIT_REACTION_LOW_SPEED_NONFATAL_KNOCKBACK: @@ -640,7 +640,7 @@ void birdbot_update(PeMoby *birdbot_moby) { *(u128 *)&va = *(u128 *)&hit->pos; trooper_knockback_arc(&va, &knockback_heading, &birdbot_vars->f88, &birdbot_vars->f8C); FUN_L00_0025c558_u(knockback_heading, birdbot_moby, birdbot_vars->x70, 0xE, 6, 0); - birdbot_moby->state = 0xC; + birdbot_moby->state = BIRDBOT_STATE_NONFATAL_KNOCKBACK; trooper_anim_update(birdbot_moby, (short *)birdbot_vars->x60); break; } @@ -712,7 +712,7 @@ void birdbot_update(PeMoby *birdbot_moby) { birdbot_moby->w94 = 0; birdbot_moby->h34 |= 0x41; } - birdbot_moby->state = 2; + birdbot_moby->state = BIRDBOT_STATE_WAIT_FOR_TRIGGER; break; } case BIRDBOT_STATE_TRACK_TARGET_AND_SELECT_ACTION: { @@ -741,7 +741,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (collision_line(&vb, &va, 0, birdbot_moby, 0) == 0) { birdbot_vars->h1A4 = 0; birdbot_vars->f198 = 4.0f; - birdbot_moby->state = 6; + birdbot_moby->state = BIRDBOT_STATE_FIRE_BURST; if (birdbot_moby->b53 != 4) { blend_moby_animation(birdbot_moby, 4, 0, scale_game_frames(6)); } @@ -766,7 +766,7 @@ void birdbot_update(PeMoby *birdbot_moby) { f = *(float *)&birdbot_path_entry_animation_speed_gp; c->idx = i; birdbot_moby->f58 = f; - birdbot_moby->state = 9; + birdbot_moby->state = BIRDBOT_STATE_BEGIN_PATH_MOVEMENT; } } } @@ -796,7 +796,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (birdbot_moby->b53 != 8) { blend_moby_animation(birdbot_moby, 8, 0, scale_game_frames(10)); } - birdbot_moby->state = 3; + birdbot_moby->state = BIRDBOT_STATE_DEPLOY; } break; case BIRDBOT_STATE_DEPLOY: @@ -821,7 +821,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (birdbot_moby->b53 != 0) { blend_moby_animation(birdbot_moby, 0, 0, scale_game_frames(5)); } - birdbot_moby->state = 1; + birdbot_moby->state = BIRDBOT_STATE_TRACK_TARGET_AND_SELECT_ACTION; } else { fast_vec_sub(&va, &vb, &birdbot_moby->pos); fast_vec_normalize(&va, &va, frame_time * 5.0f); @@ -862,7 +862,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (birdbot_moby->b53 != 0) { blend_moby_animation(birdbot_moby, 0, 0, scale_game_frames(5)); } - birdbot_moby->state = 1; + birdbot_moby->state = BIRDBOT_STATE_TRACK_TARGET_AND_SELECT_ACTION; } } else { clear_u64_value(&va); @@ -875,7 +875,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (birdbot_moby->b53 != 0) { blend_moby_animation(birdbot_moby, 0, 0, scale_game_frames(5)); } - birdbot_moby->state = 1; + birdbot_moby->state = BIRDBOT_STATE_TRACK_TARGET_AND_SELECT_ACTION; } } spawn_birdbot_movement_particles((SplashMoby *)birdbot_moby, @@ -918,7 +918,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (birdbot_moby->b53 != 0) { blend_moby_animation(birdbot_moby, 0, 0, scale_game_frames(5)); } - birdbot_moby->state = 1; + birdbot_moby->state = BIRDBOT_STATE_TRACK_TARGET_AND_SELECT_ACTION; break; } } @@ -931,7 +931,7 @@ void birdbot_update(PeMoby *birdbot_moby) { blend_moby_animation(birdbot_moby, 5, 5, scale_game_frames(10)); } birdbot_moby->f58 = 0.5f; - birdbot_moby->state = 7; + birdbot_moby->state = BIRDBOT_STATE_RECOVER_FROM_BURST; } } break; @@ -960,7 +960,7 @@ void birdbot_update(PeMoby *birdbot_moby) { blend_moby_animation(birdbot_moby, 8, 0, scale_game_frames(10)); } birdbot_moby->f58 = *(float *)&birdbot_path_entry_animation_speed_gp; - birdbot_moby->state = 9; + birdbot_moby->state = BIRDBOT_STATE_BEGIN_PATH_MOVEMENT; } else { float d; @@ -981,7 +981,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (collision_line(&vb, &va, 0, birdbot_moby, 0) == 0) { birdbot_vars->h1A4 = 0; birdbot_vars->f198 = 4.0f; - birdbot_moby->state = 6; + birdbot_moby->state = BIRDBOT_STATE_FIRE_BURST; if (birdbot_moby->b53 != 4) { blend_moby_animation(birdbot_moby, 4, 0, scale_game_frames(6)); } @@ -993,7 +993,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (birdbot_moby->b53 != 0) { blend_moby_animation(birdbot_moby, 0, 0, scale_game_frames(5)); } - birdbot_moby->state = 1; + birdbot_moby->state = BIRDBOT_STATE_TRACK_TARGET_AND_SELECT_ACTION; } } break; @@ -1002,7 +1002,7 @@ void birdbot_update(PeMoby *birdbot_moby) { birdbot_moby->f58 = 1.0f; birdbot_vars->f1B8 = 0.0f; birdbot_vars->f1BC = 0.0f; - birdbot_moby->state = 0xA; + birdbot_moby->state = BIRDBOT_STATE_MOVE_TO_PATH_NODE; spawn_birdbot_movement_particles((SplashMoby *)birdbot_moby, (u128 *)&birdbot_position_before_update); break; @@ -1067,7 +1067,7 @@ void birdbot_update(PeMoby *birdbot_moby) { qcopy(&va, &c->path->points[c->idx]); va.f[2] += path_node_height_offset; if (fast_vec_dist(&birdbot_moby->pos, &va) < 0.25f) { - birdbot_moby->state = 0xB; + birdbot_moby->state = BIRDBOT_STATE_BRAKE_AND_FACE_TARGET; } spawn_birdbot_movement_particles((SplashMoby *)birdbot_moby, (u128 *)&birdbot_position_before_update); @@ -1118,7 +1118,7 @@ void birdbot_update(PeMoby *birdbot_moby) { if (birdbot_moby->b53 != 0) { blend_moby_animation(birdbot_moby, 0, 0, scale_game_frames(6)); } - birdbot_moby->state = 1; + birdbot_moby->state = BIRDBOT_STATE_TRACK_TARGET_AND_SELECT_ACTION; } spawn_birdbot_movement_particles((SplashMoby *)birdbot_moby, (u128 *)&birdbot_position_before_update); @@ -1137,13 +1137,13 @@ void birdbot_update(PeMoby *birdbot_moby) { f = *(float *)&birdbot_path_entry_animation_speed_gp; birdbot_vars->main.idx = i; birdbot_moby->f58 = f; - birdbot_moby->state = 9; + birdbot_moby->state = BIRDBOT_STATE_BEGIN_PATH_MOVEMENT; return; } if (birdbot_moby->b53 != 0) { blend_moby_animation(birdbot_moby, 0, 0, scale_game_frames(6)); } - birdbot_moby->state = 1; + birdbot_moby->state = BIRDBOT_STATE_TRACK_TARGET_AND_SELECT_ACTION; } if (birdbot_moby->pos.f[0] < 2.0f || birdbot_moby->pos.f[0] > 1021.0f || birdbot_moby->pos.f[1] < 2.0f || birdbot_moby->pos.f[1] > 1021.0f || @@ -1243,8 +1243,10 @@ void birdbot_update(PeMoby *birdbot_moby) { } trooper_anim_finish(birdbot_moby, birdbot_vars->x60); birdbot_vars->f1CC = frame; - if (birdbot_moby->state == 1 || birdbot_moby->state == 5 || birdbot_moby->state == 6 || - birdbot_moby->state == 7 || birdbot_moby->state == 0xB) { + if (birdbot_moby->state == BIRDBOT_STATE_TRACK_TARGET_AND_SELECT_ACTION || + birdbot_moby->state == 5 || birdbot_moby->state == BIRDBOT_STATE_FIRE_BURST || + birdbot_moby->state == BIRDBOT_STATE_RECOVER_FROM_BURST || + birdbot_moby->state == BIRDBOT_STATE_BRAKE_AND_FACE_TARGET) { birdbot_vars->fE8 += frame_time_sq * 9.8f; birdbot_moby->pos.f[2] -= birdbot_vars->fE8 - 2.0f; ground = probe_ground_height(&birdbot_moby->pos, 0, 0.5f); diff --git a/src/overlays/l01/mobys/birdbot_projectile.c b/src/overlays/l01/mobys/birdbot_projectile.c index a3db3c5b97..f1c3d21086 100644 --- a/src/overlays/l01/mobys/birdbot_projectile.c +++ b/src/overlays/l01/mobys/birdbot_projectile.c @@ -225,7 +225,7 @@ typedef struct { extern f32 scale_time(f32) __asm__("FUN_001f96b0"); extern s32 collision_line(void *, void *, s32, void *, void *) __asm__("FUN_001efa68"); extern s32 probe_world_sphere(f32, void *, s32, void *, void *) __asm__("FUN_L00_001f2868"); -extern u8 D_L01_00167240[]; +extern u8 camera_pos[] __asm__("D_L01_00167240"); extern u128 D_L01_001742E0; void birdbot_projectile_update(DropMoby *) __asm__("FUN_L01_002fa4c0"); @@ -256,7 +256,7 @@ void birdbot_projectile_update(DropMoby *projectile) { ((f32 *)&projectile_vars->vel)[2] -= (scaled_ten * zero + one) * 2.0f / scaled_ten_product; fast_vec_add(pos, pos, &projectile_vars->vel); if (projectile->pos.f[0] < zero || projectile->pos.f[1] < zero || projectile->pos.f[2] < zero || - vector_distance_xy(pos, D_L01_00167240) > 64.0f) { + vector_distance_xy(pos, camera_pos) > 64.0f) { mark_moby_for_removal(projectile); return; } diff --git a/src/overlays/l01/mobys/bomber_jet.c b/src/overlays/l01/mobys/bomber_jet.c index 2ecfbde38d..bbde8b4c74 100644 --- a/src/overlays/l01/mobys/bomber_jet.c +++ b/src/overlays/l01/mobys/bomber_jet.c @@ -81,7 +81,9 @@ typedef struct { extern void update_entity() __asm__("FUN_L00_00250df8"); extern void spawn_source_attached_fading_effect_particle(void *, u32, s32, s32, f32) __asm__("FUN_L00_0026daa0"); -BeamMoby *FUN_L01_002f68a0(void *owner, u128 *pos, u128 *dir, u128 *color, s32 kind) { +BeamMoby *spawn_bomber_jet_beam(void *owner, u128 *pos, u128 *dir, u128 *color, s32 kind) __asm__("FUN_L01_002f68a0"); + +BeamMoby *spawn_bomber_jet_beam(void *owner, u128 *pos, u128 *dir, u128 *color, s32 kind) { Vec4 position_copy; Vec4 direction_copy; Vec4 target_position_copy; @@ -259,6 +261,9 @@ void bomber_jet_update(GunshipMoby *m) __asm__("FUN_L01_002f7728"); /* Moby class 688 */ void bomber_jet_update(GunshipMoby *bomber_jet_moby) { + enum { + BOMBER_JET_STATE_INITIALIZE = 0 + }; GunshipVars *gunship_vars = bomber_jet_moby->vars; GunshipFollow *sub = &gunship_vars->sub; float distance_scale; @@ -318,7 +323,7 @@ void bomber_jet_update(GunshipMoby *bomber_jet_moby) { return; } do { - if (bomber_jet_moby->state == 0) { + if (bomber_jet_moby->state == BOMBER_JET_STATE_INITIALIZE) { if (sub->path != -1) { GunshipPath *path = (GunshipPath *)l01_paths[sub->path]; j = 0; @@ -363,7 +368,7 @@ void bomber_jet_update(GunshipMoby *bomber_jet_moby) { bomber_jet_moby->alpha = 0x80; } if (gunship_vars->trigger_volume != -1) { - if (bomber_jet_moby->state == 0) { + if (bomber_jet_moby->state == BOMBER_JET_STATE_INITIALIZE) { gunship_update((char *)bomber_jet_moby); } if (gunship_vars->cutscene_timer == -1 && diff --git a/src/overlays/l01/mobys/bridge_half.c b/src/overlays/l01/mobys/bridge_half.c index 4aed66fc43..e233a0d799 100644 --- a/src/overlays/l01/mobys/bridge_half.c +++ b/src/overlays/l01/mobys/bridge_half.c @@ -59,13 +59,13 @@ void bridge_half_update(PendulumMoby *bridge_half_moby) { case BRIDGE_HALF_INITIALIZE: qcopy(&pendulum_vars->pivot, &bridge_half_moby->pos); pendulum_vars->swing = 1.0f; - bridge_half_moby->state = 1; + bridge_half_moby->state = BRIDGE_HALF_WAIT_FOR_TRIGGER; pendulum_vars->sound = -1; break; case BRIDGE_HALF_WAIT_FOR_TRIGGER: if (bridge_half_moby->trigger == 2 || D_0014C050[bridge_half_moby->id + current_level_index * 16] == 0xFF) { - bridge_half_moby->state = 2; + bridge_half_moby->state = BRIDGE_HALF_REDUCE_SWING_TO_ZERO; bridge_half_moby->trigger = 0; } break; @@ -83,7 +83,7 @@ void bridge_half_update(PendulumMoby *bridge_half_moby) { } } pendulum_vars->sound = -1; - bridge_half_moby->state = 1; + bridge_half_moby->state = BRIDGE_HALF_WAIT_FOR_TRIGGER; } else if (!voice_is_playing(bridge_half_moby, pendulum_vars->sound)) { pendulum_vars->sound = FUN_0022da68(0, 4, bridge_half_moby); } diff --git a/src/overlays/l01/mobys/burning_debris.c b/src/overlays/l01/mobys/burning_debris.c index 2f61ffdea0..2b4eb995a8 100644 --- a/src/overlays/l01/mobys/burning_debris.c +++ b/src/overlays/l01/mobys/burning_debris.c @@ -69,7 +69,7 @@ void burning_debris_update(struct Moby *moby) { s32 grey_intensity; s32 alpha; s32 grey; - f32 s; + f32 initial_particle_scalar; u8 *puff; u8 *puff_data; @@ -128,12 +128,12 @@ void burning_debris_update(struct Moby *moby) { mark_moby_for_removal(moby); return; } - s = random_float_between(0.5f, 1.5f) * 210000.0f; + initial_particle_scalar = random_float_between(0.5f, 1.5f) * 210000.0f; spawn_burst(&moby->pos, &D_L01_0015F580, 0x4F007FFF, 0x1FFFFFFF, - s, + initial_particle_scalar, random_int_between(scale_game_frames(10), scale_game_frames(20)), 1); alpha = 0x60000000; @@ -142,7 +142,7 @@ void burning_debris_update(struct Moby *moby) { if (random_integer_below(2)) { signed_puff_variation = -signed_puff_variation; } - s = random_float_between(40000.0f, 100000.0f); + initial_particle_scalar = random_float_between(40000.0f, 100000.0f); grey_intensity = random_int_between(0x30, 0xFF); grey = (grey_intensity << 8) | alpha; puff = spawn_puff(&moby->pos, @@ -151,7 +151,7 @@ void burning_debris_update(struct Moby *moby) { 1.0f, signed_puff_variation, &D_L01_0015F580, - s, + initial_particle_scalar, grey_intensity | ((grey_intensity << 16) | grey)); if (puff != NULL) { puff[3] = 0x44; @@ -194,6 +194,9 @@ DebrisMoby *spawn_debris(DebrisMoby *parent_moby, f32 scale) __asm__("FUN_L01_0030be70"); DebrisMoby *spawn_debris(DebrisMoby *parent_moby, void *debris_vector_source, f32 scale) { + enum { + BURNING_DEBRIS_STATE_INITIAL = 0 + }; DebrisMoby *spawned_moby; DebrisVars *debris_vars; @@ -203,7 +206,7 @@ DebrisMoby *spawn_debris(DebrisMoby *parent_moby, void *debris_vector_source, f3 debris_vars->parent = parent_moby; qcopy(&spawned_moby->pos, &parent_moby->pos); spawned_moby->rot = parent_moby->rot; - spawned_moby->state = 0; + spawned_moby->state = BURNING_DEBRIS_STATE_INITIAL; spawned_moby->b30 = 0xFF; spawned_moby->h32 = 0xFF; spawned_moby->b31 = 1; diff --git a/src/overlays/l01/mobys/cave_door.c b/src/overlays/l01/mobys/cave_door.c index a5719048ae..397b1da1a1 100644 --- a/src/overlays/l01/mobys/cave_door.c +++ b/src/overlays/l01/mobys/cave_door.c @@ -33,7 +33,7 @@ void cave_door_update(struct Moby *cave_door_moby) { case CAVE_DOOR_STATE_INITIALIZE: cave_door_vars->angle = cave_door_moby->rot.x; cave_door_vars->speed = cave_door_vars->speed * DEG_TO_RAD; - cave_door_moby->state = 1; + cave_door_moby->state = CAVE_DOOR_STATE_UPDATE_ROTATION; break; case CAVE_DOOR_STATE_UPDATE_ROTATION: if (cave_door_vars->target != -1) { diff --git a/src/overlays/l01/mobys/create_spark_particle.c b/src/overlays/l01/mobys/create_spark_particle.c index b0c9292ede..37ac745365 100644 --- a/src/overlays/l01/mobys/create_spark_particle.c +++ b/src/overlays/l01/mobys/create_spark_particle.c @@ -71,6 +71,9 @@ void create_spark_particle(s32 id, f32 b, f32 size) { + enum { + SPARK_MODE_FROM_KIND = 0xFF + }; Spark *spark; SparkBody *spark_body; u128 position_snapshot = *pos; @@ -85,7 +88,7 @@ void create_spark_particle(s32 id, } spark_body = &spark->body; qcopy(&spark->pos, position_copy_source); - if (mode == 0xFF) { + if (mode == SPARK_MODE_FROM_KIND) { spark->b9 = (kind >> 5) * 16 + truncate_float_to_s32(4.0f); if (kind & 1) { spark->b3 = 0x48; diff --git a/src/overlays/l01/mobys/cutscene_effects.c b/src/overlays/l01/mobys/cutscene_effects.c index ced1676e64..d44103eaa3 100644 --- a/src/overlays/l01/mobys/cutscene_effects.c +++ b/src/overlays/l01/mobys/cutscene_effects.c @@ -102,7 +102,7 @@ void level01_cutscene_effects_update(struct Moby *moby) { switch (moby->state) { case CUTSCENE_FX_STATE_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = CUTSCENE_FX_STATE_UPDATE; break; case CUTSCENE_FX_STATE_UPDATE: if (cutscene_mode_macro == 2) { diff --git a/src/overlays/l01/mobys/door_half.c b/src/overlays/l01/mobys/door_half.c index f785b179d6..d03a74b70f 100644 --- a/src/overlays/l01/mobys/door_half.c +++ b/src/overlays/l01/mobys/door_half.c @@ -66,7 +66,7 @@ void door_half_update(struct Moby *door_half_moby) { door_half_vars->start_y = door_half_moby->pos.y; door_half_vars->sound = -1; door_half_vars->last_progress = 0.0f; - door_half_moby->state = 1; + door_half_moby->state = DOOR_HALF_STATE_FOLLOW_DRIVER; break; case DOOR_HALF_STATE_FOLLOW_DRIVER: if (door_half_vars->target == -1 || door_half_vars->end_x == 0.0f || diff --git a/src/overlays/l01/mobys/door_left.c b/src/overlays/l01/mobys/door_left.c index 4c181547aa..22e9c2b919 100644 --- a/src/overlays/l01/mobys/door_left.c +++ b/src/overlays/l01/mobys/door_left.c @@ -6,7 +6,7 @@ extern s32 FUN_0022da68(s32, s32, void *); extern f32 scale_time(f32) __asm__("FUN_001f96b0"); -extern u8 D_L01_00167240[]; +extern u8 camera_pos[] __asm__("D_L01_00167240"); #include "qcopy.h" @@ -51,13 +51,13 @@ void door_left_update(HoverMoby *door_moby) { case DOOR_INITIALIZE: qcopy(&door_vars->home, &door_moby->pos); door_vars->t = 0.0f; - door_moby->state = 1; + door_moby->state = DOOR_CLOSED; break; case DOOR_CLOSED: player = &hero.motion.pos; if (vector_distance_xy(door_vars, player) < door_vars->radius && absolute_float(door_moby->pos.f[2] - player->f[2]) < 2.0f) { - door_moby->state = 2; + door_moby->state = DOOR_OPENING; if (door_moby->oclass == 0x300) { FUN_0022da68(0, 0, door_moby); } @@ -67,14 +67,14 @@ void door_left_update(HoverMoby *door_moby) { door_vars->t += 1.0f / scale_time(20.0f); if (door_vars->t >= 1.0f) { door_vars->t = 1.0f; - door_moby->state = 3; + door_moby->state = DOOR_OPEN; } break; case DOOR_OPEN: k = 1.1f; if (vector_distance_xy(door_vars, &hero.motion.pos) > door_vars->radius * k && - vector_distance_xy(door_vars, D_L01_00167240) > door_vars->radius * k) { - door_moby->state = 4; + vector_distance_xy(door_vars, camera_pos) > door_vars->radius * k) { + door_moby->state = DOOR_CLOSING; if (door_moby->oclass == 0x300) { FUN_0022da68(0, 0, door_moby); } @@ -84,12 +84,12 @@ void door_left_update(HoverMoby *door_moby) { player = &hero.motion.pos; if (vector_distance_xy(door_vars, player) < door_vars->radius && absolute_float(door_moby->pos.f[2] - player->f[2]) < 2.0f) { - door_moby->state = 2; + door_moby->state = DOOR_OPENING; } else { door_vars->t -= 1.0f / scale_time(20.0f); if (door_vars->t <= 0.0f) { door_vars->t = 0.0f; - door_moby->state = 1; + door_moby->state = DOOR_CLOSED; } } break; diff --git a/src/overlays/l01/mobys/environment_mapped_meshes.c b/src/overlays/l01/mobys/environment_mapped_meshes.c index 9893632f56..c368dff231 100644 --- a/src/overlays/l01/mobys/environment_mapped_meshes.c +++ b/src/overlays/l01/mobys/environment_mapped_meshes.c @@ -1415,7 +1415,7 @@ void environment_map_scroll_update(ScrollMoby *moby) { case UV_SCROLL_STATE_INITIALIZE: level01_environment_map_uv_scroll_offsets[0] = 0.0f; level01_environment_map_uv_scroll_offsets[1] = 0.0f; - moby->state = 1; + moby->state = UV_SCROLL_STATE_UPDATE_AND_QUEUE_DRAW; break; case UV_SCROLL_STATE_UPDATE_AND_QUEUE_DRAW: uv_scroll_delta = frame_delta_time * 0.025f; diff --git a/src/overlays/l01/mobys/falling_rock.c b/src/overlays/l01/mobys/falling_rock.c index 81d7d32af5..c696ef8308 100644 --- a/src/overlays/l01/mobys/falling_rock.c +++ b/src/overlays/l01/mobys/falling_rock.c @@ -137,8 +137,8 @@ void falling_rock_update(CapMoby *falling_rock) { LevelCuboid *camera_record; falling_rock_vars = falling_rock->pvars; - if (falling_rock->state != 1 && !fast_dec_timer_s16(&falling_rock_vars->wait) && - random_integer_below(100) < 5) { + if (falling_rock->state != FALLING_ROCK_STATE_WAIT_FOR_TRIGGER && + !fast_dec_timer_s16(&falling_rock_vars->wait) && random_integer_below(100) < 5) { CapColors colors; CapVec debris_initial_velocity; CapVec pos; @@ -173,13 +173,13 @@ void falling_rock_update(CapMoby *falling_rock) { falling_rock_vars->b28 = 4; falling_rock_vars->h3E = 5; qcopy(&falling_rock_vars->home, &falling_rock->pos); - falling_rock->state = 1; + falling_rock->state = FALLING_ROCK_STATE_WAIT_FOR_TRIGGER; if (l01_save_state.cleared[falling_rock->id] != 0 || (D_0014C190[current_level_index_macro][falling_rock->id >> 5] >> (falling_rock->id & 0x1F)) & 1) { clear_u64_value(&falling_rock_vars->rot); - falling_rock->state = 4; + falling_rock->state = FALLING_ROCK_STATE_FALLEN; falling_rock->pos.f[2] = falling_rock_vars->home.f[2] - 20.0f; falling_rock_vars->music = -1; } @@ -193,7 +193,7 @@ void falling_rock_update(CapMoby *falling_rock) { falling_rock_vars->wait = random_int_between(scale_game_frames(300), scale_game_frames(600)); falling_rock_vars->rise = scale_game_frames(falling_rock_vars->rise_len); - falling_rock->state = 2; + falling_rock->state = FALLING_ROCK_STATE_WAIT_BEFORE_FALL; l01_camera.shake_amount = 0.4f; l01_camera.shake_frames = scale_game_frames(30); allocate_voice_for_target_entry(1, 0, falling_rock); @@ -205,7 +205,7 @@ void falling_rock_update(CapMoby *falling_rock) { if (fast_dec_timer_s16(&falling_rock_vars->rise)) { clear_u64_value(&falling_rock_vars->rot); falling_rock_vars->hold = scale_game_frames(0x2D); - falling_rock->state = 3; + falling_rock->state = FALLING_ROCK_STATE_FALLING; } break; case FALLING_ROCK_STATE_FALLING: { @@ -221,7 +221,7 @@ void falling_rock_update(CapMoby *falling_rock) { l01_camera.shake_amount = 0.1f; l01_camera.shake_frames = scale_game_frames(20); clear_u64_value(&falling_rock_vars->rot); - falling_rock->state = 4; + falling_rock->state = FALLING_ROCK_STATE_FALLEN; allocate_voice_for_target_entry(0, 0, falling_rock); falling_rock->pos.f[2] = falling_rock_vars->home.f[2] - 20.0f; D_0014C190[current_level_index_macro][falling_rock->id >> 5] |= diff --git a/src/overlays/l01/mobys/fan.c b/src/overlays/l01/mobys/fan.c index a36b3c0af2..7f8a815f9e 100644 --- a/src/overlays/l01/mobys/fan.c +++ b/src/overlays/l01/mobys/fan.c @@ -39,13 +39,17 @@ void fan_update(SwayMoby *m) __asm__("FUN_L01_002f9bf0"); /* Moby class 705 */ void fan_update(SwayMoby *fan_moby) { + enum { + FAN_STATE_UNINITIALIZED = 0, + FAN_STATE_INITIALIZED = 1 + }; SwayVars *sway_vars; CollQuery collision_query; sway_vars = fan_moby->pvars; - if (fan_moby->state == 0) { + if (fan_moby->state == FAN_STATE_UNINITIALIZED) { copy_hero_moby_field_38(fan_moby); - fan_moby->state = 1; + fan_moby->state = FAN_STATE_INITIALIZED; sway_vars->sway = random_float_between(-1.0f, 1.0f); sway_vars->dir = (rand() & 1) ? 1.0f : -1.0f; } diff --git a/src/overlays/l01/mobys/fighter_jet.c b/src/overlays/l01/mobys/fighter_jet.c index e821e7e079..e7fac55dbb 100644 --- a/src/overlays/l01/mobys/fighter_jet.c +++ b/src/overlays/l01/mobys/fighter_jet.c @@ -36,7 +36,7 @@ extern void spawn_explosion(void *, /* Ported from rac1-decomp (src/overlays/l01_novalis/vendor_002BA898.c: func_L01_002F5800), where it is exact; names translated to the US level program. */ -extern char D_L01_00167240[]; +extern char camera_pos[] __asm__("D_L01_00167240"); extern short fighter_jet_minimum_distance_scale_gp __asm__("D_L01_00161AF4") __attribute__((sda)); extern short fighter_jet_minimum_scale_camera_distance_gp __asm__("D_L01_00161AF8") __attribute__((sda)); @@ -67,6 +67,9 @@ void fighter_jet_update(char *moby) __asm__("FUN_L01_002f4428"); /* Moby class 660 */ void fighter_jet_update(char *moby) { + enum { + FIGHTER_JET_STATE_DESTROYED = 0x65 + }; float hit_dir[4]; float hit_vec[4]; char *fighter_jet_vars = *(char **)(moby + 0x78); @@ -78,7 +81,7 @@ void fighter_jet_update(char *moby) { *(float *)(fighter_jet_vars + 0x174) = *(float *)(fighter_jet_vars + 0xFC); } { - float camera_distance = fast_vec_dist(moby + 0x10, D_L01_00167240); + float camera_distance = fast_vec_dist(moby + 0x10, camera_pos); float min_scale = *(float *)&fighter_jet_minimum_distance_scale_gp; float near_dist = *(float *)&fighter_jet_full_scale_camera_distance_gp; float slope = -((1.0f - min_scale) / @@ -102,7 +105,7 @@ void fighter_jet_update(char *moby) { queue_dialogue_message(0x53D6, -1); } fast_vec_sub(hit_vec, fighter_jet_vars + 0xD0, fighter_jet_vars + 0xE0); - MOBY(moby)->state = 0x65; + MOBY(moby)->state = FIGHTER_JET_STATE_DESTROYED; *(u128 *)hit_dir = *(u128 *)hit_vec; spawn_explosion(moby, hit_dir, diff --git a/src/overlays/l01/mobys/green_mushroom.c b/src/overlays/l01/mobys/green_mushroom.c index 6c2ecda21a..713e3cde6f 100644 --- a/src/overlays/l01/mobys/green_mushroom.c +++ b/src/overlays/l01/mobys/green_mushroom.c @@ -57,14 +57,14 @@ void green_mushroom_update(SparkMoby *mushroom_moby) { hit = find_moby_hit(mushroom_moby, 0x10000, 0); switch (mushroom_moby->state) { case GREEN_MUSHROOM_INITIALIZE: - mushroom_moby->state = 1; + mushroom_moby->state = GREEN_MUSHROOM_WAIT_FOR_POSITIVE_HIT; break; case GREEN_MUSHROOM_WAIT_FOR_POSITIVE_HIT: if (hit != 0 && hit->f2c > 0.0f) { flag = 1; } if (flag) { - mushroom_moby->state = 2; + mushroom_moby->state = GREEN_MUSHROOM_SPAWN_PIECES_AND_REMOVE; } break; case GREEN_MUSHROOM_SPAWN_PIECES_AND_REMOVE: diff --git a/src/overlays/l01/mobys/help_hints.c b/src/overlays/l01/mobys/help_hints.c index 73938cda6b..cb20b872ef 100644 --- a/src/overlays/l01/mobys/help_hints.c +++ b/src/overlays/l01/mobys/help_hints.c @@ -39,6 +39,9 @@ void help_hints_update(struct Moby *moby) { TUTORIAL_HINT_STATE_INITIALIZE = 0, TUTORIAL_HINT_STATE_UPDATE = 1 }; + enum { + HELP_STATE_INACTIVE = 0 + }; s32 *tutorial_hint_vars; struct Moby *hint_candidate_moby; struct Moby *health_hint_candidate_moby; @@ -50,7 +53,7 @@ void help_hints_update(struct Moby *moby) { case TUTORIAL_HINT_STATE_INITIALIZE: tutorial_hint_vars[5] = 0; moby->update_dist = 0xFF; - moby->state = 1; + moby->state = TUTORIAL_HINT_STATE_UPDATE; tutorial_hint_vars[10] = 0; break; case TUTORIAL_HINT_STATE_UPDATE: @@ -72,22 +75,23 @@ void help_hints_update(struct Moby *moby) { } } if (cutscene_mode_macro == 0) { - if (level_available[3] != 0 && level_available[2] == 0 && help_state.state == 0 && - help_state.cur == -1 && help_records[4].count == 0) { + if (level_available[3] != 0 && level_available[2] == 0 && + help_state.state == HELP_STATE_INACTIVE && help_state.cur == -1 && + help_records[4].count == 0) { help_request(0x3E8, 4); } else if (level_available[3] == 0 && level_available[2] != 0 && - help_state.state == 0 && help_state.cur == -1 && + help_state.state == HELP_STATE_INACTIVE && help_state.cur == -1 && help_records[5].count == 0) { help_request(0x3E9, 5); } else if (level_available[3] != 0 && level_available[2] != 0 && - help_state.state == 0 && help_state.cur == -1 && + help_state.state == HELP_STATE_INACTIVE && help_state.cur == -1 && help_records[6].count == 0 && help_records[4].count == 0) { help_request(0x3EA, 6); } } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_vars[15]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - help_state.state == 0 && help_state.cur == -1) { + help_state.state == HELP_STATE_INACTIVE && help_state.cur == -1) { usage_time_value = scale_game_frames(D_0015EEA4_macro) - usage_stats.stat[9].latest_time_bucket * 600; /* "< 1" rather than "!": cc1 would otherwise test the bit as (v >> level) & 1 */ @@ -98,15 +102,15 @@ void help_hints_update(struct Moby *moby) { } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_vars[14]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - D_L01_0015F68C < 3 && help_state.state == 0 && help_state.cur == -1 && + D_L01_0015F68C < 3 && help_state.state == HELP_STATE_INACTIVE && help_state.cur == -1 && help_records[0x40].count == 0) { help_request(0x3EC, 0x40); } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_vars[14]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - hero.state.current == 1 && D_L01_0015F688 == -1 && help_state.state == 0 && - help_state.cur == -1 && help_records[0x40].count != 0 && - help_records[0x41].count == 0) { + hero.state.current == 1 && D_L01_0015F688 == -1 && + help_state.state == HELP_STATE_INACTIVE && help_state.cur == -1 && + help_records[0x40].count != 0 && help_records[0x41].count == 0) { help_request(0x3ED, 0x41); } if (help_records[0x42].count < 2 && @@ -125,7 +129,7 @@ void help_hints_update(struct Moby *moby) { } } if (hero.state.control_mode == 0x12 && tutorial_hint_vars[10] == 0 && - help_state.state == 0 && help_state.cur == -1 && + help_state.state == HELP_STATE_INACTIVE && help_state.cur == -1 && (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_vars[8]) || is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_vars[9]))) { tutorial_hint_vars[11]++; @@ -167,8 +171,9 @@ void help_hints_update(struct Moby *moby) { health_hint_candidate_moby = health_hint_candidate_moby->next) { if (health_hint_candidate_moby->oclass == 0x326 && fast_vec_dist(&health_hint_candidate_moby->pos, &hero.motion.pos) < 10.0f && - help_state.state == 0 && help_state.cur == -1 && help_records[1].count == 0 && - help_records[2].count == 0 && usage_stats.stat[13].count == 0 && + help_state.state == HELP_STATE_INACTIVE && help_state.cur == -1 && + help_records[1].count == 0 && help_records[2].count == 0 && + usage_stats.stat[13].count == 0 && is_moby_in_state_one(health_hint_candidate_moby) == 0) { if (hero.health.hp < hero_max_health) { if (usage_stats.stat[13].count < 0xFFFF) { diff --git a/src/overlays/l01/mobys/peckbot.c b/src/overlays/l01/mobys/peckbot.c index 5098a92c08..7aac95d861 100644 --- a/src/overlays/l01/mobys/peckbot.c +++ b/src/overlays/l01/mobys/peckbot.c @@ -282,7 +282,7 @@ void peckbot_update(Mob577 *peckbot_moby) { hit_reaction(peckbot_moby, hit, &peckbot_vars->health, 0, &hitA0, &hitA4, 0, 4); fast_dec_timer_s16(&peckbot_vars->flee_timer); if (peckbot_vars->flee_timer < scale_game_frames(0x2D) && hit != NULL && - peckbot_moby->state != 0x63) { + peckbot_moby->state != PECKBOT_STATE_FATAL_KNOCKBACK) { if ((hit->cls->oclass == 0xB0 || hit->cls->oclass == 0xB1) && peckbot_vars->flee_timer != 0) { hit->dmg = 0.0f; @@ -310,7 +310,7 @@ void peckbot_update(Mob577 *peckbot_moby) { trooper_start_knockback(peckbot_moby, peckbot_vars->knock, 7, 1, 0, angle); peckbot_vars->x170 = 11.0f; peckbot_vars->x174 = 18.0f; - peckbot_moby->state = 0x63; + peckbot_moby->state = PECKBOT_STATE_FATAL_KNOCKBACK; peckbot_vars->x117 = 0x78; trooper_anim_update(peckbot_moby, peckbot_vars->fx110); FUN_L00_00257470(peckbot_moby, 0, -1); @@ -321,7 +321,7 @@ void peckbot_update(Mob577 *peckbot_moby) { trooper_start_knockback(peckbot_moby, peckbot_vars->knock, 6, 1, 0, angle); peckbot_vars->x170 = 5.0f; peckbot_vars->x174 = 10.0f; - peckbot_moby->state = 6; + peckbot_moby->state = PECKBOT_STATE_NONFATAL_KNOCKBACK; peckbot_vars->x117 = 0xFA; peckbot_vars->flee_timer = scale_game_frames(0x3C); trooper_anim_update(peckbot_moby, peckbot_vars->fx110); @@ -334,10 +334,10 @@ void peckbot_update(Mob577 *peckbot_moby) { qcopy(&peckbot_vars->home, &peckbot_moby->pos); peckbot_vars->x29 = 0; if (peckbot_vars->x20A != 0) { - peckbot_moby->state = 1; + peckbot_moby->state = PECKBOT_STATE_GROUNDED_IDLE; SET_ANIM(peckbot_moby, 4, 0, 0); } else { - peckbot_moby->state = 14; + peckbot_moby->state = PECKBOT_STATE_AIRBORNE_IDLE; peckbot_moby->pos.f[2] = peckbot_moby->pos.f[2] + 6.0f; SET_ANIM(peckbot_moby, 0, 0, 0); } @@ -363,7 +363,7 @@ void peckbot_update(Mob577 *peckbot_moby) { fast_vec_length(&vector_scratch) < peckbot_vars->range + 4.0f && absolute_float(peckbot_moby->pos.f[2] - target.pos.f[2]) < 8.0f && random_integer_below(0x13) == 0) { - peckbot_moby->state = 17; + peckbot_moby->state = PECKBOT_STATE_DESCEND; } else if (peckbot_vars->x228 == 0 && peckbot_moby->hit == 1 && random_integer_below(0x13) == 0) { if (random_integer_below(0x100) & 1) { @@ -371,7 +371,7 @@ void peckbot_update(Mob577 *peckbot_moby) { } peckbot_vars->turn_off = peckbot_vars->turn_deg * DEG_TO_RAD; peckbot_vars->turn_timer = scale_game_frames(random_float_between(30.0f, 90.0f)); - peckbot_moby->state = 17; + peckbot_moby->state = PECKBOT_STATE_DESCEND; clear_u64_value(&peckbot_vars->vel); peckbot_moby->hit = 0; } else if (fast_dec_timer(&peckbot_vars->idle_timer) != 0) { @@ -383,7 +383,7 @@ void peckbot_update(Mob577 *peckbot_moby) { position_scratch.f[2] = 0.0f; position_scratch.f[2] = random_float_between(5.0f, 7.0f); fast_vec_add(&peckbot_vars->dest, &position_scratch, &peckbot_vars->home); - peckbot_moby->state = 15; + peckbot_moby->state = PECKBOT_STATE_MOVE_TO_DESTINATION; } break; case PECKBOT_STATE_MOVE_TO_DESTINATION: @@ -395,12 +395,12 @@ void peckbot_update(Mob577 *peckbot_moby) { fast_vec_add(&vector_scratch, &peckbot_vars->vel, &peckbot_moby->pos); if (coll_sphere(&vector_scratch, 0, peckbot_moby, 0.4f) != 0) { clear_u64_value(&peckbot_vars->vel); - peckbot_moby->state = 14; + peckbot_moby->state = PECKBOT_STATE_AIRBORNE_IDLE; } else { qcopy(&peckbot_moby->pos, &vector_scratch); } if (fast_vec_length(&peckbot_vars->vel) == 0.0f) { - peckbot_moby->state = 14; + peckbot_moby->state = PECKBOT_STATE_AIRBORNE_IDLE; } break; case PECKBOT_STATE_DESCEND: @@ -418,7 +418,7 @@ void peckbot_update(Mob577 *peckbot_moby) { } peckbot_vars->turn_off = peckbot_vars->turn_deg * DEG_TO_RAD; peckbot_vars->turn_timer = scale_game_frames(random_float_between(30.0f, 90.0f)); - peckbot_moby->state = 3; + peckbot_moby->state = PECKBOT_STATE_CHASE_TARGET; clear_u64_value(&peckbot_vars->vel); SET_ANIM(peckbot_moby, 2, 0, scale_game_frames(3)); } @@ -429,7 +429,7 @@ void peckbot_update(Mob577 *peckbot_moby) { peckbot_moby->pos.f[2] += peckbot_vars->vel.f[2]; if (ascent_ground_height + 6.0f <= peckbot_moby->pos.f[2]) { peckbot_moby->pos.f[2] = ascent_ground_height + 6.0f; - peckbot_moby->state = 14; + peckbot_moby->state = PECKBOT_STATE_AIRBORNE_IDLE; peckbot_vars->x228 = scale_game_frames(0xB4); clear_u64_value(&peckbot_vars->vel); } @@ -439,7 +439,7 @@ void peckbot_update(Mob577 *peckbot_moby) { if (fast_vec_length(&vector_scratch) < peckbot_vars->range + 4.0f && absolute_float(peckbot_moby->pos.f[2] - target.pos.f[2]) < 8.0f && random_integer_below(0x13) == 0) { - peckbot_moby->state = 2; + peckbot_moby->state = PECKBOT_STATE_FACE_AWAY_FROM_TARGET; SET_ANIM(peckbot_moby, 5, 0, scale_game_frames(3)); } else if (peckbot_moby->hit == 1 && random_integer_below(0x13) == 0) { if (random_integer_below(0x100) & 1) { @@ -447,12 +447,12 @@ void peckbot_update(Mob577 *peckbot_moby) { } peckbot_vars->turn_off = peckbot_vars->turn_deg * DEG_TO_RAD; peckbot_vars->turn_timer = scale_game_frames(random_float_between(30.0f, 90.0f)); - peckbot_moby->state = 3; + peckbot_moby->state = PECKBOT_STATE_CHASE_TARGET; SET_ANIM(peckbot_moby, 2, 0, scale_game_frames(3)); peckbot_moby->hit = 0; } else if (fast_vec_length(&vector_scratch) > peckbot_vars->range + 6.0f && peckbot_vars->x20A == 0) { - peckbot_moby->state = 16; + peckbot_moby->state = PECKBOT_STATE_ASCEND; SET_ANIM(peckbot_moby, 0, 0, scale_game_frames(3)); } break; @@ -461,7 +461,7 @@ void peckbot_update(Mob577 *peckbot_moby) { if (fast_vec_length(&vector_scratch) < peckbot_vars->range - 4.0f && absolute_float(peckbot_moby->pos.f[2] - target.pos.f[2]) < 8.0f && random_integer_below(0x13) == 0) { - peckbot_moby->state = 2; + peckbot_moby->state = PECKBOT_STATE_FACE_AWAY_FROM_TARGET; peckbot_moby->pos.f[2] = peckbot_moby->pos.f[2] + 1.0f; SET_ANIM(peckbot_moby, 5, 0, scale_game_frames(3)); } @@ -492,12 +492,12 @@ void peckbot_update(Mob577 *peckbot_moby) { peckbot_moby, peckbot_vars->knock, 6, 1, 0, peckbot_moby->rot.f[2]); peckbot_vars->x170 = 5.0f; peckbot_vars->x174 = 10.0f; - peckbot_moby->state = 11; + peckbot_moby->state = PECKBOT_STATE_HOME_TRIGGERED_KNOCKBACK; } break; case PECKBOT_STATE_HOME_TRIGGERED_KNOCKBACK: if (step_moby_motion(peckbot_moby, peckbot_vars->knock) & 1) { - peckbot_moby->state = 3; + peckbot_moby->state = PECKBOT_STATE_CHASE_TARGET; if (random_integer_below(0x100) & 1) { peckbot_vars->turn_deg = -peckbot_vars->turn_deg; } @@ -527,7 +527,7 @@ void peckbot_update(Mob577 *peckbot_moby) { } peckbot_vars->turn_off = peckbot_vars->turn_deg * DEG_TO_RAD; peckbot_vars->turn_timer = scale_game_frames(random_float_between(30.0f, 90.0f)); - peckbot_moby->state = 3; + peckbot_moby->state = PECKBOT_STATE_CHASE_TARGET; SET_ANIM(peckbot_moby, 2, 0, scale_game_frames(3)); peckbot_moby->hit = 0; } else if (peckbot_moby->hit == 1 && random_integer_below(0x13) == 0) { @@ -536,12 +536,12 @@ void peckbot_update(Mob577 *peckbot_moby) { } peckbot_vars->turn_off = peckbot_vars->turn_deg * DEG_TO_RAD; peckbot_vars->turn_timer = scale_game_frames(random_float_between(30.0f, 90.0f)); - peckbot_moby->state = 3; + peckbot_moby->state = PECKBOT_STATE_CHASE_TARGET; SET_ANIM(peckbot_moby, 2, 0, scale_game_frames(3)); peckbot_moby->hit = 0; } else if (fast_vec_length(&vector_scratch) > peckbot_vars->range + 6.0f && peckbot_vars->x20A == 0) { - peckbot_moby->state = 16; + peckbot_moby->state = PECKBOT_STATE_ASCEND; SET_ANIM(peckbot_moby, 0, 0, scale_game_frames(3)); } if (peckbot_moby->anim == 5 && (peckbot_moby->anim_flags & 2)) { @@ -575,12 +575,12 @@ void peckbot_update(Mob577 *peckbot_moby) { fast_vec_sub(&home_to_target, &target.pos, &peckbot_vars->home); if (vector_distance_xy(&peckbot_moby->pos, &target.pos) < 1.5f && !(movement_result_flags & 2)) { - peckbot_moby->state = 4; + peckbot_moby->state = PECKBOT_STATE_ATTACK_TARGET; SET_ANIM(peckbot_moby, 3, 0, scale_game_frames(3)); } else if (chase_target_height_distance_ratio > 1.0f || (movement_result_flags & 2)) { peckbot_moby->pos.f[0] = oldpos.f[0]; peckbot_moby->pos.f[1] = oldpos.f[1]; - peckbot_moby->state = 12; + peckbot_moby->state = PECKBOT_STATE_RECOVER_FROM_BLOCKED_MOVEMENT; SET_ANIM(peckbot_moby, 5, 0, scale_game_frames(3)); } else if (fast_vec_length(&home_to_target) < peckbot_vars->range + 4.0f && absolute_float(peckbot_moby->pos.f[2] - target.pos.f[2]) < 8.0f) { @@ -588,11 +588,11 @@ void peckbot_update(Mob577 *peckbot_moby) { FUN_L01_0026e090(peckbot_moby->group, 1); } } else if (peckbot_moby->hit != 1) { - peckbot_moby->state = 5; + peckbot_moby->state = PECKBOT_STATE_RETURN_HOME; } FUN_00213508(&peckbot_moby->pos, 0, 0.5f); if (FUN_L00_001f35d8_cf() == 0 || FUN_L00_001f35d8_cf() == 8) { - peckbot_moby->state = 16; + peckbot_moby->state = PECKBOT_STATE_ASCEND; SET_ANIM(peckbot_moby, 0, 0, scale_game_frames(3)); } peckbot_moby->hit = 0; @@ -620,7 +620,7 @@ void peckbot_update(Mob577 *peckbot_moby) { } if ((peckbot_moby->anim_flags & 2) && vector_distance_xy(&peckbot_moby->pos, &target.pos) > 1.5f) { - peckbot_moby->state = 3; + peckbot_moby->state = PECKBOT_STATE_CHASE_TARGET; SET_ANIM(peckbot_moby, 2, 0, scale_game_frames(3)); } attack_ground_height = FUN_00213508(&peckbot_moby->pos, 0, 0.5f); @@ -649,7 +649,7 @@ void peckbot_update(Mob577 *peckbot_moby) { movement_result_flags = FUN_L00_00258b50( peckbot_moby, &peckbot_vars->x180, &vector_scratch, &position_scratch, 1.0f); if (vector_distance_xy(&peckbot_moby->pos, &peckbot_vars->home) < 2.0f) { - peckbot_moby->state = 1; + peckbot_moby->state = PECKBOT_STATE_GROUNDED_IDLE; SET_ANIM(peckbot_moby, 4, 0, scale_game_frames(3)); } fast_vec_sub(&home_to_target, &target.pos, &peckbot_vars->home); @@ -657,27 +657,27 @@ void peckbot_update(Mob577 *peckbot_moby) { if (peckbot_moby->group != 0xFF) { FUN_L01_0026e090(peckbot_moby->group, 1); } - peckbot_moby->state = 3; + peckbot_moby->state = PECKBOT_STATE_CHASE_TARGET; SET_ANIM(peckbot_moby, 2, 0, scale_game_frames(3)); } else if (peckbot_moby->hit == 1) { - peckbot_moby->state = 3; + peckbot_moby->state = PECKBOT_STATE_CHASE_TARGET; SET_ANIM(peckbot_moby, 2, 0, scale_game_frames(3)); } else if (movement_result_flags & 2) { peckbot_moby->pos.f[0] = oldpos.f[0]; peckbot_moby->pos.f[1] = oldpos.f[1]; - peckbot_moby->state = 12; + peckbot_moby->state = PECKBOT_STATE_RECOVER_FROM_BLOCKED_MOVEMENT; SET_ANIM(peckbot_moby, 5, 0, scale_game_frames(3)); } FUN_00213508(&peckbot_moby->pos, 0, 0.5f); if (FUN_L00_001f35d8_cf() == 0 || FUN_L00_001f35d8_cf() == 8) { - peckbot_moby->state = 16; + peckbot_moby->state = PECKBOT_STATE_ASCEND; SET_ANIM(peckbot_moby, 0, 0, scale_game_frames(3)); } peckbot_moby->hit = 0; break; case PECKBOT_STATE_NONFATAL_KNOCKBACK: if (step_moby_motion(peckbot_moby, peckbot_vars->knock) & 1) { - peckbot_moby->state = 3; + peckbot_moby->state = PECKBOT_STATE_CHASE_TARGET; SET_ANIM(peckbot_moby, 2, 0, scale_game_frames(3)); return; } else if (peckbot_moby->pos.f[2] < 5.0f) { @@ -688,7 +688,7 @@ void peckbot_update(Mob577 *peckbot_moby) { break; case 7: if (FUN_L00_002dc9f0(peckbot_moby, peckbot_vars->knock) != 0) { - peckbot_moby->state = 14; + peckbot_moby->state = PECKBOT_STATE_AIRBORNE_IDLE; peckbot_vars->x228 = scale_game_frames(0xB4); SET_ANIM(peckbot_moby, 0, 0, 0); peckbot_vars->xC8 = 0; @@ -793,15 +793,15 @@ void peckbot_update(Mob577 *peckbot_moby) { fast_vec_sub(&home_to_target, &target.pos, &peckbot_vars->home); if (vector_distance_xy(&peckbot_moby->pos, &target.pos) < 1.5f && recovery_target_height_distance_ratio <= 1.0f) { - peckbot_moby->state = 4; + peckbot_moby->state = PECKBOT_STATE_ATTACK_TARGET; SET_ANIM(peckbot_moby, 3, 0, scale_game_frames(3)); } else if (recovery_target_height_distance_ratio <= 1.0f && !(recovery_movement_result_flags & 2)) { - peckbot_moby->state = 5; + peckbot_moby->state = PECKBOT_STATE_RETURN_HOME; SET_ANIM(peckbot_moby, 2, 0, scale_game_frames(3)); } else if (vector_distance_xy(&peckbot_moby->pos, &target.pos) > peckbot_vars->range + 6.0f) { - peckbot_moby->state = 16; + peckbot_moby->state = PECKBOT_STATE_ASCEND; SET_ANIM(peckbot_moby, 0, 0, scale_game_frames(3)); } else if (peckbot_moby->anim_flags & 2) { random_integer_below(4); @@ -811,7 +811,7 @@ void peckbot_update(Mob577 *peckbot_moby) { } FUN_00213508(&peckbot_moby->pos, 0, 0.5f); if (FUN_L00_001f35d8_cf() == 0 || FUN_L00_001f35d8_cf() == 8) { - peckbot_moby->state = 16; + peckbot_moby->state = PECKBOT_STATE_ASCEND; SET_ANIM(peckbot_moby, 0, 0, scale_game_frames(3)); } peckbot_moby->hit = 0; @@ -859,7 +859,7 @@ void peckbot_update(Mob577 *peckbot_moby) { if (peckbot_vars->leader == NULL || vector_distance_xy(&peckbot_moby->pos, &peckbot_vars->leader->pos) > convert_integer_to_float(peckbot_vars->x216)) { - peckbot_moby->state = 5; + peckbot_moby->state = PECKBOT_STATE_RETURN_HOME; SET_ANIM(peckbot_moby, 2, 0, scale_game_frames(3)); } peckbot_moby->hit = 0; diff --git a/src/overlays/l01/mobys/piston_platform.c b/src/overlays/l01/mobys/piston_platform.c index 79a7ade162..f02092ed3d 100644 --- a/src/overlays/l01/mobys/piston_platform.c +++ b/src/overlays/l01/mobys/piston_platform.c @@ -56,6 +56,10 @@ void piston_platform_update(LiftMoby *piston_platform) { PISTON_PLATFORM_MODE_WAIT_BEFORE_ADD_TRAVEL = 1, PISTON_PLATFORM_MODE_MOVING = 2 }; + enum { + PISTON_PLATFORM_STATE_UNINITIALIZED = 0, + PISTON_PLATFORM_STATE_INITIALIZED = 1 + }; LiftVars *piston_platform_vars; u128 previous_position; u128 delta; @@ -64,7 +68,7 @@ void piston_platform_update(LiftMoby *piston_platform) { piston_platform_vars = piston_platform->pvars; qcopy(&previous_position, &piston_platform->pos); fast_dec_timer_s16(&piston_platform_vars->timer); - if (piston_platform->state == 0) { + if (piston_platform->state == PISTON_PLATFORM_STATE_UNINITIALIZED) { piston_platform_vars->x28 = 4; piston_platform_vars->x3e = 0xD; piston_platform_vars->x20 = 0; @@ -72,7 +76,7 @@ void piston_platform_update(LiftMoby *piston_platform) { piston_platform_vars->home_z = ((f32 *)&piston_platform->pos)[2]; piston_platform->mode = piston_platform_vars->home_mode; piston_platform_vars->timer = scale_game_frames(0x78); - piston_platform->state = 1; + piston_platform->state = PISTON_PLATFORM_STATE_INITIALIZED; piston_platform->b30 = 0xFF; piston_platform->h32 = 0xFF; piston_platform_vars->xb4 = -1; @@ -80,7 +84,7 @@ void piston_platform_update(LiftMoby *piston_platform) { switch (piston_platform->mode) { case PISTON_PLATFORM_MODE_WAIT_BEFORE_SUBTRACT_TRAVEL: if (piston_platform_vars->timer == 0) { - piston_platform->mode = 2; + piston_platform->mode = PISTON_PLATFORM_MODE_MOVING; piston_platform_vars->speed = piston_platform_vars->travel / convert_integer_to_float( @@ -92,7 +96,7 @@ void piston_platform_update(LiftMoby *piston_platform) { break; case PISTON_PLATFORM_MODE_WAIT_BEFORE_ADD_TRAVEL: if (piston_platform_vars->timer == 0) { - piston_platform->mode = 2; + piston_platform->mode = PISTON_PLATFORM_MODE_MOVING; piston_platform_vars->speed = -(piston_platform_vars->travel / convert_integer_to_float(scale_game_frames( @@ -106,9 +110,9 @@ void piston_platform_update(LiftMoby *piston_platform) { ((f32 *)&piston_platform->pos)[2] -= piston_platform_vars->speed; if (piston_platform_vars->timer == 0) { if (piston_platform_vars->speed < 0.0f) { - piston_platform->mode = 0; + piston_platform->mode = PISTON_PLATFORM_MODE_WAIT_BEFORE_SUBTRACT_TRAVEL; } else { - piston_platform->mode = 1; + piston_platform->mode = PISTON_PLATFORM_MODE_WAIT_BEFORE_ADD_TRAVEL; } if (piston_platform->mode == piston_platform_vars->home_mode) { ((f32 *)&piston_platform->pos)[2] = piston_platform_vars->home_z; diff --git a/src/overlays/l01/mobys/pool_bubbles.c b/src/overlays/l01/mobys/pool_bubbles.c index 3a390a4af4..f0300d27e4 100644 --- a/src/overlays/l01/mobys/pool_bubbles.c +++ b/src/overlays/l01/mobys/pool_bubbles.c @@ -9,6 +9,10 @@ #include "rnc/math/random.h" #include "rnc/overlay/shared/rendering/effects/create_part.h" +enum { + POOL_BUBBLE_PARTICLE_KIND = 0x48 +}; + typedef struct { u128 pos; f32 size; @@ -45,7 +49,7 @@ Particle *pool_bubble(u128 *pos, u128 *motion_position_source, f32 scale) { col = (gray_channel << 8) | 0x40000000; particle->color = (gray_channel << 16) | col | gray_channel; particle->alpha = truncate_float_to_s32(4.0f) + 0x20; - particle->kind = 0x48; + particle->kind = POOL_BUBBLE_PARTICLE_KIND; particle->active = 0; particle->tex = *pool_bubble_texture_table[0]; particle->scale = scale; @@ -70,7 +74,7 @@ Particle *pool_bubbles(u128 *pos, u128 *motion_position_source, f32 scale, f32 s m = &particle->m; particle->color = (random_integer_below(0x10) << 25) | 0x808080; particle->alpha = truncate_float_to_s32(12.0f) + 0x20; - particle->kind = 0x48; + particle->kind = POOL_BUBBLE_PARTICLE_KIND; particle->active = 1; particle->tex = *pool_bubbles_texture_table[0]; particle->life = 0x80; diff --git a/src/overlays/l01/mobys/pool_tiles_and_effects.c b/src/overlays/l01/mobys/pool_tiles_and_effects.c index e3744359b9..83c73a0ff5 100644 --- a/src/overlays/l01/mobys/pool_tiles_and_effects.c +++ b/src/overlays/l01/mobys/pool_tiles_and_effects.c @@ -281,7 +281,7 @@ void pool_tiles_and_effects_update(struct Moby *moby) { volumes = (s32 *)moby->pvars; switch (moby->state) { case POOL_INITIALIZE: - moby->state = 1; + moby->state = POOL_UPDATE_TILES_AND_EFFECTS; moby->update_dist = 0xFF; moby->pos.z = moby->pos.z + 0.5f; pool_init_tiles(pool_tiles, 21); diff --git a/src/overlays/l01/mobys/stationary_ship.c b/src/overlays/l01/mobys/stationary_ship.c index 08ff34ba06..c2cae86a34 100644 --- a/src/overlays/l01/mobys/stationary_ship.c +++ b/src/overlays/l01/mobys/stationary_ship.c @@ -134,7 +134,7 @@ void stationary_ship_update(CarrierMoby *carrier_moby) { switch (v->state) { case CARRIER_STATE_INITIALIZE: v->unk194 = -1; - v->state = 1; + v->state = CARRIER_STATE_WAIT_FOR_TRIGGER; v->arrived = 0; v->keep = 0; carrier_moby->unk30 = 0xFF; @@ -142,7 +142,7 @@ void stationary_ship_update(CarrierMoby *carrier_moby) { return; case CARRIER_STATE_WAIT_FOR_TRIGGER: if (is_point_inside_clip_volume(&hero.motion.pos, volume_or_path_node_index) != 0) { - v->state = 2; + v->state = CARRIER_STATE_FOLLOW_PATH; carrier_moby->flags &= ~0x41; if (v->camera != -1) { cv = (CarrierCamVars *)((CarrierMoby *)ents)[v->camera].pvars; @@ -205,7 +205,7 @@ void stationary_ship_update(CarrierMoby *carrier_moby) { for (i = 0; i < 8; i++) { offs = l01_carrier_rider_local_offsets; if (v->riders[i] != -1) { - if (v->state != 1) { + if (v->state != CARRIER_STATE_WAIT_FOR_TRIGGER) { ((CarrierMoby *)ents)[v->riders[i]].flags &= ~0x41; } transform_vector_by_basis(&offs.v[i], &offs.v[i], &carrier_moby->unkC0); diff --git a/src/overlays/l01/mobys/tall_shroom.c b/src/overlays/l01/mobys/tall_shroom.c index ffd5a8ddea..21352ec1a2 100644 --- a/src/overlays/l01/mobys/tall_shroom.c +++ b/src/overlays/l01/mobys/tall_shroom.c @@ -38,14 +38,14 @@ void tall_shroom_update(TriggerMoby *shroom_moby) { hit = find_moby_hit(shroom_moby, 0x10000, 0); switch (shroom_moby->state) { case TALL_SHROOM_STATE_INITIALIZE: - shroom_moby->state = 1; + shroom_moby->state = TALL_SHROOM_STATE_WAIT_FOR_HIT; break; case TALL_SHROOM_STATE_WAIT_FOR_HIT: if (hit != 0 && hit->f2c > 0.0f) { flag = 1; } if (flag) { - shroom_moby->state = 2; + shroom_moby->state = TALL_SHROOM_STATE_REMOVE_WITH_EFFECTS; } break; case TALL_SHROOM_STATE_REMOVE_WITH_EFFECTS: diff --git a/src/overlays/l01/mobys/water_lily.c b/src/overlays/l01/mobys/water_lily.c index 952377ac63..faaaccd92d 100644 --- a/src/overlays/l01/mobys/water_lily.c +++ b/src/overlays/l01/mobys/water_lily.c @@ -13,6 +13,9 @@ #include "rnc/camera.h" #include "rnc/overlay/shared/math/interpolation/spring_turn.h" +void move_moby_xy_with_collision_constraints( + void *, void *, void *, s32, f32, f32, f32, f32) __asm__("FUN_L00_00258490"); + extern f32 frame_time_macro __asm__("D_0015ED6C") MACRO_ADDR; f32 FUN_L01_002f81c8(f32 *spring_axis_position, @@ -101,7 +104,7 @@ void water_lily_update(HoverMoby *water_lily) { switch (water_lily->state) { case WATER_LILY_STATE_INITIALIZE: *(u128 *)v = previous_water_lily_position.q; - water_lily->state = 1; + water_lily->state = WATER_LILY_STATE_UPDATE_POSITION; break; case WATER_LILY_STATE_UPDATE_POSITION: spring_axis_to(&water_lily->pos.v.x, @@ -129,14 +132,14 @@ void water_lily_update(HoverMoby *water_lily) { water_lily->pos.v.y += hero.motion.pos.f[1]; } } - FUN_L00_00258490(water_lily, - &collision_adjusted_position, - &water_lily->pos, - 3, - 0.1f, - water_lily_collision_radius_gp, - 600.0f, - 1.5707964f); + move_moby_xy_with_collision_constraints(water_lily, + &collision_adjusted_position, + &water_lily->pos, + 3, + 0.1f, + water_lily_collision_radius_gp, + 600.0f, + 1.5707964f); water_lily->pos.v.x = collision_adjusted_position.v.x; water_lily->pos.v.y = collision_adjusted_position.v.y; water_lily->pos.v.z = previous_water_lily_position.v.z; diff --git a/src/overlays/l02/hero/hero_set_state.c b/src/overlays/l02/hero/hero_set_state.c index 7df557eb61..164deeda39 100644 --- a/src/overlays/l02/hero/hero_set_state.c +++ b/src/overlays/l02/hero/hero_set_state.c @@ -69,22 +69,32 @@ extern void blend_moby_animation(void *, int, int, int) __asm__("FUN_00212f90"); extern int hero_set_state(int, int) __asm__("FUN_L02_0022b728"); extern char level02_hero_transform_trail_jump_velocity_keys[] __asm__("D_L02_0017C520"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int entry_animation_mode) { int saved_state_step; char *moby; int old20A7; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || + entry_animation_mode != 2)) return 0; } - if ((level_game_mode == 2 || level_game_mode == 6) && b != 2) + if ((level_game_mode == 2 || level_game_mode == 6) && entry_animation_mode != 2) return 0; { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -97,11 +107,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -122,14 +132,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); return 1; } @@ -142,7 +152,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; q->rand_timer.range = 0x68; } - if (b) { + if (entry_animation_mode) { if (get_hero_idle_animation_index(0) == 0x54) { set_hero_animation( get_hero_idle_animation_index(0), 0, (float)scale_game_frames(0x12)); @@ -158,7 +168,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; clear_u64_value(&p->motion.momentum); p->rand_timer.range = 0x68; - if (b) { + if (entry_animation_mode) { if (get_hero_idle_animation_index(0) == 0x54) { set_hero_animation( get_hero_idle_animation_index(0), 0, (float)scale_game_frames(0x12)); @@ -184,7 +194,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0x45, 0, (float)scale_game_frames(0xC)); break; } @@ -195,7 +205,7 @@ int hero_set_state(int a, int b) { p->health.hp = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); FUN_L00_0025f730(&p->motion.momentum, frame_time * 3.5f); - if (b) + if (entry_animation_mode) set_hero_animation(0x7C, 0, (float)scale_game_frames(0xC)); break; } @@ -211,7 +221,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->unk6A0 = 0; p->unk690 = p->motion.pos.f[2] - p->unk69C; - if (b) + if (entry_animation_mode) set_hero_animation(0x74, 0, (float)scale_game_frames(0xB)); break; } @@ -223,7 +233,7 @@ int hero_set_state(int a, int b) { *(int *)&D_L02_0015F688 = scale_game_frames(0x3C); if (p->unk20AA == 0) { t = get_hero_idle_animation_index(1); - if (p->moby->prev_seq != t && b) { + if (p->moby->prev_seq != t && entry_animation_mode) { set_hero_animation(t, 0, (float)scale_game_frames(0x12)); } } @@ -312,7 +322,7 @@ int hero_set_state(int a, int b) { scale_game_frames(5) < u->rail_land_frames) n = scale_game_frames(0xD); } - if (b) { + if (entry_animation_mode) { struct Hero *v = &hero; set_hero_animation(v->state.step + 3, D_L02_0015F6D8[v->state.step], (float)n); } @@ -324,7 +334,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 1; p->unk2284 = 0; - if (b) { + if (entry_animation_mode) { if (p->state.prev == 4) { set_hero_animation(0x5E, 2, (float)scale_game_frames(5)); } else { @@ -339,14 +349,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); - if (b) { + if (entry_animation_mode) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L02_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -371,7 +381,7 @@ int hero_set_state(int a, int b) { } return 0; } - if (b) { + if (entry_animation_mode) { struct Hero *q = &hero; float d = q->anim_frame; int id = 6; @@ -388,7 +398,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = gravity_length_xy((float *)v); qcopy(&p->motion.momentum, v); - if (b) { + if (entry_animation_mode) { int id = 6; float d = p->anim_frame; if (return_hero_animation_id_unchanged(MOBY(moby)->seq) == 4 && 3.0f < d && d < 16.0f) @@ -415,7 +425,7 @@ int hero_set_state(int a, int b) { FUN_L00_0025f730(&q->motion.momentum, frame_time * 7.0f); if (frame_time * 3.5f < q->motion.forward_speed) allocate_hero_voice_for_entry(0xC, 0); - if (b) { + if (entry_animation_mode) { if (q->moby->seq == get_hero_idle_animation_index(0)) { set_hero_animation(0xD, 2, (float)scale_game_frames(9)); } else { @@ -442,7 +452,7 @@ int hero_set_state(int a, int b) { } p->motion.move_yaw = fast_arc_tan(p->grapple_target->pos.x - p->motion.pos.f[0], p->grapple_target->pos.y - p->motion.pos.f[1]); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x2F, 2, (float)scale_game_frames(5)); hero_queue_sequence(0xA, 0xE); } @@ -455,7 +465,7 @@ int hero_set_state(int a, int b) { *(int *)&p->grapple_pull_speed = 0; p->grapple_pull_ending = 0; p->item_use_locked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(0x30, 1, (float)scale_game_frames(0xA)); break; } @@ -467,7 +477,7 @@ int hero_set_state(int a, int b) { *(int *)&p->grapple_pull_speed = 0; p->grapple_pull_ending = 0; p->tether_radius = fast_vec_dist(&p->motion.pos, &p->grapple_target->pos); - if (b) + if (entry_animation_mode) set_hero_animation(0x30, 1, (float)scale_game_frames(5)); break; } @@ -523,7 +533,7 @@ int hero_set_state(int a, int b) { } else if (q->state.prev_control_mode == 2) { q->swing_gravity = q->fall_state_gravity; } - if (b) { + if (entry_animation_mode) { set_hero_animation(0x34, 0, (float)scale_game_frames(0xB)); { struct Hero *r = &hero; @@ -539,7 +549,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 7; clear_u64_value(&p->motion.rot_spring_vel); qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xF)); break; } @@ -551,7 +561,7 @@ int hero_set_state(int a, int b) { *(int *)&p->past_apex = 0; p->rise_fall_land_frames = 0; p->rise_fall_gravity = frame_time_sq * 100.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x2A, 0, (float)scale_game_frames(6)); break; } @@ -566,7 +576,7 @@ int hero_set_state(int a, int b) { p->unk4F0 = p->smoothed_ground_z; } p->item_select_blocked = 1; - if (b) { + if (entry_animation_mode) { if (frame_time * 3.5f < p->motion.flat_speed) { set_hero_animation(0x20, 0, (float)scale_game_frames(9)); } else { @@ -581,7 +591,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0xD; p->item_select_blocked = 1; p->rand_timer.range = 0x68; - if (b) + if (entry_animation_mode) set_hero_animation(0x21, 0, (float)scale_game_frames(6)); break; } @@ -590,7 +600,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(0x24, 0, (float)scale_game_frames(6)); break; } @@ -599,7 +609,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(0x25, 0, (float)scale_game_frames(6)); break; } @@ -608,7 +618,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xC)); break; } @@ -620,7 +630,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -632,7 +642,7 @@ int hero_set_state(int a, int b) { q->rand_timer.range = 0x68; q->state.step = 0; qcopy(&q->motion.velocity, &q->motion.resolved_velocity); - if (b) { + if (entry_animation_mode) { if (q->vehicle_mode == 3) { set_hero_animation(6, 0, (float)scale_game_frames(8)); return 1; @@ -658,7 +668,7 @@ int hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x13, 0, (float)animation_timing_selector); } break; @@ -673,7 +683,7 @@ int hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.displacement); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x13, 0, (float)animation_timing_selector); } break; @@ -705,7 +715,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; @@ -973,7 +984,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; if (q->fall_start_distance == 0.0f) q->fall_start_distance = q->unk430 * 1.5f; - if (b) { + if (entry_animation_mode) { int s = q->state.current; if (s == 7) { set_hero_animation(7, 0, (float)scale_game_frames(5)); @@ -1063,7 +1074,7 @@ int hero_set_state(int a, int b) { update_hero_target_heading(8.0f, 1.0471976f, -1.0f); *(int *)&q->slam_descending = 0; q->items[0].timer = 0xA; - if (b) { + if (entry_animation_mode) { char *m; int n = scale_game_frames(0xB); if (q->state.prev == 0xB && scale_game_frames(0x2A) > q->state.prev_timer) @@ -1101,7 +1112,7 @@ int hero_set_state(int a, int b) { q->saved_item[0] = 0; update_hero_target_heading(14.0f, 0.5235988f, -1.0f); q->unkA7C = q->unkA7C == 0; - if (b) { + if (entry_animation_mode) { int n = scale_game_frames(0xA); if (q->moby->prev_seq == 0x1A) n = scale_game_frames(3); @@ -1116,7 +1127,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; if (((void *)q->items[0].moby) == 0) break; - if (b) { + if (entry_animation_mode) { set_hero_animation(0x67, 4, -1.0f); blend_moby_animation(((void *)q->items[0].moby), 3, 4, -1); } @@ -1147,7 +1158,7 @@ int hero_set_state(int a, int b) { r->attack_record = k; } update_hero_target_heading(5.0f, 0.7853982f, 0.7853982f); - if (b) { + if (entry_animation_mode) { char *m; int j = 0; int n; @@ -1178,7 +1189,7 @@ int hero_set_state(int a, int b) { } case HERO_STATE_ANIMATION_RECOVERY_WITH_JUMP_CANCEL: { struct Hero *q; - if (b) + if (entry_animation_mode) set_hero_animation(0x2C, 7, (float)scale_game_frames(9)); q = &hero; if (q->items[0].item_id == 0xA && ((char *)q->throw_target) != 0) { @@ -1207,7 +1218,7 @@ int hero_set_state(int a, int b) { { struct Hero *q = &hero; int e = D_L02_0017C228[q->attack_record].kind; - if (b) { + if (entry_animation_mode) { char *m; int z = e == 0; int n = scale_game_frames(5); @@ -1224,7 +1235,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0xA; p->unk2284 = 0; p->ground_speed = frame_time * 9.0f; - if (b) { + if (entry_animation_mode) { char *m; HeroTableRow2C *e = &D_L02_0017C228[p->attack_record]; int k = e->kind; @@ -1245,7 +1256,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->pushback_yaw = fast_add_rotations(p->motion.rot.f[2], 3.1415927f); p->ground_speed = frame_time * 9.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x29, 5, (float)scale_game_frames(8)); break; } @@ -1267,7 +1278,7 @@ int hero_set_state(int a, int b) { { struct Hero *q = &hero; q->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x10, 3, -3.0f); q->moby->anim_time = hero_animation_blend_curve_samples[q->anim_blend_curve][(q->anim_blend_step)++]; @@ -1292,7 +1303,7 @@ int hero_set_state(int a, int b) { r->rand_timer.range = 0x68; r->target_speed = 0.0f; r->ground_speed = 0.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x71, 0, (float)scale_game_frames(8)); } break; @@ -1306,7 +1317,7 @@ int hero_set_state(int a, int b) { p->collision_off_frames = 0x2710; allocate_hero_voice_for_entry(9, 0); p->rand_timer.range = 0x68; - if (b) + if (entry_animation_mode) set_hero_animation(0x71, 0, (float)scale_game_frames(8)); break; } @@ -1314,7 +1325,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) + if (entry_animation_mode) set_hero_animation(0, 0, (float)scale_game_frames(0xE)); break; } @@ -1322,7 +1333,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) { + if (entry_animation_mode) { set_hero_animation(4, 0, (float)scale_game_frames(7)); hero_queue_sequence(0xE, 0x22); } @@ -1333,7 +1344,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(6, 0, (float)scale_game_frames(0xC)); break; } @@ -1344,7 +1355,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(6, 0, (float)scale_game_frames(7)); break; } @@ -1361,7 +1372,7 @@ int hero_set_state(int a, int b) { if (frame_time * 1.5f < planar_speed) hero_base->ground_speed = frame_time * 1.5f; hero_base->unk3B8 = 0; - if (b) + if (entry_animation_mode) set_hero_animation(1, 0, (float)scale_game_frames(8)); } break; @@ -1371,7 +1382,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(3, 0, (float)scale_game_frames(0xC)); break; } @@ -1384,7 +1395,7 @@ int hero_set_state(int a, int b) { FUN_L00_0025f730(&p->motion.velocity, frame_time * 5.0f); hero_change_health(1); p->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (entry_animation_mode) { set_hero_animation(2, 3, -3.0f); p->moby->anim_time = hero_animation_blend_curve_samples[p->anim_blend_curve][(p->anim_blend_step)++]; @@ -1405,7 +1416,7 @@ int hero_set_state(int a, int b) { clear_u64_value(&p->motion.velocity); clear_u64_value(&p->motion.displacement); p->motion.velocity.f[2] = frame_time * 10.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x10, 2, -3.0f); break; } @@ -1457,7 +1468,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->tilt_disabled = 1; p->item_use_locked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(get_hero_idle_animation_index(0), 0, -1.0f); break; } @@ -1468,7 +1479,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->item_use_locked = 1; clear_u64_value(&p->motion.velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0xB, 0, -1.0f); break; } @@ -1478,7 +1489,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x18; p->item_use_locked = 1; cancel_hero_item_animation(); - if (b) + if (entry_animation_mode) set_hero_animation(get_hero_idle_animation_index(0), 0, -1.0f); break; } @@ -1861,9 +1872,11 @@ void update_hero_state_transitions(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && item_selector_hud_inhibit == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -1926,7 +1939,7 @@ void update_hero_state_transitions(void) { } } if (fatal_fall_height_threshold > hero.motion.pos.f[2] && hero.ground_distance > 2.0f && - hero.vehicle_mode != 2 && hero.state.current != 0x77) { + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { switch (hero.state.current) { @@ -2182,7 +2195,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -2209,7 +2222,7 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); break; } @@ -2442,7 +2455,8 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -3591,7 +3605,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l02/hero/update_hero_state_motion.c b/src/overlays/l02/hero/update_hero_state_motion.c index 5b7bbaafeb..c381521e81 100644 --- a/src/overlays/l02/hero/update_hero_state_motion.c +++ b/src/overlays/l02/hero/update_hero_state_motion.c @@ -26,6 +26,16 @@ #include "rnc/world/collision/collision_hit_material.h" /* Same source as the exact FUN_L16_002097a0, with a state 3 flag (0x12E6) and its own landing checks (as FUN_L18_00213b40, without states 0, 4 and 0xE). */ +enum { + GROUND_MATERIAL_MAGNETIC = 2, + GROUND_MATERIAL_SINK_TRIGGER = 0xD +}; + +enum { + GROUND_MATERIAL_WATER_SURFACE_TRIGGER = 0, + GROUND_MATERIAL_SINK_SURFACE_TRIGGER = 3 +}; + extern int D_0015ED84_c __asm__("D_0015ED84"); extern int D_0015ED84_d __asm__("D_0015ED84"); extern int coll_sphere(float, void *, int, void *) __asm__("FUN_L00_001f0d60"); @@ -46,10 +56,10 @@ void process_hero_ground_material_effects(void) { hero_state->unk308 = 0; if (saved_ground_type == -1) return; - if (saved_ground_type == 2) { + if (saved_ground_type == GROUND_MATERIAL_MAGNETIC) { if (hero_state->frames_off_ground.s == 0 || hero_state->ground_distance < 0.3f) { hero_state->on_magnet_ground = 1; - if (hero_state->vehicle_mode == 0) { + if (hero_state->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { char *slot_one_moby = (char *)hero_state->items[1].moby; if (slot_one_moby != 0 && *(short *)(slot_one_moby + 0xA6) == 0xAD) hero_state->unk308 = 1; @@ -57,7 +67,7 @@ void process_hero_ground_material_effects(void) { } } sphere_probe_selector = D_0015ED84_c; - if (saved_ground_type == 3) { + if (saved_ground_type == GROUND_MATERIAL_SINK_SURFACE_TRIGGER) { struct Hero *q = &hero; q->selector_3 = 1; sphere_probe_selector = D_0015ED84_d; @@ -77,11 +87,11 @@ void process_hero_ground_material_effects(void) { struct Hero *q = &hero; q->selector_11 = 1; } - if (saved_ground_type == 0x2) { + if (saved_ground_type == GROUND_MATERIAL_MAGNETIC) { struct Hero *q = &hero; q->on_magnet_ground = 1; } - if (saved_ground_type == 0xD) { + if (saved_ground_type == GROUND_MATERIAL_SINK_TRIGGER) { struct Hero *q = &hero; q->selector_13 = 1; } @@ -146,6 +156,7 @@ void process_hero_ground_material_effects(void) { } #include "qcopy.h" + #define G hero /* Same source as the exact FUN_L08_00222800, with only the 0x16 animation in mode 0 and no 0xF exit. */ @@ -375,7 +386,7 @@ void update_hero_ground_contact(void) { } hero.ground_sound_class = collision_sound_class; hero.ground_type = collision_hit_material(); - if (hero.ground_type == 0) { + if (hero.ground_type == GROUND_MATERIAL_WATER_SURFACE_TRIGGER) { hero.water_surface_z = resolve_camera_surface_height(D_L02_00174460, (u8 *)&hero.water_surface_normal); if (hero.motion.pos.f[2] < hero.water_surface_z && hero.in_water_frames <= 0) { @@ -391,14 +402,14 @@ void update_hero_ground_contact(void) { } hero.ground_sound_class = collision_sound_class; } - if (hero.ground_type == 0xD) { + if (hero.ground_type == GROUND_MATERIAL_SINK_TRIGGER) { hero.water_surface_z = HH.point.f[2]; collision_ray_start.f[2] = HH.point.f[2] - 0.01f; if (collision_line(&collision_ray_start, &collision_ray_end, 4, (s32)hero.moby, 0) == 0) { goto d1; } } - if (hero.ground_type == 3) { + if (hero.ground_type == GROUND_MATERIAL_SINK_SURFACE_TRIGGER) { hero.sink_surface_z = HH.point.f[2]; collision_ray_start.f[2] = HH.point.f[2] - 0.01f; if (collision_line(&collision_ray_start, &collision_ray_end, 4, (s32)hero.moby, 0) == 0) { @@ -432,7 +443,8 @@ void update_hero_ground_contact(void) { } if (hero.ground_distance < 0.02f) { hero.frames_off_ground.s = 0; - if (hero.ground_slope.f <= 0.87266463f || hero.gravity_mode == 1 || + if (hero.ground_slope.f <= 0.87266463f || + hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.state.control_mode == 0x16) { hero.air_frames.s = 0; hero.last_landed_moby = HH.moby; @@ -555,9 +567,9 @@ typedef union { f32 f[4]; } V_222270; -extern void FUN_L00_002347c0(void); -extern void FUN_L00_00233810(f32 *, f32 *, f32); -extern void FUN_L00_002334d0(f32 *, f32 *, f32); +extern void resolve_hero_pending_path_clearance(void) __asm__("FUN_L00_002347c0"); +extern void add_hero_up_offset(f32 *, f32 *, f32) __asm__("FUN_L00_00233810"); +extern void add_hero_gravity_offset(f32 *, f32 *, f32) __asm__("FUN_L00_002334d0"); extern s32 coll1_222270(void *, s32, s32, f32) __asm__("FUN_L00_001f0d60"); extern s32 rig_probe(void *, s32, f32, s32, f32) __asm__("FUN_L00_001f19a0"); extern s32 coll3_222270(void *, f32) __asm__("FUN_L00_001f3170"); @@ -578,15 +590,15 @@ s32 resolve_hero_position_collisions(s32 mode) { qcopy(&pre_collision_position, &hero.motion.pos.q); clear_u64_value(&collision_probe_offset); if (hero.path_constrain_pending != 0) { - FUN_L00_002347c0(); + resolve_hero_pending_path_clearance(); hero.path_constrain_pending = 0; } if (hero.state.control_mode != 0x11) { - if (hero.gravity_mode != 0 || hero.unk1F8 != 0) { - if (hero.gravity_mode == 1 || hero.unk1F8 != 0) { - FUN_L00_00233810(&collision_probe_offset, &collision_probe_offset, 0.6f); + if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN || hero.unk1F8 != 0) { + if (hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.unk1F8 != 0) { + add_hero_up_offset(&collision_probe_offset, &collision_probe_offset, 0.6f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &collision_probe_offset, &collision_probe_offset, -hero.capsule_bottom); } } else { @@ -599,7 +611,7 @@ s32 resolve_hero_position_collisions(s32 mode) { mask = 0xD24; } for (i = 0; i < 8; i++) { - if (hero.gravity_mode != 0) { + if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN) { if (!coll1_222270(&hero.motion.pos.q, mask, hero.moby, frame_scale * 0.4f)) break; } else { @@ -731,7 +743,7 @@ extern void stop_hero_motion_without_forward_support(float, float) __asm__("FUN_ extern void emit_filtered_entry_sparkles(int, int) __asm__("FUN_L00_00217368"); extern void launch_hero_wrench(void) __asm__("FUN_L00_00217658"); extern void set_hero_animation(int, int, float) __asm__("FUN_L00_002323b8"); -extern void FUN_L00_002334d0(float *dst, float *src, float h); +extern void add_hero_gravity_offset(float *dst, float *src, float h) __asm__("FUN_L00_002334d0"); extern void offset_hero_position_against_gravity(float *, float *, float) __asm__("FUN_L00_002336e8"); extern void allocate_hero_voice_for_entry(int, int) __asm__("FUN_L00_00216de8"); @@ -902,10 +914,10 @@ void update_hero_state_motion(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && ((unsigned char *)item_available)[0x1C] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity.f, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); if (((Moby *)hero.ground_moby) != 0) { qcopy(hero.motion.pos.f, hero.ground_point.f); @@ -916,12 +928,12 @@ void update_hero_state_motion(void) { } else { clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0(hero.motion.velocity.f, - hero.motion.resolved_velocity_z.f, - frame_time_sq * 25.0f); + add_hero_gravity_offset(hero.motion.velocity.f, + hero.motion.resolved_velocity_z.f, + frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } @@ -986,11 +998,12 @@ void update_hero_state_motion(void) { clear_u64_value(hero.motion.velocity.f); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.displacement.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } if (anim != -1 && hero.moby->seq != 0x36) { set_hero_animation(anim, 0, frames); @@ -1006,11 +1019,12 @@ void update_hero_state_motion(void) { clear_u64_value(hero.motion.velocity.f); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity.f, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } if (hero.grapple_target != 0) { hero.motion.move_yaw = fast_arc_tan(hero.grapple_target->pos.x - moby->pos.x, @@ -1177,13 +1191,13 @@ void update_hero_state_motion(void) { if (vector_distance_xy(hero.motion.pos.f, &hero.swing_target_moby->pos) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.displacement.f, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(hero.motion.velocity.f) > 0.0f) { fast_vec_sub(motion_geometry_scratch[3], hero.motion.pos.f, &hero.swing_target_moby->pos); - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 57.0f); } } @@ -1322,7 +1336,7 @@ void update_hero_state_motion(void) { approach_value(&z, a, b); gravity_set_z(hero.motion.velocity.f, hero.motion.velocity.f, z); } else if (hero.state_timer > window_end) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.velocity.f, hero.rise_fall_gravity); if (gravity_z(hero.motion.velocity.f) < 0.0f) { hero.past_apex = 1.0f; @@ -1419,7 +1433,7 @@ void update_hero_state_motion(void) { approach_value(&z, v, acc); gravity_set_z(hero.motion.velocity.f, hero.motion.velocity.f, z); } else if (hero.state_timer > window_end) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 130.0f); if (gravity_z(hero.motion.velocity.f) < 0.0f) { hero.slam_descending = 1.0f; @@ -1477,7 +1491,7 @@ void update_hero_state_motion(void) { ok = 0; } if (ok) { - if (hero.gravity_mode == 0) { + if (hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1489,10 +1503,11 @@ void update_hero_state_motion(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_WRENCH_COMBO: { @@ -1514,11 +1529,11 @@ void update_hero_state_motion(void) { if (d < 0.0f) { d = 0.0f; } - if (r->kind == 0) { + if (r->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { attack_distance_offset = 0.75f; range = 0.8f; cap = 4.0f; - } else if (r->kind == 1) { + } else if (r->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { attack_distance_offset = 0.6f; range = 1.7f; cap = 4.0f; @@ -1565,7 +1580,7 @@ void update_hero_state_motion(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || ((Moby *)hero.melee_target) != 0) { - if (r->kind == 1 && + if (r->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1577,7 +1592,8 @@ void update_hero_state_motion(void) { int ok; ok = 1; - if (r->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (r->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && hero.anim_changing == 0 && + hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1591,10 +1607,11 @@ void update_hero_state_motion(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); } break; @@ -1714,11 +1731,12 @@ void update_hero_state_motion(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity.f, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_ANIMATION_RECOVERY_WITH_JUMP_CANCEL: @@ -1776,10 +1794,11 @@ void update_hero_state_motion(void) { hero.air_frames.s = 0; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity.f, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_RUN: @@ -1869,11 +1888,12 @@ void update_hero_state_motion(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_LEDGE_HANG_ENTRY: @@ -1952,7 +1972,7 @@ void update_hero_state_motion(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -1991,7 +2011,8 @@ void update_hero_state_motion(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, hero.fall_state_gravity); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, hero.fall_state_gravity); if (gravity_z(hero.motion.velocity.f) < -(frame_time * 50.0f)) { gravity_set_z(hero.motion.velocity.f, hero.motion.velocity.f, -(frame_time * 50.0f)); } @@ -2012,7 +2033,8 @@ void update_hero_state_motion(void) { hero.motion.velocity.f, hero.motion.velocity.f); } - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, hero.fall_state_gravity); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, hero.fall_state_gravity); if (gravity_z(hero.motion.velocity.f) < -(frame_time * 50.0f)) { gravity_set_z(hero.motion.velocity.f, hero.motion.velocity.f, -(frame_time * 50.0f)); } @@ -2056,7 +2078,7 @@ void update_hero_state_motion(void) { clip_hero_horizontal_velocity(1); if (fast) { gravity_flatten(hero.motion.velocity.f, hero.motion.velocity.f); - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, a * 0.72f); + add_hero_gravity_offset(hero.motion.velocity.f, hero.motion.velocity.f, a * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2101,7 +2123,7 @@ void update_hero_state_motion(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(hero.motion.velocity.f, hero.motion.velocity.f); - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, v * 0.72f); + add_hero_gravity_offset(hero.motion.velocity.f, hero.motion.velocity.f, v * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2224,7 +2246,7 @@ void update_hero_state_motion(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2278,7 +2300,7 @@ void update_hero_state_motion(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(hero.motion.velocity.f, hero.motion.velocity.f, len); - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, 0.004f); + add_hero_gravity_offset(hero.motion.velocity.f, hero.motion.velocity.f, 0.004f); } break; case HERO_STATE_APPROACH_TARGET_POSE: { float len; @@ -2300,7 +2322,7 @@ void update_hero_state_motion(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = frame_time * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = frame_time * 0.9f; } } else { @@ -2311,29 +2333,30 @@ void update_hero_state_motion(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { clip_hero_horizontal_velocity(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.displacement.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_BRAKE_AT_TARGET_POSITION: { @@ -2345,11 +2368,12 @@ void update_hero_state_motion(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.displacement.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_FIDGET: @@ -2378,18 +2402,19 @@ void update_hero_state_motion(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -2397,7 +2422,8 @@ void update_hero_state_motion(void) { if (hero.move_lock_timer == 0) { hero_update_hop_velocity(); } - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 21.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -2427,11 +2453,12 @@ void update_hero_state_motion(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity_z.f, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); + add_hero_gravity_offset( + hero.motion.velocity.f, hero.motion.velocity.f, frame_time_sq * 54.0f); } } break; case HERO_STATE_VEHICLE_MODE_3_HURT: { @@ -2447,10 +2474,10 @@ void update_hero_state_motion(void) { hero.motion.velocity.f); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( hero.motion.velocity.f, hero.motion.resolved_velocity.f, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(hero.motion.velocity.f, hero.motion.velocity.f, 0.004f); + add_hero_gravity_offset(hero.motion.velocity.f, hero.motion.velocity.f, 0.004f); } } break; case HERO_STATE_CANCEL_ITEM_WITH_OPTIONAL_IDLE_ANIMATION: diff --git a/src/overlays/l02/hud_counter.c b/src/overlays/l02/hud_counter.c index ce05a6b50e..6ce389193f 100644 --- a/src/overlays/l02/hud_counter.c +++ b/src/overlays/l02/hud_counter.c @@ -88,7 +88,7 @@ s32 draw_hud_counter(HudElem *hud_element) { x = D_L02_0015F948; } bottom = frame_size[0]; - y = pal_mode != 0 ? bottom - 0x2A : bottom - 0x32; + y = pal_mode != FALSE ? bottom - 0x2A : bottom - 0x32; grow = convert_integer_to_float(fade[0]) / convert_integer_to_float(hud_counter_bar_growth_divisor_gp); if (1.0f < grow) { diff --git a/src/overlays/l02/level_class_tables.c b/src/overlays/l02/level_class_tables.c index 859e6cb7ff..363266eda2 100644 --- a/src/overlays/l02/level_class_tables.c +++ b/src/overlays/l02/level_class_tables.c @@ -6,7 +6,7 @@ #include "rnc/camera/update_cam.h" #include "rnc/mobys/moby_class_tables.h" -void FUN_L00_002caf40(); +void get_morphoray_chicken_slot_record() __asm__("FUN_L00_002caf40"); void FUN_L00_002ea7a0(); void FUN_L00_002ed230(); void background_ship_1_update() __asm__("FUN_L02_002ec4b8"); @@ -146,7 +146,7 @@ void *D_L02_001FB6C4[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L02_001FB6DC[6] diff --git a/src/overlays/l02/mobys/constructorbot.c b/src/overlays/l02/mobys/constructorbot.c index cb5dd725c9..d9daf6fffb 100644 --- a/src/overlays/l02/mobys/constructorbot.c +++ b/src/overlays/l02/mobys/constructorbot.c @@ -85,7 +85,7 @@ int D_L02_00161A94 = 0x78; extern float constructorbot_wake_spray_planar_magnitude_max_gp __asm__("D_L02_00161A98") __attribute__((sda)); extern float approach_value(float *p, float target, float maxstep) __asm__("FUN_00213ed8"); -extern int FUN_L00_00259028(char *m, char *p, float *pos, char *v); +extern int step_mover_2e3f20(char *m, char *p, float *pos, char *v) __asm__("FUN_L00_00259028"); extern s32 rand(void); extern void *FUN_L00_00263fd8(char *src, int cls, @@ -209,31 +209,31 @@ void constructorbot_update(struct Moby *moby) { if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 0); } - moby->state = 7; + moby->state = L02_BOT_SELECT_ATTACK_OR_WANDER; break; case L02_BOT_START_WAIT_FOR_WAKE_TRIGGER: if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 0); } - moby->state = 10; + moby->state = L02_BOT_WAIT_FOR_WAKE_TRIGGER; break; case L02_BOT_START_WAIT_FOR_WAKE_TRIGGER_BEFORE_GROUND_ALIGNMENT: if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, 0); } - moby->state = 8; + moby->state = L02_BOT_WAIT_FOR_WAKE_TRIGGER_BEFORE_GROUND_ALIGNMENT; break; case L02_BOT_START_WAIT_FOR_WAKE_TRIGGER_WITH_ALTERNATE_WAKE_ANIMATION: if (moby->prev_seq != 15) { blend_moby_animation(moby, 15, 0, 0); } - moby->state = 9; + moby->state = L02_BOT_WAIT_FOR_WAKE_TRIGGER_WITH_ALTERNATE_WAKE_ANIMATION; break; } break; case L02_BOT_WAIT_FOR_WAKE_ANIMATION: if (moby->anim_flags & 2) { - moby->state = 3; + moby->state = L02_BOT_ALIGN_TO_GROUND_AT_POST; if (moby->prev_seq != 4) { blend_moby_animation(moby, 4, 0, 0); } @@ -259,7 +259,7 @@ void constructorbot_update(struct Moby *moby) { constructorbot_gravity_gp * frame_time_sq); approach_value(&moby->pos.z, ground, bot_private_vars->velocity[2]); if (moby->pos.z == ground) { - moby->state = 4; + moby->state = L02_BOT_WAIT_FOR_ANIMATION_BEFORE_MOVE_TO_POST; if (moby->prev_seq != 5) { blend_moby_animation(moby, 5, 4, scale_game_frames(10)); } @@ -267,39 +267,39 @@ void constructorbot_update(struct Moby *moby) { break; case L02_BOT_WAIT_FOR_ANIMATION_BEFORE_MOVE_TO_POST: if (moby->anim_flags & 2) { - moby->state = 5; + moby->state = L02_BOT_MOVE_TO_POST; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(6)); } } break; case L02_BOT_MOVE_TO_POST: - if (FUN_L00_00259028((char *)moby, - bot_private_vars->walk, - (float *)&l02_cuboids[bot_private_vars->post].pos, - (char *)bot_private_vars->velocity) == 4) { + if (step_mover_2e3f20((char *)moby, + bot_private_vars->walk, + (float *)&l02_cuboids[bot_private_vars->post].pos, + (char *)bot_private_vars->velocity) == 4) { if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(30)); } - moby->state = 7; + moby->state = L02_BOT_SELECT_ATTACK_OR_WANDER; } break; case L02_BOT_WANDER: - if (FUN_L00_00259028((char *)moby, - bot_private_vars->walk, - bot_private_vars->wander, - (char *)bot_private_vars->velocity) & + if (step_mover_2e3f20((char *)moby, + bot_private_vars->walk, + bot_private_vars->wander, + (char *)bot_private_vars->velocity) & 6) { if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } - moby->state = 7; + moby->state = L02_BOT_SELECT_ATTACK_OR_WANDER; } else if (fast_vec_dist(bot_private_vars->target + 0x10, &l02_cuboids[bot_private_vars->post].pos) < bot_private_vars->attack_range && absolute_float(*(float *)(bot_private_vars->target + 0x18) - moby->pos.z) < 4.0f) { - moby->state = 5; + moby->state = L02_BOT_MOVE_TO_POST; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } @@ -317,13 +317,13 @@ void constructorbot_update(struct Moby *moby) { FUN_L00_00258278( (char *)moby, angle, &bot_private_vars->turn_speed, 0.02f, 0.3f, 0.1f); if (fast_difference_between_rotations(moby->rot.z, angle) < 0.08726646f) { - moby->state = 0xB; + moby->state = L02_BOT_WAIT_FOR_ANIMATION_BEFORE_ATTACK; if (moby->prev_seq != 8) { blend_moby_animation(moby, 8, 0, scale_game_frames(6)); } } } else { - moby->state = 5; + moby->state = L02_BOT_MOVE_TO_POST; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } @@ -338,7 +338,7 @@ void constructorbot_update(struct Moby *moby) { fast_vec_add(bot_private_vars->wander, bot_private_vars->wander, &l02_cuboids[bot_private_vars->post].pos); - moby->state = 6; + moby->state = L02_BOT_WANDER; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } @@ -374,18 +374,18 @@ void constructorbot_update(struct Moby *moby) { triggered = 1; } if (triggered) { - if (moby->state == 8) { + if (moby->state == L02_BOT_WAIT_FOR_WAKE_TRIGGER_BEFORE_GROUND_ALIGNMENT) { if (moby->prev_seq != 4) { blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } - moby->state = 2; - } else if (moby->state == 9) { + moby->state = L02_BOT_WAIT_FOR_WAKE_ANIMATION; + } else if (moby->state == L02_BOT_WAIT_FOR_WAKE_TRIGGER_WITH_ALTERNATE_WAKE_ANIMATION) { if (moby->prev_seq != 0x10) { blend_moby_animation(moby, 0x10, 0, scale_game_frames(10)); } - moby->state = 2; + moby->state = L02_BOT_WAIT_FOR_WAKE_ANIMATION; } else { - moby->state = 5; + moby->state = L02_BOT_MOVE_TO_POST; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(6)); } @@ -400,7 +400,7 @@ void constructorbot_update(struct Moby *moby) { FUN_L00_00258278((char *)moby, angle, &bot_private_vars->turn_speed, 0.02f, 0.3f, 0.1f); if (moby->anim_flags & 2) { moby->anim_speed = 1.0f; - moby->state = 0xC; + moby->state = L02_BOT_UPDATE_ATTACK_SHOTS; if (moby->prev_seq != 9) { blend_moby_animation(moby, 9, 0, scale_game_frames(6)); } @@ -425,7 +425,7 @@ void constructorbot_update(struct Moby *moby) { collect_mobies_around_tracked_objects(bot_private_vars->shots, (int)moby, (int)shot); if (moby->anim_flags & 2) { moby->anim_speed = 1.0f; - moby->state = 0xD; + moby->state = L02_BOT_WAIT_FOR_ANIMATION_BEFORE_ATTACK_RECHECK; if (random_integer_below(0xFF) & 1) { if (moby->prev_seq != 10) { blend_moby_animation(moby, 10, 0, scale_game_frames(6)); @@ -444,12 +444,12 @@ void constructorbot_update(struct Moby *moby) { if (vector_distance_xy(&moby->pos, bot_private_vars->target + 0x10) < bot_private_vars->attack_range + 1.0f && absolute_float(*(float *)(bot_private_vars->target + 0x18) - moby->pos.z) < 3.0f) { - moby->state = 0xC; + moby->state = L02_BOT_UPDATE_ATTACK_SHOTS; if (moby->prev_seq != 9) { blend_moby_animation(moby, 9, 0, scale_game_frames(6)); } } else { - moby->state = 7; + moby->state = L02_BOT_SELECT_ATTACK_OR_WANDER; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(6)); } @@ -458,7 +458,7 @@ void constructorbot_update(struct Moby *moby) { break; case L02_BOT_HIT_KNOCKBACK_RECOVERY: if (step_moby_motion(moby, bot_private_vars->knockback) & 0x40) { - moby->state = 7; + moby->state = L02_BOT_SELECT_ATTACK_OR_WANDER; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(6)); } diff --git a/src/overlays/l02/mobys/elevator.c b/src/overlays/l02/mobys/elevator.c index c5f5c4814d..dff580b4af 100644 --- a/src/overlays/l02/mobys/elevator.c +++ b/src/overlays/l02/mobys/elevator.c @@ -96,9 +96,9 @@ void elevator_update(L16PlatformMoby *moby) { level02_elevator_stop_height_offset_gp; moby->reverse = 1; if (elevator_vars->stop) { - moby->state = 2; + moby->state = ELEVATOR_WAIT_AT_STOP; } else { - moby->state = 1; + moby->state = ELEVATOR_WAIT_FOR_RIDER_OR_TRIGGER; } break; case ELEVATOR_WAIT_AT_STOP: @@ -124,7 +124,7 @@ void elevator_update(L16PlatformMoby *moby) { moby->reverse = (moby->reverse + 1) & 1; elevator_vars->goal = motion.v[2]; elevator_vars->speed = 0.0f; - moby->state = 3; + moby->state = ELEVATOR_MOVE_TO_GOAL; break; } } @@ -144,7 +144,7 @@ void elevator_update(L16PlatformMoby *moby) { elevator_vars->joint * 0x80 + 0x38) + level02_elevator_stop_height_offset_gp; elevator_vars->speed = 0.0f; - moby->state = 3; + moby->state = ELEVATOR_MOVE_TO_GOAL; } break; case ELEVATOR_WAIT_FOR_RIDER_OR_TRIGGER: @@ -164,7 +164,7 @@ void elevator_update(L16PlatformMoby *moby) { elevator_vars->joint * 0x80 + 0x38) + level02_elevator_stop_height_offset_gp; elevator_vars->speed = 0.0f; - moby->state = 3; + moby->state = ELEVATOR_MOVE_TO_GOAL; } break; case ELEVATOR_MOVE_TO_GOAL: { @@ -205,7 +205,7 @@ void elevator_update(L16PlatformMoby *moby) { if (moby->position[2] == elevator_vars->goal && (hero.ground_moby != (struct Moby *)moby || hero.air_frames.s != 0)) { clear_u64_value(elevator_vars->basis[1]); - moby->state = 2; + moby->state = ELEVATOR_WAIT_AT_STOP; break; } if (elevator_vars->speed != 0.0f) { diff --git a/src/overlays/l02/mobys/liftcar_platform.c b/src/overlays/l02/mobys/liftcar_platform.c index 0410a836e8..39b4a03a44 100644 --- a/src/overlays/l02/mobys/liftcar_platform.c +++ b/src/overlays/l02/mobys/liftcar_platform.c @@ -59,12 +59,12 @@ void liftcar_platform_update(struct Moby *moby) { case LIFTCAR_PLATFORM_INITIALIZE: build_moby_bone_transform(driver, 0, joint_mtx); moby->rot.z = fast_arc_tan(joint_mtx[0], joint_mtx[1]); - moby->state = 1; + moby->state = LIFTCAR_PLATFORM_WAIT_FOR_MISSION_GATE; blend_moby_animation(driver, 3, 0, 0); break; case LIFTCAR_PLATFORM_WAIT_FOR_MISSION_GATE: if (D_0014C050[current_level_index][moby->mission] == 0xFF) { - moby->state = 5; + moby->state = LIFTCAR_PLATFORM_WAIT_FOR_RIDER_OR_HERO_BELOW; } break; case LIFTCAR_PLATFORM_WAIT_FOR_RIDER_OR_HERO_ABOVE: @@ -73,19 +73,22 @@ void liftcar_platform_update(struct Moby *moby) { if (hero.ground_moby == moby && hero.air_frames.s == 0 && moby->command == 0) { ride = 1; } else if (vector_distance_xy(&moby->pos, &hero.motion.pos) < 16.0f) { - if (moby->state == 5 && hero.motion.pos.f[2] < moby->pos.z - 5.0f) { + if (moby->state == LIFTCAR_PLATFORM_WAIT_FOR_RIDER_OR_HERO_BELOW && + hero.motion.pos.f[2] < moby->pos.z - 5.0f) { ride = 1; - } else if (moby->state == 3 && moby->pos.z + 5.0f < hero.motion.pos.f[2]) { + } else if (moby->state == LIFTCAR_PLATFORM_WAIT_FOR_RIDER_OR_HERO_ABOVE && + moby->pos.z + 5.0f < hero.motion.pos.f[2]) { ride = 1; } } if (ride) { - if (moby->state == 5 || moby->state == 1) { - moby->state = 2; + if (moby->state == LIFTCAR_PLATFORM_WAIT_FOR_RIDER_OR_HERO_BELOW || + moby->state == LIFTCAR_PLATFORM_WAIT_FOR_MISSION_GATE) { + moby->state = LIFTCAR_PLATFORM_ANIMATE_THEN_WAIT_FOR_RIDER_OR_HERO_ABOVE; set_moby_animation(driver, 0, 0); platform_vars->unkA4 = allocate_voice_for_target_entry(2, 4, driver); } else { - moby->state = 4; + moby->state = LIFTCAR_PLATFORM_ANIMATE_THEN_WAIT_FOR_RIDER_OR_HERO_BELOW; set_moby_animation(driver, 2, 0); platform_vars->unkA4 = allocate_voice_for_target_entry(0, 4, driver); } @@ -113,7 +116,7 @@ void liftcar_platform_update(struct Moby *moby) { (vector_distance_xy(&moby->pos, &hero.motion.pos) > 2.0f || moby->pos.z - 1.25f < hero.motion.pos.f[2])) { driver->anim_speed = 1.0f; - if (moby->state == 2) { + if (moby->state == LIFTCAR_PLATFORM_ANIMATE_THEN_WAIT_FOR_RIDER_OR_HERO_ABOVE) { platform_vars->unkA4 = allocate_voice_for_target_entry(2, 4, driver); } else { platform_vars->unkA4 = allocate_voice_for_target_entry(0, 4, driver); @@ -128,12 +131,12 @@ void liftcar_platform_update(struct Moby *moby) { } } platform_vars->unkA4 = -1; - if (moby->state == 2) { - moby->state = 3; + if (moby->state == LIFTCAR_PLATFORM_ANIMATE_THEN_WAIT_FOR_RIDER_OR_HERO_ABOVE) { + moby->state = LIFTCAR_PLATFORM_WAIT_FOR_RIDER_OR_HERO_ABOVE; blend_moby_animation(driver, 1, 0, 0); allocate_voice_for_target_entry(3, 0, driver); } else { - moby->state = 5; + moby->state = LIFTCAR_PLATFORM_WAIT_FOR_RIDER_OR_HERO_BELOW; blend_moby_animation(driver, 3, 0, 0); allocate_voice_for_target_entry(1, 0, driver); } diff --git a/src/overlays/l02/mobys/ocean_aridia.c b/src/overlays/l02/mobys/ocean_aridia.c index 9a7da82974..ef13c557a2 100644 --- a/src/overlays/l02/mobys/ocean_aridia.c +++ b/src/overlays/l02/mobys/ocean_aridia.c @@ -132,7 +132,7 @@ void ocean_aridia_update(struct Moby *moby) { switch (moby->state) { case OCEAN_ARIDIA_INITIALIZE: prepare_scaled_table_on_stack(0.16666667f); - moby->state = 1; + moby->state = OCEAN_ARIDIA_REGISTER_DRAW_CALLBACK; moby->update_dist = 0xFF; break; case OCEAN_ARIDIA_REGISTER_DRAW_CALLBACK: diff --git a/src/overlays/l02/mobys/rocket_door1.c b/src/overlays/l02/mobys/rocket_door1.c index d80db47541..ec218fbeed 100644 --- a/src/overlays/l02/mobys/rocket_door1.c +++ b/src/overlays/l02/mobys/rocket_door1.c @@ -23,7 +23,7 @@ typedef struct { extern s32 D_0015ED84; extern u8 D_0014C050[][16]; -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern float approach_angle(float *, float *, float, float, float, float) __asm__("FUN_L00_0025be00"); @@ -37,6 +37,9 @@ void rocket_door1_update(struct Moby *moby) { ROCKET_DOOR1_WAIT_FOR_COMMAND = 1, ROCKET_DOOR1_TURN_TO_GOAL_ROTATION = 2 }; + enum { + ROCKET_DOOR1_GOAL_ROTATION_APPLIED = 3 + }; Vec4 qx; Vec4 qy; Vec4 qz; @@ -59,25 +62,25 @@ void rocket_door1_update(struct Moby *moby) { moby->rot.x = door_vars->goal.f[0] * 0.017453292f; moby->rot.y = door_vars->goal.f[1] * 0.017453292f; moby->rot.z = door_vars->goal.f[2] * 0.017453292f; - moby->state = 3; + moby->state = ROCKET_DOOR1_GOAL_ROTATION_APPLIED; } else { - moby->state = 1; + moby->state = ROCKET_DOOR1_WAIT_FOR_COMMAND; moby->flags |= 0x100; - FUN_L00_001fff28(&qx, 0, door_vars->goal.f[0] * 0.017453292f); - FUN_L00_001fff28(&qy, 1, door_vars->goal.f[1] * 0.017453292f); - FUN_L00_001fff28(&qz, 2, door_vars->goal.f[2] * 0.017453292f); + build_axis_rotation_quaternion(&qx, 0, door_vars->goal.f[0] * 0.017453292f); + build_axis_rotation_quaternion(&qy, 1, door_vars->goal.f[1] * 0.017453292f); + build_axis_rotation_quaternion(&qz, 2, door_vars->goal.f[2] * 0.017453292f); multiply_quaternions(&qxy, &qx, &qy); multiply_quaternions(&door_vars->goal, &qxy, &qz); - FUN_L00_001fff28(&qx, 0, moby->rot.x); - FUN_L00_001fff28(&qy, 1, moby->rot.y); - FUN_L00_001fff28(&qz, 2, moby->rot.z); + build_axis_rotation_quaternion(&qx, 0, moby->rot.x); + build_axis_rotation_quaternion(&qy, 1, moby->rot.y); + build_axis_rotation_quaternion(&qz, 2, moby->rot.z); multiply_quaternions(&rxy, &qx, &qy); multiply_quaternions(&door_vars->start, &rxy, &qz); } break; case ROCKET_DOOR1_WAIT_FOR_COMMAND: if (moby->command != 0) { - moby->state = 2; + moby->state = ROCKET_DOOR1_TURN_TO_GOAL_ROTATION; door_vars->speed = 0.0f; door_vars->t = 0.0f; } diff --git a/src/overlays/l02/mobys/rocket_launcher.c b/src/overlays/l02/mobys/rocket_launcher.c index 1e9c45d618..717c94fa82 100644 --- a/src/overlays/l02/mobys/rocket_launcher.c +++ b/src/overlays/l02/mobys/rocket_launcher.c @@ -103,7 +103,7 @@ void rocket_launcher_update(struct Moby *moby) { case ROCKET_LAUNCHER_WAIT_BETWEEN_SHOTS: if (fast_dec_timer_s16(&rocket_launcher_vars->wait_timer)) { rocket_launcher_vars->target_yaw = random_float_between(0.0f, 3.14159f); - moby->state = 1; + moby->state = ROCKET_LAUNCHER_TURN_AND_FIRE; allocate_voice_for_target_entry(4, 0, moby); } break; @@ -130,7 +130,7 @@ void rocket_launcher_update(struct Moby *moby) { rocket_launcher_vars->voice = -1; allocate_voice_for_target_entry(3, 0, moby); rocket_launcher_vars->recoil = rocket_launcher_shot_sound_initial_distance_gp; - moby->state = 2; + moby->state = ROCKET_LAUNCHER_WAIT_FOR_POST_SHOT_ANIMATION; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, 1); moby_point_position(moby, 1, &muzzle); @@ -169,7 +169,7 @@ void rocket_launcher_update(struct Moby *moby) { if (moby->anim_flags & 2) { if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, 1); - moby->state = 0; + moby->state = ROCKET_LAUNCHER_WAIT_BETWEEN_SHOTS; rocket_launcher_vars->wait_timer = truncate_float_to_s32(scale_time(random_float_between(60.0f, 180.0f))); } diff --git a/src/overlays/l02/mobys/rocks.c b/src/overlays/l02/mobys/rocks.c index 85dd4aeaf2..38bf83fb42 100644 --- a/src/overlays/l02/mobys/rocks.c +++ b/src/overlays/l02/mobys/rocks.c @@ -61,7 +61,7 @@ void rocks_update(struct Moby *moby) { if (menu_item_enabled_9) { mark_moby_for_removal(moby); } else { - moby->state = 1; + moby->state = ROCKS_WAIT_FOR_HIT; } break; case ROCKS_WAIT_FOR_HIT: diff --git a/src/overlays/l02/mobys/sand_shark.c b/src/overlays/l02/mobys/sand_shark.c index 1197d353b4..560b7a6a20 100644 --- a/src/overlays/l02/mobys/sand_shark.c +++ b/src/overlays/l02/mobys/sand_shark.c @@ -17,6 +17,34 @@ #include "rnc/rendering/clip_volume.h" #include "rnc/world/collision/ground_probe.h" +enum { + SAND_SHARK_INITIALIZE = 0, + SAND_SHARK_BEGIN_RETURN_HOME_WITH_HEIGHT_OFFSET = 1, + SAND_SHARK_WANDER_AROUND_HOME = 2, + SAND_SHARK_WAIT_FOR_TARGET_IN_VOLUME = 3, + SAND_SHARK_APPROACH_TARGET = 5, + SAND_SHARK_CLOSE_RANGE_ATTACK = 6, + SAND_SHARK_RETURN_HOME = 7, + SAND_SHARK_KNOCKBACK_UNTIL_LANDING = 8, + SAND_SHARK_SUCK_CANNON_INTERACTION = 9, + SAND_SHARK_WAIT_FOR_HERO_LAUNCH_TRIGGER = 12, + SAND_SHARK_BALLISTIC_FLIGHT = 13, + SAND_SHARK_APPROACH_TARGET_WITH_PATH_PROXIMITY_CHECK = 14, + SAND_SHARK_FACE_TARGET = 15, + SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET_WITH_HEIGHT_OFFSET = 17, + SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME_WITH_HEIGHT_OFFSET = 18, + SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET = 19, + SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME = 20, + SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET_WITH_PATH_PROXIMITY_CHECK = 21, + SAND_SHARK_APPROACH_TARGET_WITH_HEIGHT_OFFSET = 22, + SAND_SHARK_RETURN_HOME_WITH_HEIGHT_OFFSET = 23, + SAND_SHARK_DEATH_KNOCKBACK = 24, + SAND_SHARK_FADE_OUT = 25, + SAND_SHARK_INACTIVE_WAIT_FOR_RELAUNCH = 26, + SAND_SHARK_BALLISTIC_FLIGHT_WITH_PARTICLES = 27, + SAND_SHARK_WAIT_FOR_LINKED_MOBY_BEFORE_INITIALIZE = 29 +}; + extern float sand_shark_dust_vertical_velocity_scale_gp __asm__("D_L02_001619D4") __attribute__((sda)); extern float sand_shark_dust_position_jitter_radius_gp __asm__("D_L02_001619DC") @@ -239,8 +267,7 @@ extern void turn_angle_e50(float *, float, float *, float, float, float) __asm__("FUN_L00_0025be00"); extern int step_moby_motion(void *, void *) __asm__("FUN_L00_0025c698"); extern void FUN_L00_00263ac8_e50(void *, int, void *, float) __asm__("FUN_L00_00263ac8"); -extern void -FUN_L00_00269958_e50(void *, void *, int, int, int, int, int, int) __asm__("FUN_L00_00269958"); +extern void spawn_effect(void *, void *, int, int, int, int, int, int) __asm__("FUN_L00_00269958"); extern int FUN_L00_002dc9f0_e50(void *, void *) __asm__("FUN_L00_002dc9f0"); extern void FUN_L01_0026d930_e50(void *) __asm__("FUN_L01_0026d930"); extern void emit_sand_shark_dust_burst(void *) __asm__("FUN_L02_002d3dd0"); @@ -264,31 +291,7 @@ void sand_shark_update(struct Moby *moby) __asm__("FUN_L02_002d3e50"); /* Moby class 580 */ void sand_shark_update(struct Moby *moby) { enum { - SAND_SHARK_INITIALIZE = 0, - SAND_SHARK_BEGIN_RETURN_HOME_WITH_HEIGHT_OFFSET = 1, - SAND_SHARK_WANDER_AROUND_HOME = 2, - SAND_SHARK_WAIT_FOR_TARGET_IN_VOLUME = 3, - SAND_SHARK_APPROACH_TARGET = 5, - SAND_SHARK_CLOSE_RANGE_ATTACK = 6, - SAND_SHARK_RETURN_HOME = 7, - SAND_SHARK_KNOCKBACK_UNTIL_LANDING = 8, - SAND_SHARK_SUCK_CANNON_INTERACTION = 9, - SAND_SHARK_WAIT_FOR_HERO_LAUNCH_TRIGGER = 12, - SAND_SHARK_BALLISTIC_FLIGHT = 13, - SAND_SHARK_APPROACH_TARGET_WITH_PATH_PROXIMITY_CHECK = 14, - SAND_SHARK_FACE_TARGET = 15, - SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET_WITH_HEIGHT_OFFSET = 17, - SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME_WITH_HEIGHT_OFFSET = 18, - SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET = 19, - SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME = 20, - SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET_WITH_PATH_PROXIMITY_CHECK = 21, - SAND_SHARK_APPROACH_TARGET_WITH_HEIGHT_OFFSET = 22, - SAND_SHARK_RETURN_HOME_WITH_HEIGHT_OFFSET = 23, - SAND_SHARK_DEATH_KNOCKBACK = 24, - SAND_SHARK_FADE_OUT = 25, - SAND_SHARK_INACTIVE_WAIT_FOR_RELAUNCH = 26, - SAND_SHARK_BALLISTIC_FLIGHT_WITH_PARTICLES = 27, - SAND_SHARK_WAIT_FOR_LINKED_MOBY_BEFORE_INITIALIZE = 29 + SAND_SHARK_LANDED_AFTER_KNOCKBACK = 0xB }; Varsd3e50 *sand_shark_behavior_vars; OvlVec4 position_or_offset_scratch; @@ -350,7 +353,7 @@ void sand_shark_update(struct Moby *moby) { mark_moby_for_removal(moby); return; } - moby->state = 0xC; + moby->state = SAND_SHARK_WAIT_FOR_HERO_LAUNCH_TRIGGER; moby->collision = 0; moby->pos.z += 10.0f; moby->flags = (moby->flags | 1) & ~0x1000; @@ -359,16 +362,16 @@ void sand_shark_update(struct Moby *moby) { } } else if (sand_shark_behavior_vars->unk278 >= 0) { sand_shark_behavior_vars->walk_18C = 0.2f; - moby->state = 3; + moby->state = SAND_SHARK_WAIT_FOR_TARGET_IN_VOLUME; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(3)); } } else if (sand_shark_behavior_vars->unk258 >= 0) { - moby->state = 0x1D; + moby->state = SAND_SHARK_WAIT_FOR_LINKED_MOBY_BEFORE_INITIALIZE; moby->collision = 0; moby->flags = (moby->flags | 0x41) & ~0x1000; } else { - moby->state = 1; + moby->state = SAND_SHARK_BEGIN_RETURN_HOME_WITH_HEIGHT_OFFSET; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(3)); } @@ -383,13 +386,13 @@ void sand_shark_update(struct Moby *moby) { moby->collision = moby->pclass->collision; sand_shark_behavior_vars->unk258 = -1; sand_shark_behavior_vars->unk25C = scale_game_frames(0x1518); - moby->state = 0; + moby->state = SAND_SHARK_INITIALIZE; moby->pos.z -= sand_shark_height_offset_gp; } break; case SAND_SHARK_BEGIN_RETURN_HOME_WITH_HEIGHT_OFFSET: fast_vec_sub(&position_or_offset_scratch, &hero.motion.pos, &moby->pos); - moby->state = 0x12; + moby->state = SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME_WITH_HEIGHT_OFFSET; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(3)); } @@ -438,13 +441,14 @@ void sand_shark_update(struct Moby *moby) { sand_shark_behavior_vars->turn_timer = scale_game_frames((int)random_float_between(30.0f, 90.0f)); sand_shark_behavior_vars->walk_step = D_0015ED6C * 4.0f; - moby->state = 0x11; + moby->state = SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET_WITH_HEIGHT_OFFSET; if (moby->prev_seq != 0xC) { blend_moby_animation(moby, 0xC, 0, scale_game_frames(3)); } } } else if (sand_shark_behavior_vars->unk25E != 0 && random_integer_below(0x13) == 0) { - moby->state = 0x15; + moby->state = + SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET_WITH_PATH_PROXIMITY_CHECK; allocate_voice_for_target_entry(4, 0, moby); if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 0); @@ -456,7 +460,7 @@ void sand_shark_update(struct Moby *moby) { if (sand_shark_behavior_vars->unk214 != 2 && is_point_inside_clip_volume(&sand_shark_behavior_vars->target, sand_shark_behavior_vars->unk278)) { - moby->state = 5; + moby->state = SAND_SHARK_APPROACH_TARGET; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(3)); } @@ -493,23 +497,23 @@ void sand_shark_update(struct Moby *moby) { } if (sand_shark_behavior_vars->unk25E != 0) { if (hit14) { - moby->state = 0xF; + moby->state = SAND_SHARK_FACE_TARGET; if (moby->prev_seq != 5) { blend_moby_animation(moby, 5, 0, scale_game_frames(0xA)); } } else if (vector_distance_xy(&moby->pos, &target_or_particle_vector) < 1.5f) { - moby->state = 6; + moby->state = SAND_SHARK_CLOSE_RANGE_ATTACK; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(0xA)); } } else if (sand_shark_behavior_vars->unk214 != 2) { - moby->state = 5; + moby->state = SAND_SHARK_APPROACH_TARGET; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(0xF)); } } } else { - moby->state = 0x12; + moby->state = SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME_WITH_HEIGHT_OFFSET; } break; } @@ -523,18 +527,18 @@ void sand_shark_update(struct Moby *moby) { D_0015ED6C * 6.2831855f); if (sand_shark_behavior_vars->unk25E != 0) { if (vector_distance_xy(&moby->pos, &sand_shark_behavior_vars->target) < 1.5f) { - moby->state = 6; + moby->state = SAND_SHARK_CLOSE_RANGE_ATTACK; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(0xA)); } } else if (sand_shark_behavior_vars->unk214 != 2) { - moby->state = 5; + moby->state = SAND_SHARK_APPROACH_TARGET; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(0xF)); } } } else { - moby->state = 0x12; + moby->state = SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME_WITH_HEIGHT_OFFSET; } break; case SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET_WITH_HEIGHT_OFFSET: @@ -552,10 +556,11 @@ void sand_shark_update(struct Moby *moby) { if (moby->prev_seq != 0xC) { blend_moby_animation(moby, 0xC, 0, scale_game_frames(5)); } - if (moby->state == 0x11) { - moby->state = 0x16; + if (moby->state == + SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET_WITH_HEIGHT_OFFSET) { + moby->state = SAND_SHARK_APPROACH_TARGET_WITH_HEIGHT_OFFSET; } else { - moby->state = 0x17; + moby->state = SAND_SHARK_RETURN_HOME_WITH_HEIGHT_OFFSET; } } moby->pos.z -= sand_shark_height_offset_gp; @@ -574,20 +579,20 @@ void sand_shark_update(struct Moby *moby) { position_or_offset_scratch.f[2] = g; if (approach_value(&moby->pos.z, g + sand_shark_height_offset_gp, D_0015ED6C * 4.0f) == 0.0f) { - if (moby->state == 0x13) { - moby->state = 5; + if (moby->state == SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET) { + moby->state = SAND_SHARK_APPROACH_TARGET; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(3)); } - } else if (moby->state == 0x14) { - moby->state = 7; + } else if (moby->state == SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME) { + moby->state = SAND_SHARK_RETURN_HOME; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(3)); } } else { sand_shark_behavior_vars->unk294 = random_float_between(2.0f, 3.5f); sand_shark_behavior_vars->walk_step = D_0015ED6C * 4.0f; - moby->state = 0xE; + moby->state = SAND_SHARK_APPROACH_TARGET_WITH_PATH_PROXIMITY_CHECK; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(3)); } @@ -599,7 +604,7 @@ void sand_shark_update(struct Moby *moby) { } case SAND_SHARK_APPROACH_TARGET: case SAND_SHARK_APPROACH_TARGET_WITH_HEIGHT_OFFSET: - if (moby->state == 0x16) { + if (moby->state == SAND_SHARK_APPROACH_TARGET_WITH_HEIGHT_OFFSET) { moby->pos.z += sand_shark_height_offset_gp; if (random_integer_below(0xFF) & 1) { particle_position_or_forward_step.q = *(OvlQuad *)&moby->pos; @@ -625,39 +630,39 @@ void sand_shark_update(struct Moby *moby) { &target_or_particle_vector, 1.0f); FUN_L02_002d63c0_e50(moby); - if (moby->state == 0x16) { + if (moby->state == SAND_SHARK_APPROACH_TARGET_WITH_HEIGHT_OFFSET) { moby->pos.z -= sand_shark_height_offset_gp; } if (sand_shark_behavior_vars->unk214 != 2) { if (sand_shark_behavior_vars->unk278 >= 0 && !is_point_inside_clip_volume(&sand_shark_behavior_vars->target, sand_shark_behavior_vars->unk278)) { - moby->state = 7; + moby->state = SAND_SHARK_RETURN_HOME; } else { fast_vec_sub(&target_home_delta, &sand_shark_behavior_vars->target, &sand_shark_behavior_vars->home); if (vector_distance_xy(&moby->pos, &navigation_point) < 12.0f && - moby->state == 0x16) { - moby->state = 0x13; + moby->state == SAND_SHARK_APPROACH_TARGET_WITH_HEIGHT_OFFSET) { + moby->state = SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET; allocate_voice_for_target_entry(4, 0, moby); if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(3)); } } else if (vector_distance_xy(&moby->pos, &navigation_point) < 1.5f && - moby->state == 5) { - moby->state = 6; + moby->state == SAND_SHARK_APPROACH_TARGET) { + moby->state = SAND_SHARK_CLOSE_RANGE_ATTACK; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(3)); } } } } else if (sand_shark_behavior_vars->unk278 >= 0) { - moby->state = 7; + moby->state = SAND_SHARK_RETURN_HOME; } else if (sand_shark_behavior_vars->unk25E != 0) { - moby->state = 0xE; + moby->state = SAND_SHARK_APPROACH_TARGET_WITH_PATH_PROXIMITY_CHECK; } else { - moby->state = 0x12; + moby->state = SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME_WITH_HEIGHT_OFFSET; } break; case SAND_SHARK_CLOSE_RANGE_ATTACK: @@ -676,7 +681,7 @@ void sand_shark_update(struct Moby *moby) { } if ((moby->anim_flags & 2) && vector_distance_xy(&moby->pos, &sand_shark_behavior_vars->target) > 1.5f) { - moby->state = 5; + moby->state = SAND_SHARK_APPROACH_TARGET; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(3)); } @@ -693,7 +698,7 @@ void sand_shark_update(struct Moby *moby) { break; case SAND_SHARK_RETURN_HOME: case SAND_SHARK_RETURN_HOME_WITH_HEIGHT_OFFSET: - if (moby->state == 0x17) { + if (moby->state == SAND_SHARK_RETURN_HOME_WITH_HEIGHT_OFFSET) { moby->pos.z += sand_shark_height_offset_gp; if (random_integer_below(0xFF) & 1) { particle_position_or_forward_step.q = *(OvlQuad *)&moby->pos; @@ -717,26 +722,26 @@ void sand_shark_update(struct Moby *moby) { &position_or_offset_scratch, &target_or_particle_vector, 1.0f); - if (moby->state == 0x17) { + if (moby->state == SAND_SHARK_RETURN_HOME_WITH_HEIGHT_OFFSET) { moby->pos.z -= sand_shark_height_offset_gp; } if (vector_distance_xy(&moby->pos, &sand_shark_behavior_vars->home) < 0.5f) { sand_shark_behavior_vars->unk298 = 0; - if (moby->state == 7) { + if (moby->state == SAND_SHARK_RETURN_HOME) { if (sand_shark_behavior_vars->unk278 >= 0) { - moby->state = 3; + moby->state = SAND_SHARK_WAIT_FOR_TARGET_IN_VOLUME; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(3)); } } else { - moby->state = 0x12; + moby->state = SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME_WITH_HEIGHT_OFFSET; sand_shark_behavior_vars->walk_step = D_0015ED6C * 1.5f; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(3)); } } } else { - moby->state = 2; + moby->state = SAND_SHARK_WANDER_AROUND_HOME; sand_shark_behavior_vars->walk_step = D_0015ED6C * 1.5f; if (moby->prev_seq != 0xC) { blend_moby_animation(moby, 0xC, 0, scale_game_frames(5)); @@ -751,15 +756,15 @@ void sand_shark_update(struct Moby *moby) { if (sand_shark_behavior_vars->unk278 >= 0) { if (is_point_inside_clip_volume(&sand_shark_behavior_vars->target, sand_shark_behavior_vars->unk278)) { - moby->state = 5; + moby->state = SAND_SHARK_APPROACH_TARGET; sand_shark_behavior_vars->walk_step = sand_shark_behavior_vars->unk254 * D_0015ED6C; } } else if (fast_vec_length(&target_home_delta) < sand_shark_behavior_vars->unk24C) { - if (moby->state == 7) { - moby->state = 5; + if (moby->state == SAND_SHARK_RETURN_HOME) { + moby->state = SAND_SHARK_APPROACH_TARGET; } else { - moby->state = 0x16; + moby->state = SAND_SHARK_APPROACH_TARGET_WITH_HEIGHT_OFFSET; } sand_shark_behavior_vars->walk_step = sand_shark_behavior_vars->unk254 * D_0015ED6C; @@ -768,7 +773,8 @@ void sand_shark_update(struct Moby *moby) { } } } else if (sand_shark_behavior_vars->unk25E != 0 && random_integer_below(0x13) == 0) { - moby->state = 0x15; + moby->state = + SAND_SHARK_ALIGN_TO_GROUND_BEFORE_APPROACH_TARGET_WITH_PATH_PROXIMITY_CHECK; allocate_voice_for_target_entry(4, 0, moby); if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 0); @@ -784,7 +790,7 @@ void sand_shark_update(struct Moby *moby) { break; case SAND_SHARK_KNOCKBACK_UNTIL_LANDING: if (step_moby_motion(moby, sand_shark_behavior_vars->unk120) & 1) { - moby->state = 0xB; + moby->state = SAND_SHARK_LANDED_AFTER_KNOCKBACK; if (moby->prev_seq != 4) { blend_moby_animation(moby, 4, 8, scale_game_frames(3)); } @@ -798,7 +804,7 @@ void sand_shark_update(struct Moby *moby) { break; case SAND_SHARK_SUCK_CANNON_INTERACTION: if (FUN_L00_002dc9f0_e50(moby, sand_shark_behavior_vars->unk120)) { - moby->state = 1; + moby->state = SAND_SHARK_BEGIN_RETURN_HOME_WITH_HEIGHT_OFFSET; sand_shark_behavior_vars->unkC8 = 0; } break; @@ -831,7 +837,7 @@ void sand_shark_update(struct Moby *moby) { if (moby->prev_seq != 0xB) { blend_moby_animation(moby, 0xB, 0, 0); } - moby->state = 0xD; + moby->state = SAND_SHARK_BALLISTIC_FLIGHT; } break; } @@ -842,14 +848,14 @@ void sand_shark_update(struct Moby *moby) { fast_vec_add(&position_or_offset_scratch, &target_or_particle_vector, &moby->pos); fast_vec_scale(&target_or_particle_vector, &target_or_particle_vector, D_0015ED6C * 5.0f); life = scale_game_frames(random_int_between(0x14, 0x28)); - FUN_L00_00269958_e50(&moby->pos, - &target_or_particle_vector, - D_L02_001619E4, - D_L02_001619E8, - life, - 0x64, - random_int_between(0x78, 0x96), - 0); + spawn_effect(&moby->pos, + &target_or_particle_vector, + D_L02_001619E4, + D_L02_001619E8, + life, + 0x64, + random_int_between(0x78, 0x96), + 0); } /* fallthrough */ case SAND_SHARK_BALLISTIC_FLIGHT: { @@ -862,7 +868,7 @@ void sand_shark_update(struct Moby *moby) { moby->collision = moby->pclass->collision; moby->flags |= 0x1000; moby->pos.z = sand_shark_behavior_vars->home.f[2] - sink; - moby->state = 0x17; + moby->state = SAND_SHARK_RETURN_HOME_WITH_HEIGHT_OFFSET; moby->rot.y = 0.0f; if (moby->prev_seq != 0xC) { blend_moby_animation(moby, 0xC, 0, scale_game_frames(1)); @@ -885,7 +891,7 @@ void sand_shark_update(struct Moby *moby) { sand_shark_behavior_vars->unk27C = select_group_class_29c_moby(moby); if (sand_shark_behavior_vars->unk27C != 0) { emit_sand_shark_dust_burst(moby); - moby->state = 0x1A; + moby->state = SAND_SHARK_INACTIVE_WAIT_FOR_RELAUNCH; moby->anim_speed = 0.0f; qcopy(&moby->pos, &sand_shark_behavior_vars->home); moby->collision = 0; @@ -911,7 +917,7 @@ void sand_shark_update(struct Moby *moby) { if (sand_shark_behavior_vars->unk27C != 0) { emit_sand_shark_dust_burst(moby); moby->alpha = 0x80; - moby->state = 0x1A; + moby->state = SAND_SHARK_INACTIVE_WAIT_FOR_RELAUNCH; qcopy(&moby->pos, &sand_shark_behavior_vars->home); moby->collision = 0; moby->pos.z -= 10.0f; @@ -1355,15 +1361,15 @@ void *handle_sand_shark_suck_cannon_storage(struct Moby *moby) { void *helper_result = store_moby_in_suck_cannon(moby); if (helper_result) { int spawner_moby_index; - moby->state = 9; + moby->state = SAND_SHARK_SUCK_CANNON_INTERACTION; spawner_moby_index = *(int *)((char *)moby->pvars + 0x288); if (spawner_moby_index >= 0) { char *spawner_vars = *(char **)(*(int *)&D_L02_0015FFD8_c + spawner_moby_index * 256 + 0x78); (*(int *)(spawner_vars + 0x14C))--; } - } else if (moby->state == 9) { - moby->state = 1; + } else if (moby->state == SAND_SHARK_SUCK_CANNON_INTERACTION) { + moby->state = SAND_SHARK_BEGIN_RETURN_HOME_WITH_HEIGHT_OFFSET; } return helper_result; } @@ -1377,7 +1383,7 @@ void prepare_sand_shark_for_relaunch_or_remove(struct Moby *moby) { int selected_class_29c_moby = select_group_class_29c_moby(moby); *(int *)(sand_shark_private_vars + 0x27C) = selected_class_29c_moby; if (selected_class_29c_moby != 0) { - moby->state = 0x1A; + moby->state = SAND_SHARK_INACTIVE_WAIT_FOR_RELAUNCH; moby->anim_speed = 0; qcopy(&moby->pos, sand_shark_private_vars + 0x220); moby->collision = 0; @@ -1399,7 +1405,7 @@ void begin_sand_shark_return_home_if_outside_path(struct Moby *moby) { char *sand_shark_instance_vars = (char *)moby->pvars; char *configured_path = D_L02_001B0AB0[*(int *)(sand_shark_instance_vars + 0x290)]; if (point_in_path_xy(&moby->pos, configured_path + 0x10, *(int *)configured_path) == 0) { - moby->state = 0x12; + moby->state = SAND_SHARK_ALIGN_TO_GROUND_BEFORE_RETURN_HOME_WITH_HEIGHT_OFFSET; if (moby->prev_seq) { blend_moby_animation(moby, 0, 0, scale_game_frames(20)); } diff --git a/src/overlays/l02/mobys/sand_shark_nest.c b/src/overlays/l02/mobys/sand_shark_nest.c index 142905f17f..2654bfd9ce 100644 --- a/src/overlays/l02/mobys/sand_shark_nest.c +++ b/src/overlays/l02/mobys/sand_shark_nest.c @@ -8,6 +8,14 @@ #include "rnc/mobys/animation/blend_moby_animation.h" #include "rnc/overlay/shared/mobys/evaluate_moby_animation_pose.h" +enum { + SAND_SHARK_NEST_INITIALIZE = 0, + SAND_SHARK_NEST_WAIT_FOR_SPAWN = 1, + SAND_SHARK_NEST_LAUNCH_SAND_SHARK = 2, + SAND_SHARK_NEST_HIT_RECOVERY = 3, + SAND_SHARK_NEST_DEATH_KNOCKBACK = 4 +}; + extern float D_0015ED6C; extern int step_moby_motion(void *, void *) __asm__("FUN_L00_0025c698"); @@ -33,8 +41,11 @@ void launch_sand_shark(struct Moby *moby, float *direction) __asm__("FUN_L02_002d6118"); void launch_sand_shark(struct Moby *moby, void *position, float *direction) { + enum { + SAND_SHARK_LAUNCHED = 0x1B + }; char *sand_shark_vars = (char *)moby->pvars; - moby->state = 0x1B; + moby->state = SAND_SHARK_LAUNCHED; moby->flags &= 0xFFBE; if (moby->prev_seq != 0xB) { blend_moby_animation(moby, 0xB, 0, 1); @@ -141,13 +152,6 @@ void sand_shark_nest_update(unsigned char *moby) __asm__("FUN_L02_002dcb38"); /* Moby class 668 */ void sand_shark_nest_update(unsigned char *moby) { - enum { - SAND_SHARK_NEST_INITIALIZE = 0, - SAND_SHARK_NEST_WAIT_FOR_SPAWN = 1, - SAND_SHARK_NEST_LAUNCH_SAND_SHARK = 2, - SAND_SHARK_NEST_HIT_RECOVERY = 3, - SAND_SHARK_NEST_DEATH_KNOCKBACK = 4 - }; Varscb38 *nest_vars = ((Varscb38 *)MOBY(moby)->pvars); char *launched_shark; int spawn_delay_factor; @@ -155,7 +159,7 @@ void sand_shark_nest_update(unsigned char *moby) { OvlVec4 launch_position; handle_sand_shark_nest_damage((struct Moby *)moby); - if ((signed char)MOBY(moby)->state < 0) { + if ((signed char)MOBY(moby)->state < SAND_SHARK_NEST_INITIALIZE) { return; } if (MOBY(moby)->visible != 0 && fast_vec_dist(moby + 0x10, D_L02_001673C0) < 28.0f) { @@ -168,7 +172,7 @@ void sand_shark_nest_update(unsigned char *moby) { if (MOBY(moby)->unkB4 <= 0) { MOBY(moby)->unkB4 = 1; } - MOBY(moby)->state = 1; + MOBY(moby)->state = SAND_SHARK_NEST_WAIT_FOR_SPAWN; nest_vars->f20 = 3.0f; nest_vars->s24 = 3; nest_vars->b2E = 1; @@ -180,7 +184,7 @@ void sand_shark_nest_update(unsigned char *moby) { case SAND_SHARK_NEST_WAIT_FOR_SPAWN: if (fast_dec_timer(&nest_vars->timer)) { if (FUN_L02_002dd2a8_c(moby)) { - MOBY(moby)->state = 2; + MOBY(moby)->state = SAND_SHARK_NEST_LAUNCH_SAND_SHARK; if (MOBY(moby)->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -191,7 +195,7 @@ void sand_shark_nest_update(unsigned char *moby) { break; case SAND_SHARK_NEST_LAUNCH_SAND_SHARK: if (MOBY(moby)->anim_flags & 2) { - MOBY(moby)->state = 1; + MOBY(moby)->state = SAND_SHARK_NEST_WAIT_FOR_SPAWN; if (MOBY(moby)->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -225,7 +229,7 @@ void sand_shark_nest_update(unsigned char *moby) { case SAND_SHARK_NEST_HIT_RECOVERY: step_moby_motion(moby, nest_vars->anim); if (MOBY(moby)->anim_flags & 2) { - MOBY(moby)->state = 1; + MOBY(moby)->state = SAND_SHARK_NEST_WAIT_FOR_SPAWN; if (MOBY(moby)->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(20)); } @@ -326,7 +330,7 @@ void handle_sand_shark_nest_damage(struct Moby *moby) { } hit_record = find_moby_hit(moby, 0x330000, 0); hit_reaction(moby, hit_record, nest_vars + 0x20, 0, &hit, &dmg, 0, 4); - if (hit_record != 0 && hit != 1 && moby->state != 4) { + if (hit_record != 0 && hit != 1 && moby->state != SAND_SHARK_NEST_DEATH_KNOCKBACK) { if (hit == 3) { *(float *)(nest_vars + 0x20) = 0.0f; } else { @@ -345,7 +349,7 @@ void handle_sand_shark_nest_damage(struct Moby *moby) { trooper_start_knockback(k1, moby, nest_vars + 0x70, 3, 1, 0); if (1.0f <= dmg) { nest_vars[0x67] = 0x78; - moby->state = 3; + moby->state = SAND_SHARK_NEST_HIT_RECOVERY; blend_moby_animation(moby, 2, 0, 0); } else { nest_vars[0x67] = 0x78; @@ -353,7 +357,7 @@ void handle_sand_shark_nest_damage(struct Moby *moby) { } else { moby->flags &= 0xEFFF; ((unsigned char *)nest_vars)[0x67] = 0xFA; - moby->state = 4; + moby->state = SAND_SHARK_NEST_DEATH_KNOCKBACK; { float b = D_0015ED6C * 11.0f; float a = D_0015ED6C * 3.0f; diff --git a/src/overlays/l02/mobys/sandshark_egg.c b/src/overlays/l02/mobys/sandshark_egg.c index 7561d06bb3..e7bf3f32d3 100644 --- a/src/overlays/l02/mobys/sandshark_egg.c +++ b/src/overlays/l02/mobys/sandshark_egg.c @@ -44,7 +44,7 @@ void sandshark_egg_update(struct Moby *moby) { case SANDSHARK_EGG_FALL_UNTIL_LANDING: clear_u64_value(u); if (step_moby_motion(moby, egg_vars) & 1) { - moby->state = 2; + moby->state = SANDSHARK_EGG_HANDOFF_TO_LINKED_MOBY; } vp = v; i = 2; diff --git a/src/overlays/l02/mobys/skid_mcmarx.c b/src/overlays/l02/mobys/skid_mcmarx.c index 239e36c2dd..aa65a0cd8d 100644 --- a/src/overlays/l02/mobys/skid_mcmarx.c +++ b/src/overlays/l02/mobys/skid_mcmarx.c @@ -67,7 +67,7 @@ void skid_mcmarx_update(struct Moby *moby) { } watcher_vars->unk180 = 0; watcher_vars->dialog = skid_mcmarx_dialogue_data; - moby->state = 1; + moby->state = SKID_MCMARX_IDLE_AND_TALK; moby->update_dist = 0xFF; initialize_npc_dialogue(moby, watcher_vars); initialize_moby_grounding(moby); @@ -80,7 +80,7 @@ void skid_mcmarx_update(struct Moby *moby) { watcher_vars->talk_radius = 2.5f; if (update_npc_dialogue(moby, watcher_vars)) { begin_dialogue_camera_transition(moby, 2.5f); - moby->state = 2; + moby->state = SKID_MCMARX_CONVERSATION_ACTIVE; } if (watcher_vars->talk_state == 2) { help_request(2000, 10); @@ -114,7 +114,7 @@ void skid_mcmarx_update(struct Moby *moby) { D_L02_0016CE60.placed = 1; } if (level_game_mode_macro != 2) - moby->state = 1; + moby->state = SKID_MCMARX_IDLE_AND_TALK; break; } rate = 0.02f; diff --git a/src/overlays/l02/mobys/skids_agent.c b/src/overlays/l02/mobys/skids_agent.c index b5fe3e7d9a..3676db3c50 100644 --- a/src/overlays/l02/mobys/skids_agent.c +++ b/src/overlays/l02/mobys/skids_agent.c @@ -121,7 +121,7 @@ void skids_agent_update(struct Moby *moby) { goto kill; } skids_agent_vars->unk20 = skids_agent_dialogue_data; - moby->state = 1; + moby->state = SKIDS_AGENT_IDLE_AND_TALK; initialize_npc_dialogue(moby, skids_agent_vars); initialize_moby_grounding(moby); prop = create_moby(0x38); @@ -140,7 +140,7 @@ void skids_agent_update(struct Moby *moby) { } if (update_npc_dialogue(moby, skids_agent_vars) != 0) { begin_dialogue_camera_transition(moby, 2.2f); - moby->state = 2; + moby->state = SKIDS_AGENT_CONVERSATION_ACTIVE; } else if (item_available[0x5] == 0 && vector_distance_xy(&moby->pos, &hero.motion.pos) < 3.0f) { if (D_00141968[14].count != 0) { @@ -177,7 +177,7 @@ void skids_agent_update(struct Moby *moby) { break; case SKIDS_AGENT_CONVERSATION_ACTIVE: if (level_game_mode != 2) { - moby->state = 1; + moby->state = SKIDS_AGENT_IDLE_AND_TALK; if (skids_agent_vars->unk4 == 0) { jet_clear_persistent(moby->mission); if (skids_agent_vars->unk150 != -1) { @@ -194,7 +194,7 @@ void skids_agent_update(struct Moby *moby) { skids_agent_vars->unk178->visible = 0; } start_indexed_disc_stream(2); - moby->state = 5; + moby->state = SKIDS_AGENT_END_CONVERSATION; } } else if (talk_camera.placed == 0) { fast_vec_normalize(&talk_camera.pos, &moby->rot_row0, 2.5f); @@ -239,7 +239,7 @@ void skids_agent_update(struct Moby *moby) { } else { approach_value(&skids_agent_vars->unk17C, 1.0f, 0.1f); if (skids_agent_vars->unk17C == 1.0f) { - moby->state = 4; + moby->state = SKIDS_AGENT_FADE_TO_ZERO_AND_DELETE; jet_end_mount(0); } } diff --git a/src/overlays/l02/mobys/transport_pod.c b/src/overlays/l02/mobys/transport_pod.c index 22abfc49b2..10b2edb08c 100644 --- a/src/overlays/l02/mobys/transport_pod.c +++ b/src/overlays/l02/mobys/transport_pod.c @@ -111,6 +111,10 @@ void transport_pod_update(unsigned char *moby) { TRANSPORT_POD_CYCLE_RAILS_TO_SPLIT_HEIGHTS = 16, TRANSPORT_POD_CYCLE_RAILS_TO_SHARED_LOWER_HEIGHT = 17 }; + enum { + HERO_TARGET_POSE_STATUS_INACTIVE = 0, + HERO_TARGET_POSE_STATUS_READY = 2 + }; Varsdc88 *transport_pod_vars = ((Varsdc88 *)MOBY(moby)->pvars); int i; int *path; @@ -259,7 +263,7 @@ void transport_pod_update(unsigned char *moby) { MOBY(moby)->state = 3; allocate_voice_for_target_entry(1, 0, moby); } else if ((unsigned char *)hero.ground_moby == (struct Moby *)moby && - hero.air_frames.s == 0 && hero.vehicle_mode == 0) { + hero.air_frames.s == 0 && hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { qcopy(&camera_target_or_hero_position_or_rotation, moby + 0x10); camera_target_or_hero_position_or_rotation.f[2] += 2.0f; if (MOBY(moby)->command == 0) { @@ -321,11 +325,11 @@ void transport_pod_update(unsigned char *moby) { break; case TRANSPORT_POD_WAIT_FOR_RIDER_READY_FOR_DEPARTURE: { int rider_readiness_status = get_hero_target_pose_status(); - if (rider_readiness_status == 2) { + if (rider_readiness_status == HERO_TARGET_POSE_STATUS_READY) { MOBY(moby)->state = 7; allocate_voice_for_target_entry(2, 0, moby); hero_set_state(0x72, 0); - } else if (rider_readiness_status == 0) { + } else if (rider_readiness_status == HERO_TARGET_POSE_STATUS_INACTIVE) { jet_end_mount(2); MOBY(moby)->state = 0xD; } else if (fast_dec_timer(&transport_pod_vars->ride_timer)) { diff --git a/src/overlays/l02/mobys/tresspasser_door1.c b/src/overlays/l02/mobys/tresspasser_door1.c index 61c3a2fdf0..f615e24613 100644 --- a/src/overlays/l02/mobys/tresspasser_door1.c +++ b/src/overlays/l02/mobys/tresspasser_door1.c @@ -27,13 +27,16 @@ void tresspasser_door1_update(struct Moby *moby) { TRESSPASSER_DOOR1_WAIT_FOR_LINKED_MOBY = 1, TRESSPASSER_DOOR1_SLIDE_TO_OFFSET_POSITION = 2 }; + enum { + TRESSPASSER_DOOR1_SLIDE_COMPLETE = 3 + }; char *door_vars = (char *)moby->pvars; float destination_position[4]; float movement_step[4]; switch (moby->state) { case TRESSPASSER_DOOR1_CAPTURE_START_POSITION: qcopy(door_vars, &moby->pos); - moby->state = 1; + moby->state = TRESSPASSER_DOOR1_WAIT_FOR_LINKED_MOBY; break; case TRESSPASSER_DOOR1_WAIT_FOR_LINKED_MOBY: if (*(int *)(door_vars + 0x10) >= 0) { @@ -42,7 +45,7 @@ void tresspasser_door1_update(struct Moby *moby) { short c = *(short *)(o + 0xA6); if (c == 0x267 || c == 0x23F) { if (o[0x20] == 4) { - moby->state = 2; + moby->state = TRESSPASSER_DOOR1_SLIDE_TO_OFFSET_POSITION; FUN_0022da68(0, 0, (int)moby); } } @@ -56,7 +59,7 @@ void tresspasser_door1_update(struct Moby *moby) { fast_vec_add(&moby->pos, &moby->pos, movement_step); if (fast_vec_length(movement_step) == 0.0f) { FUN_0022da68(1, 0, (int)moby); - moby->state = 3; + moby->state = TRESSPASSER_DOOR1_SLIDE_COMPLETE; } break; } diff --git a/src/overlays/l02/mobys/tresspasser_door2.c b/src/overlays/l02/mobys/tresspasser_door2.c index a612d57533..7d77133b64 100644 --- a/src/overlays/l02/mobys/tresspasser_door2.c +++ b/src/overlays/l02/mobys/tresspasser_door2.c @@ -23,11 +23,14 @@ void tresspasser_door2_update(struct Moby *moby) { TRESSPASSER_DOOR2_WAIT_FOR_LINKED_MOBY = 1, TRESSPASSER_DOOR2_SLIDE_TO_OFFSET_POSITION = 2 }; + enum { + TRESSPASSER_DOOR2_SLIDE_STOPPED = 3 + }; char *tresspasser_door2_vars = (char *)moby->pvars; switch (moby->state) { case TRESSPASSER_DOOR2_CAPTURE_START_POSITION: qcopy(tresspasser_door2_vars, &moby->pos); - moby->state = 1; + moby->state = TRESSPASSER_DOOR2_WAIT_FOR_LINKED_MOBY; break; case TRESSPASSER_DOOR2_WAIT_FOR_LINKED_MOBY: { int id = *(int *)(tresspasser_door2_vars + 0x10); @@ -36,7 +39,7 @@ void tresspasser_door2_update(struct Moby *moby) { int linked_moby_class = MOBY(linked_moby)->oclass; if (linked_moby_class == 0x267 || linked_moby_class == 0x23F) { if (((unsigned char *)linked_moby)[0x20] == 4) - moby->state = 2; + moby->state = TRESSPASSER_DOOR2_SLIDE_TO_OFFSET_POSITION; } } break; @@ -51,7 +54,7 @@ void tresspasser_door2_update(struct Moby *moby) { FUN_L00_0025f730(movement_step, D_0015ED6C + D_0015ED6C); fast_vec_add(pos, pos, movement_step); if (fast_vec_length(movement_step) == 0.0f) - moby->state = 3; + moby->state = TRESSPASSER_DOOR2_SLIDE_STOPPED; break; } } diff --git a/src/overlays/l03/hero/hero_set_state.c b/src/overlays/l03/hero/hero_set_state.c index 389fff64df..3c3faba792 100644 --- a/src/overlays/l03/hero/hero_set_state.c +++ b/src/overlays/l03/hero/hero_set_state.c @@ -68,22 +68,32 @@ extern int hero_set_state(int, int) __asm__("FUN_L03_00216648"); extern char level03_hero_trail_jump_velocity_keys[] __asm__("D_L03_0017C020"); extern char level03_hero_water_surface_jump_velocity_keys[] __asm__("D_L03_0017C060"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int entry_animation_mode) { int previous_state_step; char *moby; int old20A7; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || + entry_animation_mode != 2)) return 0; } - if ((D_L03_0015F5C4 == 2 || D_L03_0015F5C4 == 6) && b != 2) + if ((D_L03_0015F5C4 == 2 || D_L03_0015F5C4 == 6) && entry_animation_mode != 2) return 0; { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -96,11 +106,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -121,14 +131,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); return 1; } @@ -141,7 +151,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; q->rand_timer.range = 0x68; } - if (b) { + if (entry_animation_mode) { if (get_hero_idle_animation_index(0) == 0x54) { set_hero_animation( get_hero_idle_animation_index(0), 0, (float)scale_game_frames(0x12)); @@ -157,7 +167,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; clear_u64_value(&p->motion.momentum); p->rand_timer.range = 0x68; - if (b) { + if (entry_animation_mode) { if (get_hero_idle_animation_index(0) == 0x54) { set_hero_animation( get_hero_idle_animation_index(0), 0, (float)scale_game_frames(0x12)); @@ -183,7 +193,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0x45, 0, (float)scale_game_frames(0xC)); break; } @@ -194,7 +204,7 @@ int hero_set_state(int a, int b) { p->health.hp = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); FUN_L00_0025f730(&p->motion.momentum, frame_time * 3.5f); - if (b) + if (entry_animation_mode) set_hero_animation(0x7C, 0, (float)scale_game_frames(0xC)); break; } @@ -210,7 +220,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->unk6A0 = 0; p->unk690 = p->motion.pos.f[2] - p->unk69C; - if (b) + if (entry_animation_mode) set_hero_animation(0x74, 0, (float)scale_game_frames(0xB)); break; } @@ -232,7 +242,7 @@ int hero_set_state(int a, int b) { q->rand_timer.range = 0x68; q->unk8E0 = 0; n = scale_game_frames(0xC); - if (b) + if (entry_animation_mode) set_hero_animation(0x3B, 0, (float)n); } break; @@ -253,7 +263,7 @@ int hero_set_state(int a, int b) { n = scale_game_frames(0xB); if (p->state.prev == 0x33) n = scale_game_frames(0xF); - if (b) + if (entry_animation_mode) set_hero_animation(0x3D, 0, (float)n); break; } @@ -270,7 +280,7 @@ int hero_set_state(int a, int b) { t = -2; if (p->state.prev != 0x35) t = n; - if (b) + if (entry_animation_mode) set_hero_animation(0x3C, 0, (float)t); break; } @@ -343,7 +353,7 @@ int hero_set_state(int a, int b) { s->motion.momentum.f[2] = 0.0f; FUN_L00_0025f730(&s->motion.momentum, frame_time * 5.5f); s->rand_timer.range = 0x68; - if (b) + if (entry_animation_mode) set_hero_animation(0x3A, 0, (float)scale_game_frames(0x16)); } break; @@ -367,7 +377,7 @@ int hero_set_state(int a, int b) { int t = scale_game_frames(0x4D); struct Hero *q = &hero; q->invulnerable_frames = t; - if (b) { + if (entry_animation_mode) { if (q->state.current == 0x75) { set_hero_animation(0x70, 3, -3.0f); } else { @@ -391,7 +401,7 @@ int hero_set_state(int a, int b) { *(int *)&p->drown_sink_speed = 0; p->unk698 = scale_game_frames(0x2D); p->rand_timer.range = 0x68; - if (b) + if (entry_animation_mode) set_hero_animation(0x65, 0, (float)scale_game_frames(0x11)); break; } @@ -431,7 +441,7 @@ int hero_set_state(int a, int b) { v = (char *)&hero.motion.momentum; qcopy(v, v - 0x40); } - if (b) + if (entry_animation_mode) set_hero_animation(0x5F, 0, (float)scale_game_frames(0xA)); break; } @@ -442,7 +452,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->health.hp = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0x80, 0, (float)scale_game_frames(0xA)); break; } @@ -454,7 +464,7 @@ int hero_set_state(int a, int b) { *(int *)&D_L03_0015F688 = scale_game_frames(0x3C); if (p->unk20AA == 0) { t = get_hero_idle_animation_index(1); - if (p->moby->prev_seq != t && b) { + if (p->moby->prev_seq != t && entry_animation_mode) { set_hero_animation(t, 0, (float)scale_game_frames(0x12)); } } @@ -543,7 +553,7 @@ int hero_set_state(int a, int b) { scale_game_frames(5) < u->rail_land_frames) n = scale_game_frames(0xD); } - if (b) { + if (entry_animation_mode) { struct Hero *v = &hero; set_hero_animation(v->state.step + 3, D_L03_0015F6D8[v->state.step], (float)n); } @@ -557,14 +567,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); - if (b) { + if (entry_animation_mode) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L03_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -578,7 +588,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; fill_transfer_words((char *)p + 0x9D0, 0, 0x20); qcopy(&p->motion.momentum, &p->motion.displacement); - if (b) + if (entry_animation_mode) set_hero_animation(0x64, 0, (float)scale_game_frames(0xF)); break; } @@ -600,7 +610,7 @@ int hero_set_state(int a, int b) { } return 0; } - if (b) { + if (entry_animation_mode) { struct Hero *q = &hero; float d = q->anim_frame; int id = 6; @@ -617,7 +627,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = gravity_length_xy((float *)v); qcopy(&p->motion.momentum, v); - if (b) { + if (entry_animation_mode) { int id = 6; float d = p->anim_frame; if (return_hero_animation_id_unchanged(MOBY(moby)->seq) == 4 && 3.0f < d && d < 16.0f) @@ -644,7 +654,7 @@ int hero_set_state(int a, int b) { FUN_L00_0025f730(&q->motion.momentum, frame_time * 7.0f); if (frame_time * 3.5f < q->motion.forward_speed) allocate_hero_voice_for_entry(0xC, 0); - if (b) { + if (entry_animation_mode) { if (q->moby->seq == get_hero_idle_animation_index(0)) { set_hero_animation(0xD, 2, (float)scale_game_frames(9)); } else { @@ -671,7 +681,7 @@ int hero_set_state(int a, int b) { } p->motion.move_yaw = fast_arc_tan(p->grapple_target->pos.x - p->motion.pos.f[0], p->grapple_target->pos.y - p->motion.pos.f[1]); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x2F, 2, (float)scale_game_frames(5)); hero_queue_sequence(0xA, 0xE); } @@ -684,7 +694,7 @@ int hero_set_state(int a, int b) { *(int *)&p->grapple_pull_speed = 0; p->grapple_pull_ending = 0; p->item_use_locked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(0x30, 1, (float)scale_game_frames(0xA)); break; } @@ -696,7 +706,7 @@ int hero_set_state(int a, int b) { *(int *)&p->grapple_pull_speed = 0; p->grapple_pull_ending = 0; p->tether_radius = fast_vec_dist(&p->motion.pos, &p->grapple_target->pos); - if (b) + if (entry_animation_mode) set_hero_animation(0x30, 1, (float)scale_game_frames(5)); break; } @@ -752,7 +762,7 @@ int hero_set_state(int a, int b) { } else if (q->state.prev_control_mode == 2) { q->swing_gravity = q->fall_state_gravity; } - if (b) { + if (entry_animation_mode) { set_hero_animation(0x34, 0, (float)scale_game_frames(0xB)); { struct Hero *r = &hero; @@ -768,7 +778,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 7; clear_u64_value(&p->motion.rot_spring_vel); qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xF)); break; } @@ -780,7 +790,7 @@ int hero_set_state(int a, int b) { *(int *)&p->past_apex = 0; p->rise_fall_land_frames = 0; p->rise_fall_gravity = frame_time_sq * 100.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x2A, 0, (float)scale_game_frames(6)); break; } @@ -821,7 +831,7 @@ int hero_set_state(int a, int b) { p->unk4F0 = p->smoothed_ground_z; } p->item_select_blocked = 1; - if (b) { + if (entry_animation_mode) { if (frame_time * 3.5f < p->motion.flat_speed) { set_hero_animation(0x20, 0, (float)scale_game_frames(9)); } else { @@ -836,7 +846,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0xD; p->item_select_blocked = 1; p->rand_timer.range = 0x68; - if (b) + if (entry_animation_mode) set_hero_animation(0x21, 0, (float)scale_game_frames(6)); break; } @@ -845,7 +855,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(0x24, 0, (float)scale_game_frames(6)); break; } @@ -854,7 +864,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(0x25, 0, (float)scale_game_frames(6)); break; } @@ -863,7 +873,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xC)); break; } @@ -875,7 +885,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -887,7 +897,7 @@ int hero_set_state(int a, int b) { q->rand_timer.range = 0x68; q->state.step = 0; qcopy(&q->motion.velocity, &q->motion.resolved_velocity); - if (b) { + if (entry_animation_mode) { if (q->vehicle_mode == 3) { set_hero_animation(6, 0, (float)scale_game_frames(8)); return 1; @@ -913,7 +923,7 @@ int hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x13, 0, (float)animation_timing_value); } break; @@ -928,7 +938,7 @@ int hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.displacement); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x13, 0, (float)animation_timing); } break; @@ -960,7 +970,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; @@ -1173,7 +1184,7 @@ int hero_set_state(int a, int b) { u->unk4A6 = scale_game_frames(0x55); u->ledge_probe_cooldown = scale_game_frames(0x46); u->velocity_keys_active = 1; - if (pal_mode != 0) { + if (pal_mode != FALSE) { u->unk3D0 = scale_game_frames(0x22); } else { u->unk3D0 = scale_game_frames(0x23); @@ -1236,7 +1247,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; if (q->fall_start_distance == 0.0f) q->fall_start_distance = q->unk430 * 1.5f; - if (b) { + if (entry_animation_mode) { int s = q->state.current; if (s == 7) { set_hero_animation(7, 0, (float)scale_game_frames(5)); @@ -1326,7 +1337,7 @@ int hero_set_state(int a, int b) { update_hero_target_heading(8.0f, 1.0471976f, -1.0f); *(int *)&q->slam_descending = 0; q->items[0].timer = 0xA; - if (b) { + if (entry_animation_mode) { char *m; int n = scale_game_frames(0xB); if (q->state.prev == 0xB && scale_game_frames(0x2A) > q->state.prev_timer) @@ -1363,7 +1374,7 @@ int hero_set_state(int a, int b) { q->saved_item[0] = 0; update_hero_target_heading(14.0f, 0.5235988f, -1.0f); q->unkA7C = q->unkA7C == 0; - if (b) { + if (entry_animation_mode) { int n = scale_game_frames(0xA); if (q->moby->prev_seq == 0x1A) n = scale_game_frames(3); @@ -1378,7 +1389,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; if (((void *)q->items[0].moby) == 0) break; - if (b) { + if (entry_animation_mode) { set_hero_animation(0x67, 4, -1.0f); blend_moby_animation(((void *)q->items[0].moby), 3, 4, -1); } @@ -1409,7 +1420,7 @@ int hero_set_state(int a, int b) { r->attack_record = k; } update_hero_target_heading(5.0f, 0.7853982f, 0.7853982f); - if (b) { + if (entry_animation_mode) { char *m; int j = 0; int n; @@ -1440,7 +1451,7 @@ int hero_set_state(int a, int b) { } case HERO_STATE_ANIMATION_RECOVERY_WITH_JUMP_CANCEL: { struct Hero *q; - if (b) + if (entry_animation_mode) set_hero_animation(0x2C, 7, (float)scale_game_frames(9)); q = &hero; if (q->items[0].item_id == 0xA && ((char *)q->throw_target) != 0) { @@ -1459,7 +1470,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0xA; p->unk2284 = 0; p->ground_speed = frame_time * 9.0f; - if (b) { + if (entry_animation_mode) { char *m; HeroTableRow2C *e = &D_L03_0017BD28[p->attack_record]; int k = e->kind; @@ -1480,7 +1491,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->pushback_yaw = fast_add_rotations(p->motion.rot.f[2], 3.1415927f); p->ground_speed = frame_time * 9.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x29, 5, (float)scale_game_frames(8)); break; } @@ -1502,7 +1513,7 @@ int hero_set_state(int a, int b) { { struct Hero *q = &hero; q->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x10, 3, -3.0f); q->moby->anim_time = level03_hero_animation_blend_curves[q->anim_blend_curve] [(q->anim_blend_step)++]; @@ -1514,7 +1525,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) + if (entry_animation_mode) set_hero_animation(0, 0, (float)scale_game_frames(0xE)); break; } @@ -1522,7 +1533,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) { + if (entry_animation_mode) { set_hero_animation(4, 0, (float)scale_game_frames(7)); hero_queue_sequence(0xE, 0x22); } @@ -1533,7 +1544,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(6, 0, (float)scale_game_frames(0xC)); break; } @@ -1544,7 +1555,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(6, 0, (float)scale_game_frames(7)); break; } @@ -1561,7 +1572,7 @@ int hero_set_state(int a, int b) { if (frame_time * 1.5f < planar_speed) hero_base->ground_speed = frame_time * 1.5f; hero_base->unk3B8 = 0; - if (b) + if (entry_animation_mode) set_hero_animation(1, 0, (float)scale_game_frames(8)); } break; @@ -1571,7 +1582,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(3, 0, (float)scale_game_frames(0xC)); break; } @@ -1584,7 +1595,7 @@ int hero_set_state(int a, int b) { FUN_L00_0025f730(&p->motion.velocity, frame_time * 5.0f); hero_change_health(1); p->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (entry_animation_mode) { set_hero_animation(2, 3, -3.0f); p->moby->anim_time = level03_hero_animation_blend_curves[p->anim_blend_curve][(p->anim_blend_step)++]; @@ -1605,7 +1616,7 @@ int hero_set_state(int a, int b) { clear_u64_value(&p->motion.velocity); clear_u64_value(&p->motion.displacement); p->motion.velocity.f[2] = frame_time * 10.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x10, 2, -3.0f); break; } @@ -1657,7 +1668,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->tilt_disabled = 1; p->item_use_locked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(get_hero_idle_animation_index(0), 0, -1.0f); break; } @@ -1668,7 +1679,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->item_use_locked = 1; clear_u64_value(&p->motion.velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0xB, 0, -1.0f); break; } @@ -1692,7 +1703,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x18; p->item_use_locked = 1; cancel_hero_item_animation(); - if (b) + if (entry_animation_mode) set_hero_animation(get_hero_idle_animation_index(0), 0, -1.0f); break; } diff --git a/src/overlays/l03/hero/update_hero_motion_for_current_state.c b/src/overlays/l03/hero/update_hero_motion_for_current_state.c index 165641f969..a497c13e25 100644 --- a/src/overlays/l03/hero/update_hero_motion_for_current_state.c +++ b/src/overlays/l03/hero/update_hero_motion_for_current_state.c @@ -197,7 +197,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void clip_hero_horizontal_velocity(s32) __asm__("FUN_L01_00232978"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -225,7 +225,7 @@ extern void moby_point_position(struct MobyView *, s32, void *) __asm__("FUN_L00 extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L03_002030a0(f32, f32); @@ -276,7 +276,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L03_0017BEB8; extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); extern s32 is_moby_in_class_range_500_to_540(s32) __asm__("FUN_L00_0025e3b8"); @@ -442,10 +442,10 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -456,11 +456,11 @@ void update_hero_motion_for_current_state(void) { } else { clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -514,8 +514,9 @@ void update_hero_motion_for_current_state(void) { } else { s32 idx = hero.pack_swim_voice; if (idx != -1) { - struct VoiceSlot *e = (struct VoiceSlot *)(((u8 *)&voice_pool) + idx * 0x70); - if (e->pm88 == MV(hero.moby) && e->b74 != 0) { + struct VoiceSlot *swim_voice_slot = + (struct VoiceSlot *)(((u8 *)&voice_pool) + idx * 0x70); + if (swim_voice_slot->pm88 == MV(hero.moby) && swim_voice_slot->b74 != 0) { release_voice_slot(idx); } } @@ -769,7 +770,7 @@ void update_hero_motion_for_current_state(void) { &hero.motion.velocity, hero.ground_speed, hero.motion.rot.f[2], yaw); } else if (hero.state.current == 0x33) { f32 sp = hero.ground_speed * - FUN_L00_00209018(swim_animation_speed_scale_table, 0x1E) * 5.0f; + vector_length_xyz_cf(swim_animation_speed_scale_table, 0x1E) * 5.0f; if (hero.state.prev == 0x35 && scale_game_frames(15) > hero.state_timer) { if (sp < frame_time * 4.5f) { sp = frame_time * 4.5f; @@ -900,7 +901,7 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 4.0f, frame_time_sq * 5.0f); { f32 sp = hero.ground_speed * - FUN_L00_00209018(swim_animation_speed_scale_table, 0x1E) * 5.5f; + vector_length_xyz_cf(swim_animation_speed_scale_table, 0x1E) * 5.5f; hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[2] = 0.0f; @@ -932,11 +933,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && MV(hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -954,11 +956,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (MV(hero.grapple_target) != NULL) { hero.motion.move_yaw = @@ -1129,13 +1132,13 @@ void update_hero_motion_for_current_state(void) { if (vector_distance_xy(&hero.motion.pos, &MV(hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&motion_offset_or_position, &hero.motion.pos, &MV(hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1249,7 +1252,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1334,7 +1338,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1380,7 +1385,7 @@ void update_hero_motion_for_current_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1396,10 +1401,11 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1419,11 +1425,11 @@ void update_hero_motion_for_current_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { attack_spacing_offset = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { attack_spacing_offset = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1468,7 +1474,7 @@ void update_hero_motion_for_current_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || MV(hero.melee_target) != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1478,7 +1484,8 @@ void update_hero_motion_for_current_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1492,10 +1499,11 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -1609,11 +1617,12 @@ void update_hero_motion_for_current_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1724,11 +1733,12 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1964,7 +1974,7 @@ void update_hero_motion_for_current_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2001,7 +2011,8 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2018,7 +2029,8 @@ void update_hero_motion_for_current_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2062,7 +2074,7 @@ void update_hero_motion_for_current_state(void) { clip_hero_horizontal_velocity(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2078,9 +2090,9 @@ void update_hero_motion_for_current_state(void) { f32 sp; if (hero_slot_item_id(3) == 2) { if (hero.voice_slot4 != -1) { - struct VoiceSlot *e = + struct VoiceSlot *landing_voice_slot = (struct VoiceSlot *)(((u8 *)&voice_pool) + hero.voice_slot4 * 0x70); - if (e->pm88 == MV(hero.moby) && e->b74 != 0) { + if (landing_voice_slot->pm88 == MV(hero.moby) && landing_voice_slot->b74 != 0) { release_voice_slot(hero.voice_slot4); } } @@ -2088,9 +2100,10 @@ void update_hero_motion_for_current_state(void) { release_voice_slot_cf(3, MV(hero.moby), 2); } else { if (hero.unk2224 != -1) { - struct VoiceSlot *e = + struct VoiceSlot *alternate_landing_voice_slot = (struct VoiceSlot *)(((u8 *)&voice_pool) + hero.unk2224 * 0x70); - if (e->pm88 == MV(hero.moby) && e->b74 != 0) { + if (alternate_landing_voice_slot->pm88 == MV(hero.moby) && + alternate_landing_voice_slot->b74 != 0) { release_voice_slot(hero.unk2224); } } @@ -2107,7 +2120,7 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2211,7 +2224,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&spatial_scratch_or_hit_descriptor, &hero.motion.pos); - FUN_L00_00233810( + add_hero_up_offset( &spatial_scratch_or_hit_descriptor, &spatial_scratch_or_hit_descriptor, 0.5f); qcopy(&v10, &spatial_scratch_or_hit_descriptor); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; @@ -2247,7 +2260,7 @@ void update_hero_motion_for_current_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2294,7 +2307,7 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -2316,7 +2329,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = frame_time * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = frame_time * 0.9f; } } else { @@ -2327,29 +2340,30 @@ void update_hero_motion_for_current_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { clip_hero_horizontal_velocity(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2362,11 +2376,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -2384,18 +2399,19 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -2403,7 +2419,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -2432,11 +2449,12 @@ void update_hero_motion_for_current_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2451,10 +2469,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l03/hero/update_hero_state_machine.c b/src/overlays/l03/hero/update_hero_state_machine.c index 7367316230..d1620fa07d 100644 --- a/src/overlays/l03/hero/update_hero_state_machine.c +++ b/src/overlays/l03/hero/update_hero_state_machine.c @@ -168,9 +168,11 @@ void update_hero_state_machine(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && D_L03_0015F594 == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -232,7 +234,7 @@ void update_hero_state_machine(void) { } } if (hero_low_altitude_respawn_z_threshold > hero.motion.pos.f[2] && - hero.ground_distance > 2.0f && hero.vehicle_mode != 2 && + hero.ground_distance > 2.0f && hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { @@ -631,7 +633,7 @@ void update_hero_state_machine(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -658,7 +660,7 @@ void update_hero_state_machine(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); break; } @@ -914,7 +916,8 @@ void update_hero_state_machine(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -2034,7 +2037,7 @@ void update_hero_state_machine(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l03/level_class_tables.c b/src/overlays/l03/level_class_tables.c index 6531f9a699..5d21e4baa7 100644 --- a/src/overlays/l03/level_class_tables.c +++ b/src/overlays/l03/level_class_tables.c @@ -22,6 +22,9 @@ #include "rnc/overlay/shared/ui/hud/hud_keep_visible.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -57,7 +60,7 @@ void *D_L03_001E4114[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; struct MobyClassUpdate moby_classes[181] __asm__("D_L03_001E3880") diff --git a/src/overlays/l03/mobys/big_al.c b/src/overlays/l03/mobys/big_al.c index 90c6e448bd..1ab225a5a2 100644 --- a/src/overlays/l03/mobys/big_al.c +++ b/src/overlays/l03/mobys/big_al.c @@ -117,7 +117,7 @@ void big_al_update(struct Moby *guide_moby) { } } guide_moby->spawn_frame = *(u64 *)(D_001413D0_db558[0] + 0x38); - guide_moby->state = 1; + guide_moby->state = BIG_AL_UPDATE_DIALOGUE; initialize_npc_dialogue(guide_moby, (struct TalkState *)&v->talk); initialize_moby_grounding(guide_moby); if (D_0013D4C2[0] != 0) { @@ -154,7 +154,7 @@ void big_al_update(struct Moby *guide_moby) { } begin_dialogue_camera_transition(guide_moby, 2.7f); guide_moby->anim_speed = 0.0f; - guide_moby->state = 2; + guide_moby->state = BIG_AL_RESOLVE_DIALOGUE; } break; case BIG_AL_RESOLVE_DIALOGUE: @@ -174,7 +174,7 @@ void big_al_update(struct Moby *guide_moby) { jet_reset_camera(&l03_cuboids[v->warp].pos, &l03_cuboids[v->warp].rot); } } - guide_moby->state = 1; + guide_moby->state = BIG_AL_UPDATE_DIALOGUE; if (v->talk.mode != 2) { break; } diff --git a/src/overlays/l03/mobys/cutscene_effects.c b/src/overlays/l03/mobys/cutscene_effects.c index dfa3697aca..a2df76612f 100644 --- a/src/overlays/l03/mobys/cutscene_effects.c +++ b/src/overlays/l03/mobys/cutscene_effects.c @@ -37,7 +37,7 @@ void kerwan_cutscene_effects_update(struct Moby *owner_moby) { switch (owner_moby->state) { case CUTSCENE_EFFECTS_INITIALIZE: owner_moby->update_dist = 0xFF; - owner_moby->state = 1; + owner_moby->state = CUTSCENE_EFFECTS_UPDATE; break; case CUTSCENE_EFFECTS_UPDATE: if (D_L03_0015F5C4 != 2) diff --git a/src/overlays/l03/mobys/helga.c b/src/overlays/l03/mobys/helga.c index a203715488..81588f181c 100644 --- a/src/overlays/l03/mobys/helga.c +++ b/src/overlays/l03/mobys/helga.c @@ -166,7 +166,7 @@ void helga_update(struct Moby *helga_moby) { } } helga_moby->spawn_frame = *(u64 *)(D_001413D0[0] + 0x38); - helga_moby->state = 1; + helga_moby->state = HELGA_UPDATE_DIALOGUE; talk->script = helga_dialogue_script; helga_vars->talk.unk48 = 5; initialize_npc_dialogue(helga_moby, talk); @@ -175,7 +175,7 @@ void helga_update(struct Moby *helga_moby) { case HELGA_UPDATE_DIALOGUE: if (update_npc_dialogue(helga_moby, talk)) { begin_dialogue_camera_transition(helga_moby, 2.3f); - helga_moby->state = 2; + helga_moby->state = HELGA_RESOLVE_DIALOGUE; if (helga_vars->link != -1) { helper_moby = (struct Moby *)((helga_vars->link << 8) + (s32)D_L03_0015FFD8); if (helper_moby->oclass == 0x3F4) { @@ -205,7 +205,7 @@ void helga_update(struct Moby *helga_moby) { &l03_cuboids[helga_vars->talk.warp].rot); } } - helga_moby->state = 1; + helga_moby->state = HELGA_UPDATE_DIALOGUE; if (helga_vars->talk.mode == 2) { grant_inventory_item(0xC, 1); queue_dialogue_message(0xBC8, -1); diff --git a/src/overlays/l03/mobys/help_hints.c b/src/overlays/l03/mobys/help_hints.c index 8b5ea34ca4..717ba051f0 100644 --- a/src/overlays/l03/mobys/help_hints.c +++ b/src/overlays/l03/mobys/help_hints.c @@ -45,6 +45,9 @@ void help_hints_update(struct Moby *moby) { TUTORIAL_HINTS_INITIALIZE = 0, TUTORIAL_HINTS_UPDATE = 1 }; + enum { + HELP_PLAYBACK_IDLE = 0 + }; s32 *tutorial_hint_state = ((s32 *)moby->pvars); struct Moby *candidate_moby; s32 count; @@ -57,7 +60,7 @@ void help_hints_update(struct Moby *moby) { tutorial_hint_state[20] = 0; tutorial_hint_state[21] = 0; moby->update_dist = 0xFF; - moby->state = 1; + moby->state = TUTORIAL_HINTS_UPDATE; break; case TUTORIAL_HINTS_UPDATE: if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[30]) && @@ -67,19 +70,19 @@ void help_hints_update(struct Moby *moby) { if (alternate_item_available[0x1A] == 0) { if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[0]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - l03_help_message_playback_state.state == 0 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x14].level_mask >= 0) { help_request(0xBB8, 0x14); } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[3]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - l03_help_message_playback_state.state == 0 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x15].level_mask >= 0) { help_request(0xBB9, 0x15); } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[6]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - l03_help_message_playback_state.state == 0 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x17].level_mask >= 0) { help_request(0xBBB, 0x17); } @@ -109,13 +112,13 @@ void help_hints_update(struct Moby *moby) { usage_stats.stat[3].count == 0 && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && tutorial_hint_state[20] % 6 == 0 && tutorial_hint_state[20] != 0 && - l03_help_message_playback_state.state == 0 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x16].count == 0) { help_request(0xBBA, 0x16); } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[10]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - l03_help_message_playback_state.state == 0 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x18].count == 0) { scaled_time_value = scale_game_frames(D_0015EEA4) - usage_stats.stat[9].latest_time_bucket * 600; @@ -134,7 +137,7 @@ void help_hints_update(struct Moby *moby) { if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[15]) && count == 0 && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && hero.state.current != 0x1E && item_available[0xF] != 0 && get_ammo(0xF) >= 0x15 && - l03_help_message_playback_state.state == 0 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x4A].count == 0 && usage_stats.stat[19].count == 0) { help_request(0x4E20, 0x4A); @@ -151,26 +154,26 @@ void help_hints_update(struct Moby *moby) { } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[14]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - D_L03_0015F68C < 3 && l03_help_message_playback_state.state == 0 && + D_L03_0015F68C < 3 && l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x40].count == 0) { help_request(0x3EC, 0x40); } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[14]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && hero.state.current == HERO_STATE_LOOK && D_L03_0015F688 == -1 && - l03_help_message_playback_state.state == 0 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x40].count != 0 && help_records[0x41].count == 0) { help_request(0x3ED, 0x41); } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[16]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - l03_help_message_playback_state.state == 0 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x54].count == 0) { help_request(0xBC0, 0x54); } if (D_L03_0015F5C4 == 0 && item_available[0x34] != 0 && - l03_help_message_playback_state.state == 0 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x19].count == 0) { help_request(0xBBD, 0x19); } @@ -191,7 +194,8 @@ void help_hints_update(struct Moby *moby) { } if (usage_stats.stat[15].count == 0 && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - tutorial_hint_state[21] >= 3 && l03_help_message_playback_state.state == 0 && + tutorial_hint_state[21] >= 3 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x1A].count == 0) { help_request(0xBBE, 0x1A); } @@ -206,13 +210,14 @@ void help_hints_update(struct Moby *moby) { } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[11]) && usage_stats.stat[16].count == 0 && hero.state.control_mode == 6 && - hero.items[0].item_id == 8 && l03_help_message_playback_state.state == 0 && + hero.items[0].item_id == 8 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x1B].count == 0) { help_request(0xBBF, 0x1B); } if (is_point_inside_clip_volume(&hero.motion.pos, tutorial_hint_state[17]) && ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9) && - l03_help_message_playback_state.state == 0 && + l03_help_message_playback_state.state == HELP_PLAYBACK_IDLE && l03_help_message_playback_state.cur == -1 && help_records[0x79].count == 0) { help_request(0x4E2F, 0x79); } diff --git a/src/overlays/l03/mobys/homing_rocket.c b/src/overlays/l03/mobys/homing_rocket.c index 1a0c775ec7..34d5266b9f 100644 --- a/src/overlays/l03/mobys/homing_rocket.c +++ b/src/overlays/l03/mobys/homing_rocket.c @@ -185,10 +185,10 @@ void homing_rocket_update(struct Moby *rocket_moby) { hit.oclass = rocket_moby->oclass; record_moby_hit(level[6], &hit); } - rocket_moby->state = 2; + rocket_moby->state = ROCKET_BURST_AND_REMOVE; } if (fast_dec_timer(&rocket_vars->timer) != 0) { - rocket_moby->state = 2; + rocket_moby->state = ROCKET_BURST_AND_REMOVE; } break; case ROCKET_BURST_AND_REMOVE: diff --git a/src/overlays/l03/mobys/kerwan_path_enemy.c b/src/overlays/l03/mobys/kerwan_path_enemy.c index b1a6395cfe..a0e6ad1fbc 100644 --- a/src/overlays/l03/mobys/kerwan_path_enemy.c +++ b/src/overlays/l03/mobys/kerwan_path_enemy.c @@ -22,6 +22,24 @@ #include "rnc/overlay/l03/mobys/homing_rocket.h" #include "rnc/overlay/l03/mobys/robot_dog.h" +enum { + ENEMY_INITIALIZE = 0, + ENEMY_WAIT_FOR_ACTIVATION = 1, + ENEMY_WAIT_FOR_LINKED_MOBY = 2, + ENEMY_PROJECTILE_ATTACK_WINDUP = 4, + ENEMY_PROJECTILE_ATTACK = 5, + ENEMY_MELEE_ATTACK = 6, + ENEMY_MOVE_TO_PATH_NODE = 7, + ENEMY_FOLLOW_PATH_TO_END = 8, + ENEMY_FOLLOW_ALTERNATE_PATH = 0x9, + ENEMY_KNOCKBACK_RECOVERY = 10, + ENEMY_FALL_UNDER_GRAVITY = 11, + ENEMY_TURN_TO_HEADING = 0xC, + ENEMY_DEATH_KNOCKBACK = 13, + ENEMY_HIDDEN_AT_PATH_START = 14, + ENEMY_RESPAWN_AT_PATH_START = 15 +}; + extern void blend_moby_animation(void *, int, int, int) __asm__("FUN_00212f90"); /* Ported from rac1-decomp (src/overlays/l03_kerwan/vendor_00293720.c: func_L03_002C81E0), where it is exact; names translated to the US level program. */ @@ -72,7 +90,7 @@ int try_start_kerwan_path_enemy_heading_turn(float desired_heading, } enemy_pvars->unk28C = desired_heading; previous_state = moby->state; - moby->state = 0xC; + moby->state = ENEMY_TURN_TO_HEADING; moby->command = previous_state; return 1; } @@ -263,7 +281,7 @@ extern Moby2C8398 *D_L03_0015FFD8_m __asm__("D_L03_0015FFD8"); int D_L03_001618F4_i __asm__("D_L03_001618F4") = 0; extern int coll_sphere(float, void *, int, void *) __asm__("FUN_L00_001f0d60"); extern int is_value_within_interpolated_window(char *, float) __asm__("FUN_00214cc8"); -extern int FUN_L00_0025df68_cf(char *m, char *p, float *pos, char *v) __asm__("FUN_L00_00259028"); +extern int step_mover_2e3f20(char *m, char *p, float *pos, char *v) __asm__("FUN_L00_00259028"); extern int fast_subtract_rotations_cf(void *) __asm__("FUN_L00_001fefc8"); extern int probe_ground_height_cf(int unused, char *m, char *a, void *b, char *c, void *d) __asm__("FUN_L00_00260400"); extern short D_L03_001618F4 __attribute__((sda)); @@ -363,7 +381,7 @@ int is_kerwan_path_enemy_in_state_9(struct Moby *moby) __asm__("FUN_L03_002c6d58 int is_kerwan_path_enemy_in_state_9(struct Moby *moby) { if (moby && moby->state != 0xFE && moby->state != 0xFD && moby->oclass == 0x23e && - moby->state == 0x9) { + moby->state == ENEMY_FOLLOW_ALTERNATE_PATH) { return 1; } return 0; @@ -373,23 +391,6 @@ void kerwan_path_enemy_update(Moby2C8398 *m) __asm__("FUN_L03_002c6fd0"); /* Moby class 574 */ void kerwan_path_enemy_update(Moby2C8398 *m) { - enum { - ENEMY_INITIALIZE = 0, - ENEMY_WAIT_FOR_ACTIVATION = 1, - ENEMY_WAIT_FOR_LINKED_MOBY = 2, - ENEMY_PROJECTILE_ATTACK_WINDUP = 4, - ENEMY_PROJECTILE_ATTACK = 5, - ENEMY_MELEE_ATTACK = 6, - ENEMY_MOVE_TO_PATH_NODE = 7, - ENEMY_FOLLOW_PATH_TO_END = 8, - ENEMY_FOLLOW_ALTERNATE_PATH = 9, - ENEMY_KNOCKBACK_RECOVERY = 10, - ENEMY_FALL_UNDER_GRAVITY = 11, - ENEMY_TURN_TO_HEADING = 12, - ENEMY_DEATH_KNOCKBACK = 13, - ENEMY_HIDDEN_AT_PATH_START = 14, - ENEMY_RESPAWN_AT_PATH_START = 15 - }; enum { ENEMY_ANIM_LOCOMOTION = 1, ENEMY_ANIM_HEADING_TURN = 9 @@ -410,21 +411,22 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { } if (D_L03_0015F5C4 == 2) { m->flags |= 0x41; - } else if (m->state != 0xE) { + } else if (m->state != ENEMY_HIDDEN_AT_PATH_START) { m->flags &= 0xFFBE; } if (m->pos[0] < 2.0f || 1021.0f < m->pos[0] || m->pos[1] < 2.0f || 1021.0f < m->pos[1] || - m->pos[2] < 2.0f || 1021.0f < m->pos[2] || (moby_data->pf.id == -1 && m->state != 0xD)) { + m->pos[2] < 2.0f || 1021.0f < m->pos[2] || + (moby_data->pf.id == -1 && m->state != ENEMY_DEATH_KNOCKBACK)) { mark_moby_for_removal(m); return; } FUN_L00_001fefc8_cf(m); fast_subtract_rotations_cf(&moby_data->b263); if (m->b31 != 0 || target_distance < 24.0f) { - if (m->state == 0xC) { + if (m->state == ENEMY_TURN_TO_HEADING) { moby_data->look0.f68 = fast_subtract_rotations(moby_data->f28C, m->rot[2]) * 0.25f; moby_data->look1.f68 = fast_subtract_rotations(moby_data->f28C, m->rot[2]) * 0.75f; - } else if (m->state < 7 && target_distance < moby_data->f270) { + } else if (m->state < ENEMY_MOVE_TO_PATH_NODE && target_distance < moby_data->f270) { moby_data->look1.f68 = fast_subtract_rotations(fast_arc_tan(selected_target.pos[0] - m->pos[0], selected_target.pos[1] - m->pos[1]), @@ -479,7 +481,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { moby_data->pf.path = np; qcopy(m->pos, np + 0x10); } - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; moby_data->s288 = m->s32; moby_data->s28A = D_L03_001618F4 & 7; D_L03_001618F4_i++; @@ -496,7 +498,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { } if (moby_data->i284 != -1 && moby_data->i290 == -1) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); - m->state = 2; + m->state = ENEMY_WAIT_FOR_LINKED_MOBY; } break; case ENEMY_WAIT_FOR_ACTIVATION: @@ -514,14 +516,14 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { (target_distance < moby_data->f294 && absolute_float(selected_target.pos[2] - m->pos[2]) < 4.0f)) { moby_data->i298 = 0; - m->state = 9; + m->state = ENEMY_FOLLOW_ALTERNATE_PATH; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } } } else if (moby_data->i284 != -1) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); - m->state = 2; + m->state = ENEMY_WAIT_FOR_LINKED_MOBY; } else { if (target_distance < moby_data->f270 || target_distance < moby_data->f27C) { if (try_start_kerwan_path_enemy_heading_turn( @@ -536,14 +538,14 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { absolute_float(selected_target.pos[2] - m->pos[2]) < 4.0f) { moby_data->f27C = 0.0f; moby_data->s256 = 1; - m->state = 8; + m->state = ENEMY_FOLLOW_PATH_TO_END; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } } if (target_distance < 3.5f && absolute_float(selected_target.pos[2] - m->pos[2]) < 3.0f) { - m->state = 6; + m->state = ENEMY_MELEE_ATTACK; if (m->anim != 2) { blend_moby_animation(m, 2, 0, scale_game_frames(10)); } @@ -555,7 +557,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { fast_arc_tan(selected_target.pos[0] - m->pos[0], selected_target.pos[1] - m->pos[1])) < 0.7853982f) { if (m->b31 != 0) { - m->state = 4; + m->state = ENEMY_PROJECTILE_ATTACK_WINDUP; if (m->anim != 3) { blend_moby_animation(m, 3, 0, scale_game_frames(10)); } @@ -573,7 +575,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { { Moby2C8398 *o = &D_L03_0015FFD8_m[moby_data->i284]; if (o == 0 || o->state == 0xFE || o->state == 0xFD || (m->b52 == 0xA && (m->b70 & 2))) { - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; blend_moby_animation(m, 0, 0, scale_game_frames(10)); moby_data->s250 = scale_game_frames(0x3C); moby_data->i284 = -1; @@ -588,14 +590,14 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { break; case ENEMY_PROJECTILE_ATTACK_WINDUP: if (m->b70 & 2) { - m->state = 5; + m->state = ENEMY_PROJECTILE_ATTACK; moby_data->b254 = 0; if (m->anim != 4) { blend_moby_animation(m, 4, 0, 0); } } else if (target_distance < 3.5f && absolute_float(selected_target.pos[2] - m->pos[2]) < 3.0f) { - m->state = 6; + m->state = ENEMY_MELEE_ATTACK; if (m->anim != 2) { blend_moby_animation(m, 2, 0, scale_game_frames(10)); } @@ -605,14 +607,14 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { Data2C8398 *d2 = m->data; if (d2->pf.idx < *(int *)d2->pf.path - 1) { d2->pf.idx++; - m->state = 7; + m->state = ENEMY_MOVE_TO_PATH_NODE; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } } } else { is_value_within_interpolated_window_cf(m); - m->state = 7; + m->state = ENEMY_MOVE_TO_PATH_NODE; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } @@ -658,7 +660,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { if (target_distance < moby_data->f27C && absolute_float(selected_target.pos[2] - m->pos[2]) < 4.0f) { moby_data->f27C = 0.0f; - m->state = 8; + m->state = ENEMY_FOLLOW_PATH_TO_END; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } @@ -682,7 +684,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { } if (target_distance < 3.5f && absolute_float(selected_target.pos[2] - m->pos[2]) < 3.0f) { - m->state = 6; + m->state = ENEMY_MELEE_ATTACK; if (m->anim != 2) { blend_moby_animation(m, 2, 0, scale_game_frames(10)); } @@ -696,7 +698,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { (char *)&selected_target)) { break; } - m->state = 6; + m->state = ENEMY_MELEE_ATTACK; if (m->anim != 2) { blend_moby_animation(m, 2, 0, scale_game_frames(10)); } @@ -706,14 +708,14 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { Data2C8398 *d2 = m->data; if (d2->pf.idx < *(int *)d2->pf.path - 1) { d2->pf.idx++; - m->state = 7; + m->state = ENEMY_MOVE_TO_PATH_NODE; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } } } else { is_value_within_interpolated_window_cf(m); - m->state = 7; + m->state = ENEMY_MOVE_TO_PATH_NODE; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } @@ -758,12 +760,12 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { Data2C8398 *d2 = m->data; if (d2->pf.idx < *(int *)d2->pf.path - 1) { d2->pf.idx++; - m->state = 7; + m->state = ENEMY_MOVE_TO_PATH_NODE; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } } else { - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; if (m->anim != 0) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); } @@ -775,7 +777,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { } } else { is_value_within_interpolated_window_cf(m); - m->state = 7; + m->state = ENEMY_MOVE_TO_PATH_NODE; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } @@ -787,7 +789,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { case ENEMY_MOVE_TO_PATH_NODE: { PathF2C8398 *pf = &moby_data->pf; if (moby_data->s256 != 0) { - m->state = 8; + m->state = ENEMY_FOLLOW_PATH_TO_END; break; } { @@ -800,10 +802,10 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { break; } } - if (!(FUN_L00_0025df68_cf((char *)m, - (char *)&moby_data->mv, - (float *)(pf->path + 0x10 + pf->idx * 0x10), - (char *)moby_data->v40) & + if (!(step_mover_2e3f20((char *)m, + (char *)&moby_data->mv, + (float *)(pf->path + 0x10 + pf->idx * 0x10), + (char *)moby_data->v40) & 0x14)) { break; } @@ -813,12 +815,12 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { Data2C8398 *d2 = m->data; if (d2->pf.idx < *(int *)d2->pf.path - 1) { d2->pf.idx++; - m->state = 7; + m->state = ENEMY_MOVE_TO_PATH_NODE; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } } else { - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; if (m->anim != 0) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); } @@ -830,13 +832,13 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { } } else { is_value_within_interpolated_window_cf(m); - m->state = 7; + m->state = ENEMY_MOVE_TO_PATH_NODE; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } } } else { - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; if (m->anim != 0) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); } @@ -858,17 +860,17 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { if (pf->idx < seg) { pf->idx = seg; } - if (!(FUN_L00_0025df68_cf((char *)m, - (char *)&moby_data->mv, - (float *)(pf->path + 0x10 + pf->idx * 0x10), - (char *)moby_data->v40) & + if (!(step_mover_2e3f20((char *)m, + (char *)&moby_data->mv, + (float *)(pf->path + 0x10 + pf->idx * 0x10), + (char *)moby_data->v40) & 0x14)) { break; } if (pf->idx < *(int *)pf->path - 1) { pf->idx++; } else { - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; if (m->anim != 0) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); } @@ -891,10 +893,10 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { if (moby_data->i298 < seg) { moby_data->i298 = seg; } - if (!(FUN_L00_0025df68_cf((char *)m, - (char *)&moby_data->mv, - (float *)(path + 0x10 + moby_data->i298 * 0x10), - (char *)moby_data->v40) & + if (!(step_mover_2e3f20((char *)m, + (char *)&moby_data->mv, + (float *)(path + 0x10 + moby_data->i298 * 0x10), + (char *)moby_data->v40) & 0x14)) { break; } @@ -902,13 +904,13 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { moby_data->i298++; } else { moby_data->i290 = -1; - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; if (m->anim != 0) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); } if (moby_data->i284 != -1) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); - m->state = 2; + m->state = ENEMY_WAIT_FOR_LINKED_MOBY; } else { try_start_kerwan_path_enemy_heading_turn( fast_arc_tan(selected_target.pos[0] - m->pos[0], @@ -935,12 +937,12 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { Data2C8398 *d2 = m->data; if (d2->pf.idx < *(int *)d2->pf.path - 1) { d2->pf.idx++; - m->state = 7; + m->state = ENEMY_MOVE_TO_PATH_NODE; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } } else { - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; if (m->anim != 0) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); } @@ -952,7 +954,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { } } else { is_value_within_interpolated_window_cf(m); - m->state = 7; + m->state = ENEMY_MOVE_TO_PATH_NODE; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } @@ -1018,7 +1020,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { *(OvlQuad *)m->pos = *(OvlQuad *)(moby_data->pf.path + 0x10); clear_u64_value(moby_data->v40); moby_data->mv.f18 = 0.0f; - m->state = 0xE; + m->state = ENEMY_HIDDEN_AT_PATH_START; m->flags |= 0x41; m->i94 = 0; return; @@ -1030,7 +1032,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { if (g + 5.0f < m->pos[2]) { allocate_voice_for_target_entry(0xA, 0x21, (int)m); blend_moby_animation(m, 0xB, 0, scale_game_frames(10)); - m->state = 0xB; + m->state = ENEMY_FALL_UNDER_GRAVITY; } break; } @@ -1123,7 +1125,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { *(OvlQuad *)m->pos = *(OvlQuad *)(moby_data->pf.path + 0x10); clear_u64_value(moby_data->v40); moby_data->mv.f18 = 0.0f; - m->state = 0xE; + m->state = ENEMY_HIDDEN_AT_PATH_START; m->flags |= 0x41; m->i94 = 0; return; @@ -1147,7 +1149,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { } m->f58 = 1.0f; } else { - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; if (m->anim != 0) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); } @@ -1168,7 +1170,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } } else { - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; if (m->anim != 0) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); } @@ -1252,7 +1254,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { *(OvlQuad *)m->pos = *(OvlQuad *)(moby_data->pf.path + 0x10); clear_u64_value(moby_data->v40); moby_data->mv.f18 = 0.0f; - m->state = 0xE; + m->state = ENEMY_HIDDEN_AT_PATH_START; m->flags |= 0x41; m->i94 = 0; return; @@ -1267,7 +1269,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { *(OvlQuad *)m->pos = *(OvlQuad *)(moby_data->pf.path + 0x10); clear_u64_value(moby_data->v40); moby_data->mv.f18 = 0.0f; - m->state = 0xE; + m->state = ENEMY_HIDDEN_AT_PATH_START; m->flags |= 0x41; m->i94 = 0; return; @@ -1294,7 +1296,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { m->flags = (m->flags & 0xFFBE) | 0x1000; moby_data->f20 = convert_integer_to_float(moby_data->s24); qcopy(m->pos, moby_data->pf.path + 0x10); - m->state = 1; + m->state = ENEMY_WAIT_FOR_ACTIVATION; break; } if (m->b31 != 0) { @@ -1342,9 +1344,9 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { m->rot[2] = transformed_rotation[2]; } } - if (!(m->state >= 0xB && m->state <= 0xE)) { + if (!(m->state >= ENEMY_FALL_UNDER_GRAVITY && m->state <= ENEMY_HIDDEN_AT_PATH_START)) { float g; - if (m->state == 0xA) { + if (m->state == ENEMY_KNOCKBACK_RECOVERY) { moby_data->mv.f18 = 0.0f; } else { moby_data->mv.f18 = moby_data->mv.f18 + frame_time_sq * 9.8f; @@ -1373,7 +1375,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { } } else if (g + 5.0f < m->pos[2]) { blend_moby_animation(m, 0xB, 0, scale_game_frames(10)); - m->state = 0xB; + m->state = ENEMY_FALL_UNDER_GRAVITY; clear_u64_value(&moby_data->q); moby_data->q.f8 = -moby_data->mv.f18; moby_data->q.f10 = frame_time_sq * 19.6f; @@ -1447,7 +1449,7 @@ void kerwan_path_enemy_update(Moby2C8398 *m) { *(OvlQuad *)m->pos = *(OvlQuad *)(pf->path + 0x10); clear_u64_value(moby_data->v40); moby_data->mv.f18 = 0.0f; - m->state = 0xE; + m->state = ENEMY_HIDDEN_AT_PATH_START; m->flags |= 0x41; m->i94 = 0; } @@ -1488,6 +1490,9 @@ void update_kerwan_path_enemy_hit_reaction(Moby2C8398 *moby) { NO_KNOCKBACK_HIT_RESPONSE = 12, ZERO_DAMAGE_NO_KNOCKBACK_RESPONSE = 13 }; + enum { + HIT_REACTION_SUPPRESSED = 1 + }; float hit_knockback_vector[4]; int kind; float damage; @@ -1511,7 +1516,7 @@ void update_kerwan_path_enemy_hit_reaction(Moby2C8398 *moby) { hit = find_moby_hit(moby, 0x330000, 0); hit_response_code = resolve_moby_hit_response(moby, hit, &moby_data->f20, 0, &kind, &damage, 0, 4); - if (hit != 0 && kind != 1 && moby->state != 0xD) { + if (hit != 0 && kind != HIT_REACTION_SUPPRESSED && moby->state != ENEMY_DEATH_KNOCKBACK) { hit_record_source_moby = *(char **)(hit + 0x20); if (hit_record_source_moby != 0) { if (hit_record_source_moby != (char *)hero.items[0].moby) { @@ -1557,7 +1562,7 @@ void update_kerwan_path_enemy_hit_reaction(Moby2C8398 *moby) { set_moby_animation(moby, 5, 5); moby_data->q.f50 = 14.0f; moby_data->q.f54 = 28.0f; - moby->state = 10; + moby->state = ENEMY_KNOCKBACK_RECOVERY; allocate_voice_for_target_entry(1, 0, (int)moby); break; case KNOCKBACK_WITHOUT_FACING_CHANGE_RESPONSE: @@ -1581,7 +1586,7 @@ void update_kerwan_path_enemy_hit_reaction(Moby2C8398 *moby) { trooper_start_knockback(angle, moby, (char *)moby_data + 0x70, 5, 5, 0); moby_data->q.f50 = 6.0f; moby_data->q.f54 = 13.0f; - moby->state = 10; + moby->state = ENEMY_KNOCKBACK_RECOVERY; allocate_voice_for_target_entry(1, 0, (int)moby); break; case ALTERNATE_ANIMATION_KNOCKBACK_RESPONSE: @@ -1604,7 +1609,7 @@ void update_kerwan_path_enemy_hit_reaction(Moby2C8398 *moby) { trooper_start_knockback(angle, moby, (char *)moby_data + 0x70, 6, 5, 2); moby_data->q.f50 = 5.0f; moby_data->q.f54 = 10.0f; - moby->state = 10; + moby->state = ENEMY_KNOCKBACK_RECOVERY; allocate_voice_for_target_entry(1, 0, (int)moby); break; case DEATH_KNOCKBACK_RESPONSE: @@ -1628,7 +1633,7 @@ void update_kerwan_path_enemy_hit_reaction(Moby2C8398 *moby) { moby_data->b255 = 0; moby->flags &= 0xEFFF; moby_data->b67 = 0xFA; - moby->state = 0xD; + moby->state = ENEMY_DEATH_KNOCKBACK; allocate_voice_for_target_entry(3, 0, (int)moby); if (moby->anim != 7) { blend_moby_animation(moby, 7, 0, scale_game_frames(6)); diff --git a/src/overlays/l03/mobys/lightpost.c b/src/overlays/l03/mobys/lightpost.c index 849bb4a9fd..522320a1a9 100644 --- a/src/overlays/l03/mobys/lightpost.c +++ b/src/overlays/l03/mobys/lightpost.c @@ -25,13 +25,13 @@ void lightpost_update(struct Moby *lightpost_moby) { char *hit_result = find_moby_hit(lightpost_moby, 0x10000, 0); switch (lightpost_moby->state) { case LIGHTPOST_INITIALIZE: - lightpost_moby->state = 1; + lightpost_moby->state = LIGHTPOST_WAIT_FOR_HIT; break; case LIGHTPOST_WAIT_FOR_HIT: if (hit_result != 0 && *(float *)(hit_result + 0x2C) > 0.0f) hit = 1; if (hit) - lightpost_moby->state = 2; + lightpost_moby->state = LIGHTPOST_REMOVE; break; case LIGHTPOST_REMOVE: allocate_voice_for_target_entry(0, 0, (int)lightpost_moby); diff --git a/src/overlays/l03/mobys/metropolis_train_carriage.c b/src/overlays/l03/mobys/metropolis_train_carriage.c index 8aab7dd5fe..4d6827e96e 100644 --- a/src/overlays/l03/mobys/metropolis_train_carriage.c +++ b/src/overlays/l03/mobys/metropolis_train_carriage.c @@ -33,6 +33,9 @@ typedef struct MetropolisTrainCarriageVars { /* Moby class 1210 */ void metropolis_train_carriage_update(struct Moby *moby) { + enum { + METROPOLIS_TRAIN_CARRIAGE_STATE_INITIALIZE = 0 + }; float position_delta[4]; float joint_zero_world_position[4]; MetropolisTrainCarriageVars *carriage_pvars; @@ -46,7 +49,7 @@ void metropolis_train_carriage_update(struct Moby *moby) { previous_position = &carriage_pvars->unkA0; previous_rotation = &carriage_pvars->unkB0; current_rotation = &moby->rot; - if (moby->state == 0) { + if (moby->state == METROPOLIS_TRAIN_CARRIAGE_STATE_INITIALIZE) { carriage_pvars->unk60 = 0; carriage_pvars->unk64 = 0; carriage_pvars->unk68 = 4; diff --git a/src/overlays/l03/mobys/metropolis_train_locomotive.c b/src/overlays/l03/mobys/metropolis_train_locomotive.c index 1b9ea52cf2..20cc1d1ed6 100644 --- a/src/overlays/l03/mobys/metropolis_train_locomotive.c +++ b/src/overlays/l03/mobys/metropolis_train_locomotive.c @@ -101,7 +101,7 @@ void place_metropolis_train(struct Moby *moby, float *pos, float heading) { } extern char *D_L03_0015FFD8_292890 __asm__("D_L03_0015FFD8"); -extern char D_L03_001E2410[]; +extern char l03_train_engine_no_cars_warning_format[] __asm__("D_L03_001E2410"); extern float spring_turn(float *vel, float cur, float target, float k, float d, float max) __asm__("FUN_L00_00258110"); extern void debug_print(void *, int) __asm__("FUN_001e93b0"); extern void gunship_update(char *) __asm__("FUN_L01_002f5168"); @@ -240,7 +240,7 @@ void update_metropolis_train_motion(char *moby) { fast_vec_sub(delta, moby + 0x10, old_pos); update_entity_matrix(locomotive_state->motion, delta, old_rot, moby + 0x40); } else { - debug_print(D_L03_001E2410, locomotive_state->iB8); + debug_print(l03_train_engine_no_cars_warning_format, locomotive_state->iB8); mark_moby_for_removal(moby); return; } @@ -290,7 +290,7 @@ void update_metropolis_train_idle_motion(struct Moby *moby) { fast_vec_sub(dp, &moby->pos, old_pos); update_entity_matrix(motion, dp, old_rot, &moby->rot); } else { - debug_print(D_L03_001E2410, *(int *)(locomotive_pvars + 0xB8)); + debug_print(l03_train_engine_no_cars_warning_format, *(int *)(locomotive_pvars + 0xB8)); mark_moby_for_removal(moby); return; } diff --git a/src/overlays/l03/mobys/mine.c b/src/overlays/l03/mobys/mine.c index 06a9564cf9..8eceefff5b 100644 --- a/src/overlays/l03/mobys/mine.c +++ b/src/overlays/l03/mobys/mine.c @@ -66,6 +66,9 @@ void mine_layer_mine_update(struct Moby *mine_moby) { MINE_DEBRIS_RANDOM_PALETTE_COLOR = 2, MINE_DEBRIS_SPHERICAL_VELOCITY = 3 }; + enum { + MOBY_STATE_MARKED_FOR_REMOVAL = 0xFE + }; MineBlast blast = l03_mine_camera_blast_template; MineVec vector_scratch; MineVars *mine_vars = (MineVars *)mine_moby->pvars; @@ -83,7 +86,7 @@ void mine_layer_mine_update(struct Moby *mine_moby) { break; case MINE_FALL_UNTIL_LANDING: if (step_moby_motion(mine_moby, mine_vars) & 1) { - mine_moby->state = 3; + mine_moby->state = MINE_ARM_AND_MONITOR_PROXIMITY; if (mine_moby->prev_seq != 1) { blend_moby_animation(mine_moby, 1, 0, scale_game_frames(10)); } @@ -106,20 +109,21 @@ void mine_layer_mine_update(struct Moby *mine_moby) { case MINE_ARM_AND_MONITOR_PROXIMITY: fast_dec_timer(&mine_vars->timer); target_moby = mine_vars->target; - if (target_moby != 0 && target_moby->state != 0xFE && target_moby->state != 0xFD && + if (target_moby != 0 && target_moby->state != MOBY_STATE_MARKED_FOR_REMOVAL && + target_moby->state != 0xFD && vector_distance_xy(&mine_moby->pos, &target_moby->pos) < 3.0f && mine_vars->timer == 0) { - mine_moby->state = 2; + mine_moby->state = MINE_HOME_ON_TARGET; allocate_voice_for_target_entry(2, 0, mine_moby); } if (scale_game_frames(3600) < mine_vars->age && (mine_vars->target == 0 || mine_vars->target->state == 0xFE || mine_vars->target->state == 0xFD || scale_game_frames(5400) < mine_vars->age)) { - mine_moby->state = 5; + mine_moby->state = MINE_SHRINK_AND_REMOVE; } if (vector_distance_xy(&hero.moby->pos, &mine_moby->pos) < 0.5f && absolute_float(mine_moby->pos.z - hero.motion.pos.f[2]) < 0.25f) { - mine_moby->state = 4; + mine_moby->state = MINE_EXPLODE_AND_REMOVE; break; } nearby_moby_count = collect_mobies_in_sphere(&mine_moby->pos, 0x10, mine_moby, 0, 1.0f); @@ -128,7 +132,7 @@ void mine_layer_mine_update(struct Moby *mine_moby) { if ((nearby_moby->flags & 0x1000) && (nearby_moby != mine_vars->target || mine_vars->timer == 0)) { - mine_moby->state = 4; + mine_moby->state = MINE_EXPLODE_AND_REMOVE; break; } } @@ -170,7 +174,8 @@ void mine_layer_mine_update(struct Moby *mine_moby) { debris_vector_scratch[2] = random_float_between(frame_time * 4.0f, vector_scratch[kind]); *(OvlQuad *)debris_velocity = *(OvlQuad *)debris_vector_scratch; - rr = random_float_between(0.0f, kind == 1 ? 0.5f : 0.25f); + rr = random_float_between(0.0f, + kind == MINE_DEBRIS_WIDE_SPAWN_RADIUS ? 0.5f : 0.25f); debris_azimuth = random_angle_radians(); debris_vector_scratch[0] = fast_cos(debris_azimuth) * rr; debris_vector_scratch[1] = fast_sin(debris_azimuth) * rr; diff --git a/src/overlays/l03/mobys/mine_layer.c b/src/overlays/l03/mobys/mine_layer.c index 111212c9ab..e099e9f6ff 100644 --- a/src/overlays/l03/mobys/mine_layer.c +++ b/src/overlays/l03/mobys/mine_layer.c @@ -15,6 +15,15 @@ #include "rnc/overlay/l03/mobys/mine_layer_globals.h" /* Patrol state of the l03 trooper: walks back and forth along a rail path. */ +enum { + MINE_LAYER_INITIALIZE = 0, + MINE_LAYER_FACE_TARGET_AND_WAIT_FOR_RANGE = 1, + MINE_LAYER_WAIT_FOR_ANIMATION_BEFORE_PATROL = 2, + MINE_LAYER_PATROL_AND_FIRE = 3, + MINE_LAYER_KNOCKBACK_AND_RECOVER = 4, + MINE_LAYER_KNOCKBACK_UNTIL_EXPLOSION = 5 +}; + typedef struct { s32 idx; /* 0x00: path point it is walking to */ s8 dir; /* 0x04: +1 or -1 */ @@ -92,7 +101,7 @@ char *spawn_mine_layer_projectile(char *p, void *pos, float *dir) __asm__( extern void FUN_L01_0026d930(void *); extern void blend_moby_animation(struct Moby *, int, int, int) __asm__("FUN_00212f90"); extern void FUN_L00_00258278(f32, f32, f32, f32, struct Moby *, void *); -extern void FUN_L00_00259028(struct Moby *, void *, void *, void *); +extern void step_mover_2e3f20(struct Moby *, void *, void *, void *) __asm__("FUN_L00_00259028"); extern void trooper_play_sound(int, int, struct Moby *, int) __asm__("FUN_L00_0028dc90"); extern int step_moby_motion(struct Moby *, void *) __asm__("FUN_L00_0025c698"); extern void spawn_explosion(struct Moby *, @@ -124,14 +133,6 @@ void mine_layer_update(struct Moby *m) __asm__("FUN_L03_002c9eb8"); /* Moby class 578 */ void mine_layer_update(struct Moby *mine_layer_moby) { - enum { - MINE_LAYER_INITIALIZE = 0, - MINE_LAYER_FACE_TARGET_AND_WAIT_FOR_RANGE = 1, - MINE_LAYER_WAIT_FOR_ANIMATION_BEFORE_PATROL = 2, - MINE_LAYER_PATROL_AND_FIRE = 3, - MINE_LAYER_KNOCKBACK_AND_RECOVER = 4, - MINE_LAYER_KNOCKBACK_UNTIL_EXPLOSION = 5 - }; TrooperVars *mine_layer_vars = (TrooperVars *)mine_layer_moby->pvars; TrooperPatrol *pt; LevelPath *path; @@ -176,7 +177,7 @@ void mine_layer_update(struct Moby *mine_layer_moby) { qcopy(&mine_layer_moby->pos, &path->points[0]); mine_layer_vars->patrol.idx = 1; mine_layer_moby->scale *= mine_layer_initial_scale_multiplier_gp; - mine_layer_moby->state = 1; + mine_layer_moby->state = MINE_LAYER_FACE_TARGET_AND_WAIT_FOR_RANGE; if (mine_layer_moby->prev_seq != 0) { blend_moby_animation(mine_layer_moby, 0, 0, 0); } @@ -191,7 +192,7 @@ void mine_layer_update(struct Moby *mine_layer_moby) { mine_layer_vars->turn); if (vector_distance_xy(&mine_layer_moby->pos, &target.aim) < sight && absolute_float(target.aim.f[2] - mine_layer_moby->pos.z) < 4.0f) { - mine_layer_moby->state = 2; + mine_layer_moby->state = MINE_LAYER_WAIT_FOR_ANIMATION_BEFORE_PATROL; if (mine_layer_moby->prev_seq != 1) { blend_moby_animation(mine_layer_moby, 1, 0, scale_game_frames(10)); } @@ -199,7 +200,7 @@ void mine_layer_update(struct Moby *mine_layer_moby) { break; case MINE_LAYER_WAIT_FOR_ANIMATION_BEFORE_PATROL: if (mine_layer_moby->anim_flags & 2) { - mine_layer_moby->state = 3; + mine_layer_moby->state = MINE_LAYER_PATROL_AND_FIRE; mine_layer_vars->patrol_timer = scale_game_frames(120); if (mine_layer_moby->prev_seq != 2) { blend_moby_animation(mine_layer_moby, 2, 0, scale_game_frames(10)); @@ -211,16 +212,16 @@ void mine_layer_update(struct Moby *mine_layer_moby) { case MINE_LAYER_PATROL_AND_FIRE: pt = &mine_layer_vars->patrol; patrol_point_index = pt->idx; - FUN_L00_00259028(mine_layer_moby, - mine_layer_vars->walk, - &pt->path->points[patrol_point_index], - mine_layer_vars->effect); + step_mover_2e3f20(mine_layer_moby, + mine_layer_vars->walk, + &pt->path->points[patrol_point_index], + mine_layer_vars->effect); mine_layer_moby->anim_speed = mine_layer_patrol_animation_speed_gp; fast_dec_timer_s16(&mine_layer_vars->patrol_timer); if (fast_vec_dist(&mine_layer_moby->pos, &pt->path->points[patrol_point_index]) < 1.0f) { if (mine_layer_vars->patrol_timer == 0 && vector_distance_xy(&mine_layer_moby->pos, &target.aim) > 25.0f) { - mine_layer_moby->state = 1; + mine_layer_moby->state = MINE_LAYER_FACE_TARGET_AND_WAIT_FOR_RANGE; if (mine_layer_moby->prev_seq != 0) { blend_moby_animation(mine_layer_moby, 0, 0, scale_game_frames(10)); } @@ -267,7 +268,7 @@ void mine_layer_update(struct Moby *mine_layer_moby) { if (mine_layer_moby->prev_seq != 0) { blend_moby_animation(mine_layer_moby, 0, 0, scale_game_frames(10)); } - mine_layer_moby->state = 1; + mine_layer_moby->state = MINE_LAYER_FACE_TARGET_AND_WAIT_FOR_RANGE; } else if (mine_layer_moby->pos.z < 5.0f) { qcopy(muzzle, &mine_layer_moby->pos); muzzle[2] += 0.5f; @@ -323,7 +324,7 @@ void mine_layer_update(struct Moby *mine_layer_moby) { } break; } - if (mine_layer_moby->state < 4) { + if (mine_layer_moby->state < MINE_LAYER_KNOCKBACK_AND_RECOVER) { mine_layer_vars->fall_speed += frame_time_sq * 9.8f; mine_layer_moby->pos.z -= mine_layer_vars->fall_speed - 2.0f; ground = probe_ground_height(&mine_layer_moby->pos, 0, 0.5f); @@ -408,7 +409,7 @@ void handle_mine_layer_damage(struct Moby *damaged_moby) { hit_record = trooper_find_hit(damaged_moby, 0x330000, 0); damage_response = resolve_moby_hit_response( damaged_moby, hit_record, &trooper_vars->health, 0, &hit, &dmg, 0, 4); - if (hit != 1 && damaged_moby->state != 5) { + if (hit != 1 && damaged_moby->state != MINE_LAYER_KNOCKBACK_UNTIL_EXPLOSION) { if (hit_record->source != NULL) { if (hit_record->source != hero.items[0].moby) knockback_arc_angle = fast_arc_tan(damaged_moby->pos.x - hit_record->source->pos.x, @@ -445,7 +446,7 @@ void handle_mine_layer_damage(struct Moby *damaged_moby) { 0); trooper_vars->kb_min = 5.0f; trooper_vars->kb_max = 10.0f; - damaged_moby->state = 4; + damaged_moby->state = MINE_LAYER_KNOCKBACK_AND_RECOVER; break; case TROOPER_DAMAGE_LONG_KNOCKBACK: case TROOPER_DAMAGE_LONG_KNOCKBACK_ALTERNATE: @@ -468,7 +469,7 @@ void handle_mine_layer_damage(struct Moby *damaged_moby) { 0); trooper_vars->kb_min = 7.5f; trooper_vars->kb_max = 15.0f; - damaged_moby->state = 4; + damaged_moby->state = MINE_LAYER_KNOCKBACK_AND_RECOVER; break; case TROOPER_DAMAGE_LETHAL: trooper_vars->kb_speed = @@ -492,7 +493,7 @@ void handle_mine_layer_damage(struct Moby *damaged_moby) { trooper_vars->kb_max = 15.0f; damaged_moby->flags &= 0xEFFF; *((u8 *)trooper_vars + 0x67) = 0xFA; - damaged_moby->state = 5; + damaged_moby->state = MINE_LAYER_KNOCKBACK_UNTIL_EXPLOSION; break; } trooper_anim_update(damaged_moby, trooper_vars->anim); diff --git a/src/overlays/l03/mobys/moving_platform_small.c b/src/overlays/l03/mobys/moving_platform_small.c index bb99435e89..db5139eeac 100644 --- a/src/overlays/l03/mobys/moving_platform_small.c +++ b/src/overlays/l03/mobys/moving_platform_small.c @@ -110,7 +110,7 @@ void moving_platform_small_update(char *moby) { platform_pvars->unk110 * 4.0f / convert_integer_to_float(easing_frame_count * scale_game_frames(240)); platform_pvars->easing_frames = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = PLATFORM_EASED_ENDPOINT_TRAVEL; } break; case PLATFORM_EASED_ENDPOINT_TRAVEL: @@ -149,14 +149,14 @@ void moving_platform_small_update(char *moby) { } } platform_pvars->voice = -1; - MOBY(moby)->state = 2; + MOBY(moby)->state = PLATFORM_PAUSE_BEFORE_EASED_TRAVEL; platform_pvars->wait_timer = scale_game_frames(platform_pvars->wait_frames); } break; case PLATFORM_PAUSE_BEFORE_EASED_TRAVEL: if (fast_dec_timer(&platform_pvars->wait_timer)) { platform_pvars->easing_frames = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = PLATFORM_EASED_ENDPOINT_TRAVEL; } break; case PLATFORM_FOLLOW_PATH_NODES: @@ -206,14 +206,14 @@ void moving_platform_small_update(char *moby) { } } platform_pvars->voice = -1; - MOBY(moby)->state = 4; + MOBY(moby)->state = PLATFORM_PAUSE_BEFORE_NODE_TRAVEL; platform_pvars->wait_timer = scale_game_frames(platform_pvars->wait_frames); } } break; case PLATFORM_PAUSE_BEFORE_NODE_TRAVEL: if (fast_dec_timer(&platform_pvars->wait_timer)) { - MOBY(moby)->state = 3; + MOBY(moby)->state = PLATFORM_FOLLOW_PATH_NODES; } break; } diff --git a/src/overlays/l03/mobys/path_mover_spawner.c b/src/overlays/l03/mobys/path_mover_spawner.c index 53c38d08a6..f40569291a 100644 --- a/src/overlays/l03/mobys/path_mover_spawner.c +++ b/src/overlays/l03/mobys/path_mover_spawner.c @@ -75,12 +75,16 @@ void path_mover_spawner_update(struct RailSpawnerMoby *moby) __asm__("FUN_L03_00 /* Moby class 899 */ void path_mover_spawner_update(struct RailSpawnerMoby *moby) { + enum { + PATH_MOVER_SPAWNER_STATE_UNINITIALIZED = 0, + PATH_MOVER_SPAWNER_STATE_INITIALIZED = 1 + }; struct RailSpawnerVars *vars = moby->vars; LevelPath *path; float spawn_distance; int i; - if (moby->state == 0) { + if (moby->state == PATH_MOVER_SPAWNER_STATE_UNINITIALIZED) { if (vars->path == -1) { debug_print(path_mover_spawner_bad_path_format, moby->uid); mark_moby_for_removal((char *)moby); @@ -91,7 +95,7 @@ void path_mover_spawner_update(struct RailSpawnerMoby *moby) { for (i = 0; i < path->count - 2; i++) path->points[i].f[3] = fast_vec_dist(&path->points[i], &path->points[i + 1]); vars->timer = 0; - moby->state = 1; + moby->state = PATH_MOVER_SPAWNER_STATE_INITIALIZED; vars->voice = -1; for (spawn_distance = 2.9f; spawn_distance < path->count * path->points[0].f[3]; spawn_distance += 2.9f) diff --git a/src/overlays/l03/mobys/rail_lift.c b/src/overlays/l03/mobys/rail_lift.c index a3fe3c6694..03308d0553 100644 --- a/src/overlays/l03/mobys/rail_lift.c +++ b/src/overlays/l03/mobys/rail_lift.c @@ -127,7 +127,7 @@ void rail_lift_update(struct Moby *lift_moby) { qcopy(&lift_moby->pos, &(l03_paths[lift_vars->path[lift_moby->command]])->points[0]); lift_vars->hud = -1; lift_vars->timer = 0; - lift_moby->state = 1; + lift_moby->state = LIFT_WAIT_FOR_DEPARTURE; lift_moby->update_dist = 0xFF; lift_moby->draw_dist = 0xFF; break; @@ -144,7 +144,7 @@ void rail_lift_update(struct Moby *lift_moby) { lift_moby->flags &= 0xFFBE; *(u128 *)&lift_moby->pos = *(u128 *)&(l03_paths[lift_vars->path[hero_end]])->points[0]; - lift_moby->state = 3; + lift_moby->state = LIFT_FOLLOW_PATH; lift_vars->unk64 = 1; lift_vars->started = 1; lift_vars->ready = 0; @@ -162,10 +162,10 @@ void rail_lift_update(struct Moby *lift_moby) { lift_moby->command ^= 1; lift_vars->unk64 = 1; lift_vars->ready = 0; - lift_moby->state = 2; + lift_moby->state = LIFT_WAIT_FOR_HERO_ANIMATION; } } else if (hero_end != lift_end) { - lift_moby->state = 3; + lift_moby->state = LIFT_FOLLOW_PATH; lift_moby->command ^= 1; lift_vars->unk64 = 1; lift_vars->ready = 0; @@ -173,7 +173,7 @@ void rail_lift_update(struct Moby *lift_moby) { break; case LIFT_WAIT_FOR_HERO_ANIMATION: if (!get_hero_target_pose_status()) - lift_moby->state = 3; + lift_moby->state = LIFT_FOLLOW_PATH; break; case LIFT_FOLLOW_PATH: if (is_hero_on_moby(lift_moby)) { @@ -182,7 +182,7 @@ void rail_lift_update(struct Moby *lift_moby) { } if (advance_moby_along_rail_path( lift_moby, lift_vars->path[lift_moby->command], &lift_vars->snd)) { - lift_moby->state = 1; + lift_moby->state = LIFT_WAIT_FOR_DEPARTURE; lift_vars->timer = scale_game_frames(0xF); } break; diff --git a/src/overlays/l03/mobys/red_ship_1.c b/src/overlays/l03/mobys/red_ship_1.c index 3b5da05ad0..b2cb1933f4 100644 --- a/src/overlays/l03/mobys/red_ship_1.c +++ b/src/overlays/l03/mobys/red_ship_1.c @@ -26,6 +26,13 @@ /* Ported from rac1-decomp (src/overlays/l03_kerwan/vendor_00293720.c: func_L03_0029DB88), where it is exact; names translated to the US level program. */ +enum { + RED_SHIP_INITIALIZE = 0, + RED_SHIP_FOLLOW_PATH_SPLINE = 1, + RED_SHIP_WAIT_FOR_PATH = 2, + RED_SHIP_WAIT_FOR_MOVEMENT_TIMER = 3 +}; + extern int D_L03_0015F5CC; /* no foreign declaration */ /* Builds two scaled offset vectors from the moby's matrix and adds them to out. */ @@ -62,7 +69,7 @@ void maintain_emitter_sound_voice(struct Moby *moby) __asm__("FUN_L03_0029c9d0") void maintain_emitter_sound_voice(struct Moby *moby) { char *emitter_pvars = (char *)moby->pvars; - if (moby->state == 0) { + if (moby->state == RED_SHIP_INITIALIZE) { *(int *)(emitter_pvars + 0x150) = -1; return; } @@ -542,12 +549,6 @@ typedef struct RedShip1Vars { * steering, banking and spawning its hit/smoke effects; state 2 waits without a path, 3 waits a timer. */ /* Moby classes 75, 115-120, 132, 795 */ void red_ship_1_update(char *moby) { - enum { - RED_SHIP_INITIALIZE = 0, - RED_SHIP_FOLLOW_PATH_SPLINE = 1, - RED_SHIP_WAIT_FOR_PATH = 2, - RED_SHIP_WAIT_FOR_MOVEMENT_TIMER = 3 - }; float zero[4]; float old_rot[4]; float old_pos[4]; @@ -642,7 +643,7 @@ void red_ship_1_update(char *moby) { random_float_between(-1.0f, 1.0f) * spline_moby_pvars->unk144 / 1000.0f; } if (*(int *)(pm + 0x14) == -1) { - MOBY(moby)->state = 2; + MOBY(moby)->state = RED_SHIP_WAIT_FOR_PATH; break; } moby_position = moby + 0x10; @@ -699,15 +700,15 @@ void red_ship_1_update(char *moby) { compute_sampled_spline_path_lengths( pm, 0, moby, spline_moby_pvars->unk104, spline_moby_pvars->unk108); if (spline_moby_pvars->timer_12C > 0) { - MOBY(moby)->state = 3; + MOBY(moby)->state = RED_SHIP_WAIT_FOR_MOVEMENT_TIMER; } else { spline_moby_pvars->unk14A = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = RED_SHIP_FOLLOW_PATH_SPLINE; } break; case RED_SHIP_WAIT_FOR_PATH: if (*(int *)(pm + 0x14) != -1) { - MOBY(moby)->state = 0; + MOBY(moby)->state = RED_SHIP_INITIALIZE; } voice_slot_index = spline_moby_pvars->unk150; if (voice_slot_index != -1) { @@ -720,7 +721,7 @@ void red_ship_1_update(char *moby) { break; case RED_SHIP_WAIT_FOR_MOVEMENT_TIMER: if (fast_dec_timer_s16(&spline_moby_pvars->timer_12C)) { - MOBY(moby)->state = 1; + MOBY(moby)->state = RED_SHIP_FOLLOW_PATH_SPLINE; } break; case RED_SHIP_FOLLOW_PATH_SPLINE: diff --git a/src/overlays/l03/mobys/robot_dog.c b/src/overlays/l03/mobys/robot_dog.c index 59a51c14ba..9eeee3c0b2 100644 --- a/src/overlays/l03/mobys/robot_dog.c +++ b/src/overlays/l03/mobys/robot_dog.c @@ -19,11 +19,29 @@ /* Ported from rac1-decomp (src/overlays/l03_kerwan/vendor_00293720.c: func_L03_002C6F40), where it is exact; names translated to the US level program. */ +enum { + ROBOT_DOG_INITIALIZE = 0, + ROBOT_DOG_WAIT_FOR_ACTIVATION = 1, + ROBOT_DOG_WAIT_FOR_PARTNER_RELEASE = 2, + ROBOT_DOG_TURN_TO_TARGET = 3, + ROBOT_DOG_CHASE_TARGET = 4, + ROBOT_DOG_FOLLOW_PATH = 5, + ROBOT_DOG_MELEE_ATTACK = 6, + ROBOT_DOG_RETURN_HOME = 7, + ROBOT_DOG_FALL_RECOVERY = 8, + ROBOT_DOG_WAIT_TO_REINITIALIZE = 9, + ROBOT_DOG_DEATH_FALL = 21 +}; + +enum { + MOBY_STATE_PENDING_REMOVAL = 0xFE +}; + int is_robot_dog_in_state_5(struct Moby *moby) __asm__("FUN_L03_002c5b78"); int is_robot_dog_in_state_5(struct Moby *moby) { - if (moby && moby->state != 0xFE && moby->state != 0xFD && moby->oclass == 0x23D && - moby->state == 5) { + if (moby && moby->state != MOBY_STATE_PENDING_REMOVAL && moby->state != 0xFD && + moby->oclass == 0x23D && moby->state == ROBOT_DOG_FOLLOW_PATH) { return 1; } return 0; @@ -104,7 +122,7 @@ extern float D_L03_0015F580_macro[] __asm__("D_L03_0015F580") MACRO_ADDR; extern float FUN_L04_001f1978(float); extern int rand(void) __asm__("FUN_001160d8"); extern int FUN_L00_00258b50(void *, void *, void *, void *, float); -extern int FUN_L00_00259028(char *m, char *p, char *pos, char *v); +extern int step_mover_2e3f20(char *m, char *p, char *pos, char *v) __asm__("FUN_L00_00259028"); extern int FUN_L00_002dc9f0(void *, void *); extern int select_moby_target_with_hero_fallback(char *, char *, float) __asm__("FUN_L03_0024e830"); extern void FUN_L00_00257470(void *, int, int); @@ -135,19 +153,6 @@ void robot_dog_update(char *moby) __asm__("FUN_L03_002c5bb8"); /* Moby class 573 */ void robot_dog_update(char *moby) { - enum { - ROBOT_DOG_INITIALIZE = 0, - ROBOT_DOG_WAIT_FOR_ACTIVATION = 1, - ROBOT_DOG_WAIT_FOR_PARTNER_RELEASE = 2, - ROBOT_DOG_TURN_TO_TARGET = 3, - ROBOT_DOG_CHASE_TARGET = 4, - ROBOT_DOG_FOLLOW_PATH = 5, - ROBOT_DOG_MELEE_ATTACK = 6, - ROBOT_DOG_RETURN_HOME = 7, - ROBOT_DOG_FALL_RECOVERY = 8, - ROBOT_DOG_WAIT_TO_REINITIALIZE = 9, - ROBOT_DOG_DEATH_FALL = 21 - }; Tgt2c5bb8 selected_target; float forward_vector_or_path_point[4]; float push[4]; @@ -171,7 +176,7 @@ void robot_dog_update(char *moby) { case ROBOT_DOG_INITIALIZE: MOBY(moby)->flags |= 0x1000; qcopy(robot_dog_state->home, moby + 0x10); - MOBY(moby)->state = 1; + MOBY(moby)->state = ROBOT_DOG_WAIT_FOR_ACTIVATION; MOBY(moby)->shadow_range = 0x18; robot_dog_state->f20 = 1.0f; robot_dog_state->b29 = 0; @@ -203,7 +208,7 @@ void robot_dog_update(char *moby) { if (((unsigned char *)moby)[0x53] != 0) { blend_moby_animation(moby, 0, 0, 0); } - MOBY(moby)->state = 2; + MOBY(moby)->state = ROBOT_DOG_WAIT_FOR_PARTNER_RELEASE; } else if (((unsigned char *)moby)[0x53] != 1) { blend_moby_animation(moby, 1, 0, 0); } @@ -221,7 +226,7 @@ void robot_dog_update(char *moby) { (fast_vec_dist(&selected_target, moby + 0x10) < robot_dog_state->f274 && absolute_float(selected_target.pos[2] - MOBY(moby)->pos.z) < 4.0f)) { robot_dog_state->i278 = 0; - MOBY(moby)->state = 5; + MOBY(moby)->state = ROBOT_DOG_FOLLOW_PATH; if (((unsigned char *)moby)[0x53] != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } @@ -229,7 +234,7 @@ void robot_dog_update(char *moby) { } else if (random_integer_below(14) == 0 && fast_vec_dist(&selected_target, robot_dog_state->home) < robot_dog_state->f230 && absolute_float(selected_target.pos[2] - MOBY(moby)->pos.z) < 3.0f) { - MOBY(moby)->state = 3; + MOBY(moby)->state = ROBOT_DOG_TURN_TO_TARGET; if (((unsigned char *)moby)[0x53] != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } @@ -245,7 +250,7 @@ void robot_dog_update(char *moby) { ((unsigned char *)partner_moby)[0x20] == 0xFD || can_release_linked_robot_dog((struct Moby *)partner_moby)) { robot_dog_state->i23C = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - MOBY(moby)->state = 4; + MOBY(moby)->state = ROBOT_DOG_CHASE_TARGET; if (((unsigned char *)moby)[0x53] != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } @@ -263,7 +268,7 @@ void robot_dog_update(char *moby) { 0.1f); if (((unsigned char *)moby)[0x70] & 2) { robot_dog_state->i23C = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - MOBY(moby)->state = 4; + MOBY(moby)->state = ROBOT_DOG_CHASE_TARGET; if (((unsigned char *)moby)[0x53] != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } @@ -289,13 +294,13 @@ void robot_dog_update(char *moby) { if (target_distance < robot_dog_state->f234 * frame_time * 0.5f * FUN_L04_001f1978(40.0f) + robot_dog_state->f234 * frame_time * FUN_L04_001f1978(10.0f) + 1.5f) { - MOBY(moby)->state = 6; + MOBY(moby)->state = ROBOT_DOG_MELEE_ATTACK; if (((unsigned char *)moby)[0x53] != 5) { blend_moby_animation(moby, 5, 0, truncate_float_to_s32(FUN_L04_001f1978(10.0f))); } } else if (robot_dog_state->f230 < fast_vec_dist(&selected_target, robot_dog_state->home) || absolute_float(selected_target.pos[2] - MOBY(moby)->pos.z) > 3.0f) { - MOBY(moby)->state = 7; + MOBY(moby)->state = ROBOT_DOG_RETURN_HOME; } break; case ROBOT_DOG_FOLLOW_PATH: @@ -305,16 +310,16 @@ void robot_dog_update(char *moby) { if (robot_dog_state->i278 < seg) { robot_dog_state->i278 = seg; } - if (FUN_L00_00259028(moby, - (char *)&robot_dog_state->i180, - (char *)path + (robot_dog_state->i278 * 0x10 + 0x10), - (char *)robot_dog_state->v40) & + if (step_mover_2e3f20(moby, + (char *)&robot_dog_state->i180, + (char *)path + (robot_dog_state->i278 * 0x10 + 0x10), + (char *)robot_dog_state->v40) & 0x14) { if (robot_dog_state->i278 < *path - 1) { robot_dog_state->i278++; } else { robot_dog_state->i270 = -1; - MOBY(moby)->state = 1; + MOBY(moby)->state = ROBOT_DOG_WAIT_FOR_ACTIVATION; if (((unsigned char *)moby)[0x53] != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -322,7 +327,7 @@ void robot_dog_update(char *moby) { if (((unsigned char *)moby)[0x53] != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } - MOBY(moby)->state = 2; + MOBY(moby)->state = ROBOT_DOG_WAIT_FOR_PARTNER_RELEASE; } } } @@ -335,7 +340,7 @@ void robot_dog_update(char *moby) { can_release_linked_robot_dog((struct Moby *)partner_moby)) { robot_dog_state->i270 = -1; robot_dog_state->i23C = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - MOBY(moby)->state = 4; + MOBY(moby)->state = ROBOT_DOG_CHASE_TARGET; if (((unsigned char *)moby)[0x53] != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } @@ -376,7 +381,7 @@ void robot_dog_update(char *moby) { spawn_nearby_effect(selected_target.obj, moby, 1, at, push, 1.0f); } else if (((unsigned char *)moby)[0x70] & 2) { robot_dog_state->f1A4 = robot_dog_state->f234 * frame_time; - MOBY(moby)->state = 7; + MOBY(moby)->state = ROBOT_DOG_RETURN_HOME; if (((unsigned char *)moby)[0x53] != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(3)); } @@ -398,7 +403,7 @@ void robot_dog_update(char *moby) { forward_vector_or_path_point[2] = 0.0f; FUN_L00_00258b50(moby, &robot_dog_state->i180, forward_vector_or_path_point, push, 1.0f); if (vector_distance_xy(moby + 0x10, robot_dog_state->home) < 1.0f) { - MOBY(moby)->state = 1; + MOBY(moby)->state = ROBOT_DOG_WAIT_FOR_ACTIVATION; if (((unsigned char *)moby)[0x53] != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(3)); } @@ -407,7 +412,7 @@ void robot_dog_update(char *moby) { if (target_distance < robot_dog_state->f234 * frame_time * 0.5f * FUN_L04_001f1978(40.0f) + robot_dog_state->f234 * frame_time * FUN_L04_001f1978(10.0f) + 1.5f) { - MOBY(moby)->state = 6; + MOBY(moby)->state = ROBOT_DOG_MELEE_ATTACK; if (((unsigned char *)moby)[0x53] != 5) { blend_moby_animation( moby, 5, 0, truncate_float_to_s32(FUN_L04_001f1978(10.0f))); @@ -417,7 +422,7 @@ void robot_dog_update(char *moby) { break; case ROBOT_DOG_FALL_RECOVERY: if (step_moby_motion(moby, robot_dog_state->m120) & 0x60) { - MOBY(moby)->state = 4; + MOBY(moby)->state = ROBOT_DOG_CHASE_TARGET; if (((unsigned char *)moby)[0x53] != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } @@ -426,7 +431,7 @@ void robot_dog_update(char *moby) { goto low; case ROBOT_DOG_WAIT_TO_REINITIALIZE: if (FUN_L00_002dc9f0(moby, robot_dog_state->m120)) { - MOBY(moby)->state = 0; + MOBY(moby)->state = ROBOT_DOG_INITIALIZE; robot_dog_state->sC8 = 0; } break; @@ -506,7 +511,7 @@ void update_robot_dog_hit_reaction(struct Moby *moby) { damage = 0.0f; hit = find_moby_hit(moby, 0x330000, 0); hit_reaction(moby, hit, robot_dog_pvars + 0x20, 0, &hit_reaction_code, &damage, 0, 4); - if (hit_reaction_code != 1 && moby->state != 21) { + if (hit_reaction_code != 1 && moby->state != ROBOT_DOG_DEATH_FALL) { char *hit_source_moby; if (moby->group != 255) FUN_L01_0026e090(moby->group, 1); @@ -532,7 +537,7 @@ void update_robot_dog_hit_reaction(struct Moby *moby) { *(OvlQuad *)vector = *(OvlQuad *)(hit + 0x10); trooper_knockback_arc(vector, &angle, robot_dog_pvars + 0x138, robot_dog_pvars + 0x13C); trooper_start_knockback(angle, moby, robot_dog_pvars + 0x120, 4, 1, 0); - moby->state = 21; + moby->state = ROBOT_DOG_DEATH_FALL; *(unsigned char *)(robot_dog_pvars + 0x117) = 240; trooper_anim_update(moby, (short *)(robot_dog_pvars + 0x110)); } @@ -547,7 +552,7 @@ int can_release_linked_robot_dog(struct Moby *moby) { if (!moby) return 0; state = moby->state; - if (state == 0xFE) + if (state == MOBY_STATE_PENDING_REMOVAL) return 0; if (state == 0xFD) return 0; diff --git a/src/overlays/l03/mobys/robot_qwark.c b/src/overlays/l03/mobys/robot_qwark.c index 529ef548fa..95a571d6f6 100644 --- a/src/overlays/l03/mobys/robot_qwark.c +++ b/src/overlays/l03/mobys/robot_qwark.c @@ -77,6 +77,9 @@ void robot_qwark_update(struct Moby *robot_qwark_moby) { ROBOT_QWARK_RESOLVE_DIALOGUE = 2, ROBOT_QWARK_BROKEN_SPARKING = 3 }; + enum { + TALKER_MODE_WARP = 2 + }; struct TalkerVars *dialogue_state = (struct TalkerVars *)robot_qwark_moby->pvars; TalkerHit *hit; u8 type; @@ -94,8 +97,8 @@ void robot_qwark_update(struct Moby *robot_qwark_moby) { (D_0014C190_257218[current_level_index][(s16)robot_qwark_moby->save_id >> 5] >> (robot_qwark_moby->save_id & 0x1F)) & 1) { - if (robot_qwark_moby->state != 3) { - robot_qwark_moby->state = 3; + if (robot_qwark_moby->state != ROBOT_QWARK_BROKEN_SPARKING) { + robot_qwark_moby->state = ROBOT_QWARK_BROKEN_SPARKING; set_moby_animation(robot_qwark_moby, 1, 0); } } @@ -140,13 +143,14 @@ void robot_qwark_update(struct Moby *robot_qwark_moby) { 1 << (robot_qwark_moby->save_id & 0x1F); } robot_qwark_moby->hit_slot = 0xFF; - if (npc_dialogue_suppression_flags[0] != 0 && robot_qwark_moby->state != 3) { + if (npc_dialogue_suppression_flags[0] != 0 && + robot_qwark_moby->state != ROBOT_QWARK_BROKEN_SPARKING) { return; } switch (robot_qwark_moby->state) { case ROBOT_QWARK_INITIALIZE: robot_qwark_moby->spawn_frame = *(u64 *)(D_001413D0[0] + 0x38); - robot_qwark_moby->state = 1; + robot_qwark_moby->state = ROBOT_QWARK_UPDATE_DIALOGUE; talker_init(robot_qwark_moby, dialogue_state); if (alternate_item_available[0x19] != 0) { dialogue_state->mode = 1; @@ -157,15 +161,15 @@ void robot_qwark_update(struct Moby *robot_qwark_moby) { if (talker_update(robot_qwark_moby, dialogue_state)) { alternate_item_available[0x19] = 1; begin_dialogue_camera_transition(robot_qwark_moby, 2.7f); - robot_qwark_moby->state = 2; + robot_qwark_moby->state = ROBOT_QWARK_RESOLVE_DIALOGUE; } break; case ROBOT_QWARK_RESOLVE_DIALOGUE: if (D_L03_0015F5C4 == 2) { break; } - robot_qwark_moby->state = 1; - if (dialogue_state->mode == 2 && dialogue_state->warp != -1) { + robot_qwark_moby->state = ROBOT_QWARK_UPDATE_DIALOGUE; + if (dialogue_state->mode == TALKER_MODE_WARP && dialogue_state->warp != -1) { warp_record = (char *)l03_cuboids + dialogue_state->warp * 128; jet_reset_camera(warp_record + 0x30, warp_record + 0x70); } diff --git a/src/overlays/l03/mobys/select_moby_target_with_hero_fallback.c b/src/overlays/l03/mobys/select_moby_target_with_hero_fallback.c index 30efc8cd06..cfedb01980 100644 --- a/src/overlays/l03/mobys/select_moby_target_with_hero_fallback.c +++ b/src/overlays/l03/mobys/select_moby_target_with_hero_fallback.c @@ -16,6 +16,11 @@ extern struct Hero hero_lui __asm__("D_0013F350") NOT_SDA; int select_moby_target_with_hero_fallback(char *a, char *o, float best) __asm__("FUN_L03_0024e830"); int select_moby_target_with_hero_fallback(char *source_moby, char *target_output, float best) { + enum { + TARGET_SELECTION_HERO_FALLBACK = 0, + TARGET_SELECTION_CANDIDATE_SELECTED = 1, + TARGET_SELECTION_HERO_FALLBACK_SUPPRESSED = 2 + }; struct Hero *hero = &hero_lui; char *selected_moby; char *candidate_moby; @@ -25,10 +30,10 @@ int select_moby_target_with_hero_fallback(char *source_moby, char *target_output float candidate_comparison_value; selected_moby = ((char *)hero->moby); - target_selection_status = 0; + target_selection_status = TARGET_SELECTION_HERO_FALLBACK; if (hero->state.control_mode == 0x18 || hero->state.current == 0x72) { selected_moby = 0; - target_selection_status = 2; + target_selection_status = TARGET_SELECTION_HERO_FALLBACK_SUPPRESSED; } for (i = 1; i <= D_L03_001B0930[0]; i++) { candidate_moby = D_L03_0015FFD8 + (D_L03_001B0930[i] << 8); @@ -46,7 +51,7 @@ int select_moby_target_with_hero_fallback(char *source_moby, char *target_output if (candidate_comparison_value < best) { selected_moby = candidate_moby; best = candidate_comparison_value; - target_selection_status = 1; + target_selection_status = TARGET_SELECTION_CANDIDATE_SELECTED; } } for (j = 0; j < 20; j++) { @@ -65,7 +70,7 @@ int select_moby_target_with_hero_fallback(char *source_moby, char *target_output if (candidate_comparison_value < best) { selected_moby = candidate_moby; best = candidate_comparison_value; - target_selection_status = 1; + target_selection_status = TARGET_SELECTION_CANDIDATE_SELECTED; } } if (selected_moby != 0) { diff --git a/src/overlays/l03/mobys/taxi.c b/src/overlays/l03/mobys/taxi.c index 1ba6184e1e..352d021c02 100644 --- a/src/overlays/l03/mobys/taxi.c +++ b/src/overlays/l03/mobys/taxi.c @@ -155,7 +155,7 @@ void rail_taxi_update(struct Moby *taxi_moby) { taxi_moby->draw_dist = 0; taxi_moby->update_dist = 0xFF; taxi_vars->route = -1; - taxi_moby->state = 1; + taxi_moby->state = TAXI_WAIT_FOR_ROUTE_TRIGGER; taxi_moby->collision = 0; if (l03_save_state.cleared[(s16)taxi_moby->save_id] != 0 || (D_0014C190_257218[current_level_index][(s16)taxi_moby->save_id >> 5] >> @@ -186,7 +186,7 @@ void rail_taxi_update(struct Moby *taxi_moby) { route_path->points[1].f[1] - taxi_moby->pos.y); } taxi_moby->command = route_index; - taxi_moby->state = 2; + taxi_moby->state = TAXI_FOLLOW_OUTBOUND_PATH; taxi_moby->draw_dist = 0x80; taxi_vars->idx = 1; taxi_vars->speed = rail_flyer_max_speed_gp * frame_time; @@ -199,7 +199,7 @@ void rail_taxi_update(struct Moby *taxi_moby) { if (taxi_vars->out[taxi_moby->command] == -1 || advance_moby_along_rail_path( taxi_moby, taxi_vars->out[taxi_moby->command], &taxi_vars->snd)) { - taxi_moby->state = 3; + taxi_moby->state = TAXI_WAIT_FOR_RETURN_REQUEST; taxi_vars->unkE4 = -1; } break; @@ -220,14 +220,14 @@ void rail_taxi_update(struct Moby *taxi_moby) { request_taxi_return_help_message(taxi_moby, taxi_vars->help[taxi_moby->command]); if ((((u32)pad_pressed_lui) & 0x10) && D_L03_0015F594 == 8) { request_hero_target_pose(&taxi_moby->pos, taxi_moby->rot.z, 0); - taxi_moby->state = 4; + taxi_moby->state = TAXI_WAIT_FOR_RETURN_DEPARTURE; taxi_vars->idx = 1; } } break; case TAXI_WAIT_FOR_RETURN_DEPARTURE: if (!get_hero_target_pose_status()) { - taxi_moby->state = 5; + taxi_moby->state = TAXI_FOLLOW_RETURN_PATH; } break; case TAXI_FOLLOW_RETURN_PATH: @@ -237,7 +237,7 @@ void rail_taxi_update(struct Moby *taxi_moby) { } if (advance_moby_along_rail_path( taxi_moby, taxi_vars->back[taxi_moby->command], &taxi_vars->snd)) { - taxi_moby->state = 6; + taxi_moby->state = TAXI_WAIT_FOR_HERO_TO_MOVE_AWAY; } break; case TAXI_WAIT_FOR_HERO_TO_MOVE_AWAY: @@ -255,18 +255,18 @@ void rail_taxi_update(struct Moby *taxi_moby) { frame_time * 12.566371f); if (taxi_vars->onward[taxi_moby->command] != -1 && fast_vec_dist(&taxi_moby->pos, &hero.motion.pos) > 15.0f) { - taxi_moby->state = 7; + taxi_moby->state = TAXI_FOLLOW_ONWARD_PATH; taxi_vars->idx = 1; } else if (taxi_vars->onward[taxi_moby->command] == -1 && vector_distance_xy(&taxi_moby->pos, &hero.motion.pos) > 5.0f) { - taxi_moby->state = 1; + taxi_moby->state = TAXI_WAIT_FOR_ROUTE_TRIGGER; } break; case TAXI_FOLLOW_ONWARD_PATH: if (advance_moby_along_rail_path( taxi_moby, taxi_vars->onward[taxi_moby->command], &taxi_vars->snd)) { taxi_moby->draw_dist = 0; - taxi_moby->state = 1; + taxi_moby->state = TAXI_WAIT_FOR_ROUTE_TRIGGER; taxi_moby->collision = 0; } break; diff --git a/src/overlays/l04/level_class_tables.c b/src/overlays/l04/level_class_tables.c index 5b4f32efad..bd7fddeda0 100644 --- a/src/overlays/l04/level_class_tables.c +++ b/src/overlays/l04/level_class_tables.c @@ -17,6 +17,9 @@ #include "rnc/overlay/shared/ui/hud/hud_keep_visible.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -50,7 +53,7 @@ void *D_L04_001DD104[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L04_001DD11C[6] diff --git a/src/overlays/l04/mobys/big_axebot.c b/src/overlays/l04/mobys/big_axebot.c index 2e325b77c8..70d201589b 100644 --- a/src/overlays/l04/mobys/big_axebot.c +++ b/src/overlays/l04/mobys/big_axebot.c @@ -248,7 +248,8 @@ extern int FUN_L00_001fefc8(void *); extern int is_point_inside_clip_volume(void *point, int volume_index) __asm__("FUN_00214720"); extern int hit_reaction(void *, void *, void *, int, int *, float *, int, int) __asm__("FUN_L00_0025a478"); -extern int FUN_L04_00295de8_cf(void *, void *, void *, int, float, float, float, float) __asm__("FUN_L00_00258490"); +extern int move_moby_xy_with_collision_constraints( + void *, void *, void *, int, float, float, float, float) __asm__("FUN_L00_00258490"); extern int step_moby_motion(void *, void *) __asm__("FUN_L00_0025c698"); extern int allocate_voice_for_target_entry(int, int, char *); extern int mark_moby_for_removal_cf() __asm__("FUN_L04_002ba470"); @@ -256,7 +257,7 @@ extern void * FUN_L00_00263fd8(char *, int, float *, void *, int, int, float, float *, float *, float *); void *spawn_big_axebot_axe(char *source_moby, char *spawn_position) __asm__("FUN_L04_002d34d8"); extern void *random_integer_below_cf(void *, int, unsigned int) __asm__("FUN_001153fc"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern void FUN_L00_00257470(void *, int, int); extern void leg_walker_update(void *, void *, float, float, float) __asm__("FUN_L04_00295778"); extern void FUN_L00_0025a120(void *); @@ -361,7 +362,7 @@ void big_axebot_update(M_B7B0 *moby) { } } fast_dec_timer_s16(&data->f404); - if (moby->state != 10 && moby->state != 0) { + if (moby->state != BIG_AXEBOT_STATE_DYING && moby->state != BIG_AXEBOT_STATE_INITIALIZE) { int unused_hit_reaction_output; float dmg; Hit_B7B0 *hit; @@ -372,7 +373,7 @@ void big_axebot_update(M_B7B0 *moby) { hit = (Hit_B7B0 *)find_moby_hit(moby, 0x210000, 0); hit_reaction_result = hit_reaction(moby, hit, &data->hp, 0, &unused_hit_reaction_output, &dmg, 0, 4); - if (hit != 0 && dmg != 0.0f && moby->state != 0) { + if (hit != 0 && dmg != 0.0f && moby->state != BIG_AXEBOT_STATE_INITIALIZE) { if (hit->att != 0) { struct Hero *h = &hero; if (hit->att != h->items[0].moby) { @@ -421,7 +422,7 @@ void big_axebot_update(M_B7B0 *moby) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)5, 0, (void *)scale_game_frames(6)); set_big_axebot_and_axe_animation_speed(moby, 2.0f); - moby->state = 8; + moby->state = BIG_AXEBOT_STATE_HIT_RECOVERY; } data->f42C = 3.4f / scale_time(7.0f) * 0.5f; data->fB7 = 0x78; @@ -439,7 +440,7 @@ void big_axebot_update(M_B7B0 *moby) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)5, 0, (void *)scale_game_frames(6)); set_big_axebot_and_axe_animation_speed(moby, 2.0f); - moby->state = 8; + moby->state = BIG_AXEBOT_STATE_HIT_RECOVERY; trooper_start_knockback(knockback_yaw, moby, data->fC0, 5, 1, 0); data->f110 = 5.0f; data->f114 = 10.0f; @@ -455,7 +456,7 @@ void big_axebot_update(M_B7B0 *moby) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)6, (void *)2, (void *)scale_game_frames(4)); data->f402 = scale_game_frames(0x28); - moby->state = 1; + moby->state = BIG_AXEBOT_STATE_IDLE; data->f42C = 3.4f / scale_time(7.0f); data->fB7 = 0x78; trooper_anim_update(moby, (short *)data->fB0); @@ -472,7 +473,7 @@ void big_axebot_update(M_B7B0 *moby) { trooper_start_knockback(knockback_yaw, moby, data->fC0, 7, 1, 0); data->f110 = 12.0f; data->f114 = 25.0f; - moby->state = 10; + moby->state = BIG_AXEBOT_STATE_DYING; data->fB7 = 0x78; trooper_anim_update(moby, (short *)data->fB0); FUN_L00_00257470(moby, 0, -1); @@ -492,7 +493,7 @@ void big_axebot_update(M_B7B0 *moby) { } data->f38 = 0; FUN_L00_001fefc8(&data->f406); - if (moby->state != 0 && data->f2E != 1) { + if (moby->state != BIG_AXEBOT_STATE_INITIALIZE && data->f2E != 1) { if (data->f424 != 0) { mark_moby_for_removal(data->f424); } @@ -521,11 +522,11 @@ void big_axebot_update(M_B7B0 *moby) { data->f58 = 0xA; data->f5A = 0xC; if (data->f400 != 0) { - moby->state = 3; + moby->state = BIG_AXEBOT_STATE_WAIT_FOR_TARGET; blend_big_axebot_and_axe_animation( (char *)moby, (void *)0xA, 0, (void *)scale_game_frames(0xC)); } else { - moby->state = 1; + moby->state = BIG_AXEBOT_STATE_IDLE; } break; case BIG_AXEBOT_STATE_IDLE: { @@ -550,7 +551,7 @@ void big_axebot_update(M_B7B0 *moby) { } if (data->f430 != -1 && data->f434 != -1 && data->f43A == 0 && (flag || is_point_inside_clip_volume(&hero.motion.pos, data->f430) != 0)) { - moby->state = 4; + moby->state = BIG_AXEBOT_STATE_FOLLOW_PATH; moby->fBC |= 1; data->f43A = 1; } else { @@ -562,14 +563,14 @@ void big_axebot_update(M_B7B0 *moby) { if (target_distance < 4.5f) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)4, (void *)4, (void *)scale_game_frames(0xC)); - moby->state = 7; + moby->state = BIG_AXEBOT_STATE_MELEE_ATTACK; } else if (flag ? target_distance < data->f43C * 2.0f : target_distance < data->f43C) { int nf = (moby->fBC & 1) == 0; if (nf) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)2, 0, (void *)scale_game_frames(0xC)); - moby->state = 2; + moby->state = BIG_AXEBOT_STATE_ALERT; moby->fBC |= 1; } } @@ -586,7 +587,7 @@ void big_axebot_update(M_B7B0 *moby) { : 0), 0, (void *)scale_game_frames(0xC)); - moby->state = 1; + moby->state = BIG_AXEBOT_STATE_IDLE; } break; case BIG_AXEBOT_STATE_WAIT_FOR_TARGET: @@ -598,13 +599,13 @@ void big_axebot_update(M_B7B0 *moby) { if (target_distance < 4.5f) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)4, (void *)4, (void *)scale_game_frames(0xC)); - moby->state = 7; + moby->state = BIG_AXEBOT_STATE_MELEE_ATTACK; } else if (flag ? target_distance < data->f43C * 2.0f : target_distance < data->f43C) { int nf = (moby->fBC & 1) == 0; if (nf) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)2, 0, (void *)scale_game_frames(0xC)); - moby->state = 2; + moby->state = BIG_AXEBOT_STATE_ALERT; moby->fBC |= 1; } } @@ -621,7 +622,7 @@ void big_axebot_update(M_B7B0 *moby) { if (target_distance < 4.5f) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)4, (void *)4, (void *)scale_game_frames(0xC)); - moby->state = 7; + moby->state = BIG_AXEBOT_STATE_MELEE_ATTACK; } if (vector_distance_xy(path->pts[data->f438], moby->pos) < 1.0f) { data->f438++; @@ -633,7 +634,7 @@ void big_axebot_update(M_B7B0 *moby) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)0xD, 0, (void *)scale_game_frames(0x18)); } - moby->state = 1; + moby->state = BIG_AXEBOT_STATE_IDLE; break; } } @@ -649,7 +650,7 @@ void big_axebot_update(M_B7B0 *moby) { vector_quaternion_scratch[1] = fast_sin(moby->rot[2]) * (frame_time * 6.0f); vector_quaternion_scratch[2] = 0.0f; fast_vec_add(vector_quaternion_scratch, vector_quaternion_scratch, moby->pos); - FUN_L04_00295de8_cf( + move_moby_xy_with_collision_constraints( moby, moby->pos, vector_quaternion_scratch, 1, 0.25f, 1.5f, 0.75f, 0.87266463f); break; } @@ -668,7 +669,7 @@ void big_axebot_update(M_B7B0 *moby) { if (target_distance < 4.5f) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)4, (void *)4, (void *)scale_game_frames(0xC)); - moby->state = 7; + moby->state = BIG_AXEBOT_STATE_MELEE_ATTACK; } else if (data->f41C != -1) { vector_quaternion_scratch[0] = fast_cos(moby->rot[2]) * 2.0f; vector_quaternion_scratch[1] = fast_sin(moby->rot[2]) * 2.0f; @@ -680,12 +681,12 @@ void big_axebot_update(M_B7B0 *moby) { data->f410 = 0.0f; blend_big_axebot_and_axe_animation( (char *)moby, (void *)8, 0, (void *)scale_game_frames(0xC)); - moby->state = 9; + moby->state = BIG_AXEBOT_STATE_TURN; } if (point_in_path_xy(tpos, ((P_B7B0 *)l04_paths[data->f41C])->pts, ((P_B7B0 *)l04_paths[data->f41C])->count) == 0) { - moby->state = 6; + moby->state = BIG_AXEBOT_STATE_RETURN_HOME; } } break; @@ -693,7 +694,7 @@ void big_axebot_update(M_B7B0 *moby) { if (target_distance < 4.5f) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)4, (void *)4, (void *)scale_game_frames(0xC)); - moby->state = 7; + moby->state = BIG_AXEBOT_STATE_MELEE_ATTACK; } else { float a; @@ -711,7 +712,7 @@ void big_axebot_update(M_B7B0 *moby) { leg_walker_update( moby, data->f1A0, frame_time * 4.0f, data->f414, frame_time_sq * 20.0f); if (vector_distance_xy(moby->pos, data->home) < 2.0f) { - moby->state = 1; + moby->state = BIG_AXEBOT_STATE_IDLE; } if (data->f41C != -1) { vector_quaternion_scratch[0] = fast_cos(moby->rot[2]) * 2.0f; @@ -724,13 +725,13 @@ void big_axebot_update(M_B7B0 *moby) { data->f410 = 0.0f; blend_big_axebot_and_axe_animation( (char *)moby, (void *)8, 0, (void *)scale_game_frames(0xC)); - moby->state = 9; + moby->state = BIG_AXEBOT_STATE_TURN; moby->fBC |= 0x10; } if (point_in_path_xy(tpos, ((P_B7B0 *)l04_paths[data->f41C])->pts, ((P_B7B0 *)l04_paths[data->f41C])->count) != 0) { - moby->state = 1; + moby->state = BIG_AXEBOT_STATE_IDLE; } } } @@ -770,7 +771,7 @@ void big_axebot_update(M_B7B0 *moby) { : 0), 0, (void *)scale_game_frames(0xC)); - moby->state = 1; + moby->state = BIG_AXEBOT_STATE_IDLE; } break; case BIG_AXEBOT_STATE_HIT_RECOVERY: @@ -780,7 +781,7 @@ void big_axebot_update(M_B7B0 *moby) { blend_big_axebot_and_axe_animation( (char *)moby, (void *)4, (void *)4, (void *)scale_game_frames(6)); set_big_axebot_and_axe_animation_speed(moby, 1.5f); - moby->state = 7; + moby->state = BIG_AXEBOT_STATE_MELEE_ATTACK; } else if (moby->f53 == 8 && (hd < 28.0f || moby->f52 != moby->f53)) { float hit_recovery_displacement_limit = frame_scale * 0.11111111f; @@ -810,14 +811,14 @@ void big_axebot_update(M_B7B0 *moby) { frame_time_sq * 6.2831855f, frame_time * 4.1887903f); } else { - moby->state = 1; + moby->state = BIG_AXEBOT_STATE_IDLE; data->f402 = 0; } } break; case BIG_AXEBOT_STATE_TURN: if (moby->f52 == 8 && (moby->f70 & 2)) { - moby->state = 5; + moby->state = BIG_AXEBOT_STATE_CHASE_TARGET; moby->fBC = (moby->fBC | 8) & ~0x10; blend_big_axebot_and_axe_animation( (char *)moby, (void *)9, 0, (void *)scale_game_frames(0xC)); @@ -896,15 +897,15 @@ void big_axebot_update(M_B7B0 *moby) { if (data->f420 == 0.0f) { data->f42C += -3.4f / (scale_time(7.0f) * scale_time(7.0f)); } - FUN_L04_00295de8_cf( + move_moby_xy_with_collision_constraints( moby, moby->pos, vector_quaternion_scratch, 1, 0.25f, 1.5f, 0.75f, 0.87266463f); } data->f408 *= 0.96f; fast_dec_timer(&data->f448); - FUN_L00_001fff28(vector_quaternion_scratch, 1, data->f408); - FUN_L00_001fff28(data->m120.q, 2, 0.0f); + build_axis_rotation_quaternion(vector_quaternion_scratch, 1, data->f408); + build_axis_rotation_quaternion(data->m120.q, 2, 0.0f); multiply_quaternions(data->m120.q, data->m120.q, vector_quaternion_scratch); - if (moby->state != 8) { + if (moby->state != BIG_AXEBOT_STATE_HIT_RECOVERY) { data->f401 = moby->state; } data->f420 += frame_time_sq * 29.8f; @@ -926,7 +927,7 @@ void big_axebot_update(M_B7B0 *moby) { mark_moby_for_removal(moby); return; } - if (moby->state != 0) { + if (moby->state != BIG_AXEBOT_STATE_INITIALIZE) { float q[4]; float bone_transform[4][4]; float bone_euler_angles[4]; @@ -934,7 +935,7 @@ void big_axebot_update(M_B7B0 *moby) { data->f428 = fast_add_rotations(data->f428, fast_subtract_rotations(moby->rot[2], rot)); build_moby_bone_transform((char *)moby, 0xC, (char *)bone_transform); matrix_to_euler(bone_transform, bone_euler_angles); - FUN_L00_001fff28(q, 2, fast_subtract_rotations(target_yaw, data->f428)); + build_axis_rotation_quaternion(q, 2, fast_subtract_rotations(target_yaw, data->f428)); data->f428 = target_yaw; multiply_quaternions(data->m160.q, data->m160.q, q); } diff --git a/src/overlays/l04/mobys/blarg_trooper.c b/src/overlays/l04/mobys/blarg_trooper.c index 5cac8271cc..6dd97726d7 100644 --- a/src/overlays/l04/mobys/blarg_trooper.c +++ b/src/overlays/l04/mobys/blarg_trooper.c @@ -149,7 +149,8 @@ extern void record_moby_hit(void *, void *) __asm__("FUN_L00_00259a88"); extern void update_joint_animation(char *, char *, int, float, float) __asm__("FUN_L00_002628d8"); extern void spawn_blarg_trooper_projectile(void *, void *, void *, int) __asm__("FUN_L04_002aee30"); void destroy_blarg_trooper(struct Moby *arg) __asm__("FUN_L04_002c4808"); -extern int func_L00_002594C8_o(void *, void *, void *, float, float, float, float, int) __asm__("FUN_L00_00258490"); +extern int move_moby_xy_with_collision_constraints( + void *, void *, void *, float, float, float, float, int) __asm__("FUN_L00_00258490"); void blarg_trooper_update(struct Moby *moby) __asm__("FUN_L04_002c4850"); @@ -242,7 +243,7 @@ void blarg_trooper_update(struct Moby *moby) { target_distance = vector_distance_xy(pos, update_scratch.tgt); dmg = 0.0f; alive = compute_interpolated_record_value(moby); - if (moby->state != 0 && blarg_trooper_pvars->unk2E != 1) { + if (moby->state != BLARG_TROOPER_STATE_INITIALIZE && blarg_trooper_pvars->unk2E != 1) { char *o = blarg_trooper_pvars->gun_moby; if (o != 0) { mark_moby_for_removal(o); @@ -283,7 +284,7 @@ void blarg_trooper_update(struct Moby *moby) { r = hit_reaction(moby, hit, &blarg_trooper_pvars->health, 0, &hit_reaction_status, &dmg, 0, 4); fast_dec_timer_s16(&blarg_trooper_pvars->timer_F0); fast_dec_timer_s16(&blarg_trooper_pvars->timer_F2); - if (hit != 0 && moby->state < 0xB && blarg_trooper_pvars->timer_F0 == 0) { + if (hit != 0 && moby->state < BLARG_TROOPER_STATE_DYING && blarg_trooper_pvars->timer_F0 == 0) { char *o; float t; o = *(char **)(hit + 0x20); @@ -334,7 +335,7 @@ void blarg_trooper_update(struct Moby *moby) { fatal_knockback_yaw, moby, blarg_trooper_pvars->motion, 0xD, 1, 0); blarg_trooper_pvars->unkC0[0] = 12.0f; blarg_trooper_pvars->unkC0[1] = 25.0f; - moby->state = 0xB; + moby->state = BLARG_TROOPER_STATE_DYING; FUN_L00_00257470(moby, 0, -1); break; case BLARG_TROOPER_HIT_REACTION_START_HIT_RECOVERY: @@ -342,7 +343,7 @@ void blarg_trooper_update(struct Moby *moby) { int attacker_class; blarg_trooper_pvars->unk67 = 0x96; blend_moby_animation(moby, (void *)8, 0, (void *)scale_game_frames(5)); - moby->state = 8; + moby->state = BLARG_TROOPER_STATE_HIT_RECOVERY; attacker_class = *(short *)(*(char **)(hit + 0x20) + 0xA6); if (attacker_class == 0x131 || attacker_class == 0xB0) { blarg_trooper_pvars->unkF4 = 2.0f / scale_time(15.0f) * 0.5f; @@ -359,7 +360,7 @@ void blarg_trooper_update(struct Moby *moby) { case BLARG_TROOPER_HIT_REACTION_KNOCKBACK_RECOVERY: blarg_trooper_pvars->unk67 = 0xFA; blend_moby_animation(moby, (void *)0xC, 0, (void *)scale_game_frames(5)); - moby->state = 0xA; + moby->state = BLARG_TROOPER_STATE_KNOCKBACK_RECOVERY; blarg_trooper_pvars->unkF4 = 2.0f / scale_time(15.0f); *(OvlQuad *)update_scratch.w.p.v70 = *(OvlQuad *)(hit + 0x10); trooper_knockback_arc( @@ -405,11 +406,11 @@ void blarg_trooper_update(struct Moby *moby) { } if (blarg_trooper_pvars->unkFC != 0) { blend_moby_animation(moby, (void *)3, 0, (void *)scale_game_frames(0xA)); - moby->state = 5; + moby->state = BLARG_TROOPER_STATE_AIM; } else { blend_moby_animation( moby, (void *)((rand() ^ 1) & 1), 0, (void *)scale_game_frames(0xA)); - moby->state = 1; + moby->state = BLARG_TROOPER_STATE_IDLE; } break; case BLARG_TROOPER_STATE_IDLE: @@ -429,18 +430,18 @@ void blarg_trooper_update(struct Moby *moby) { } if (flag) { blend_moby_animation(moby, (void *)0xB, 0, (void *)scale_game_frames(8)); - moby->state = 3; + moby->state = BLARG_TROOPER_STATE_RUN_TO_TARGET_OR_PATH_POINT; break; } if (target_distance > 2.5f && best > 1.0f) { if (target_distance > 14.0f) { blend_moby_animation(moby, (void *)0xA, 0, (void *)scale_game_frames(8)); - moby->state = 2; + moby->state = BLARG_TROOPER_STATE_MOVE_TO_PATH_POINT; break; } if (target_distance < 8.0f && blarg_trooper_pvars->timer_108 == 0) { blend_moby_animation(moby, (void *)0xB, 0, (void *)scale_game_frames(8)); - moby->state = 3; + moby->state = BLARG_TROOPER_STATE_RUN_TO_TARGET_OR_PATH_POINT; break; } } @@ -454,14 +455,14 @@ void blarg_trooper_update(struct Moby *moby) { if (collision_line(update_scratch.w.p.v70, update_scratch.w.p.v80, 0, moby, 0) != 0 && D_L04_00173FD8 == target) { - moby->state = 5; + moby->state = BLARG_TROOPER_STATE_AIM; blend_moby_animation(moby, (void *)3, 0, (void *)scale_game_frames(7)); } } } else if (target_distance <= 2.5f) { int t = blarg_trooper_pvars->timer_F2; if (t <= 0) { - moby->state = 7; + moby->state = BLARG_TROOPER_STATE_MELEE_ATTACK; blend_moby_animation(moby, (void *)7, 0, (void *)scale_game_frames(7)); } else if (scale_game_frames(0x14) < t) { blarg_trooper_pvars->timer_F2 = scale_game_frames(0x14); @@ -471,7 +472,7 @@ void blarg_trooper_update(struct Moby *moby) { case BLARG_TROOPER_STATE_MOVE_TO_PATH_POINT: if (target_distance < 13.0f || best < 1.0f) { blend_moby_animation(moby, 0, 0, (void *)scale_game_frames(0xA)); - moby->state = 1; + moby->state = BLARG_TROOPER_STATE_IDLE; } else { float f; { @@ -496,7 +497,8 @@ void blarg_trooper_update(struct Moby *moby) { update_scratch.w.p.v70[1] = fast_sin(moby->rot.z) * (frame_time * 2.5f); update_scratch.w.p.v70[2] = 0.0f; fast_vec_add(update_scratch.w.p.v70, update_scratch.w.p.v70, pos); - func_L00_002594C8_o(moby, pos, update_scratch.w.p.v70, 0.5f, 1.0f, 0.5f, 0.5235988f, 0); + move_moby_xy_with_collision_constraints( + moby, pos, update_scratch.w.p.v70, 0.5f, 1.0f, 0.5f, 0.5235988f, 0); } break; case BLARG_TROOPER_STATE_RUN_TO_TARGET_OR_PATH_POINT: @@ -518,14 +520,14 @@ void blarg_trooper_update(struct Moby *moby) { update_scratch.w.p.v70[2] = 0.0f; fast_vec_add(update_scratch.w.p.v70, update_scratch.w.p.v70, pos); qcopy(update_scratch.w.p.v80, pos); - if (func_L00_002594C8_o(moby, - update_scratch.w.p.v80, - update_scratch.w.p.v70, - 0.5f, - 1.0f, - 0.5f, - 0.5235988f, - 0) != 0) { + if (move_moby_xy_with_collision_constraints(moby, + update_scratch.w.p.v80, + update_scratch.w.p.v70, + 0.5f, + 1.0f, + 0.5f, + 0.5235988f, + 0) != 0) { if (point_in_path_xy(update_scratch.w.p.v80, path->pts, path->count) != 0) { qcopy(pos, update_scratch.w.p.v80); k = 0xB; @@ -544,11 +546,11 @@ void blarg_trooper_update(struct Moby *moby) { fast_arc_tan(update_scratch.v50[0] - moby->pos.x, update_scratch.v50[1] - moby->pos.y), moby->rot.z) < 0.2617994f) { - moby->state = 7; + moby->state = BLARG_TROOPER_STATE_MELEE_ATTACK; blend_moby_animation(moby, (void *)7, 0, (void *)scale_game_frames(7)); blarg_trooper_pvars->unkFF = 0; } else if (target_distance < 14.0f) { - moby->state = 5; + moby->state = BLARG_TROOPER_STATE_AIM; blend_moby_animation(moby, (void *)3, 0, (void *)scale_game_frames(7)); blarg_trooper_pvars->unkFF = 0; } @@ -558,14 +560,14 @@ void blarg_trooper_update(struct Moby *moby) { fast_difference_between_rotations(fast_arc_tan(update_scratch.v50[0] - moby->pos.x, update_scratch.v50[1] - moby->pos.y), moby->rot.z) < 0.2617994f) { - moby->state = 7; + moby->state = BLARG_TROOPER_STATE_MELEE_ATTACK; blend_moby_animation(moby, (void *)7, 0, (void *)scale_game_frames(7)); } else if (target_distance > 9.0f) { - moby->state = 5; + moby->state = BLARG_TROOPER_STATE_AIM; blend_moby_animation(moby, (void *)3, 0, (void *)scale_game_frames(7)); } else if (best < 1.0f) { blend_moby_animation(moby, 0, 0, (void *)scale_game_frames(0xA)); - moby->state = 1; + moby->state = BLARG_TROOPER_STATE_IDLE; } else { { float a = fast_arc_tan(update_scratch.v60[0] - moby->pos.x, @@ -581,7 +583,7 @@ void blarg_trooper_update(struct Moby *moby) { update_scratch.w.p.v70[1] = fast_sin(moby->rot.z) * (frame_time * 6.0f); update_scratch.w.p.v70[2] = 0.0f; fast_vec_add(update_scratch.w.p.v70, update_scratch.w.p.v70, pos); - func_L00_002594C8_o( + move_moby_xy_with_collision_constraints( moby, pos, update_scratch.w.p.v70, 0.5f, 1.0f, 0.5f, 0.5235988f, 0); } } @@ -592,7 +594,7 @@ void blarg_trooper_update(struct Moby *moby) { blarg_trooper_pvars->unkD0[0] = -(frame_time * 7.668f); } else if (moby->anim_flags & 2) { blend_moby_animation(moby, 0, 0, (void *)scale_game_frames(0xA)); - moby->state = 1; + moby->state = BLARG_TROOPER_STATE_IDLE; } break; case BLARG_TROOPER_STATE_AIM: { @@ -611,17 +613,17 @@ void blarg_trooper_update(struct Moby *moby) { if (!flag && target_distance > 2.5f && best > 1.0f) { if (target_distance > 14.0f) { blend_moby_animation(moby, (void *)0xA, 0, (void *)scale_game_frames(9)); - moby->state = 2; + moby->state = BLARG_TROOPER_STATE_MOVE_TO_PATH_POINT; break; } if (target_distance < 8.0f && blarg_trooper_pvars->timer_108 == 0) { blend_moby_animation(moby, (void *)0xB, 0, (void *)scale_game_frames(5)); - moby->state = 3; + moby->state = BLARG_TROOPER_STATE_RUN_TO_TARGET_OR_PATH_POINT; break; } } if (target_distance < 2.5f) { - moby->state = 7; + moby->state = BLARG_TROOPER_STATE_MELEE_ATTACK; blend_moby_animation(moby, (void *)7, 0, (void *)scale_game_frames(7)); break; } @@ -636,7 +638,7 @@ void blarg_trooper_update(struct Moby *moby) { moby->rot.z, fast_arc_tan(update_scratch.v50[0] - moby->pos.x, update_scratch.v50[1] - moby->pos.y)) < 0.7853982f) { - moby->state = 6; + moby->state = BLARG_TROOPER_STATE_FIRE; blend_moby_animation(moby, (void *)5, 0, (void *)scale_game_frames(7)); blarg_trooper_pvars->timer_F2 = scale_game_frames(0x1E); blarg_trooper_pvars->unkFD = 3; @@ -662,7 +664,7 @@ void blarg_trooper_update(struct Moby *moby) { frame_time * 4.712389f); } if (target_distance < 2.5f) { - moby->state = 7; + moby->state = BLARG_TROOPER_STATE_MELEE_ATTACK; blend_moby_animation(moby, (void *)7, 0, (void *)scale_game_frames(7)); } if (moby->prev_seq == 5 && blarg_trooper_pvars->unkD0[2] < 2.0f && alive >= 2.0f && @@ -686,7 +688,7 @@ void blarg_trooper_update(struct Moby *moby) { } else if ((moby->anim_flags & 2) && blarg_trooper_pvars->timer_F2 == 0 && blarg_trooper_pvars->unkFD == 0) { blarg_trooper_pvars->timer_F2 = scale_game_frames(0xB4); - moby->state = 5; + moby->state = BLARG_TROOPER_STATE_AIM; blend_moby_animation(moby, (void *)4, 0, (void *)scale_game_frames(0xA)); } break; @@ -726,7 +728,7 @@ void blarg_trooper_update(struct Moby *moby) { } } if (moby->anim_flags & 2) { - moby->state = 5; + moby->state = BLARG_TROOPER_STATE_AIM; blarg_trooper_pvars->timer_F2 = scale_game_frames(0x14); blend_moby_animation(moby, (void *)4, 0, (void *)scale_game_frames(7)); } @@ -743,13 +745,17 @@ void blarg_trooper_update(struct Moby *moby) { fast_vec_add(update_scratch.w.p.v70, update_scratch.w.p.v70, pos); blarg_trooper_pvars->unkF4 = blarg_trooper_pvars->unkF4 + -2.0f / (scale_time(15.0f) * scale_time(15.0f)); - func_L00_002594C8_o(moby, pos, update_scratch.w.p.v70, 0.5f, 1.0f, 0.5f, 0.5235988f, 1); + move_moby_xy_with_collision_constraints( + moby, pos, update_scratch.w.p.v70, 0.5f, 1.0f, 0.5f, 0.5235988f, 1); } if (moby->anim_flags & 2) { *(unsigned short *)&blarg_trooper_pvars->path_selector ^= 1; blend_moby_animation( - moby, (void *)(moby->state == 9 ? 9 : 0), 0, (void *)scale_game_frames(9)); - moby->state = 1; + moby, + (void *)(moby->state == BLARG_TROOPER_STATE_BACKWARD_RECOVERY ? 9 : 0), + 0, + (void *)scale_game_frames(9)); + moby->state = BLARG_TROOPER_STATE_IDLE; blarg_trooper_pvars->timer_108 = scale_game_frames(0x78); } break; @@ -763,8 +769,10 @@ void blarg_trooper_update(struct Moby *moby) { trooper_anim_finish(moby, &blarg_trooper_pvars->anim_state); { int current_state = moby->state; - if (current_state == 1 || current_state == 3 || current_state == 4 || current_state == 5 || - current_state == 6) { + if (current_state == BLARG_TROOPER_STATE_IDLE || + current_state == BLARG_TROOPER_STATE_RUN_TO_TARGET_OR_PATH_POINT || + current_state == BLARG_TROOPER_STATE_JUMP || current_state == BLARG_TROOPER_STATE_AIM || + current_state == BLARG_TROOPER_STATE_FIRE) { char *t = target; if (t == 0) { t = *(char **)((char *)(&hero.moby)); diff --git a/src/overlays/l04/mobys/circular_saw_enemy.c b/src/overlays/l04/mobys/circular_saw_enemy.c index 5a0f633215..2fcfcc1892 100644 --- a/src/overlays/l04/mobys/circular_saw_enemy.c +++ b/src/overlays/l04/mobys/circular_saw_enemy.c @@ -23,6 +23,19 @@ #include "rnc/world/collision/ground_probe.h" /* The engine-sound fields of the moby's pvars. */ +enum { + CIRCULAR_SAW_STATE_INITIALIZE = 0, + CIRCULAR_SAW_STATE_IDLE = 1, + CIRCULAR_SAW_STATE_JUMP = 2, + CIRCULAR_SAW_STATE_CHASE_TARGET = 3, + CIRCULAR_SAW_STATE_FOLLOW_PATH = 4, + CIRCULAR_SAW_STATE_POINT_ATTACK = 5, + CIRCULAR_SAW_STATE_HIT_RECOVERY = 6, + CIRCULAR_SAW_STATE_MELEE_ATTACK = 7, + CIRCULAR_SAW_STATE_DYING = 8, + CIRCULAR_SAW_STATE_SUCK_CANNON_CONTROLLED = 9 +}; + typedef struct { /* 0x000 */ u8 pad0[0x230]; /* 0x230 */ f32 volume; @@ -53,7 +66,7 @@ void update_circular_saw_engine_sound(struct Moby *moby) { f32 volume; f32 pitch; - if (moby->state != 9) { + if (moby->state != CIRCULAR_SAW_STATE_SUCK_CANNON_CONTROLLED) { if (voice_is_playing((long)moby, engine_sound_vars->voice) == 0 && moby->prev_seq < 8) { engine_sound_vars->voice = allocate_voice_for_target_entry(0, 4, moby); engine_sound_vars->volume = convert_integer_to_float(0x400); @@ -466,9 +479,10 @@ I4_35F0 D_L04_00161890 = { extern float fast_cos(float); extern float fast_sin(float); extern int collect_mobies_in_sphere(void *, int, void *, void *, float) __asm__("FUN_L00_001f2868"); -extern int FUN_L00_00258490(void *, void *, void *, int, float, float, float, float); -extern int FUN_L00_002dc9f0(void *, void *); -short D_L04_00161878 = 0x101; +extern int move_moby_xy_with_collision_constraints( + void *, void *, void *, int, float, float, float, float) __asm__("FUN_L00_00258490"); +extern int FUN_L00_002dc9f0(void *, void *); +short D_L04_00161878 = 0x101; extern void FUN_L01_0026d930(char *p); extern void update_circular_saw_engine_sound(struct Moby *) __asm__("FUN_L04_002c1b80"); extern void transform_vector_by_basis(void *, void *, void *); @@ -480,17 +494,6 @@ void circular_saw_enemy_update(M_35F0 *moby) __asm__("FUN_L04_002c2270"); /* Moby class 340 */ void circular_saw_enemy_update(M_35F0 *moby) { - enum { - CIRCULAR_SAW_STATE_INITIALIZE = 0, - CIRCULAR_SAW_STATE_IDLE = 1, - CIRCULAR_SAW_STATE_JUMP = 2, - CIRCULAR_SAW_STATE_CHASE_TARGET = 3, - CIRCULAR_SAW_STATE_FOLLOW_PATH = 4, - CIRCULAR_SAW_STATE_POINT_ATTACK = 5, - CIRCULAR_SAW_STATE_HIT_RECOVERY = 6, - CIRCULAR_SAW_STATE_MELEE_ATTACK = 7, - CIRCULAR_SAW_STATE_DYING = 8 - }; enum { CIRCULAR_SAW_HIT_REACTION_NONE = 0, CIRCULAR_SAW_HIT_REACTION_FATAL = 1, @@ -539,16 +542,16 @@ void circular_saw_enemy_update(M_35F0 *moby) { qcopy(dest, moby->pos); moby->f30 = 0x20; update_circular_saw_engine_sound((struct Moby *)moby); - if (moby->state == 1 || moby->state == 3) { + if (moby->state == CIRCULAR_SAW_STATE_IDLE || moby->state == CIRCULAR_SAW_STATE_CHASE_TARGET) { H_35F0 *h = (H_35F0 *)(((char *)((char *)&hero))); if (h->f240 == moby || fast_vec_dist(moby->pos, h->pos) < 1.5f) { blend_moby_animation(moby, (void *)7, 0, (void *)scale_game_frames(10)); data->f146 = scale_game_frames(0x3C); - moby->state = 7; + moby->state = CIRCULAR_SAW_STATE_MELEE_ATTACK; } } FUN_L00_001fefc8(&data->f14D); - if (moby->state != 8 && moby->state != 0) { + if (moby->state != CIRCULAR_SAW_STATE_DYING && moby->state != CIRCULAR_SAW_STATE_INITIALIZE) { int unused_hit_reaction_output; float dmg; Hit_35F0 *hit; @@ -558,7 +561,7 @@ void circular_saw_enemy_update(M_35F0 *moby) { dmg = 0.0f; hit = find_moby_hit(moby, 0x210000, 0); r = hit_reaction(moby, hit, &data->hp, 0, &unused_hit_reaction_output, &dmg, 0, 4); - if (hit != 0 && moby->state != 0 && data->f14D == 0) { + if (hit != 0 && moby->state != CIRCULAR_SAW_STATE_INITIALIZE && data->f14D == 0) { if (hit->att != 0) { struct Hero *h = &hero; if (hit->att != h->items[0].moby) { @@ -605,7 +608,7 @@ void circular_saw_enemy_update(M_35F0 *moby) { } else { data->f13C = 10.0f / scale_time(15.0f); } - moby->state = 6; + moby->state = CIRCULAR_SAW_STATE_HIT_RECOVERY; moby->rot = fast_add_rotations(3.1415927f, ang); data->fB7 = 0x78; trooper_anim_update(moby, (short *)data->fB0); @@ -629,7 +632,8 @@ void circular_saw_enemy_update(M_35F0 *moby) { } data->f38 = 0; fast_dec_timer_s16(&data->f136); - if (moby->state == 7 && moby->f52 == 7 && hd > 15.0f && hd < 44.0f) { + if (moby->state == CIRCULAR_SAW_STATE_MELEE_ATTACK && moby->f52 == 7 && hd > 15.0f && + hd < 44.0f) { int i; for (i = 0; i < 4; i++) { S_35F0 melee_hit_parameters; @@ -652,7 +656,7 @@ void circular_saw_enemy_update(M_35F0 *moby) { } } } - if (moby->state != 0 && data->f2E != 1) { + if (moby->state != CIRCULAR_SAW_STATE_INITIALIZE && data->f2E != 1) { int engine_voice_index = data->f238; if (engine_voice_index != -1) { char *e = (char *)((char *)&D_0013E550) + engine_voice_index * 0x70; @@ -696,9 +700,9 @@ void circular_saw_enemy_update(M_35F0 *moby) { data->f136 = 0; data->f144 = 0; if (data->f150 == -1) { - moby->state = 1; + moby->state = CIRCULAR_SAW_STATE_IDLE; } else { - moby->state = 4; + moby->state = CIRCULAR_SAW_STATE_FOLLOW_PATH; } break; } @@ -733,13 +737,13 @@ void circular_saw_enemy_update(M_35F0 *moby) { check_circular_saw_melee_attack_spacing((char *)moby) != 0) { blend_moby_animation(moby, (void *)7, 0, (void *)scale_game_frames(10)); data->f146 = scale_game_frames(0x3C); - moby->state = 7; + moby->state = CIRCULAR_SAW_STATE_MELEE_ATTACK; } else if (flag ? target_distance < data->f140 * 2.0f : target_distance < data->f140) { if (data->f146 == 0) { blend_moby_animation(moby, (void *)1, 0, (void *)scale_game_frames(10)); data->f14C = 0; - moby->state = 3; + moby->state = CIRCULAR_SAW_STATE_CHASE_TARGET; } } } @@ -753,7 +757,7 @@ void circular_saw_enemy_update(M_35F0 *moby) { data->f78 = -(frame_time * 7.668f); } else if (moby->f70 & 2) { blend_moby_animation(moby, 0, 0, (void *)scale_game_frames(10)); - moby->state = 1; + moby->state = CIRCULAR_SAW_STATE_IDLE; } break; case CIRCULAR_SAW_STATE_CHASE_TARGET: @@ -768,13 +772,13 @@ void circular_saw_enemy_update(M_35F0 *moby) { check_circular_saw_melee_attack_spacing((char *)moby) != 0) { blend_moby_animation(moby, (void *)7, 0, (void *)scale_game_frames(10)); data->f146 = scale_game_frames(0x3C); - moby->state = 7; + moby->state = CIRCULAR_SAW_STATE_MELEE_ATTACK; } } else if (flag == 0) { qcopy(dest, data->f120); if (vector_distance_xy(moby->pos, data->f120) < 1.0f) { blend_moby_animation(moby, 0, 0, (void *)scale_game_frames(10)); - moby->state = 1; + moby->state = CIRCULAR_SAW_STATE_IDLE; } } func_L00_002592B0_b((char *)moby, @@ -805,13 +809,13 @@ void circular_saw_enemy_update(M_35F0 *moby) { check_circular_saw_melee_attack_spacing((char *)moby) != 0) { blend_moby_animation(moby, (void *)7, 0, (void *)scale_game_frames(10)); data->f146 = scale_game_frames(0x3C); - moby->state = 7; + moby->state = CIRCULAR_SAW_STATE_MELEE_ATTACK; } else if (flag ? target_distance < data->f140 * 2.0f : target_distance < data->f140) { if (data->f146 == 0) { blend_moby_animation(moby, (void *)1, 0, (void *)scale_game_frames(10)); data->f14C = 0; - moby->state = 3; + moby->state = CIRCULAR_SAW_STATE_CHASE_TARGET; } } } @@ -832,7 +836,7 @@ void circular_saw_enemy_update(M_35F0 *moby) { if (data->f146 == 0 && data->f160[i] != -1 && is_point_inside_clip_volume(moby->pos, data->f160[i]) != 0) { data->f158 = data->f160[i]; - moby->state = 5; + moby->state = CIRCULAR_SAW_STATE_POINT_ATTACK; data->f15A = 0; break; } @@ -869,14 +873,14 @@ void circular_saw_enemy_update(M_35F0 *moby) { check_circular_saw_melee_attack_spacing((char *)moby) != 0) { blend_moby_animation(moby, (void *)7, 0, (void *)scale_game_frames(10)); data->f146 = scale_game_frames(0x3C); - moby->state = 7; + moby->state = CIRCULAR_SAW_STATE_MELEE_ATTACK; data->f130 = 0.0f; } else if (flag ? target_distance < data->f140 * 2.0f : target_distance < data->f140) { if (data->f146 == 0) { blend_moby_animation(moby, (void *)1, 0, (void *)scale_game_frames(10)); data->f14C = 0; - moby->state = 3; + moby->state = CIRCULAR_SAW_STATE_CHASE_TARGET; } } } @@ -927,7 +931,7 @@ void circular_saw_enemy_update(M_35F0 *moby) { moby->rot, fast_arc_tan(path->pts[data->f154][0] - moby->pos[0], path->pts[data->f154][1] - moby->pos[1])) < 0.17453292f) { - moby->state = 4; + moby->state = CIRCULAR_SAW_STATE_FOLLOW_PATH; data->f146 = scale_game_frames(0xF0); } break; @@ -941,7 +945,7 @@ void circular_saw_enemy_update(M_35F0 *moby) { if (data->f146 == 0 && (hd > 44.0f || (moby->f70 & 2))) { blend_moby_animation(moby, 0, 0, (void *)scale_game_frames(5)); data->f146 = scale_game_frames(0x78); - moby->state = 1; + moby->state = CIRCULAR_SAW_STATE_IDLE; data->f14E |= 2; } func_L00_002592B0_b((char *)moby, @@ -955,7 +959,7 @@ void circular_saw_enemy_update(M_35F0 *moby) { if ((moby->f52 == 8 && compute_interpolated_record_value(moby) > 30.0f) || (moby->f70 & 2)) { blend_moby_animation(moby, 0, 0, (void *)scale_game_frames(10)); - moby->state = 1; + moby->state = CIRCULAR_SAW_STATE_IDLE; data->f146 = 0; } break; @@ -966,9 +970,9 @@ void circular_saw_enemy_update(M_35F0 *moby) { return; } break; - case 9: + case CIRCULAR_SAW_STATE_SUCK_CANNON_CONTROLLED: if (FUN_L00_002dc9f0(moby, data->fC0) != 0) { - moby->state = 0; + moby->state = CIRCULAR_SAW_STATE_INITIALIZE; data->f1E8 = 0; } break; @@ -981,13 +985,14 @@ void circular_saw_enemy_update(M_35F0 *moby) { v[2] = 0.0f; fast_vec_add(v, v, moby->pos); data->f13C += -10.0f / (scale_time(15.0f) * scale_time(15.0f)); - FUN_L00_00258490(moby, moby->pos, v, 1, 0.25f, 0.57f, 0.5f, 0.5235988f); + move_moby_xy_with_collision_constraints( + moby, moby->pos, v, 1, 0.25f, 0.57f, 0.5f, 0.5235988f); } } - if (moby->state == 9) { + if (moby->state == CIRCULAR_SAW_STATE_SUCK_CANNON_CONTROLLED) { return; } - if (moby->state == 4) { + if (moby->state == CIRCULAR_SAW_STATE_FOLLOW_PATH) { V4_35F0 v; V4_35F0 np; { @@ -999,7 +1004,7 @@ void circular_saw_enemy_update(M_35F0 *moby) { v[2] = 0.0f; fast_vec_add(v, v, moby->pos); qcopy(np, moby->pos); - FUN_L00_00258490(moby, np, v, 0, 0.25f, 0.57f, 0.5f, 0.5235988f); + move_moby_xy_with_collision_constraints(moby, np, v, 0, 0.25f, 0.57f, 0.5f, 0.5235988f); if (data->f138 == -1 || point_in_path_xy(np, ((P_35F0 *)l04_paths[data->f138])->pts, @@ -1007,7 +1012,7 @@ void circular_saw_enemy_update(M_35F0 *moby) { qcopy(moby->pos, np); } } - } else if (moby->state == 3) { + } else if (moby->state == CIRCULAR_SAW_STATE_CHASE_TARGET) { V4_35F0 v; V4_35F0 np; float ang = fast_arc_tan(dest[0] - moby->pos[0], dest[1] - moby->pos[1]); @@ -1042,7 +1047,8 @@ void circular_saw_enemy_update(M_35F0 *moby) { anim = 0; } qcopy(np, moby->pos); - moved = FUN_L00_00258490(moby, np, v, 0, 0.25f, 0.57f, 0.5f, 0.5235988f); + moved = move_moby_xy_with_collision_constraints( + moby, np, v, 0, 0.25f, 0.57f, 0.5f, 0.5235988f); if (data->f138 == -1 || point_in_path_xy(np, ((P_35F0 *)l04_paths[data->f138])->pts, @@ -1059,7 +1065,8 @@ void circular_saw_enemy_update(M_35F0 *moby) { data->f144 = scale_game_frames(0xF); } } - } else if (moby->state == 5 || (moby->state == 7 && moby->f52 == 7 && hd > 15.0f)) { + } else if (moby->state == CIRCULAR_SAW_STATE_POINT_ATTACK || + (moby->state == CIRCULAR_SAW_STATE_MELEE_ATTACK && moby->f52 == 7 && hd > 15.0f)) { if (vector_distance_xy(moby->pos, dest) > frame_time * 2.0f) { V4_35F0 v; V4_35F0 np; @@ -1071,7 +1078,8 @@ void circular_saw_enemy_update(M_35F0 *moby) { v[2] = 0.0f; fast_vec_add(v, v, moby->pos); qcopy(np, moby->pos); - FUN_L00_00258490(moby, np, v, 0, 0.25f, 1.25f, 0.5f, 0.5235988f); + move_moby_xy_with_collision_constraints( + moby, np, v, 0, 0.25f, 1.25f, 0.5f, 0.5235988f); if (data->f138 == -1 || point_in_path_xy(np, ((P_35F0 *)l04_paths[data->f138])->pts, @@ -1080,11 +1088,13 @@ void circular_saw_enemy_update(M_35F0 *moby) { } } } - } else if (moby->state != 6 && moby->state != 8) { + } else if (moby->state != CIRCULAR_SAW_STATE_HIT_RECOVERY && + moby->state != CIRCULAR_SAW_STATE_DYING) { V4_35F0 v; { qcopy(v, moby->pos); - FUN_L00_00258490(moby, moby->pos, v, 0, 0.25f, 0.57f, 0.5f, 0.5235988f); + move_moby_xy_with_collision_constraints( + moby, moby->pos, v, 0, 0.25f, 0.57f, 0.5f, 0.5235988f); } } data->f78 += frame_time_sq * 9.8f; @@ -1144,9 +1154,9 @@ int launch_circular_saw_enemy_from_suck_cannon(struct Moby *moby, int hit_processing_result = launch_suck_cannon_projectile( moby, input_quad_address, launch_position_source, launch_position_offset); if (hit_processing_result != 0) { - moby->state = 0x9; - } else if ((unsigned char)moby->state == 0x9) { - moby->state = 1; + moby->state = CIRCULAR_SAW_STATE_SUCK_CANNON_CONTROLLED; + } else if ((unsigned char)moby->state == CIRCULAR_SAW_STATE_SUCK_CANNON_CONTROLLED) { + moby->state = CIRCULAR_SAW_STATE_IDLE; } if (*(short *)(moby_callback_result + 0x68) == 6) { allocate_voice_for_target_entry(1, 0, moby); diff --git a/src/overlays/l04/mobys/cutscene_camera_target.c b/src/overlays/l04/mobys/cutscene_camera_target.c index 220c606128..33c7d70b60 100644 --- a/src/overlays/l04/mobys/cutscene_camera_target.c +++ b/src/overlays/l04/mobys/cutscene_camera_target.c @@ -29,7 +29,7 @@ void cutscene_camera_target_update(struct Moby *moby) { switch (moby->state) { case MODE_SLOT_STATE_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = MODE_SLOT_STATE_DISPATCH_SELECTED_SLOT; break; case MODE_SLOT_STATE_DISPATCH_SELECTED_SLOT: if (D_L04_0015F5C4 == 2) { diff --git a/src/overlays/l04/mobys/eudora_bridge.c b/src/overlays/l04/mobys/eudora_bridge.c index c8963205aa..6ce8a0b31d 100644 --- a/src/overlays/l04/mobys/eudora_bridge.c +++ b/src/overlays/l04/mobys/eudora_bridge.c @@ -54,7 +54,7 @@ void eudora_bridge_update(struct Moby *moby) { switch (moby->state) { case EUDORA_BRIDGE_STATE_INITIALIZE: blend_moby_animation(moby, 1, 0, scale_game_frames(300)); - moby->state = 1; + moby->state = EUDORA_BRIDGE_STATE_FOLLOW_LINKED_SWITCH; moby->anim_speed = 0; switch_follower_vars->voice = -1; if (moby->oclass == 0x1B0) { @@ -100,7 +100,7 @@ void eudora_bridge_update(struct Moby *moby) { moby->unk72 = ((MobyClassHeader *)moby->pclass)->unkE; moby->collision = ((MobyClassHeader *)moby->pclass)->unk10; refresh_moby_spatial_bounds_from_basis(moby); - moby->state = 2; + moby->state = EUDORA_BRIDGE_STATE_RELEASE_MOVEMENT_VOICE; } } else if (!voice_is_playing(moby, switch_follower_vars->voice)) { switch_follower_vars->voice = allocate_voice_for_target_entry(0, 4, moby); diff --git a/src/overlays/l04/mobys/floating_platform.c b/src/overlays/l04/mobys/floating_platform.c index fa046084bc..169248d2f1 100644 --- a/src/overlays/l04/mobys/floating_platform.c +++ b/src/overlays/l04/mobys/floating_platform.c @@ -41,7 +41,7 @@ void floating_platform_update(char *moby) { case FLOATING_PLATFORM_INITIALIZE: { int i; MOBY(moby)->anim_speed = random_float_between(0.5f, 0.8f); - MOBY(moby)->state = 1; + MOBY(moby)->state = FLOATING_PLATFORM_UPDATE_MOTION; *(float *)(platform_vars + 0x220) = MOBY(moby)->pos.z + 15.0f; ((unsigned char *)moby)[0x30] = 0xFF; *(short *)(platform_vars + 0x3E) = 0xD; diff --git a/src/overlays/l04/mobys/help_hints.c b/src/overlays/l04/mobys/help_hints.c index a34d313ad0..32a6e8b1bd 100644 --- a/src/overlays/l04/mobys/help_hints.c +++ b/src/overlays/l04/mobys/help_hints.c @@ -78,7 +78,7 @@ void help_hints_update(Moby *moby) { switch (moby->state) { case TUTORIAL_TRIGGER_STATE_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = TUTORIAL_TRIGGER_STATE_UPDATE_HINTS_AND_STATS; tutorial_trigger_vars->f14 = -1; break; case TUTORIAL_TRIGGER_STATE_UPDATE_HINTS_AND_STATS: diff --git a/src/overlays/l04/mobys/leaf.c b/src/overlays/l04/mobys/leaf.c index bb7fd19032..7853246f53 100644 --- a/src/overlays/l04/mobys/leaf.c +++ b/src/overlays/l04/mobys/leaf.c @@ -50,7 +50,7 @@ void leaf_update(struct Moby *moby) { qcopy(leaf_vars + 0x30, &moby->pos); *(int *)(leaf_vars + 0x40) = *(int *)(leaf_vars + 0x44) = random_int_between(120, 2400); *(float *)(leaf_vars + 0x4c) = moby->scale * random_float_between(0.8f, 1.2f); - moby->state = 1; + moby->state = LEAF_WAIT_FOR_ACTIVATION; break; case LEAF_WAIT_FOR_ACTIVATION: if (!(vector_distance_xy(&moby->pos, D_L04_00166F40) < 32.0f)) @@ -74,7 +74,7 @@ void leaf_update(struct Moby *moby) { fast_vec_normalize(motion + 8, &initialDirection, 0.098174773f); fast_vec_normalize(motion + 4, &initialDirection, leaf_motion_parameters[5] * 0.5f); *(int *)(motion + 16) = *(int *)(motion + 17) = random_int_between(720, 1200); - moby->state = 2; + moby->state = LEAF_UPDATE_MOTION; return; case LEAF_UPDATE_MOTION: fast_dec_timer((int *)(leaf_vars + 0x44)); @@ -138,7 +138,7 @@ void leaf_update(struct Moby *moby) { /* Preserve the retail ordering of the timer reload stores. */ *(volatile int *)(leaf_vars + 0x40) = timer; *(volatile int *)(leaf_vars + 0x44) = timer; - moby->state = 1; + moby->state = LEAF_WAIT_FOR_ACTIVATION; break; default: return; diff --git a/src/overlays/l04/mobys/leg_walker.c b/src/overlays/l04/mobys/leg_walker.c index 4e1f6f14f8..748bec76b8 100644 --- a/src/overlays/l04/mobys/leg_walker.c +++ b/src/overlays/l04/mobys/leg_walker.c @@ -20,6 +20,10 @@ /* Ported from rac1-decomp (src/overlays/l04_eudora/vuchain_00293490.c: func_L04_00293490), where it is exact; names translated to the US level program. */ +enum { + LEG_RIG_FALLBACK_GAIT_MASK = 5 +}; + extern float D_L04_00173FE8 NOT_SDA; float probe_leg_rig_ground_height(float *probe_origin) __asm__("FUN_L04_002922d0"); @@ -119,7 +123,7 @@ void initialize_leg_rig(struct Moby *moby, LegRig *rig) { rig->unkD8 = 0; rig->unkE4 = 0; rig->unkEC = 0; - rig->mode = 5; + rig->mode = LEG_RIG_FALLBACK_GAIT_MASK; debug_print(rig_size_message, 0x250); } /* Ported from rac1-decomp (src/overlays/l04_eudora/vuchain_00293490.c: func_L04_00293990), where it is exact; names translated to the US level program. */ @@ -347,11 +351,11 @@ void FUN_L04_00292d48(struct Moby *moby, LegRig *rig, int flags) { rig->legs[i].yaw = fast_add_rotations(rig->legs[i].upper_turn, base_yaw); rig->legs[i].yaw = fast_add_rotations(rig->legs[i].lower_turn, rig->legs[i].yaw); if (rig->legs[i].manip_b.attached) - rotation_2D5FA8(rig->legs[i].manip_b.rot, 2, rig->legs[i].upper_turn); + build_axis_rotation_quaternion(rig->legs[i].manip_b.rot, 2, rig->legs[i].upper_turn); if (rig->legs[i].manip_a.attached) { - rotation_2D5FA8(rig->legs[i].manip_a.rot, 2, rig->legs[i].lower_turn); + build_axis_rotation_quaternion(rig->legs[i].manip_a.rot, 2, rig->legs[i].lower_turn); if (flags & mask) { - rotation_2D5FA8(tilt, 0, -moby->rot.x); + build_axis_rotation_quaternion(tilt, 0, -moby->rot.x); multiply_quaternions(rig->legs[i].manip_a.rot, rig->legs[i].manip_a.rot, tilt); } } @@ -468,10 +472,10 @@ s32 leg_walker_update(struct Moby *moby, LegRig *rig, f32 speed, f32 heading, f3 fast_vec_add(pos, pos, &shift); { f32 max_step = rig->unkC4; - s32 old = rig->mode; + s32 previous_mode = rig->mode; rig->mode = mode; - changed = (mode ^ old) & mode; + changed = (mode ^ previous_mode) & mode; if (max_step < step) step = max_step; } @@ -521,19 +525,19 @@ s32 leg_walker_update(struct Moby *moby, LegRig *rig, f32 speed, f32 heading, f3 moby->anim_speed = 1.0f; if (rig->unkB7 != 0) { LegRigAnim **fallback = rig->anims; - LegRigAnim **entry; + LegRigAnim **animation_record_cursor; s32 seq = moby->seq; f32 min_turn = 0.09239978f; - for (i = 0, entry = fallback; i < 13; i++) { - if ((*entry)->id == seq) { + for (i = 0, animation_record_cursor = fallback; i < 13; i++) { + if ((*animation_record_cursor)->id == seq) { LegRigAnim *anim; f32 rate; if (!(rig->speed < frame_time * 0.19f) || !(min_turn < fast_difference_between_rotations(moby->rot.z, heading)) || !(speed < (rate = frame_time * 0.19f))) { - anim = *entry; + anim = *animation_record_cursor; rate = rig->speed; } else { anim = *fallback; @@ -541,7 +545,7 @@ s32 leg_walker_update(struct Moby *moby, LegRig *rig, f32 speed, f32 heading, f3 moby->anim_speed = frame_scale_inv * absolute_float(rate / anim->rate); break; } - entry++; + animation_record_cursor++; fallback++; } } @@ -599,7 +603,7 @@ void reset_leg_rig_from_animation(struct Moby *moby, LegRig *rig) { animation_time = convert_integer_to_float(moby->prev_frame); animation_time += animation_start(moby->class_slot, moby->prev_seq); } - rig->mode = 5; + rig->mode = LEG_RIG_FALLBACK_GAIT_MASK; rig->speed = 0.0f; rig->unkB7 = 0; animation_cursor = rig->anims; diff --git a/src/overlays/l04/mobys/lieutenant.c b/src/overlays/l04/mobys/lieutenant.c index 4a5e8a0596..ef3ee56276 100644 --- a/src/overlays/l04/mobys/lieutenant.c +++ b/src/overlays/l04/mobys/lieutenant.c @@ -72,12 +72,12 @@ void lieutenant_update(struct Moby *moby) { switch (moby->state) { case LIEUTENANT_STATE_INITIALIZE: if (D_0014C050[((struct VendorMobyView *)moby)->slot + current_level_index * 16] == 0xFF) { - moby->state = 3; + moby->state = LIEUTENANT_STATE_DISABLED; moby->flags |= 0x41; moby->collision = 0; break; } - moby->state = 1; + moby->state = LIEUTENANT_STATE_UPDATE_DIALOGUE; initialize_npc_dialogue(moby, lieutenant_dialogue_vars); break; case LIEUTENANT_STATE_UPDATE_DIALOGUE: @@ -86,7 +86,7 @@ void lieutenant_update(struct Moby *moby) { else lieutenant_dialogue_vars->alpha = 1.0f; if (update_npc_dialogue(moby, lieutenant_dialogue_vars)) - moby->state = 2; + moby->state = LIEUTENANT_STATE_UNLOCK_PLANET_AND_DISABLE; break; case LIEUTENANT_STATE_UNLOCK_PLANET_AND_DISABLE: if (lieutenant_dialogue_vars->phase == 2) { @@ -101,7 +101,7 @@ void lieutenant_update(struct Moby *moby) { qcopy(&l04_lieutenant_shop_camera.rot, rotation_ptr); l04_lieutenant_shop_camera.active = 1; memcard_save_data(0, -1); - moby->state = 3; + moby->state = LIEUTENANT_STATE_DISABLED; moby->flags |= 0x41; moby->collision = 0; break; diff --git a/src/overlays/l04/mobys/pipe.c b/src/overlays/l04/mobys/pipe.c index 5bfbfa8f46..79a89511fe 100644 --- a/src/overlays/l04/mobys/pipe.c +++ b/src/overlays/l04/mobys/pipe.c @@ -25,13 +25,13 @@ void pipe_update(struct Moby *pipe_moby) { struct Moby *hit_moby = find_moby_hit(pipe_moby, 0x10000, 0); switch (pipe_moby->state) { case PIPE_INITIALIZE: - pipe_moby->state = 1; + pipe_moby->state = PIPE_WAIT_FOR_HIT; break; case PIPE_WAIT_FOR_HIT: if (hit_moby != 0 && hit_moby->scale > 0.0f) hit = 1; if (hit) - pipe_moby->state = 2; + pipe_moby->state = PIPE_REMOVE; break; case PIPE_REMOVE: allocate_voice_for_target_entry(0, 0, (int)pipe_moby); diff --git a/src/overlays/l04/mobys/platform_booster.c b/src/overlays/l04/mobys/platform_booster.c index f857916a3b..50c08bd12b 100644 --- a/src/overlays/l04/mobys/platform_booster.c +++ b/src/overlays/l04/mobys/platform_booster.c @@ -58,7 +58,7 @@ void platform_booster_update(struct Moby *moby) { switch (moby->state) { case PLATFORM_BOOSTER_STATE_INITIALIZE: blend_moby_animation(moby, 1, 0, scale_game_frames(300)); - moby->state = 1; + moby->state = PLATFORM_BOOSTER_STATE_FOLLOW_LEVER; moby->anim_speed = 0; door_vars->voice = -1; break; @@ -78,7 +78,7 @@ void platform_booster_update(struct Moby *moby) { ((u32)hero.state.control_mode < 2 || hero.state.control_mode == 9 || hero.state.control_mode == 12) && hero.ground_moby == &((struct Moby *)moby_array)[door_vars->target])) { - moby->state = 2; + moby->state = PLATFORM_BOOSTER_STATE_ADVANCE_ANIMATION; } if (moby->anim_time != previous_anim_time) { if (lv->travel != 1.0f && lv->travel != 0.0f) { @@ -125,7 +125,7 @@ void platform_booster_update(struct Moby *moby) { link_vars = (LeverVars *)link->pvars; if (link->state == 3) { moby->anim_time = 1.0f - link_vars->travel; - moby->state = 1; + moby->state = PLATFORM_BOOSTER_STATE_FOLLOW_LEVER; } else { link_vars->travel = 1.0f - moby->anim_time; link_vars->spin = link_vars->travel * (link_vars->rate * 6.2831855f); diff --git a/src/overlays/l04/mobys/snow_plow.c b/src/overlays/l04/mobys/snow_plow.c index 1368d05c30..44acbebc33 100644 --- a/src/overlays/l04/mobys/snow_plow.c +++ b/src/overlays/l04/mobys/snow_plow.c @@ -29,7 +29,7 @@ extern int snow_plow_hit_count_gp __asm__("D_L04_0015EDF8") __attribute__((sda) extern void debug_print() __asm__("FUN_001e93b0"); extern void FUN_L00_00258278(void *, float, void *, float, float, float); extern void attach_manipulator(char *, int, void *) __asm__("FUN_0020cb10"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern void advance_moby_animation(void *) __asm__("FUN_0020d580"); extern void update_entity(void *) __asm__("FUN_L00_00250df8"); extern void refresh_moby_spatial_bounds_from_basis(void *) __asm__("FUN_0020e098"); @@ -118,6 +118,9 @@ void snow_plow_update(struct Moby *moby) { SNOW_PLOW_CLASS_OFFSET_WITH_THREE_HIT_SPAWNS_AND_TARGET_VOICE_SELECTOR_ZERO = 0x20, SNOW_PLOW_CLASS_OFFSET_WITH_TARGET_VOICE_SELECTOR_ZERO = 0x59 }; + enum { + SNOW_PLOW_WAIT_TO_RESUME_PATH = 3 + }; Vec4 update_start_position; Vec4 delta, *return_delta_ptr; /* The sphere query is its position followed by the record; the hit cases pass one or the other. */ @@ -186,7 +189,7 @@ void snow_plow_update(struct Moby *moby) { snow_plow_vars->unk149 = 1; snow_plow_vars->unk14C = moby->rot.z; *(int *)&snow_plow_vars->unk7C = 0; - moby->state = 3; + moby->state = SNOW_PLOW_WAIT_TO_RESUME_PATH; snow_plow_vars->unk11C = scale_game_frames(36000); break; } @@ -275,7 +278,7 @@ void snow_plow_update(struct Moby *moby) { case SNOW_PLOW_CLASS_OFFSET_WITH_QUARTER_TURN_LINKED_MOBY: snow_plow_vars->unk140 = fast_add_rotations(snow_plow_vars->unk140, frame_time * 12.566371f); - FUN_L00_001fff28(&snow_plow_vars->unk190, 0, snow_plow_vars->unk140); + build_axis_rotation_quaternion(&snow_plow_vars->unk190, 0, snow_plow_vars->unk140); break; case SNOW_PLOW_CLASS_OFFSET_WITH_HIT_SPHERE_QUERY_AND_TARGET_VOICE: case SNOW_PLOW_CLASS_OFFSET_WITH_HIT_SPHERE_QUERY_WITHOUT_TARGET_VOICE: @@ -285,16 +288,16 @@ void snow_plow_update(struct Moby *moby) { case SNOW_PLOW_CLASS_OFFSET_WITH_TARGET_VOICE_SELECTOR_ZERO: snow_plow_vars->unk140 = fast_add_rotations(snow_plow_vars->unk140, frame_time * 12.566371f); - FUN_L00_001fff28(&snow_plow_vars->unk190, 2, snow_plow_vars->unk140); + build_axis_rotation_quaternion(&snow_plow_vars->unk190, 2, snow_plow_vars->unk140); break; case SNOW_PLOW_CLASS_OFFSET_WITH_TWO_ROTATING_MANIPULATORS: case SNOW_PLOW_CLASS_OFFSET_WITH_TWO_POINT_CART_BURST: snow_plow_vars->unk140 = fast_add_rotations(snow_plow_vars->unk140, frame_time * 12.566371f); - FUN_L00_001fff28(&snow_plow_vars->unk190, 2, snow_plow_vars->unk140); + build_axis_rotation_quaternion(&snow_plow_vars->unk190, 2, snow_plow_vars->unk140); snow_plow_vars->unk144 = fast_add_rotations(snow_plow_vars->unk144, frame_time * 12.566371f); - FUN_L00_001fff28(&snow_plow_vars->unk1D0, 2, snow_plow_vars->unk144); + build_axis_rotation_quaternion(&snow_plow_vars->unk1D0, 2, snow_plow_vars->unk144); break; } } diff --git a/src/overlays/l04/mobys/suck_cannon.c b/src/overlays/l04/mobys/suck_cannon.c index 5cb49061c9..86bd129ab9 100644 --- a/src/overlays/l04/mobys/suck_cannon.c +++ b/src/overlays/l04/mobys/suck_cannon.c @@ -13,6 +13,10 @@ #include "rnc/overlay/shared/world/level_labels.h" #include "rnc/overlay/shared/game/unlock_planet.h" #include "rnc/overlay/shared/rendering/effects/particles.h" + +unsigned char *spawn_timed_hero_relative_particle( + u128 *, int, unsigned char, int, int, int, int, float) __asm__("FUN_L00_00272f68"); + #include "rnc/save/memcard_save_data.h" /* Warp portal: spins, opens once the hero is near, then warps to the exit moby. */ @@ -63,7 +67,7 @@ void suck_cannon_update(struct Moby *moby) { mark_moby_for_removal(moby); break; } - moby->state = 1; + moby->state = SUCK_CANNON_WAIT_FOR_HERO; moby->pos.z += 1.0f; break; case SUCK_CANNON_WAIT_FOR_HERO: @@ -71,7 +75,7 @@ void suck_cannon_update(struct Moby *moby) { if (vector_distance_xy(&moby->pos, &hero.motion.pos) < 3.0f) { moby->flags |= 0x41; start_scene(2); - moby->state = 2; + moby->state = SUCK_CANNON_WAIT_TO_RESET_CAMERA; } break; case SUCK_CANNON_WAIT_TO_RESET_CAMERA: @@ -90,7 +94,7 @@ void suck_cannon_update(struct Moby *moby) { debug_print(suck_cannon_missing_segment_switch_warning_format, ((struct PortalMobyView *)moby)->uid); } - moby->state = 3; + moby->state = SUCK_CANNON_REMOVE; memcard_save_data(0, -1); break; case SUCK_CANNON_REMOVE: @@ -141,14 +145,14 @@ void update_suck_cannon_particles(char *moby) { timer_progress = timer_progress / (float)scale_game_frames(0xFF); col = fast_tween_color(0x4040FFFF, 0x1040FFFF, absolute_float(0.5f - timer_progress)); if (D_L04_0015F5C4 != 2) - FUN_L00_00272f68(d, - col, - truncate_float_to_s32(sprite_data->a[i]) & 0xFF, - 0x35, - 1, - 2, - 0, - sprite_data->d[i]); + spawn_timed_hero_relative_particle(d, + col, + truncate_float_to_s32(sprite_data->a[i]) & 0xFF, + 0x35, + 1, + 2, + 0, + sprite_data->d[i]); fast_vec_add(d, d, particle_position_step); } } diff --git a/src/overlays/l04/mobys/translation_delta_matrix.c b/src/overlays/l04/mobys/translation_delta_matrix.c index 701d7c3d07..e60d8ea43a 100644 --- a/src/overlays/l04/mobys/translation_delta_matrix.c +++ b/src/overlays/l04/mobys/translation_delta_matrix.c @@ -14,12 +14,15 @@ void translation_delta_matrix_update(char *moby) __asm__("FUN_L04_002d3580"); /* Moby class 584 */ void translation_delta_matrix_update(char *moby) { + enum { + MOBY_TRANSLATION_DELTA_STATE_INITIALIZE = 0 + }; char *moby_vars = ((char *)MOBY(moby)->pvars); float position_delta[4]; fast_vec_sub(position_delta, moby + 0x10, moby_vars + 0xA0); update_entity_matrix(moby_vars + 0x60, position_delta, moby + 0x40, moby + 0x40); qcopy(moby_vars + 0xA0, moby + 0x10); - if (MOBY(moby)->state == 0) { + if (MOBY(moby)->state == MOBY_TRANSLATION_DELTA_STATE_INITIALIZE) { *(int *)(moby_vars + 0x20) = 0; *(short *)(moby_vars + 0x24) = 0; moby_vars[0x28] = 4; diff --git a/src/overlays/l04/mobys/upper_door.c b/src/overlays/l04/mobys/upper_door.c index 60209c3e99..154509b6eb 100644 --- a/src/overlays/l04/mobys/upper_door.c +++ b/src/overlays/l04/mobys/upper_door.c @@ -55,6 +55,9 @@ void upper_door_update(struct Moby *moby) { UPPER_DOOR_WAIT_FOR_ACTIVATION = 1, UPPER_DOOR_MOVE_VERTICAL = 2 }; + enum { + UPPER_DOOR_MOVEMENT_COMPLETE = 3 + }; struct RiserVars *riser_vars = (struct RiserVars *)moby->pvars; struct Moby *trigger_moby; s16 save_id_index; @@ -63,7 +66,7 @@ void upper_door_update(struct Moby *moby) { switch (moby->state) { case UPPER_DOOR_INITIALIZE: riser_vars->baseZ = moby->pos.z; - moby->state = 1; + moby->state = UPPER_DOOR_WAIT_FOR_ACTIVATION; break; case UPPER_DOOR_WAIT_FOR_ACTIVATION: id = moby->save_id; @@ -79,7 +82,7 @@ void upper_door_update(struct Moby *moby) { } if (moby->oclass == 0x44D || moby->oclass == 0x5FC) trooper_play_sound(0, 0, moby, 0x44D); - moby->state = 2; + moby->state = UPPER_DOOR_MOVE_VERTICAL; riser_vars->timer = scale_game_frames(60); break; case UPPER_DOOR_MOVE_VERTICAL: @@ -90,7 +93,7 @@ void upper_door_update(struct Moby *moby) { level_completed_save_id_bits[(s16)moby->save_id >> 5] |= 1 << (moby->save_id & 0x1F); if (moby->oclass == 0x44D) allocate_voice_for_target_entry(1, 0, moby); - moby->state = 3; + moby->state = UPPER_DOOR_MOVEMENT_COMPLETE; } break; } diff --git a/src/overlays/l04/mobys/woodcut_bot.c b/src/overlays/l04/mobys/woodcut_bot.c index 967b748c5e..61aa14586b 100644 --- a/src/overlays/l04/mobys/woodcut_bot.c +++ b/src/overlays/l04/mobys/woodcut_bot.c @@ -172,7 +172,7 @@ void emit_woodcut_bot_death_effects(void *moby) { extern float D_L04_0015F580[] MACRO_ADDR; extern void attach_manipulator(char *, int, void *) __asm__("FUN_0020cb10"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern void collect_mobies_in_sphere(void *, float, int, void *, void *) __asm__("FUN_L00_001f2868"); extern void FUN_L00_00263fd8(void *, int, void *, void *, int, int, float, void *, void *, void *); @@ -299,9 +299,10 @@ extern void *memset(void *, int, unsigned int); extern void coll_line_fix(void *, void *, int, void *, void *) __asm__("FUN_001efa68"); extern void add_vectors(void *, void *, void *) __asm__("FUN_L00_001ff290"); extern void FUN_L00_00257470(void *, int, int); -extern void FUN_L00_00258490(void *, void *, void *, int, float, float, float, float); -extern void FUN_L00_0025a120(void *); -extern void trooper_knockback_arc(void *, float *, void *, void *) __asm__("FUN_L00_0025ab48"); +extern void move_moby_xy_with_collision_constraints( + void *, void *, void *, int, float, float, float, float) __asm__("FUN_L00_00258490"); +extern void FUN_L00_0025a120(void *); +extern void trooper_knockback_arc(void *, float *, void *, void *) __asm__("FUN_L00_0025ab48"); extern void trooper_start_knockback(float, void *, void *, int, int, int) __asm__("FUN_L00_0025c558"); extern void trooper_anim_update(void *, void *) __asm__("FUN_L00_0025d458"); @@ -381,7 +382,7 @@ void woodcut_bot_update(WBMoby *m) { qcopy(duplicate_position_snapshot, pos); fast_dec_timer_s16(&d->t3C4); - if (m->state != 0xB && m->state != 0) { + if (m->state != WOODCUT_BOT_DEATH_KNOCKBACK && m->state != WOODCUT_BOT_INITIALIZE) { int r; int htype; float damage; @@ -394,7 +395,7 @@ void woodcut_bot_update(WBMoby *m) { r = hit_reaction(m, p, &d->hp, 0, &htype, &damage, 0, 4); d->fE0 = 0x15E; d->fE8 = 0.35f; - if (p != 0 && damage != 0.0f && m->state != 0 && d->t3C4 == 0) { + if (p != 0 && damage != 0.0f && m->state != WOODCUT_BOT_INITIALIZE && d->t3C4 == 0) { unsigned char *hit_source_moby; float knockback_gravity_step; float b; @@ -440,7 +441,7 @@ void woodcut_bot_update(WBMoby *m) { trooper_start_knockback(angle, m, d->fC0, 8, 1, 0); d->f110 = 14.0f; d->f114 = 24.0f; - m->state = 0xB; + m->state = WOODCUT_BOT_DEATH_KNOCKBACK; FUN_L00_00257470(m, 0, -1); d->fB7 = 0x78; trooper_anim_update(m, d->fB0); @@ -455,7 +456,7 @@ void woodcut_bot_update(WBMoby *m) { m->fBC |= 5; blend_moby_animation(m, 5, 0, scale_game_frames(3)); reset_walker_gait_helpers(d->f160); - m->state = 9; + m->state = WOODCUT_BOT_HIT_RECOVERY_AND_REPOSITION; hit_source_moby_class = *(short *)(*(char **)(p + 0x20) + 0xA6); if (hit_source_moby_class == 0x131 || hit_source_moby_class == 0xB0) { d->f3E4 = (2.0f / scale_time(15.0f)) * 0.5f; @@ -474,7 +475,7 @@ void woodcut_bot_update(WBMoby *m) { case WOODCUT_BOT_REACTION_RECOIL_TO_IDLE_WITH_COOLDOWNS: blend_moby_animation(m, 6, 0, scale_game_frames(10)); reset_walker_gait_helpers(d->f160); - m->state = 1; + m->state = WOODCUT_BOT_IDLE; d->f3E4 = 2.0f / scale_time(15.0f); *(OvlQuad *)v = *(OvlQuad *)(p + 0x10); trooper_knockback_arc(v, &angle, &d->f3E4, &one); @@ -501,7 +502,7 @@ void woodcut_bot_update(WBMoby *m) { d->f38 = 0; fast_dec_timer_s16(&d->t3C6); - if (m->state == 8) { + if (m->state == WOODCUT_BOT_MELEE_ATTACK) { if (m->anim == 4 && hd > 16.0f && hd < 27.0f) { WBJoints joints = D_L04_001DC450; float pts[6][4]; @@ -545,10 +546,10 @@ void woodcut_bot_update(WBMoby *m) { attach_manipulator(m, 6, manipulator); initialize_woodcut_bot_movement_data(m); if (d->f3C0 != 0) { - m->state = 3; + m->state = WOODCUT_BOT_PLAY_ANIMATION_AND_EMIT_DEBRIS; blend_moby_animation(m, 0xB, 0, scale_game_frames(10)); } else { - m->state = 1; + m->state = WOODCUT_BOT_IDLE; } break; case WOODCUT_BOT_IDLE: @@ -566,21 +567,21 @@ void woodcut_bot_update(WBMoby *m) { if (d->t3C2 == 0) { if (target_distance < 3.0f && adiff < 1.5707964f) { blend_moby_animation(m, 4, 0, scale_game_frames(10)); - m->state = 8; + m->state = WOODCUT_BOT_MELEE_ATTACK; } else if (excited ? (target_distance < d->f3E8 * 2.0f) : (target_distance < d->f3E8)) { if (m->fBC & 1) { if (excited || d->f3DC == -1 || point_in_path_xy(selected_target_position, ((int *)l04_paths[d->f3DC]) + 4, *((int *)l04_paths[d->f3DC])) != 0) { - m->state = 5; + m->state = WOODCUT_BOT_MOVE_TOWARD_TARGET; m->fBC |= 8; } } else { d->f3D0 = 0.0f; blend_moby_animation(m, 0x10, 0, scale_game_frames(10)); reset_walker_gait_helpers(d->f160); - m->state = 0xA; + m->state = WOODCUT_BOT_TURN_BEFORE_MOVEMENT; m->fBC |= 1; } } @@ -590,7 +591,7 @@ void woodcut_bot_update(WBMoby *m) { (d->f3DC != -1 && point_in_path_xy(selected_target_position, ((int *)l04_paths[d->f3DC]) + 4, *((int *)l04_paths[d->f3DC])) == 0)) { - m->state = 6; + m->state = WOODCUT_BOT_RETURN_TO_SAVED_POSITION; m->fBC |= 8; } } @@ -603,11 +604,11 @@ void woodcut_bot_update(WBMoby *m) { point_in_path_xy(selected_target_position, ((int *)l04_paths[d->f3DC]) + 4, *((int *)l04_paths[d->f3DC])) != 0) { - m->state = 5; + m->state = WOODCUT_BOT_MOVE_TOWARD_TARGET; m->fBC |= 8; } else { blend_moby_animation(m, 0, 0, scale_game_frames(10)); - m->state = 1; + m->state = WOODCUT_BOT_IDLE; } } break; @@ -651,21 +652,21 @@ void woodcut_bot_update(WBMoby *m) { if (d->t3C2 == 0) { if (target_distance < 3.0f && adiff < 1.5707964f) { blend_moby_animation(m, 4, 0, scale_game_frames(10)); - m->state = 8; + m->state = WOODCUT_BOT_MELEE_ATTACK; } else if (excited ? (target_distance < d->f3E8 * 2.0f) : (target_distance < d->f3E8)) { if (m->fBC & 1) { if (excited || d->f3DC == -1 || point_in_path_xy(selected_target_position, ((int *)l04_paths[d->f3DC]) + 4, *((int *)l04_paths[d->f3DC])) != 0) { - m->state = 5; + m->state = WOODCUT_BOT_MOVE_TOWARD_TARGET; m->fBC |= 8; } } else { d->f3D0 = 0.0f; blend_moby_animation(m, 0x10, 0, scale_game_frames(10)); reset_walker_gait_helpers(d->f160); - m->state = 0xA; + m->state = WOODCUT_BOT_TURN_BEFORE_MOVEMENT; m->fBC |= 1; } } @@ -677,20 +678,20 @@ void woodcut_bot_update(WBMoby *m) { if (target_distance < 3.0f && adiff < 1.5707964f) { blend_moby_animation(m, 4, 0, scale_game_frames(10)); reset_walker_gait_helpers(d->f160); - m->state = 8; + m->state = WOODCUT_BOT_MELEE_ATTACK; } else if (d->f3DC == -1 || point_in_path_xy(selected_target_position, ((int *)l04_paths[d->f3DC]) + 4, *((int *)l04_paths[d->f3DC])) != 0) { - m->state = 5; + m->state = WOODCUT_BOT_MOVE_TOWARD_TARGET; m->fBC |= 8; } else if (adiff > 1.5707964f) { d->f3D0 = 0.0f; blend_moby_animation(m, 0x10, 0, scale_game_frames(10)); reset_walker_gait_helpers(d->f160); - m->state = 0xA; + m->state = WOODCUT_BOT_TURN_BEFORE_MOVEMENT; } } else { - m->state = 1; + m->state = WOODCUT_BOT_IDLE; } break; case WOODCUT_BOT_MOVE_TOWARD_TARGET: { @@ -707,7 +708,7 @@ void woodcut_bot_update(WBMoby *m) { if (target_distance < 3.0f && adiff < 1.5707964f) { blend_moby_animation(m, 4, 0, scale_game_frames(10)); reset_walker_gait_helpers(d->f160); - m->state = 8; + m->state = WOODCUT_BOT_MELEE_ATTACK; } else if (d->f3DC != -1) { float v[4]; @@ -721,21 +722,21 @@ void woodcut_bot_update(WBMoby *m) { if (excited && point_in_path_xy(selected_target_position, ((int *)l04_paths[d->f3DC]) + 4, *((int *)l04_paths[d->f3DC])) == 0) { - m->state = 7; + m->state = WOODCUT_BOT_STOP_MOVEMENT; } else if (point_in_path_xy(selected_target_position, ((int *)l04_paths[d->f3DC]) + 4, *((int *)l04_paths[d->f3DC])) != 0) { d->f3D0 = 0.0f; blend_moby_animation(m, 0x10, 0, scale_game_frames(10)); reset_walker_gait_helpers(d->f160); - m->state = 0xA; + m->state = WOODCUT_BOT_TURN_BEFORE_MOVEMENT; } } if (!excited) { if (point_in_path_xy(selected_target_position, ((int *)l04_paths[d->f3DC]) + 4, *((int *)l04_paths[d->f3DC])) == 0) { - m->state = 6; + m->state = WOODCUT_BOT_RETURN_TO_SAVED_POSITION; } } } @@ -749,14 +750,14 @@ void woodcut_bot_update(WBMoby *m) { if (target_distance < 3.0f && adiff < 1.5707964f) { blend_moby_animation(m, 4, 0, scale_game_frames(10)); reset_walker_gait_helpers(d->f160); - m->state = 8; + m->state = WOODCUT_BOT_MELEE_ATTACK; } else { if (m->fBC & 8) { m->fBC &= ~8; reset_leg_rig_from_animation(m, d->f160); } if (vector_distance_xy(pos, d->f3B0) < 2.0f) { - m->state = 7; + m->state = WOODCUT_BOT_STOP_MOVEMENT; } else { leg_walker_update(m, d->f160, @@ -776,12 +777,12 @@ void woodcut_bot_update(WBMoby *m) { d->f3D0 = 0.0f; blend_moby_animation(m, 0x10, 0, scale_game_frames(10)); reset_walker_gait_helpers(d->f160); - m->state = 0xA; + m->state = WOODCUT_BOT_TURN_BEFORE_MOVEMENT; m->fBC |= 0x10; } else if (point_in_path_xy(selected_target_position, ((int *)l04_paths[d->f3DC]) + 4, *((int *)l04_paths[d->f3DC])) != 0) { - m->state = 7; + m->state = WOODCUT_BOT_STOP_MOVEMENT; } } } @@ -791,14 +792,14 @@ void woodcut_bot_update(WBMoby *m) { if (target_distance < 3.0f && adiff < 1.5707964f) { blend_moby_animation(m, 4, 0, scale_game_frames(10)); reset_walker_gait_helpers(d->f160); - m->state = 8; + m->state = WOODCUT_BOT_MELEE_ATTACK; } else { leg_walker_update(m, d->f160, frame_time * 0.0f, m->rot[2], frame_time_sq * 20.0f); if (d->f217 == 0) { if (excited) { - m->state = 4; + m->state = WOODCUT_BOT_SELECT_ACTION_WHILE_EXCITED; } else { - m->state = 1; + m->state = WOODCUT_BOT_IDLE; } } } @@ -807,7 +808,7 @@ void woodcut_bot_update(WBMoby *m) { if (m->anim == 4 && (m->f70 & 2)) { d->t3C2 = 0; blend_moby_animation(m, 0, 0, scale_game_frames(10)); - m->state = 1; + m->state = WOODCUT_BOT_IDLE; } break; case WOODCUT_BOT_HIT_RECOVERY_AND_REPOSITION: @@ -816,7 +817,7 @@ void woodcut_bot_update(WBMoby *m) { m->fBC &= ~4; if (d->f3DC == -1) { blend_moby_animation(m, 0, 0, scale_game_frames(10)); - m->state = 1; + m->state = WOODCUT_BOT_IDLE; d->t3C2 = 0; } else { WBAngles tab = D_L04_001DC468; @@ -856,14 +857,14 @@ void woodcut_bot_update(WBMoby *m) { if (m->anim == 5) { if (target_distance < 3.0f && adiff < 1.5707964f) { blend_moby_animation(m, 4, 0, scale_game_frames(10)); - m->state = 8; + m->state = WOODCUT_BOT_MELEE_ATTACK; } else { blend_moby_animation(m, 0, 0, scale_game_frames(10)); - m->state = 1; + m->state = WOODCUT_BOT_IDLE; } } else { blend_moby_animation(m, 0, 0, scale_game_frames(10)); - m->state = 1; + m->state = WOODCUT_BOT_IDLE; d->t3C2 = 0; } } @@ -900,7 +901,7 @@ void woodcut_bot_update(WBMoby *m) { frame_time_sq * 6.2831855f, frame_time * 4.1887903f); } else { - m->state = 1; + m->state = WOODCUT_BOT_IDLE; d->t3C2 = 0; } } @@ -911,10 +912,10 @@ void woodcut_bot_update(WBMoby *m) { if ((m->fBC & 0x10) || point_in_path_xy(selected_target_position, ((int *)l04_paths[d->f3DC]) + 4, *((int *)l04_paths[d->f3DC])) == 0) { - m->state = 6; + m->state = WOODCUT_BOT_RETURN_TO_SAVED_POSITION; blend_moby_animation(m, 0, 0, scale_game_frames(10)); } else { - m->state = 5; + m->state = WOODCUT_BOT_MOVE_TOWARD_TARGET; blend_moby_animation(m, 0, 0, scale_game_frames(10)); } m->fBC = (m->fBC | 8) & ~0x10; @@ -966,15 +967,16 @@ void woodcut_bot_update(WBMoby *m) { recoil_scratch[2] = 0.0f; fast_vec_add(recoil_scratch, recoil_scratch, pos); d->f3E4 += -2.0f / (scale_time(15.0f) * scale_time(15.0f)); - FUN_L00_00258490(m, pos, recoil_scratch, 1, 0.25f, 1.0f, 0.75f, 0.87266463f); + move_moby_xy_with_collision_constraints( + m, pos, recoil_scratch, 1, 0.25f, 1.0f, 0.75f, 0.87266463f); } d->f3C8 *= 0.96f; - FUN_L00_001fff28(recoil_scratch, 1, d->f3C8); - FUN_L00_001fff28(d->f130, 2, 0.0f); + build_axis_rotation_quaternion(recoil_scratch, 1, d->f3C8); + build_axis_rotation_quaternion(d->f130, 2, 0.0f); multiply_quaternions(d->f130, d->f130, recoil_scratch); - if (m->state != 9) + if (m->state != WOODCUT_BOT_HIT_RECOVERY_AND_REPOSITION) d->f3C1 = m->state; - if (m->state != 5 && m->fBC != 6) { + if (m->state != WOODCUT_BOT_MOVE_TOWARD_TARGET && m->fBC != 6) { float g; d->f3E0 += frame_time_sq * 9.8f; diff --git a/src/overlays/l05/hero/apply_hero_ground_material_effects.c b/src/overlays/l05/hero/apply_hero_ground_material_effects.c index f53ccc02dc..ed7644f146 100644 --- a/src/overlays/l05/hero/apply_hero_ground_material_effects.c +++ b/src/overlays/l05/hero/apply_hero_ground_material_effects.c @@ -13,6 +13,16 @@ #include "rnc/overlay/shared/rendering/effects/spawn_explosion.h" #include "rnc/world/collision/collision_hit_material.h" +enum { + GROUND_MATERIAL_WATER = 0, + GROUND_MATERIAL_MAGNET = 2, + GROUND_MATERIAL_FIXED_SHALLOW_WATER = 14 +}; + +enum { + GROUND_MATERIAL_SINK_TRIGGER = 13 +}; + int FUN_L00_001f0d60_239fc0(void *, int, int, f32) __asm__("FUN_L00_001f0d60"); f32 absolute_float(f32) __asm__("func_001F99C0"); void exit_hero_vehicle_mode_if_mode_three(void) __asm__("FUN_L00_0020b930"); @@ -31,20 +41,20 @@ void apply_hero_ground_material_effects(void) { hero.unk308 = 0; if (saved_ground_type == -1) return; - if (saved_ground_type == 2) { + if (saved_ground_type == GROUND_MATERIAL_MAGNET) { if (hero.frames_off_ground.s == 0 || hero.ground_distance < 0.3f) { hero.on_magnet_ground = 1; - if (hero.vehicle_mode == 0 && ((u8 *)hero.items[1].moby) != 0 && + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT && ((u8 *)hero.items[1].moby) != 0 && *(s16 *)(((u8 *)hero.items[1].moby) + 0xA6) == 0xAD) hero.unk308 = 1; } } - if (saved_ground_type == 14) { + if (saved_ground_type == GROUND_MATERIAL_FIXED_SHALLOW_WATER) { hero.base_condition = 1; hero.water_depth = 0.2f; hero.water_surface_z = hero.ground_z.f + 0.2f; } - if (saved_ground_type == 0) { + if (saved_ground_type == GROUND_MATERIAL_WATER) { water_depth = hero.water_surface_z - hero.ground_z.f; hero.water_depth = water_depth; if (water_depth < 0.85f && 0.25f < water_depth) @@ -67,7 +77,7 @@ void apply_hero_ground_material_effects(void) { hero.unk12E9 = 1; if (saved_ground_type == 4) hero.selector_4 = 1; - if (saved_ground_type == 13) + if (saved_ground_type == GROUND_MATERIAL_SINK_TRIGGER) hero.selector_13 = 1; if (saved_ground_type == 1) hero.selector_1 = 1; @@ -149,7 +159,7 @@ void FUN_001f9a68_c(void *, void *, f32) __asm__("FUN_001f9a68"); void FUN_001f9bf8_c(void *, void *, f32) __asm__("FUN_001f9bf8"); void compute_rotated_vector_angles(void *, void *) __asm__("FUN_L00_00216078"); void transform_hero_polar_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_002335c8"); -void FUN_L00_002334d0(void *, void *, f32); +void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern CollisionHit HH __asm__("D_L05_00174240") NOT_SDA; #define HI(o) (*(s32 *)(D_L05_00174240 + (o))) @@ -158,6 +168,10 @@ extern CollisionHit HH __asm__("D_L05_00174240") NOT_SDA; void update_hero_ground_contact(void) __asm__("FUN_L05_002402a8"); void update_hero_ground_contact(void) { + enum { + GROUND_MATERIAL_SINK_SURFACE_PROBE_THROUGH = 3, + GROUND_MATERIAL_SINK_SURFACE_CONTACT_BYPASS = 0xB + }; V shared_probe_endpoint, ground_probe_endpoint, ground_vector_scratch, side_probe_endpoint, unused_probe_vector, hit_normal_angles, normalized_hit_normal; f32 f; @@ -201,7 +215,7 @@ void update_hero_ground_contact(void) { } hero.ground_sound_class = ground_sound_class; hero.ground_type = collision_hit_material(); - if (hero.ground_type == 0) { + if (hero.ground_type == GROUND_MATERIAL_WATER) { hero.water_surface_z = resolve_camera_surface_height(D_L05_00174260, (u8 *)&hero.water_surface_normal); if (hero.motion.pos.f[2] < hero.water_surface_z && hero.in_water_frames <= 0) { @@ -217,7 +231,7 @@ void update_hero_ground_contact(void) { } hero.ground_sound_class = ground_sound_class; } - if (hero.ground_type == 0xD) { + if (hero.ground_type == GROUND_MATERIAL_SINK_TRIGGER) { hero.water_surface_z = D_L05_00174268; ground_probe_endpoint.f[2] = D_L05_00174268 - 0.01f; if (collision_line(&ground_probe_endpoint, &shared_probe_endpoint, 4, (s32)hero.moby, 0) == @@ -225,7 +239,7 @@ void update_hero_ground_contact(void) { goto d1; } } - if (hero.ground_type == 3) { + if (hero.ground_type == GROUND_MATERIAL_SINK_SURFACE_PROBE_THROUGH) { hero.sink_surface_z = D_L05_00174268; ground_probe_endpoint.f[2] = D_L05_00174268 - 0.01f; if (collision_line(&ground_probe_endpoint, &shared_probe_endpoint, 4, (s32)hero.moby, 0) == @@ -233,7 +247,7 @@ void update_hero_ground_contact(void) { goto d1; } } - if (hero.ground_type == 0xB) { + if (hero.ground_type == GROUND_MATERIAL_SINK_SURFACE_CONTACT_BYPASS) { hero.sink_surface_z = D_L05_00174268; goto d1; } @@ -244,7 +258,7 @@ void update_hero_ground_contact(void) { if (is_moby_in_class_range_500_to_540(HH.moby)) { hero.on_flagged_ground_moby = 1; if ((u32)(hero.state.control_mode - 0x15) < 2) { - FUN_L00_002334d0((u8 *)&HH.point, (u8 *)&HH.point, 1.0f); + add_hero_gravity_offset((u8 *)&HH.point, (u8 *)&HH.point, 1.0f); } } hit_moby_record = get_moby_target_info(HH.moby); @@ -266,7 +280,8 @@ void update_hero_ground_contact(void) { } if (hero.ground_distance < 0.02f) { hero.frames_off_ground.s = 0; - if (hero.ground_slope.f <= 0.87266463f || hero.gravity_mode == 1 || + if (hero.ground_slope.f <= 0.87266463f || + hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.state.control_mode == 0x16) { hero.air_frames.s = 0; hero.last_landed_moby = HH.moby; @@ -362,10 +377,10 @@ typedef union { f32 f[4]; } V_2133a8; -extern void FUN_L00_002347c0(void); +extern void resolve_hero_pending_path_clearance(void) __asm__("FUN_L00_002347c0"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); -extern void FUN_L00_00233810(void *, void *, f32); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern s32 coll_sphere(void *, s32, s32, f32) __asm__("FUN_L00_001f0d60"); extern s32 rig_probe(void *, s32, f32, s32, f32) __asm__("FUN_L00_001f19a0"); extern s32 FUN_L00_001f3170(void *, f32); @@ -386,19 +401,19 @@ s32 resolve_hero_position_collisions(s32 mode) { qcopy(&initial_position, &hero.motion.pos.q); clear_u64_value(&collision_query_offset); if (hero.path_constrain_pending != 0) { - FUN_L00_002347c0(); + resolve_hero_pending_path_clearance(); hero.path_constrain_pending = 0; } if (hero.state.control_mode != 0x11) { if (hero.state.control_mode == 0x16) { transform_hero_local_offset_to_world(&collision_query_offset, 0.0f, 0.0f, 0.7f); fast_vec_sub(&collision_query_offset, &collision_query_offset, &hero.motion.pos.q); - } else if (hero.gravity_mode != 0 || hero.unk1F8 != 0) { - if (hero.gravity_mode == 1 || hero.unk1F8 != 0 || + } else if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN || hero.unk1F8 != 0) { + if (hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.unk1F8 != 0 || (unsigned)(hero.state.control_mode - 0x15) < 2) { - FUN_L00_00233810(&collision_query_offset, &collision_query_offset, 0.6f); + add_hero_up_offset(&collision_query_offset, &collision_query_offset, 0.6f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &collision_query_offset, &collision_query_offset, -hero.capsule_bottom); } } else { @@ -411,7 +426,7 @@ s32 resolve_hero_position_collisions(s32 mode) { mask = 0xD24; } for (i = 0; i < 8; i++) { - if (hero.gravity_mode != 0) { + if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN) { if (!coll_sphere(&hero.motion.pos.q, mask, ((s32)hero.moby), frame_scale * 0.4f)) break; } else if (hero.state.control_mode == 0x11) { @@ -545,7 +560,8 @@ void integrate_hero_motion_with_collisions(void) { player = (L16MovementPlayer *)((char *)position - 0x80); update_hero_attachment(player->physics_mode, (char *)position + 0x70, (char *)position + 0x10); /* Limit the velocity by state and mode. Inside an arm `position` moves on to the velocity; it is formed again below. */ - if (player->state == 34 || player->state == 20) { + if (player->state == HERO_STATE_RISE_THEN_FALL_WITH_AIRBORNE_HIT_QUERY || + player->state == HERO_STATE_WRENCH_SLAM) { float limit; float *limited_velocity; diff --git a/src/overlays/l05/hero/hero_set_state.c b/src/overlays/l05/hero/hero_set_state.c index 76114beba0..73fd29270e 100644 --- a/src/overlays/l05/hero/hero_set_state.c +++ b/src/overlays/l05/hero/hero_set_state.c @@ -81,13 +81,14 @@ extern void draw_hud_timer(void) __asm__("FUN_L05_00266710"); extern int hero_set_state(int, int) __asm__("FUN_L05_0024cee8"); extern char level05_hero_water_surface_jump_velocity_keys[] __asm__("D_L05_0017C3C0"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int b) { int saved_state_step; char *moby; int old20A7; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || b != 2)) return 0; } if ((D_L05_0015F5C4 == 2 || D_L05_0015F5C4 == 6) && b != 2) @@ -95,8 +96,16 @@ int hero_set_state(int a, int b) { { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -109,11 +118,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -134,14 +143,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); return 1; } @@ -752,14 +761,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); if (b) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L05_0015F6E8[p->state.step], (float)scale_game_frames(8)); } @@ -1044,7 +1053,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -1129,7 +1138,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; diff --git a/src/overlays/l05/hero/update_hero_motion_by_state.c b/src/overlays/l05/hero/update_hero_motion_by_state.c index a0fdd16a37..dfb92d1cc9 100644 --- a/src/overlays/l05/hero/update_hero_motion_by_state.c +++ b/src/overlays/l05/hero/update_hero_motion_by_state.c @@ -136,7 +136,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void clip_hero_horizontal_velocity(s32) __asm__("FUN_L01_00232978"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -178,7 +178,7 @@ extern void moby_point_position(struct MobyView *, s32, void *) __asm__("FUN_L00 extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L05_00238858(f32, f32); @@ -229,7 +229,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L05_0017C218; extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); extern s32 is_moby_in_class_range_500_to_540(s32) __asm__("FUN_L00_0025e3b8"); @@ -398,10 +398,10 @@ void update_hero_motion_by_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -412,11 +412,11 @@ void update_hero_motion_by_state(void) { } else { clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -728,8 +728,8 @@ void update_hero_motion_by_state(void) { build_spherical_offset( &hero.motion.velocity, hero.ground_speed, hero.motion.rot.f[2], yaw); } else if (hero.state.current == 0x33) { - f32 sp = - hero.ground_speed * FUN_L00_00209018(swim_motion_scale_samples, 0x1E) * 5.0f; + f32 sp = hero.ground_speed * vector_length_xyz_cf(swim_motion_scale_samples, 0x1E) * + 5.0f; if (hero.state.prev == 0x35 && scale_game_frames(15) > hero.state_timer) { if (sp < frame_time * 4.5f) { sp = frame_time * 4.5f; @@ -857,8 +857,8 @@ void update_hero_motion_by_state(void) { } speed_step(frame_time_sq * 4.0f, frame_time_sq * 5.0f); { - f32 sp = - hero.ground_speed * FUN_L00_00209018(swim_motion_scale_samples, 0x1E) * 5.5f; + f32 sp = hero.ground_speed * vector_length_xyz_cf(swim_motion_scale_samples, 0x1E) * + 5.5f; hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[2] = 0.0f; @@ -1128,7 +1128,7 @@ void update_hero_motion_by_state(void) { approach_value(&len, 0.0f, frame_time_sq * 15.0f); set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, len); sp = frame_time_sq * 27.0f; - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.resolved_velocity_z, sp); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.resolved_velocity_z, sp); n = truncate_float_to_s32(predict_hero_trajectory_intercept_time(60.0f, sp, -1.0f)); k = 16; if (n != 0 && (f32)k - hero.anim_frame > 1.0f) { @@ -1205,11 +1205,12 @@ void update_hero_motion_by_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && ((struct MobyView *)hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -1228,11 +1229,12 @@ void update_hero_motion_by_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if ((struct MobyView *)hero.grapple_target != NULL) { hero.motion.move_yaw = @@ -1400,13 +1402,13 @@ void update_hero_motion_by_state(void) { &((struct MobyView *)hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&rotation_and_motion_scratch[3], &hero.motion.pos, &((struct MobyView *)hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1529,7 +1531,8 @@ void update_hero_motion_by_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1621,7 +1624,8 @@ void update_hero_motion_by_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1667,7 +1671,7 @@ void update_hero_motion_by_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1683,10 +1687,11 @@ void update_hero_motion_by_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1709,11 +1714,11 @@ void update_hero_motion_by_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { off = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { off = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1758,7 +1763,7 @@ void update_hero_motion_by_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || (struct MobyView *)hero.melee_target != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1768,7 +1773,8 @@ void update_hero_motion_by_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1782,10 +1788,11 @@ void update_hero_motion_by_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -1893,11 +1900,12 @@ void update_hero_motion_by_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2008,11 +2016,12 @@ void update_hero_motion_by_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2564,7 +2573,7 @@ void update_hero_motion_by_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2601,7 +2610,8 @@ void update_hero_motion_by_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2618,7 +2628,8 @@ void update_hero_motion_by_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2662,7 +2673,7 @@ void update_hero_motion_by_state(void) { clip_hero_horizontal_velocity(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2707,7 +2718,7 @@ void update_hero_motion_by_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2811,7 +2822,7 @@ void update_hero_motion_by_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&vector_and_hit_scratch, &hero.motion.pos); - FUN_L00_00233810(&vector_and_hit_scratch, &vector_and_hit_scratch, 0.5f); + add_hero_up_offset(&vector_and_hit_scratch, &vector_and_hit_scratch, 0.5f); qcopy(&v10, &vector_and_hit_scratch); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; v10.f[1] += fast_sin(hero.motion.rot.f[2]) * 0.85f; @@ -2846,7 +2857,7 @@ void update_hero_motion_by_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2896,7 +2907,7 @@ void update_hero_motion_by_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -2918,7 +2929,7 @@ void update_hero_motion_by_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = frame_time * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = frame_time * 0.9f; } } else { @@ -2929,29 +2940,30 @@ void update_hero_motion_by_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { clip_hero_horizontal_velocity(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2964,11 +2976,12 @@ void update_hero_motion_by_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -3004,18 +3017,19 @@ void update_hero_motion_by_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -3023,7 +3037,8 @@ void update_hero_motion_by_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -3052,11 +3067,12 @@ void update_hero_motion_by_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3073,10 +3089,10 @@ void update_hero_motion_by_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l05/hero/update_hero_state_machine.c b/src/overlays/l05/hero/update_hero_state_machine.c index 01b880b4a4..bdfefb1bd9 100644 --- a/src/overlays/l05/hero/update_hero_state_machine.c +++ b/src/overlays/l05/hero/update_hero_state_machine.c @@ -173,9 +173,11 @@ void update_hero_state_machine(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && item_selector_hud_open_blocker == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -237,7 +239,7 @@ void update_hero_state_machine(void) { } } if (fatal_fall_entry_z_threshold > hero.motion.pos.f[2] && - hero.ground_distance > 2.0f && hero.vehicle_mode != 2 && + hero.ground_distance > 2.0f && hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { @@ -649,7 +651,7 @@ void update_hero_state_machine(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -676,7 +678,7 @@ void update_hero_state_machine(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); break; } @@ -932,7 +934,8 @@ void update_hero_state_machine(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -2294,7 +2297,7 @@ void update_hero_state_machine(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l05/level_class_tables.c b/src/overlays/l05/level_class_tables.c index c8d52bf94d..931a58f8b4 100644 --- a/src/overlays/l05/level_class_tables.c +++ b/src/overlays/l05/level_class_tables.c @@ -18,6 +18,9 @@ #include "rnc/overlay/shared/vehicles.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -52,7 +55,7 @@ void *D_L05_002193D0[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L05_002193E8[6] diff --git a/src/overlays/l05/mobys/amoeboid.c b/src/overlays/l05/mobys/amoeboid.c index 3072548bb4..161decf5b6 100644 --- a/src/overlays/l05/mobys/amoeboid.c +++ b/src/overlays/l05/mobys/amoeboid.c @@ -14,12 +14,13 @@ extern float fast_cos(float); extern float fast_sin(float); /* Ported from rac1-decomp (src/overlays/l05_rilgar/vendor_002D28D0.c: func_L05_002DBF10), where it is exact; names translated to the US level program. */ -extern float FUN_L00_0025be00(float *, float *, float, float, float, float); -extern int FUN_L00_00258b50(void *, void *, void *, void *, float); -extern void FUN_L01_0026d930(char *p); -extern void handle_amoeboid_hits(unsigned char *m) __asm__("FUN_L05_002daf58"); -extern void spawn_amoeboid_particles(unsigned char *moby) __asm__("FUN_L05_002db018"); -void mark_moby_for_removal(void *obj) __asm__("FUN_0020c828"); +extern float + approach_angle(float *, float *, float, float, float, float) __asm__("FUN_L00_0025be00"); +extern int FUN_L00_00258b50(void *, void *, void *, void *, float); +extern void FUN_L01_0026d930(char *p); +extern void handle_amoeboid_hits(unsigned char *m) __asm__("FUN_L05_002daf58"); +extern void spawn_amoeboid_particles(unsigned char *moby) __asm__("FUN_L05_002db018"); +void mark_moby_for_removal(void *obj) __asm__("FUN_0020c828"); void amoeboid_update(struct Moby *m) __asm__("FUN_L05_002dac80"); typedef struct Moby Moby; @@ -53,7 +54,7 @@ void amoeboid_update(struct Moby *moby) { handle_amoeboid_hits(moby); switch (moby->state) { case AMOEBOID_INITIALIZE: - moby->state = 1; + moby->state = AMOEBOID_FOLLOW_PATH; moby->update_dist = 0x40; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, 0); @@ -75,12 +76,12 @@ void amoeboid_update(struct Moby *moby) { char *path_node_base = ((char *)l05_paths[moby_data->path_B0]) + moby_data->unkB4 * 16; float yaw = fast_arc_tan(*(float *)(path_node_base + 0x10) - moby->pos.x, *(float *)(path_node_base + 0x14) - moby->pos.y); - FUN_L00_0025be00(&moby->rot.z, - &moby_data->unkBC, - yaw, - frame_time_sq * 1.0471976f, - frame_time_sq * 1.0471976f, - frame_time * 3.1415927f); + approach_angle(&moby->rot.z, + &moby_data->unkBC, + yaw, + frame_time_sq * 1.0471976f, + frame_time_sq * 1.0471976f, + frame_time * 3.1415927f); facing_direction[0] = fast_cos(moby->rot.z); facing_direction[1] = fast_sin(moby->rot.z); facing_direction[2] = 0.0f; @@ -98,7 +99,7 @@ void amoeboid_update(struct Moby *moby) { } case AMOEBOID_WAIT_FOR_HERO_TO_LEAVE: if (48.0f < vector_distance_xy(&moby->pos, &hero.motion.pos)) { - moby->state = 1; + moby->state = AMOEBOID_FOLLOW_PATH; moby->visible = 1; moby->flags &= 0xFFFE; moby->collision = moby->pclass->collision; diff --git a/src/overlays/l05/mobys/box.c b/src/overlays/l05/mobys/box.c index f6a23326df..8cd4e49ce1 100644 --- a/src/overlays/l05/mobys/box.c +++ b/src/overlays/l05/mobys/box.c @@ -32,7 +32,7 @@ void box_update(char *moby) { moby + 0x40, moby_data + 0x60, moby_data + 0x70); - MOBY(moby)->state = 1; + MOBY(moby)->state = BOX_UPDATE_TRANSFORM; } break; case BOX_UPDATE_TRANSFORM: diff --git a/src/overlays/l05/mobys/drain_cover.c b/src/overlays/l05/mobys/drain_cover.c index b7ebc6435a..1fedc2de87 100644 --- a/src/overlays/l05/mobys/drain_cover.c +++ b/src/overlays/l05/mobys/drain_cover.c @@ -211,7 +211,7 @@ void drain_cover_update(DrainCoverMoby *moby) { qcopy(old_position, moby->pos); qcopy(old_rotation, moby->rot); - if (moby->state >= 2) { + if (moby->state >= DRAIN_COVER_RISE) { if (voice_is_playing(moby, drain_cover_data->sound) == 0) { drain_cover_data->sound = allocate_voice_for_target_entry(0, 4, moby); } @@ -228,7 +228,7 @@ void drain_cover_update(DrainCoverMoby *moby) { } switch (moby->state) { case DRAIN_COVER_INITIALIZE: - moby->state = 1; + moby->state = DRAIN_COVER_WAIT_TO_RISE; drain_cover_data->timer = scale_game_frames(0x78); drain_cover_data->sound = 0xFF; qcopy(drain_cover_data->home, moby->pos); @@ -245,7 +245,7 @@ void drain_cover_update(DrainCoverMoby *moby) { update_drain_cover_tilt((char *)moby, 0.0f, 8.0f); if (D_L05_0015F5C4 == 0 && vector_distance_xy(moby->pos, D_0013F3D0) < 24.0f && fast_dec_timer(&drain_cover_data->timer) != 0) { - moby->state = 2; + moby->state = DRAIN_COVER_RISE; clear_u64_value(drain_cover_data->vel); drain_cover_data->vel[2] = square_root(drain_cover_data->f80 * 2.0f * (l05_drain_cover_gravity * frame_time_sq)); @@ -314,7 +314,7 @@ void drain_cover_update(DrainCoverMoby *moby) { drain_cover_data->vel[2] = drain_cover_data->vel[2] - l05_drain_cover_gravity * frame_time_sq; if (drain_cover_data->vel[2] <= 0.0f) { - moby->state = 3; + moby->state = DRAIN_COVER_HOVER; drain_cover_data->home[3] = drain_cover_data->f84 - 0.5f; drain_cover_data->timer = truncate_float_to_s32(scale_time(drain_cover_data->f88)); } @@ -336,7 +336,7 @@ void drain_cover_update(DrainCoverMoby *moby) { } } if (fast_dec_timer(&drain_cover_data->timer) != 0) { - moby->state = 4; + moby->state = DRAIN_COVER_FALL_TO_HOME; } break; case DRAIN_COVER_FALL_TO_HOME: @@ -354,7 +354,7 @@ void drain_cover_update(DrainCoverMoby *moby) { drain_cover_data->vel[2] - l05_drain_cover_gravity * frame_time_sq; if (moby->pos[2] < drain_cover_data->home[2]) { allocate_voice_for_target_entry(1, 0, moby); - moby->state = 1; + moby->state = DRAIN_COVER_WAIT_TO_RISE; drain_cover_data->timer = scale_game_frames(0x78); qcopy(moby->pos, drain_cover_data->home); drain_cover_data->f98 = random_angle_radians(); diff --git a/src/overlays/l05/mobys/electric_gate.c b/src/overlays/l05/mobys/electric_gate.c index 7b54d20044..0a14725196 100644 --- a/src/overlays/l05/mobys/electric_gate.c +++ b/src/overlays/l05/mobys/electric_gate.c @@ -45,7 +45,7 @@ void electric_gate_update(char *gate_moby) { switch (state) { case ELECTRIC_GATE_INITIALIZE: MOBY(gate_moby)->flags |= 1; - MOBY(gate_moby)->state = 1; + MOBY(gate_moby)->state = ELECTRIC_GATE_WAIT_FOR_TRIGGER; MOBY(gate_moby)->visible = 0; *electric_gate_vars->unk4 = -1; break; @@ -88,7 +88,7 @@ void electric_gate_update(char *gate_moby) { 0) { allocate_voice_for_target_entry(1, 0, gate_moby); MOBY(gate_moby)->collision = 0; - MOBY(gate_moby)->state = 2; + MOBY(gate_moby)->state = ELECTRIC_GATE_TRIGGERED; } } break; diff --git a/src/overlays/l05/mobys/elevator_with_button.c b/src/overlays/l05/mobys/elevator_with_button.c index ddde666feb..143e365aae 100644 --- a/src/overlays/l05/mobys/elevator_with_button.c +++ b/src/overlays/l05/mobys/elevator_with_button.c @@ -95,7 +95,7 @@ void elevator_with_button_update(struct Moby *moby) { elevator_vars->phase = random_angle_radians(); elevator_vars->sound = -1; elevator_vars->base_yaw = moby->rot.z; - moby->state = 3; + moby->state = ELEVATOR_MOVE_TO_BOTTOM; break; case ELEVATOR_FADE_BEFORE_CAMERA_MOUNT: D_0014162A = elevator_vars->marker; @@ -127,7 +127,7 @@ void elevator_with_button_update(struct Moby *moby) { progress_speed_limit = frame_time; max_speed = frame_time_sq; } - target = moby->state == 2 ? 1.0f : 0.0f; + target = moby->state == ELEVATOR_MOVE_TO_TOP ? 1.0f : 0.0f; advance_accelerated_scalar(&elevator_vars->progress, &elevator_vars->speed, target, @@ -157,16 +157,16 @@ void elevator_with_button_update(struct Moby *moby) { elevator_vars->speed = -0.00125f; } if (moby->command) { - if (moby->state == 2) { - moby->state = 6; + if (moby->state == ELEVATOR_MOVE_TO_TOP) { + moby->state = ELEVATOR_WAIT_TO_RETURN_FROM_TOP; } else { - moby->state = 7; + moby->state = ELEVATOR_WAIT_TO_RETURN_FROM_BOTTOM; } } else { - if (moby->state == 2) { - moby->state = 4; + if (moby->state == ELEVATOR_MOVE_TO_TOP) { + moby->state = ELEVATOR_WAIT_AT_TOP; } else { - moby->state = 5; + moby->state = ELEVATOR_WAIT_AT_BOTTOM; } } } @@ -183,10 +183,10 @@ void elevator_with_button_update(struct Moby *moby) { } if (hero.ground_moby != moby) { jet_end_mount(1); - if (moby->state == 7) { - moby->state = 5; + if (moby->state == ELEVATOR_WAIT_TO_RETURN_FROM_BOTTOM) { + moby->state = ELEVATOR_WAIT_AT_BOTTOM; } else { - moby->state = 4; + moby->state = ELEVATOR_WAIT_AT_TOP; } break; } @@ -205,10 +205,10 @@ void elevator_with_button_update(struct Moby *moby) { vector_distance_xy(&hero.motion.pos, &moby->pos) < 0.5f) { allocate_voice_for_target_entry(1, 0, moby); moby->glow_color = 0x80208020; - if (moby->state == 7) { - moby->state = 2; + if (moby->state == ELEVATOR_WAIT_TO_RETURN_FROM_BOTTOM) { + moby->state = ELEVATOR_MOVE_TO_TOP; } else { - moby->state = 3; + moby->state = ELEVATOR_MOVE_TO_BOTTOM; } } break; @@ -229,26 +229,26 @@ void elevator_with_button_update(struct Moby *moby) { place_marker_ring(moby); } moby->glow_color = 0x80208020; - if (moby->state == 5) { + if (moby->state == ELEVATOR_WAIT_AT_BOTTOM) { moby->command = 2; } else { moby->command = 3; } - moby->state = 1; + moby->state = ELEVATOR_FADE_BEFORE_CAMERA_MOUNT; elevator_vars->fade = 0.0f; - } else if (moby->state == 4) { + } else if (moby->state == ELEVATOR_WAIT_AT_TOP) { f32 dist = vector_distance_xy(&moby->pos, &hero.motion.pos); if (absolute_float(hero.ground_z.f - elevator_vars->bottom) < 2.0f && dist < 32.0f && dist > 5.0f) { moby->command = 0; - moby->state = 3; + moby->state = ELEVATOR_MOVE_TO_BOTTOM; } - } else if (moby->state == 5) { + } else if (moby->state == ELEVATOR_WAIT_AT_BOTTOM) { f32 dist = vector_distance_xy(&moby->pos, &hero.motion.pos); if (absolute_float(hero.ground_z.f - elevator_vars->top) < 2.0f && dist < 32.0f && dist > 5.0f) { moby->command = 0; - moby->state = 2; + moby->state = ELEVATOR_MOVE_TO_TOP; } } break; diff --git a/src/overlays/l05/mobys/extermibot.c b/src/overlays/l05/mobys/extermibot.c index 01080f5f39..1b02c8273c 100644 --- a/src/overlays/l05/mobys/extermibot.c +++ b/src/overlays/l05/mobys/extermibot.c @@ -9,6 +9,29 @@ #include "rnc/overlay/shared/mobys/build_symmetric_adjacency_masks.h" #include "qcopy.h" +enum { + EXTERMIBOT_INITIALIZE = 0, + EXTERMIBOT_HIT_STATUS_SKIP_RESPONSE = 1, + EXTERMIBOT_IDLE_AND_CHECK_TARGET_PATH = 1, + EXTERMIBOT_WANDER_NEAR_START = 2, + EXTERMIBOT_FOLLOW_TARGET = 4, + EXTERMIBOT_WAIT_FOR_TARGET_IN_STRIKE_RANGE = 5, + EXTERMIBOT_APPROACH_TARGET_DIRECTLY = 6, + EXTERMIBOT_AIM_BEFORE_STRIKE = 7, + EXTERMIBOT_STRIKE_TARGET = 8, + EXTERMIBOT_RECOVER_AFTER_STRIKE = 9, + EXTERMIBOT_RETURN_TO_START = 10, + EXTERMIBOT_NONLETHAL_KNOCKBACK = 11, + EXTERMIBOT_WAIT_FOR_ANIMATION_BEFORE_IDLE = 13, + EXTERMIBOT_DEATH_KNOCKBACK = 14, + EXTERMIBOT_WAIT_FOR_ACTIVATION_TRIGGER = 15 +}; + +enum { + EXTERMIBOT_TARGET_PATH_UNAVAILABLE = 2, + EXTERMIBOT_HIDDEN_BELOW_START = 0xC +}; + extern int scale_game_frames(int) __asm__("FUN_001f96f8"); extern void blend_moby_animation(void *, int, int, int) __asm__("FUN_00212f90"); extern int random_integer_below(int) __asm__("FUN_00213260"); @@ -20,9 +43,10 @@ extern float random_angle_radians(void) __asm__("FUN_00213308"); extern float D_0015ED6C; extern float D_0015ED70; float absolute_float(float input) __asm__("func_001F99C0"); -extern float FUN_L00_0025be00(float *, float *, float, float, float, float); -extern int FUN_L00_00258b50(void *, void *, void *, void *, float); -extern void FUN_L01_0026d930(char *p); +extern float + approach_angle(float *, float *, float, float, float, float) __asm__("FUN_L00_0025be00"); +extern int FUN_L00_00258b50(void *, void *, void *, void *, float); +extern void FUN_L01_0026d930(char *p); /* Extermibot update: wakes from its dormant pose, walks its path, closes in on the target and strikes it, bursts into sparks between strikes, and dies on a hit. */ /* Ported from rac1-decomp (src/overlays/l05_rilgar/vendor_002D28D0.c: func_L05_003033A0), where it is exact; names translated to the US level program. */ @@ -124,22 +148,6 @@ typedef struct ExtermibotVars { /* Moby class 623 */ void extermibot_update(unsigned char *moby) { - enum { - EXTERMIBOT_INITIALIZE = 0, - EXTERMIBOT_IDLE_AND_CHECK_TARGET_PATH = 1, - EXTERMIBOT_WANDER_NEAR_START = 2, - EXTERMIBOT_FOLLOW_TARGET = 4, - EXTERMIBOT_WAIT_FOR_TARGET_IN_STRIKE_RANGE = 5, - EXTERMIBOT_APPROACH_TARGET_DIRECTLY = 6, - EXTERMIBOT_AIM_BEFORE_STRIKE = 7, - EXTERMIBOT_STRIKE_TARGET = 8, - EXTERMIBOT_RECOVER_AFTER_STRIKE = 9, - EXTERMIBOT_RETURN_TO_START = 10, - EXTERMIBOT_NONLETHAL_KNOCKBACK = 11, - EXTERMIBOT_WAIT_FOR_ANIMATION_BEFORE_IDLE = 13, - EXTERMIBOT_DEATH_KNOCKBACK = 14, - EXTERMIBOT_WAIT_FOR_ACTIVATION_TRIGGER = 15 - }; ExtermibotVars *moby_data = (ExtermibotVars *)MOBY(moby)->pvars; char *target_moby; float path_goal_or_facing_vector[4]; @@ -200,7 +208,7 @@ void extermibot_update(unsigned char *moby) { MOBY(moby)->flags &= 0x7FFF; } if (moby_data->unk2B4 != 0) { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = EXTERMIBOT_HIDDEN_BELOW_START; MOBY(moby)->visible = 0; MOBY(moby)->collision = 0; MOBY(moby)->flags &= 0xEFFF; @@ -208,18 +216,18 @@ void extermibot_update(unsigned char *moby) { MOBY(moby)->draw_dist = 0; } else if (*(long *)&moby_data->unk2B8 != -1) { MOBY(moby)->flags &= 0xEFFF; - MOBY(moby)->state = 0xF; + MOBY(moby)->state = EXTERMIBOT_WAIT_FOR_ACTIVATION_TRIGGER; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, 0); } else { - MOBY(moby)->state = 1; + MOBY(moby)->state = EXTERMIBOT_IDLE_AND_CHECK_TARGET_PATH; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, 0); } build_symmetric_adjacency_masks(&moby_data->path, 1, moby_data->path_pos); break; case EXTERMIBOT_IDLE_AND_CHECK_TARGET_PATH: - if (moby_data->mode != 2 && random_integer_below(9) == 0) { + if (moby_data->mode != EXTERMIBOT_TARGET_PATH_UNAVAILABLE && random_integer_below(9) == 0) { if (follow_path(&moby_data->path, 1, moby_data->path_pos, @@ -232,15 +240,15 @@ void extermibot_update(unsigned char *moby) { } moby_data->unk294 = moby_data->unk298 * 0.017453292f; moby_data->unk2AC = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - MOBY(moby)->state = 4; + MOBY(moby)->state = EXTERMIBOT_FOLLOW_TARGET; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } else { - moby_data->mode = 2; + moby_data->mode = EXTERMIBOT_TARGET_PATH_UNAVAILABLE; } } - if (moby_data->mode == 2 && moby_data->unk2B0 != 0) { - MOBY(moby)->state = 6; + if (moby_data->mode == EXTERMIBOT_TARGET_PATH_UNAVAILABLE && moby_data->unk2B0 != 0) { + MOBY(moby)->state = EXTERMIBOT_APPROACH_TARGET_DIRECTLY; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } else if (MOBY(moby)->anim_flags & 2) { @@ -250,7 +258,7 @@ void extermibot_update(unsigned char *moby) { fast_vec_add(moby_data->goal, moby_data->goal, &moby_data->unk270); moby_data->unk2D2 = 0; MOBY(moby)->command = MOBY(moby)->state; - MOBY(moby)->state = 2; + MOBY(moby)->state = EXTERMIBOT_WANDER_NEAR_START; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } else if (MOBY(moby)->prev_seq != 0) { @@ -263,12 +271,12 @@ void extermibot_update(unsigned char *moby) { moby_position = moby + 0x10; yaw = fast_arc_tan(moby_data->goal[0] - MOBY(moby)->pos.x, moby_data->goal[1] - MOBY(moby)->pos.y); - FUN_L00_0025be00(moby_yaw_ptr, - &moby_data->yaw_vel, - yaw, - D_0015ED70 * 6.2831855f, - D_0015ED70 * 6.2831855f, - D_0015ED6C * 6.2831855f); + approach_angle(moby_yaw_ptr, + &moby_data->yaw_vel, + yaw, + D_0015ED70 * 6.2831855f, + D_0015ED70 * 6.2831855f, + D_0015ED6C * 6.2831855f); if (fast_difference_between_rotations( MOBY(moby)->rot.z, fast_arc_tan(moby_data->goal[0] - MOBY(moby)->pos.x, @@ -300,12 +308,12 @@ void extermibot_update(unsigned char *moby) { approach_value(&moby_data->speed, D_0015ED6C * 6.0f, D_0015ED70 * 6.0f); yaw = fast_arc_tan(MOBY(target_moby)->pos.x - MOBY(moby)->pos.x, MOBY(target_moby)->pos.y - MOBY(moby)->pos.y); - FUN_L00_0025be00(moby_yaw_ptr, - &moby_data->yaw_vel, - yaw, - D_0015ED70 * 6.2831855f, - D_0015ED70 * 6.2831855f, - D_0015ED6C * 6.2831855f); + approach_angle(moby_yaw_ptr, + &moby_data->yaw_vel, + yaw, + D_0015ED70 * 6.2831855f, + D_0015ED70 * 6.2831855f, + D_0015ED6C * 6.2831855f); if (fast_difference_between_rotations( MOBY(moby)->rot.z, fast_arc_tan(MOBY(target_moby)->pos.x - MOBY(moby)->pos.x, @@ -327,29 +335,29 @@ void extermibot_update(unsigned char *moby) { near = 1; } if (near) { - MOBY(moby)->state = 5; + MOBY(moby)->state = EXTERMIBOT_WAIT_FOR_TARGET_IN_STRIKE_RANGE; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(20)); } else if (moby_data->unk2B0 != 0) { if (vector_distance_xy(moby_position, target_moby + 0x10) < 3.0f) { - MOBY(moby)->state = 7; + MOBY(moby)->state = EXTERMIBOT_AIM_BEFORE_STRIKE; moby_data->unk2D0 = scale_game_frames(extermibot_pre_strike_delay_frames_gp); if (MOBY(moby)->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } } else { - MOBY(moby)->state = 10; + MOBY(moby)->state = EXTERMIBOT_RETURN_TO_START; } break; } case EXTERMIBOT_WAIT_FOR_TARGET_IN_STRIKE_RANGE: if (moby_data->unk2B0 == 0) { moby_data->speed = 0.0f; - MOBY(moby)->state = 10; + MOBY(moby)->state = EXTERMIBOT_RETURN_TO_START; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(20)); } else if (vector_distance_xy(moby + 0x10, target_moby + 0x10) < 3.0f) { - MOBY(moby)->state = 7; + MOBY(moby)->state = EXTERMIBOT_AIM_BEFORE_STRIKE; moby_data->unk2D0 = scale_game_frames(extermibot_pre_strike_delay_frames_gp); if (MOBY(moby)->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(10)); @@ -362,7 +370,7 @@ void extermibot_update(unsigned char *moby) { is_point_inside_clip_volume(((char *)D_0013F3D0), moby_data->unk2BC) != 0)) { MOBY(moby)->draw_dist = 0x40; MOBY(moby)->flags |= 0x1000; - MOBY(moby)->state = 1; + MOBY(moby)->state = EXTERMIBOT_IDLE_AND_CHECK_TARGET_PATH; } else if (MOBY(moby)->anim_flags & 2) { if (random_integer_below(0xFF) & 1) { FUN_L00_00257d78(moby_data->goal, 0.0f, 4.0f); @@ -370,7 +378,7 @@ void extermibot_update(unsigned char *moby) { fast_vec_add(moby_data->goal, moby_data->goal, &moby_data->unk270); moby_data->unk2D2 = scale_game_frames(0x5A); MOBY(moby)->command = MOBY(moby)->state; - MOBY(moby)->state = 2; + MOBY(moby)->state = EXTERMIBOT_WANDER_NEAR_START; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } else if (MOBY(moby)->prev_seq != 0) { @@ -386,13 +394,13 @@ void extermibot_update(unsigned char *moby) { MOBY(moby)->rot.z, fast_arc_tan(MOBY(target_moby)->pos.x - MOBY(moby)->pos.x, MOBY(target_moby)->pos.y - MOBY(moby)->pos.y)) < 0.7853982f) { - MOBY(moby)->state = 7; + MOBY(moby)->state = EXTERMIBOT_AIM_BEFORE_STRIKE; moby_data->unk2D0 = scale_game_frames(extermibot_pre_strike_delay_frames_gp); if (MOBY(moby)->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } - if (moby_data->mode == 2) { - MOBY(moby)->state = 10; + if (moby_data->mode == EXTERMIBOT_TARGET_PATH_UNAVAILABLE) { + MOBY(moby)->state = EXTERMIBOT_RETURN_TO_START; } break; } @@ -400,18 +408,18 @@ void extermibot_update(unsigned char *moby) { moby_yaw_ptr = (float *)&MOBY(moby)->rot.z; yaw = fast_arc_tan(MOBY(target_moby)->pos.x - MOBY(moby)->pos.x, MOBY(target_moby)->pos.y - MOBY(moby)->pos.y); - FUN_L00_0025be00(moby_yaw_ptr, - &moby_data->yaw_vel, - yaw, - D_0015ED70 * 12.566371f, - D_0015ED70 * 12.566371f, - D_0015ED6C * 25.132742f); + approach_angle(moby_yaw_ptr, + &moby_data->yaw_vel, + yaw, + D_0015ED70 * 12.566371f, + D_0015ED70 * 12.566371f, + D_0015ED6C * 25.132742f); if ((MOBY(moby)->anim_flags & 2) && MOBY(moby)->prev_seq == 2) { blend_moby_animation(moby, 7, 0, scale_game_frames(5)); } if (fast_dec_timer_s16(&moby_data->unk2D0) != 0) { float a; - MOBY(moby)->state = 8; + MOBY(moby)->state = EXTERMIBOT_STRIKE_TARGET; moby_data->unk2D0 = 0; if (MOBY(moby)->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(1)); @@ -518,7 +526,7 @@ void extermibot_update(unsigned char *moby) { 1.0f); } if (MOBY(moby)->anim_flags & 2) { - MOBY(moby)->state = 9; + MOBY(moby)->state = EXTERMIBOT_RECOVER_AFTER_STRIKE; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } @@ -531,13 +539,13 @@ void extermibot_update(unsigned char *moby) { MOBY(moby)->rot.z, fast_arc_tan(MOBY(target_moby)->pos.x - MOBY(moby)->pos.x, MOBY(target_moby)->pos.y - MOBY(moby)->pos.y)) < 0.2617994f) { - MOBY(moby)->state = 7; + MOBY(moby)->state = EXTERMIBOT_AIM_BEFORE_STRIKE; moby_data->unk2D0 = scale_game_frames(extermibot_pre_strike_delay_frames_gp); if (MOBY(moby)->prev_seq != 7) blend_moby_animation(moby, 7, 0, scale_game_frames(5)); } else { moby_data->speed = 0.0f; - MOBY(moby)->state = 4; + MOBY(moby)->state = EXTERMIBOT_FOLLOW_TARGET; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -546,15 +554,15 @@ void extermibot_update(unsigned char *moby) { case EXTERMIBOT_RETURN_TO_START: FUN_L05_00303b08_c((struct Moby *)moby, (s32)(&moby_data->unk270), 0.0f); if (vector_distance_xy(moby + 0x10, &moby_data->unk270) < 1.0f) { - MOBY(moby)->state = 1; + MOBY(moby)->state = EXTERMIBOT_IDLE_AND_CHECK_TARGET_PATH; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(3)); - } else if (moby_data->mode != 2) { - MOBY(moby)->state = 4; + } else if (moby_data->mode != EXTERMIBOT_TARGET_PATH_UNAVAILABLE) { + MOBY(moby)->state = EXTERMIBOT_FOLLOW_TARGET; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(3)); } else if (moby_data->unk2B0 != 0) { - MOBY(moby)->state = 6; + MOBY(moby)->state = EXTERMIBOT_APPROACH_TARGET_DIRECTLY; } break; case EXTERMIBOT_NONLETHAL_KNOCKBACK: @@ -566,7 +574,7 @@ void extermibot_update(unsigned char *moby) { (s32)(&moby_data->unk270), path_goal_or_facing_vector, (D_L05_00161A98) * 0.4f) != 0) { - MOBY(moby)->state = 4; + MOBY(moby)->state = EXTERMIBOT_FOLLOW_TARGET; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); break; @@ -582,7 +590,7 @@ void extermibot_update(unsigned char *moby) { break; case EXTERMIBOT_WAIT_FOR_ANIMATION_BEFORE_IDLE: if (MOBY(moby)->anim_flags & 2) { - MOBY(moby)->state = 1; + MOBY(moby)->state = EXTERMIBOT_IDLE_AND_CHECK_TARGET_PATH; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -791,7 +799,8 @@ void handle_extermibot_hits_and_update_targeting(Moby *moby) { } hit_response = resolve_moby_hit_response( moby, hit_record, &moby_data->hp, 0, &collision_hit_status, &dmg, 0, 4); - if (collision_hit_status != 1 && moby->state != 14) { + if (collision_hit_status != EXTERMIBOT_HIT_STATUS_SKIP_RESPONSE && + moby->state != EXTERMIBOT_DEATH_KNOCKBACK) { moby_data->hp = moby_data->hp - dmg; if (moby_data->hp <= 0.0f) { hit_response = 1; @@ -826,7 +835,7 @@ void handle_extermibot_hits_and_update_targeting(Moby *moby) { trooper_knockback_arc( working_vector, &nonlethal_knockback_heading, &moby_data->f88, &moby_data->f8C); trooper_start_knockback(moby, moby_data->f70, nonlethal_knockback_heading, 5, 1, 0); - moby->state = 11; + moby->state = EXTERMIBOT_NONLETHAL_KNOCKBACK; moby_data->b67 = 0x78; break; case EXTERMIBOT_HIT_LETHAL: @@ -843,7 +852,7 @@ void handle_extermibot_hits_and_update_targeting(Moby *moby) { trooper_knockback_arc( working_vector, &death_knockback_heading, &moby_data->f88, &moby_data->f8C); trooper_start_knockback(moby, moby_data->f70, death_knockback_heading, 6, 1, 0); - moby->state = 14; + moby->state = EXTERMIBOT_DEATH_KNOCKBACK; moby_data->b67 = 0xF0; if (hit_record->who != 0 && *(struct Moby **)&hit_record->who->pclass != 0 && *(short *)((u8 *)((struct Moby *)hit_record->who->pclass) + 0x46) == 5) { @@ -950,7 +959,10 @@ extern f32 D_L05_00161A98_gp __asm__("D_L05_00161A98") __attribute__((sda)); extern f32 fast_difference_between_rotations(f32, f32) __asm__("FUN_001fa688"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern f32 -approach_angle(f32 *angle, f32 target, f32 *vel, f32, f32, f32) __asm__("FUN_L00_0025be00"); +approach_angle(f32 *angle, f32 *vel, f32 target, f32, f32, f32) __asm__("FUN_L00_0025be00"); + +/* This handler uses the retail target-before-velocity C call view. */ +typedef f32 (*ApproachAngleTargetFirst)(f32 *, f32, f32 *, f32, f32, f32); extern s32 test_extermibot_offset_path_clearance(char *moby, float *goal, float s) __asm__("FUN_L05_00303e50"); @@ -975,7 +987,7 @@ void move_extermibot_along_path(struct Moby *moby, s32 destination_position, f32 destination_position, &walker_vars->goal, D_L05_00161A98_gp * 0.4f) == 0) - walker_vars->mode = 2; + walker_vars->mode = EXTERMIBOT_TARGET_PATH_UNAVAILABLE; } qcopy(&goal, &walker_vars->goal); distance_to_goal = vector_distance_xy(&moby->pos, &goal); @@ -984,19 +996,20 @@ void move_extermibot_along_path(struct Moby *moby, s32 destination_position, f32 (char *)moby, (float *)&goal, D_L05_00161A98_gp * 0.4f)) { offset_heading = fast_add_rotations(fast_arc_tan(goal.x - moby->pos.x, goal.y - moby->pos.y), side); - approach_angle(&moby->rot.z, - offset_heading, - &walker_vars->yaw_vel, - frame_time_sq * 12.566371f, - frame_time_sq * 12.566371f, - frame_time * 25.132742f); + ((ApproachAngleTargetFirst)approach_angle)(&moby->rot.z, + offset_heading, + &walker_vars->yaw_vel, + frame_time_sq * 12.566371f, + frame_time_sq * 12.566371f, + frame_time * 25.132742f); } else { - approach_angle(&moby->rot.z, - fast_arc_tan(goal.x - moby->pos.x, goal.y - moby->pos.y), - &walker_vars->yaw_vel, - frame_time_sq * 12.566371f, - frame_time_sq * 12.566371f, - frame_time * 25.132742f); + ((ApproachAngleTargetFirst)approach_angle)( + &moby->rot.z, + fast_arc_tan(goal.x - moby->pos.x, goal.y - moby->pos.y), + &walker_vars->yaw_vel, + frame_time_sq * 12.566371f, + frame_time_sq * 12.566371f, + frame_time * 25.132742f); } if (fast_difference_between_rotations( moby->rot.z, fast_arc_tan(goal.x - moby->pos.x, goal.y - moby->pos.y)) < 1.5707964f && @@ -1104,7 +1117,7 @@ f32 push_point_from_path(s32 path_index, f32 push_point_from_path(s32 path_index, void *input, void *output, f32 distance) { PathVec *point = input; - PathVec *out = output; + PathVec *adjusted_position_output = output; PathVec difference; PathVec scaled_difference; PathVec working; @@ -1112,7 +1125,7 @@ f32 push_point_from_path(s32 path_index, void *input, void *output, f32 distance PathVec scaled_segment; PathVec cross; PathVec scaled_cross; - SegmentPath **entry; + SegmentPath **path_table_slot; s32 i; s32 found; f32 best = 512.0f; @@ -1120,12 +1133,14 @@ f32 push_point_from_path(s32 path_index, void *input, void *output, f32 distance found = 0; qcopy_nc(&working, point); for (i = 0; i < ((SegmentPath *)l05_paths[path_index])->count - 1; i++) { - entry = ((SegmentPath **)&l05_paths[path_index]); - if ((*entry)->points[i].f[3] == 0.0f && (*entry)->points[i + 1].f[3] == 0.0f) + path_table_slot = ((SegmentPath **)&l05_paths[path_index]); + if ((*path_table_slot)->points[i].f[3] == 0.0f && + (*path_table_slot)->points[i + 1].f[3] == 0.0f) continue; - func_001F9BF0_3054B0(&difference, &working, &(*entry)->points[i]); + func_001F9BF0_3054B0(&difference, &working, &(*path_table_slot)->points[i]); difference.i[2] = 0; - func_001F9BF0_3054B0(&segment, &(*entry)->points[i + 1], &(*entry)->points[i]); + func_001F9BF0_3054B0( + &segment, &(*path_table_slot)->points[i + 1], &(*path_table_slot)->points[i]); segment.i[2] = 0; func_L00_001FF4B0_3054B0(&scaled_segment, &segment, 1.0f); func_001F9CA0_3054B0(&cross, &difference, &scaled_segment); @@ -1144,7 +1159,7 @@ f32 push_point_from_path(s32 path_index, void *input, void *output, f32 distance continue; found = 1; func_L00_001FF4B0_3054B0(&scaled_difference, &difference, distance); - func_001F9BD8_3054B0(&working, &scaled_difference, &(*entry)->points[i]); + func_001F9BD8_3054B0(&working, &scaled_difference, &(*path_table_slot)->points[i]); working.f[2] = point->f[2]; } else { found = 1; @@ -1152,12 +1167,12 @@ f32 push_point_from_path(s32 path_index, void *input, void *output, f32 distance func_001F9BF0_3054B0(&scaled_difference, &difference, &scaled_cross); func_L00_001FF4B0_3054B0(&scaled_difference, &scaled_difference, distance); func_001F9BD8_3054B0(&scaled_difference, &scaled_difference, &scaled_cross); - func_001F9BD8_3054B0(&working, &scaled_difference, &(*entry)->points[i]); + func_001F9BD8_3054B0(&working, &scaled_difference, &(*path_table_slot)->points[i]); working.f[2] = point->f[2]; } } } if (found) - qcopy(out, &working); + qcopy(adjusted_position_output, &working); return best; } diff --git a/src/overlays/l05/mobys/extermitank.c b/src/overlays/l05/mobys/extermitank.c index 3e43117965..3daef698ff 100644 --- a/src/overlays/l05/mobys/extermitank.c +++ b/src/overlays/l05/mobys/extermitank.c @@ -11,6 +11,13 @@ #include "qcopy.h" #include "rnc/overlay/l05/mobys/extermitank_globals.h" +enum { + EXTERMITANK_INITIALIZE = 0, + EXTERMITANK_FOLLOW_PATH = 1, + EXTERMITANK_FIRE_PARTICLES = 2, + EXTERMITANK_REMOVE = 3 +}; + extern char D_0013E533[]; extern int scale_game_frames(int) __asm__("FUN_001f96f8"); extern void *create_moby() __asm__("FUN_0020c4f8"); @@ -33,7 +40,7 @@ extern int collision_line(void *, void *, int, void *, void *) __asm__("FUN_00 extern float D_0015ED6C_gp __asm__("D_0015ED6C") MACRO_ADDR; extern float step_angle_toward_target(float *, int, float, float) __asm__("FUN_L00_0025bc00"); extern int frame_number_gp __asm__("D_L05_0015F5CC") MACRO_ADDR; -extern int FUN_L00_00259028(char *m, char *p, float *pos, char *v); +extern int step_mover_2e3f20(char *m, char *p, float *pos, char *v) __asm__("FUN_L00_00259028"); extern int FUN_L00_00259740(void *, void *, int); extern s32 spawn_spark_c2(void *, void *, void *, s32, s32, s32, s32, s32, s32) __asm__("func_00218888"); @@ -78,7 +85,7 @@ extern float extermitank_secondary_particle_vector_a_spread_degrees_gp __asm__(" __attribute__((sda)); extern short D_L05_00161B78 __attribute__((sda)); extern float D_L05_00161B7C __attribute__((sda)); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern void mark_moby_for_removal_c3(void *) __asm__("func_0020C828"); void handle_extermitank_hits_and_sync_children(char *moby) __asm__("FUN_L05_00305178"); void process_extermitank_particle_hits(char *m) __asm__("FUN_L05_00305898"); @@ -152,12 +159,6 @@ typedef struct ExtermitankVars { /* Moby class 625 */ void extermitank_update(unsigned char *moby) { - enum { - EXTERMITANK_INITIALIZE = 0, - EXTERMITANK_FOLLOW_PATH = 1, - EXTERMITANK_FIRE_PARTICLES = 2, - EXTERMITANK_REMOVE = 3 - }; ExtermitankVars *extermitank_vars = (ExtermitankVars *)MOBY(moby)->pvars; float origin_position[4]; float particle_vector_a[4]; @@ -231,7 +232,7 @@ void extermitank_update(unsigned char *moby) { extermitank_vars->unkD0 = ((char *)l05_paths[extermitank_vars->unkD4]); extermitank_vars->unkC0 = 1; qcopy(moby + 0x10, extermitank_vars->unkD0 + 0x10); - MOBY(moby)->state = 1; + MOBY(moby)->state = EXTERMITANK_FOLLOW_PATH; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, 0); extermitank_vars->unk94 = D_L05_00161AF8 * D_0015ED6C_gp; @@ -263,10 +264,10 @@ void extermitank_update(unsigned char *moby) { if (dir >= 0) last = n - 1; idx = (extermitank_vars->unkC0 + n + dir) % n; - FUN_L00_00259028((char *)moby, - &extermitank_vars->unk70, - (float *)(path + (idx * 16 + 0x10)), - extermitank_vars->unk40); + step_mover_2e3f20((char *)moby, + &extermitank_vars->unk70, + (float *)(path + (idx * 16 + 0x10)), + extermitank_vars->unk40); if (vector_distance_xy(moby + 0x10, *(char **)(pp + 0x10) + (idx * 16 + 0x10)) < 1.0f) { if (idx == last) { char *q = *(char **)(pp + 0x10); @@ -289,7 +290,7 @@ void extermitank_update(unsigned char *moby) { if (collision_line(origin_position, h + 0x50, 2, moby, 0) == 0) { if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, 3); - MOBY(moby)->state = 2; + MOBY(moby)->state = EXTERMITANK_FIRE_PARTICLES; } } } @@ -307,10 +308,11 @@ void extermitank_update(unsigned char *moby) { step_angle_toward_target( &extermitank_vars->unk198, 0, 0.0f, D_0015ED6C_gp * 1.5707964f); } - FUN_L00_001fff28(extermitank_vars->unk140, 1, extermitank_vars->unk198); - FUN_L00_001fff28(extermitank_vars->unk100, - 2, - fast_subtract_rotations(extermitank_vars->unk194, MOBY(moby)->rot.z)); + build_axis_rotation_quaternion(extermitank_vars->unk140, 1, extermitank_vars->unk198); + build_axis_rotation_quaternion( + extermitank_vars->unk100, + 2, + fast_subtract_rotations(extermitank_vars->unk194, MOBY(moby)->rot.z)); break; } case EXTERMITANK_FIRE_PARTICLES: { @@ -326,10 +328,10 @@ void extermitank_update(unsigned char *moby) { if (dir >= 0) last = n - 1; idx = (extermitank_vars->unkC0 + n + dir) % n; - FUN_L00_00259028((char *)moby, - &extermitank_vars->unk70, - (float *)(path + (idx * 16 + 0x10)), - extermitank_vars->unk40); + step_mover_2e3f20((char *)moby, + &extermitank_vars->unk70, + (float *)(path + (idx * 16 + 0x10)), + extermitank_vars->unk40); if (vector_distance_xy(moby + 0x10, *(char **)(pp + 0x10) + (idx * 16 + 0x10)) < 1.0f) { if (idx == last) { char *q = *(char **)(pp + 0x10); @@ -470,7 +472,7 @@ void extermitank_update(unsigned char *moby) { collision_line(working_position, D_0013E533 + 0xEED, 2, moby, 0) != 0) { if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, 3); - MOBY(moby)->state = 1; + MOBY(moby)->state = EXTERMITANK_FOLLOW_PATH; } { char *g = ((char *)&D_0013F350); @@ -480,10 +482,11 @@ void extermitank_update(unsigned char *moby) { step_angle_toward_target( &extermitank_vars->unk198, 0, 0.08726646f, D_0015ED6C_gp * 1.5707964f); } - FUN_L00_001fff28(extermitank_vars->unk140, 1, extermitank_vars->unk198); - FUN_L00_001fff28(extermitank_vars->unk100, - 2, - fast_subtract_rotations(extermitank_vars->unk194, MOBY(moby)->rot.z)); + build_axis_rotation_quaternion(extermitank_vars->unk140, 1, extermitank_vars->unk198); + build_axis_rotation_quaternion( + extermitank_vars->unk100, + 2, + fast_subtract_rotations(extermitank_vars->unk194, MOBY(moby)->rot.z)); break; } case EXTERMITANK_REMOVE: @@ -535,6 +538,9 @@ extern float extermitank_child_animation_speed_offset_scale_gp __asm__("D_L05_00 typedef struct Hero Hero; void handle_extermitank_hits_and_sync_children(char *moby) { + enum { + MOBY_HIT_RESPONSE_SKIP_DAMAGE = 1 + }; ExtermitankVars *extermitank_hit_sync_vars = (ExtermitankVars *)MOBY(moby)->pvars; char *first; char *second; @@ -568,7 +574,8 @@ void handle_extermitank_hits_and_sync_children(char *moby) { hit = part0; resolve_moby_hit_response( moby, hit, &extermitank_hit_sync_vars->health, 0, &hit_processing_status, &remaining, 0, 4); - if (hit_processing_status == 1 || (unsigned char)MOBY(moby)->state == 3) + if (hit_processing_status == MOBY_HIT_RESPONSE_SKIP_DAMAGE || + (unsigned char)MOBY(moby)->state == EXTERMITANK_REMOVE) goto mark_children; { extermitank_hit_sync_vars->health -= remaining; @@ -644,7 +651,7 @@ void handle_extermitank_hits_and_sync_children(char *moby) { -1, 0); extermitank_hit_sync_vars->unk19E = scale_game_frames(D_L05_00161B74); - MOBY(moby)->state = 3; + MOBY(moby)->state = EXTERMITANK_REMOVE; clear_u64_value(effect_data); *(float *)(effect_data + 8) = extermitank_hit_sync_vars->unk194; spawn_particle_305178(moby, diff --git a/src/overlays/l05/mobys/floating_platform.c b/src/overlays/l05/mobys/floating_platform.c index d14a73b8e2..25a99e95fc 100644 --- a/src/overlays/l05/mobys/floating_platform.c +++ b/src/overlays/l05/mobys/floating_platform.c @@ -62,7 +62,7 @@ void floating_platform_update(unsigned char *moby) { (float)floating_platform_voice_interval_max_gp))); floating_platform_vars->unk60 = random_angle_radians(); floating_platform_vars->unk6C = random_angle_radians(); - MOBY(moby)->state = 1; + MOBY(moby)->state = FLOATING_PLATFORM_UPDATE_ROCKING; break; case FLOATING_PLATFORM_UPDATE_ROCKING: if (fast_dec_timer(&floating_platform_vars->timer_78)) { diff --git a/src/overlays/l05/mobys/fog_zone.c b/src/overlays/l05/mobys/fog_zone.c index 9a5e2a5d66..9e9050ca8e 100644 --- a/src/overlays/l05/mobys/fog_zone.c +++ b/src/overlays/l05/mobys/fog_zone.c @@ -88,14 +88,14 @@ void fog_zone_update(struct Moby *moby) { fog_zone_vars->preset_fog_448 = 0; fog_zone_vars->preset_fog_454 = 0; { - int c = l05_volume_blended_color_low_byte + - (l05_volume_blended_color_lower_middle_byte << 8) + - (l05_volume_blended_color_upper_middle_byte << 16) + - (l05_volume_blended_color_high_byte << 24); + int saved_volume_blend_color = l05_volume_blended_color_low_byte + + (l05_volume_blended_color_lower_middle_byte << 8) + + (l05_volume_blended_color_upper_middle_byte << 16) + + (l05_volume_blended_color_high_byte << 24); fog_zone_vars->unk34 = 0x40408070; - fog_zone_vars->unk30 = c; + fog_zone_vars->unk30 = saved_volume_blend_color; } - moby->state = 1; + moby->state = FOG_ZONE_WAIT_TO_APPLY_PRESET; break; case FOG_ZONE_WAIT_TO_APPLY_PRESET: if (is_point_inside_clip_volume(&hero.motion.pos, fog_zone_vars->clip_volume_2C)) { @@ -112,7 +112,7 @@ void fog_zone_update(struct Moby *moby) { D_L05_0015F450 = fog_450; D_L05_0015F454 = fog_454; } - moby->state = 2; + moby->state = FOG_ZONE_WAIT_TO_RESTORE_SAVED_SETTINGS; } break; case FOG_ZONE_WAIT_TO_RESTORE_SAVED_SETTINGS: @@ -130,7 +130,7 @@ void fog_zone_update(struct Moby *moby) { D_L05_0015F450 = fog_450; D_L05_0015F454 = fog_454; } - moby->state = 1; + moby->state = FOG_ZONE_WAIT_TO_APPLY_PRESET; } break; } diff --git a/src/overlays/l05/mobys/hero_clip_volume_outputs.c b/src/overlays/l05/mobys/hero_clip_volume_outputs.c index 0fd1f3da0f..957b64d0fb 100644 --- a/src/overlays/l05/mobys/hero_clip_volume_outputs.c +++ b/src/overlays/l05/mobys/hero_clip_volume_outputs.c @@ -30,7 +30,7 @@ void hero_clip_volume_outputs_update(struct Moby *moby) { switch (state) { case MOBY_INITIALIZE: - moby->state = 1; + moby->state = MOBY_CHECK_HERO_VOLUME; moby->flags |= 1; moby->update_dist = 0xFF; moby->collision = 0; diff --git a/src/overlays/l05/mobys/hoverboard_girl.c b/src/overlays/l05/mobys/hoverboard_girl.c index 70fce8cf4e..48f69c9fab 100644 --- a/src/overlays/l05/mobys/hoverboard_girl.c +++ b/src/overlays/l05/mobys/hoverboard_girl.c @@ -22,6 +22,10 @@ /* Hoverboard girl (class record hoverboard_girl), Rilgar / Blackwater City. * The update counts player action 11 at frame 15 when she faces the player. * Its two breast manipulators also carry the effect into cutscene instances. */ +enum { + GAME_MODE_CUTSCENE = 2 +}; + typedef union { u128 quadword; f32 component[4]; @@ -166,7 +170,7 @@ extern unsigned char D_L05_0017C8A0[]; void update_hoverboard_girl_cutscene_instances(HoverboardGirlMoby *girl) { char *reference_moby = (char *)girl; - if (game_mode == 2 && (D_0015EDB0[0] != 0 || breast_growth_count_gp != 0)) { + if (game_mode == GAME_MODE_CUTSCENE && (D_0015EDB0[0] != 0 || breast_growth_count_gp != 0)) { int i; for (i = 0; i < D_L05_0016CC60.count; i++) { char *moby = D_L05_0016CC60.mobys[i]; @@ -225,14 +229,14 @@ void hoverboard_girl_update(HoverboardGirlMoby *moby) { entries[dialogue_entry_index]->state = 13; } state->dialogue_name = race_girl_name; - moby->state = 1; + moby->state = HOVERBOARD_GIRL_STATE_UPDATE_DIALOGUE; initialize_npc_dialogue(moby, state); initialize_moby_grounding(moby); break; case HOVERBOARD_GIRL_STATE_UPDATE_DIALOGUE: if (update_npc_dialogue(moby, state) != 0) { begin_dialogue_camera_transition(2.0f, moby); - moby->state = 3; + moby->state = HOVERBOARD_GIRL_STATE_WAIT_TO_RESUME_DIALOGUE; } if (state->dialogue_state == 3) { state->previous_dialogue_state = state->dialogue_state; @@ -281,8 +285,8 @@ void hoverboard_girl_update(HoverboardGirlMoby *moby) { } break; case HOVERBOARD_GIRL_STATE_WAIT_TO_RESUME_DIALOGUE: - if (game_mode != 2) { - moby->state = 1; + if (game_mode != GAME_MODE_CUTSCENE) { + moby->state = HOVERBOARD_GIRL_STATE_UPDATE_DIALOGUE; if (state->previous_dialogue_state == 4) { alternate_item_available = 1; queue_dialogue_message(0x1395, scale_game_frames(300)); @@ -378,7 +382,7 @@ void hoverboard_girl_update(HoverboardGirlMoby *moby) { breast_growth_count_gp = state->breast_growth_count_gp; } } - if (game_mode != 2) { + if (game_mode != GAME_MODE_CUTSCENE) { update_hoverboard_girl_boobs_animation(moby, state); if (big_head_cheat_enabled != 0) state->joints[0].target_scale = 2.75f; diff --git a/src/overlays/l05/mobys/ocean_rilgar.c b/src/overlays/l05/mobys/ocean_rilgar.c index f2a98c86bc..04122995ff 100644 --- a/src/overlays/l05/mobys/ocean_rilgar.c +++ b/src/overlays/l05/mobys/ocean_rilgar.c @@ -45,7 +45,7 @@ void ocean_rilgar_update(struct Moby *moby) { switch ((unsigned char)((char)moby->state)) { case OCEAN_RILGAR_INITIALIZE: prepare_scaled_table_with_byte_128(D_L05_00211B20, 1.0f); - moby->state = 1; + moby->state = OCEAN_RILGAR_UPDATE_BOBBING; ((unsigned char *)moby)[0x30] = 0xFF; break; case OCEAN_RILGAR_UPDATE_BOBBING: diff --git a/src/overlays/l05/mobys/qwarks_bouncer.c b/src/overlays/l05/mobys/qwarks_bouncer.c index 38c7c703ab..a5ebc98160 100644 --- a/src/overlays/l05/mobys/qwarks_bouncer.c +++ b/src/overlays/l05/mobys/qwarks_bouncer.c @@ -134,7 +134,7 @@ void qwarks_bouncer_update(WM_c *bouncer_moby) { return; } bouncer_data->ptr20 = (void *)qwarks_bouncer_dialogue_name; - bouncer_moby->state = 1; + bouncer_moby->state = QWARKS_BOUNCER_UPDATE_DIALOGUE; initialize_npc_dialogue(bouncer_moby, bouncer_data); bouncer_data->fC = 3.7f; initialize_moby_grounding(bouncer_moby); diff --git a/src/overlays/l05/mobys/rising_gate.c b/src/overlays/l05/mobys/rising_gate.c index f5880bb45e..70b914c2da 100644 --- a/src/overlays/l05/mobys/rising_gate.c +++ b/src/overlays/l05/mobys/rising_gate.c @@ -26,7 +26,8 @@ float gate_swing_max_speed_gp __asm__("D_L05_00161E94") = 1.44e+03f; extern int gate_mobys_314eb0 __asm__("D_L05_0015FFD8"); extern float advance_accelerated_scalar(float, float, float, float, float *, float *) __asm__("FUN_00213f38"); -extern float FUN_L00_0025be00(float *, float *, float, float, float, float); +extern float +approach_angle(float *, float *, float, float, float, float) __asm__("FUN_L00_0025be00"); /* Gate: waits for its trigger moby, then rises to topZ and swings its yaw back to 0, with sounds per class. */ void rising_gate_update(struct Moby *gate_moby) __asm__("FUN_L05_00314eb0"); @@ -38,24 +39,27 @@ void rising_gate_update(struct Moby *gate_moby) { GATE_WAIT_FOR_TRIGGER = 1, GATE_RAISE_AND_SWING = 2 }; + enum { + GATE_YAW_ALIGNED = 3 + }; struct GateVars *gate_vars = (struct GateVars *)gate_moby->pvars; struct Moby *trigger_moby; switch (gate_moby->state) { case GATE_INITIALIZE: gate_vars->topZ = gate_moby->pos.z + 1.0f; - gate_moby->state = 1; + gate_moby->state = GATE_WAIT_FOR_TRIGGER; gate_moby->pos.z -= 8.0f; break; case GATE_WAIT_FOR_TRIGGER: trigger_moby = (struct Moby *)((gate_vars->trigger << 8) + gate_mobys_314eb0); if (trigger_moby->command == 1) { - gate_moby->state = 2; + gate_moby->state = GATE_RAISE_AND_SWING; break; } if (trigger_moby->command == 2) { gate_moby->pos.z = gate_vars->topZ; - gate_moby->state = 3; + gate_moby->state = GATE_YAW_ALIGNED; gate_moby->rot.y = 0.0f; } break; @@ -73,14 +77,14 @@ void rising_gate_update(struct Moby *gate_moby) { allocate_voice_for_target_entry(0, 0, gate_moby); } if (fast_dec_timer(&gate_vars->swingTimer)) { - FUN_L00_0025be00(&gate_moby->rot.y, - &gate_vars->swingSpeed, - 0.0f, - gate_swing_acceleration_gp * 0.017453292f * frame_time_sq, - gate_swing_deceleration_gp * 0.017453292f * frame_time_sq, - gate_swing_max_speed_gp * 0.017453292f * frame_time); + approach_angle(&gate_moby->rot.y, + &gate_vars->swingSpeed, + 0.0f, + gate_swing_acceleration_gp * 0.017453292f * frame_time_sq, + gate_swing_deceleration_gp * 0.017453292f * frame_time_sq, + gate_swing_max_speed_gp * 0.017453292f * frame_time); if (gate_moby->rot.y == 0.0f) - gate_moby->state = 3; + gate_moby->state = GATE_YAW_ALIGNED; } else if (gate_vars->swingTimer == 1 && gate_moby->oclass == 0x354) { allocate_voice_for_target_entry(0, 0, gate_moby); } diff --git a/src/overlays/l05/mobys/scenery_ship.c b/src/overlays/l05/mobys/scenery_ship.c index dfba8f5234..b7995c116d 100644 --- a/src/overlays/l05/mobys/scenery_ship.c +++ b/src/overlays/l05/mobys/scenery_ship.c @@ -16,6 +16,12 @@ /* Ported from rac1-decomp (src/overlays/l05_rilgar/vendor_002D28D0.c: func_L05_002D8190), where it is exact; names translated to the US level program. */ +enum { + SCENERY_SHIP_INITIALIZE = 0, + SCENERY_SHIP_FOLLOW_PATH = 1, + SCENERY_SHIP_SPAWN_EFFECTS_AND_REMOVE = 2 +}; + extern int get_first_moby_in_group(int *, int, int, int) __asm__("FUN_L00_002591d0"); extern int get_next_moby_in_group(int *, int, int, int) __asm__("FUN_L00_002592b8"); extern void draw_offset_textured_effect_quad(void *, int, float, float) __asm__("FUN_L00_00263618"); @@ -161,11 +167,6 @@ extern float fast_vec_dist(void *, void *); /* Moby class 79 */ void scenery_ship_update(char *moby) { - enum { - SCENERY_SHIP_INITIALIZE = 0, - SCENERY_SHIP_FOLLOW_PATH = 1, - SCENERY_SHIP_SPAWN_EFFECTS_AND_REMOVE = 2 - }; Data_2D8388 *scenery_ship_instance_vars = ((Data_2D8388 *)MOBY(moby)->pvars); char *hit; char *path; @@ -242,7 +243,7 @@ void scenery_ship_update(char *moby) { } scenery_ship_instance_vars->fC = fast_vec_dist((float *)(path + 0x10), (float *)(path + 0x20)); - MOBY(moby)->state = 1; + MOBY(moby)->state = SCENERY_SHIP_FOLLOW_PATH; scenery_ship_instance_vars->f8 = (float)*(int *)path * scenery_ship_instance_vars->f4; break; } @@ -307,7 +308,7 @@ void scenery_ship_update(char *moby) { if (hit != 0 && 0.0f < *(float *)(hit + 0x2C)) damaged = 1; if (damaged) - MOBY(moby)->state = 2; + MOBY(moby)->state = SCENERY_SHIP_SPAWN_EFFECTS_AND_REMOVE; break; } case SCENERY_SHIP_SPAWN_EFFECTS_AND_REMOVE: { @@ -458,7 +459,7 @@ void draw_group_scenery_ship_trails(struct Moby *moby) { list = D_L05_001ABCC0_7920[(unsigned char)((char)moby->group)]; do { member = (struct Moby *)(((*list & 0x7fff) << 8) + (int)D_L05_0015FFD8); - if (member->oclass == 0x4f && member->state == 1) { + if (member->oclass == 0x4f && member->state == SCENERY_SHIP_FOLLOW_PATH) { scenery_ship_vars = (char *)member->pvars; qcopy_nc(center, &member->pos); center[3] = 20.0f; diff --git a/src/overlays/l05/mobys/shady_salesman.c b/src/overlays/l05/mobys/shady_salesman.c index ec1e2355c5..c3f38a7e8f 100644 --- a/src/overlays/l05/mobys/shady_salesman.c +++ b/src/overlays/l05/mobys/shady_salesman.c @@ -105,7 +105,7 @@ void shady_salesman_update(WM *moby) { moby->position[2] += 0.5f; moby->position[2] = probe_ground_height(moby->position, 0, 0.5f); npc_data->ptr20 = (void *)shady_salesman_dialogue_name; - moby->state = 1; + moby->state = SHADY_SALESMAN_UPDATE_DIALOGUE; initialize_npc_dialogue(moby, npc_data); break; case SHADY_SALESMAN_UPDATE_DIALOGUE: diff --git a/src/overlays/l05/mobys/sharkigator.c b/src/overlays/l05/mobys/sharkigator.c index 6e42a25600..91195cf707 100644 --- a/src/overlays/l05/mobys/sharkigator.c +++ b/src/overlays/l05/mobys/sharkigator.c @@ -87,7 +87,7 @@ void sharkigator_update(char *moby) { state_zero: { float height; if (sharkigator_instance_vars->unk64 != 0) { - MOBY(moby)->state = 2; + MOBY(moby)->state = SHARKIGATOR_WAIT_TO_LEAP; MOBY(moby)->flags |= 1; MOBY(moby)->update_dist = 0xff; sharkigator_instance_vars->unk74 = MOBY(moby)->pos.z; @@ -180,7 +180,7 @@ state_two: { if (MOBY(moby)->prev_seq != state) set_action_2d1688(moby, 2, 0, scale_game_frames(5)); MOBY(moby)->command = 0; - MOBY(moby)->state = 3; + MOBY(moby)->state = SHARKIGATOR_UPDATE_LEAP; jet_mount(point + 0x140, point + 0x150, 0, 0, 0); return; } diff --git a/src/overlays/l05/mobys/skid_mcmarx.c b/src/overlays/l05/mobys/skid_mcmarx.c index 7db8a93e2c..61287c3b4d 100644 --- a/src/overlays/l05/mobys/skid_mcmarx.c +++ b/src/overlays/l05/mobys/skid_mcmarx.c @@ -464,7 +464,7 @@ void skid_mcmarx_update(Moby *moby) { racer_instance_vars->launch_speed *= handicap; } racer_instance_vars->bob_phase = random_angle_radians(); - moby->state = 1; + moby->state = SKID_MCMARX_WAIT_FOR_RACE_MODE; break; } case SKID_MCMARX_WAIT_FOR_RACE_MODE: @@ -492,14 +492,14 @@ void skid_mcmarx_update(Moby *moby) { racer_instance_vars->child->flags |= 0x8000; } } - moby->state = 2; + moby->state = SKID_MCMARX_FOLLOW_PATH; } break; case SKID_MCMARX_FOLLOW_PATH: { Hero *hero = (Hero *)(((char *)&D_0013F350)); if (hero->state.control_mode != 0x16) { - moby->state = 0; + moby->state = SKID_MCMARX_INITIALIZE; } else { float ground; float height_above_ground; diff --git a/src/overlays/l05/mobys/taxi.c b/src/overlays/l05/mobys/taxi.c index dfbe3f8cab..1f673e23da 100644 --- a/src/overlays/l05/mobys/taxi.c +++ b/src/overlays/l05/mobys/taxi.c @@ -73,6 +73,9 @@ void taxi_update(struct Moby *moby) { TAXI_BLEND_TO_DESTINATION = 5, TAXI_WAIT_FOR_ACTIVATION = 6 }; + enum { + TAXI_HIDDEN_STOP = 2 + }; TaxiVars *taxi_data = (TaxiVars *)moby->pvars; float old_position[4], old_rotation[4], position_delta[4], rotation_or_start_position_scratch[4], interpolation_end_position[4], @@ -106,10 +109,10 @@ void taxi_update(struct Moby *moby) { select_taxi_route(moby); request_moby_variant_help_message(moby); if (pad_pressed_words[0] & 0x10) { - moby->state = 3; + moby->state = TAXI_BLEND_TO_PATH_START; destination_stop_moby = find_moby_in_owner_list_by_id(moby, taxi_data->unkB6); if (destination_stop_moby != 0) { - destination_stop_moby->state = 2; + destination_stop_moby->state = TAXI_HIDDEN_STOP; destination_stop_moby->flags |= 1; destination_stop_moby->visible = 0; destination_stop_moby->collision = 0; @@ -151,14 +154,14 @@ void taxi_update(struct Moby *moby) { if (1.0f <= taxi_data->unkC0) { taxi_data->unkC0 = z; *(float *)&taxi_data->unkC4 = z; - moby->state = 4; + moby->state = TAXI_FOLLOW_PATH; } break; case TAXI_FOLLOW_PATH: if (advance_moby_path(moby)) { *(int *)&taxi_data->unkC0 = 0; taxi_data->unkC4 = 0; - moby->state = 5; + moby->state = TAXI_BLEND_TO_DESTINATION; } break; case TAXI_BLEND_TO_DESTINATION: @@ -196,7 +199,7 @@ void taxi_update(struct Moby *moby) { if (1.0f <= taxi_data->unkC0) { *(int *)&taxi_data->unkC0 = 0; taxi_data->unkC4 = 0; - moby->state = 1; + moby->state = TAXI_WAIT_FOR_PICKUP; reset_selected_moby_to_current_placement(moby); } break; @@ -209,12 +212,12 @@ void taxi_update(struct Moby *moby) { moby->visible = 1; moby->collision = class_collision; moby->flags = flags & 0xFFFE; - moby->state = 1; + moby->state = TAXI_WAIT_FOR_PICKUP; } break; } apply_moby_position_and_rotation_wobble(moby); - if (moby->state >= 3 && moby->state <= 5) { + if (moby->state >= TAXI_BLEND_TO_PATH_START && moby->state <= TAXI_BLEND_TO_DESTINATION) { travel_hero = &hero; travel_hero->jump_lock_timer = 2; travel_hero->unk1F4 = 2; diff --git a/src/overlays/l05/mobys/television.c b/src/overlays/l05/mobys/television.c index b9b276b37d..85ba7cc4e4 100644 --- a/src/overlays/l05/mobys/television.c +++ b/src/overlays/l05/mobys/television.c @@ -25,7 +25,7 @@ void television_update(struct Moby *moby) { moby->scale = moby->pclass->scale * *(float *)&television_scale_multiplier_gp; switch (moby->state) { case TELEVISION_INITIALIZE: - moby->state = 1; + moby->state = TELEVISION_UPDATE_BOBBING; *(float *)television_bobbing_state = random_angle_radians(); *(float *)(television_bobbing_state + 4) = moby->pos.z; break; diff --git a/src/overlays/l05/mobys/triggered_moby_yaw.c b/src/overlays/l05/mobys/triggered_moby_yaw.c index 11067bf087..e8e271dcbd 100644 --- a/src/overlays/l05/mobys/triggered_moby_yaw.c +++ b/src/overlays/l05/mobys/triggered_moby_yaw.c @@ -25,7 +25,7 @@ void triggered_moby_yaw_update(struct Moby *moby) { case MOBY_INITIALIZE_YAW: if (yaw_control_vars[0] != 0) moby->flags |= 0x8000; - moby->state = 1; + moby->state = MOBY_WAIT_FOR_TRIGGER; *(float *)&yaw_control_vars[3] = moby->rot.z; if (yaw_control_vars[0] != 0) moby->rot.z = fast_subtract_rotations(moby->rot.z, 1.5707964f); @@ -35,7 +35,7 @@ void triggered_moby_yaw_update(struct Moby *moby) { case MOBY_WAIT_FOR_TRIGGER: if (((unsigned char *)*(int *)&D_L05_0015FFD8)[yaw_control_vars[2] * 256 + 0xBC] != 0) { allocate_voice_for_target_entry(0, 0, moby); - moby->state = 2; + moby->state = MOBY_APPROACH_SAVED_YAW_OFFSET; } break; case MOBY_APPROACH_SAVED_YAW_OFFSET: { diff --git a/src/overlays/l05/mobys/triggered_motion.c b/src/overlays/l05/mobys/triggered_motion.c index 2ab18feebf..26fe86299b 100644 --- a/src/overlays/l05/mobys/triggered_motion.c +++ b/src/overlays/l05/mobys/triggered_motion.c @@ -12,9 +12,10 @@ extern int allocate_voice_for_target_entry() __asm__("FUN_0022da68"); extern short D_L05_0015FFD8 __asm__("D_L05_0015FFD8"); extern float advance_accelerated_scalar(float, float, float, float, float *, float *) __asm__("FUN_00213f38"); -extern float FUN_L00_0025be00(float *, float *, float, float, float, float); +extern float +approach_angle(float *, float *, float, float, float, float) __asm__("FUN_L00_0025be00"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern char *D_001413D0_lui __asm__("D_001413D0") NOT_SDA; void triggered_motion_update(char *moby) __asm__("FUN_L05_00316258"); @@ -44,6 +45,9 @@ void triggered_motion_update(char *moby) { MOBY_SETTLE_AT_UPPER_MANIPULATOR_ANGLE = 5, MOBY_SETTLE_AT_ZERO_MANIPULATOR_ANGLE = 6 }; + enum { + MOBY_MOTION_SEQUENCE_COMPLETE = 7 + }; TriggeredMotionVars *motion_and_manipulator_vars = (TriggeredMotionVars *)MOBY(moby)->pvars; float target[4]; float delta[4]; @@ -59,16 +63,16 @@ void triggered_motion_update(char *moby) { attach_manipulator(moby, 0, &motion_and_manipulator_vars->manipulator_10); if (motion_and_manipulator_vars->unk54 != 0) { motion_and_manipulator_vars->unk60 = 0.0f; - MOBY(moby)->state = 2; + MOBY(moby)->state = MOBY_WAIT_TO_RETURN_TO_SAVED_POSITION; if (motion_and_manipulator_vars->unk50 != 0) fast_vec_scale(target, moby + 0xD0, 2.0f); else fast_vec_scale(target, moby + 0xD0, -2.0f); fast_vec_add(moby + 0x10, moby + 0x10, target); } else { - MOBY(moby)->state = 1; + MOBY(moby)->state = MOBY_WAIT_FOR_TRIGGER; motion_and_manipulator_vars->unk60 = 0.5934119f; - FUN_L00_001fff28(&motion_and_manipulator_vars->unk20, 0, 0.5934119f); + build_axis_rotation_quaternion(&motion_and_manipulator_vars->unk20, 0, 0.5934119f); } *(long long *)(moby + 0x38) = *(long long *)(D_001413D0_lui + 0x38); break; @@ -78,33 +82,33 @@ void triggered_motion_update(char *moby) { ((u8 *)*(int *)&D_L05_0015FFD8)[motion_and_manipulator_vars->unk58 * 256 + 0xBC]; if (trigger == 0) return; - if (MOBY(moby)->state == 2 && trigger != 2) { - MOBY(moby)->state = 4; + if (MOBY(moby)->state == MOBY_WAIT_TO_RETURN_TO_SAVED_POSITION && trigger != 2) { + MOBY(moby)->state = MOBY_RETURN_TO_SAVED_POSITION; break; } - if (MOBY(moby)->state != 1) + if (MOBY(moby)->state != MOBY_WAIT_FOR_TRIGGER) return; allocate_voice_for_target_entry(0, 0, moby); - MOBY(moby)->state = 6; + MOBY(moby)->state = MOBY_SETTLE_AT_ZERO_MANIPULATOR_ANGLE; return; } case MOBY_SETTLE_AT_UPPER_MANIPULATOR_ANGLE: case MOBY_SETTLE_AT_ZERO_MANIPULATOR_ANGLE: { float end; float approach; - if (MOBY(moby)->state == 5) { + if (MOBY(moby)->state == MOBY_SETTLE_AT_UPPER_MANIPULATOR_ANGLE) { end = 0.5934119f; approach = 1.1868238f; } else { end = 0.0f; approach = -0.5934119f; } - FUN_L00_0025be00(&motion_and_manipulator_vars->unk60, - &motion_and_manipulator_vars->unk64, - approach, - frame_time_sq * 4.1887903f, - frame_time_sq * 4.1887903f, - frame_time * 12.566371f); + approach_angle(&motion_and_manipulator_vars->unk60, + &motion_and_manipulator_vars->unk64, + approach, + frame_time_sq * 4.1887903f, + frame_time_sq * 4.1887903f, + frame_time * 12.566371f); if (motion_and_manipulator_vars->unk60 > 0.5934119f || motion_and_manipulator_vars->unk60 < 0.0f) { if (motion_and_manipulator_vars->unk60 > 0.5934119f) @@ -115,18 +119,18 @@ void triggered_motion_update(char *moby) { MOBY(moby)->command = 1; motion_and_manipulator_vars->unk64 *= -0.33f; } else if (motion_and_manipulator_vars->unk60 == end) { - if (MOBY(moby)->state == 5) - MOBY(moby)->state = 7; + if (MOBY(moby)->state == MOBY_SETTLE_AT_UPPER_MANIPULATOR_ANGLE) + MOBY(moby)->state = MOBY_MOTION_SEQUENCE_COMPLETE; else - MOBY(moby)->state = 3; + MOBY(moby)->state = MOBY_MOVE_TO_OFFSET_POSITION; } } - FUN_L00_001fff28( + build_axis_rotation_quaternion( &motion_and_manipulator_vars->unk20, 0, motion_and_manipulator_vars->unk60); } break; case MOBY_MOVE_TO_OFFSET_POSITION: case MOBY_RETURN_TO_SAVED_POSITION: - if (MOBY(moby)->state == 3) { + if (MOBY(moby)->state == MOBY_MOVE_TO_OFFSET_POSITION) { fast_vec_scale(target, moby + 0xD0, -1.9f); fast_vec_add(target, motion_and_manipulator_vars, target); } else { @@ -145,12 +149,12 @@ void triggered_motion_update(char *moby) { fast_vec_add(moby + 0x10, moby + 0x10, delta); if (!(fast_vec_dist(moby + 0x10, target) < 0.0001f)) return; - if (MOBY(moby)->state == 3) { + if (MOBY(moby)->state == MOBY_MOVE_TO_OFFSET_POSITION) { allocate_voice_for_target_entry(1, 0, moby); - MOBY(moby)->state = 7; + MOBY(moby)->state = MOBY_MOTION_SEQUENCE_COMPLETE; return; } - MOBY(moby)->state = 5; + MOBY(moby)->state = MOBY_SETTLE_AT_UPPER_MANIPULATOR_ANGLE; break; } } diff --git a/src/overlays/l05/mobys/triggered_slide.c b/src/overlays/l05/mobys/triggered_slide.c index 0801af3278..d1f088da2a 100644 --- a/src/overlays/l05/mobys/triggered_slide.c +++ b/src/overlays/l05/mobys/triggered_slide.c @@ -36,6 +36,9 @@ void triggered_slide_update(char *moby) { MOBY_SLIDE_TO_END_POINT = 2, MOBY_LOWER_BELOW_POSE_HEIGHT = 3 }; + enum { + MOBY_LOWERING_COMPLETE = 4 + }; TriggeredSlideVars *slide_and_lowering_vars = (TriggeredSlideVars *)MOBY(moby)->pvars; float slide_motion_scratch[4]; float slide_step_distance; @@ -58,14 +61,14 @@ void triggered_slide_update(char *moby) { MOBY(moby)->flags |= 0x8000; } fast_vec_add(moby + 0x10, moby + 0x10, slide_motion_scratch); - MOBY(moby)->state = 1; + MOBY(moby)->state = MOBY_WAIT_FOR_TRIGGER; break; } case MOBY_WAIT_FOR_TRIGGER: if ((*(unsigned char **)&D_L05_0015FFD8)[slide_and_lowering_vars->unk14 * 256 + 0xBC] != 0) { allocate_voice_for_target_entry(0, 0, moby); - MOBY(moby)->state = 2; + MOBY(moby)->state = MOBY_SLIDE_TO_END_POINT; clear_u64_value(slide_and_lowering_vars); } break; @@ -90,7 +93,7 @@ void triggered_slide_update(char *moby) { fast_vec_normalize(slide_and_lowering_vars, slide_motion_scratch, speed); fast_vec_add(moby + 0x10, moby + 0x10, slide_and_lowering_vars); if (fast_vec_length(slide_motion_scratch) < 0.01f) { - MOBY(moby)->state = 3; + MOBY(moby)->state = MOBY_LOWER_BELOW_POSE_HEIGHT; } break; case MOBY_LOWER_BELOW_POSE_HEIGHT: @@ -103,7 +106,7 @@ void triggered_slide_update(char *moby) { (float *)&MOBY(moby)->pos.z, &slide_and_lowering_vars->unk8); if (MOBY(moby)->pos.z < pose_entry->pos.z - 5.9f) { - MOBY(moby)->state = 4; + MOBY(moby)->state = MOBY_LOWERING_COMPLETE; } break; } diff --git a/src/overlays/l05/mobys/triggered_spray_emitter.c b/src/overlays/l05/mobys/triggered_spray_emitter.c index 0906a953cb..fa22a1b1e1 100644 --- a/src/overlays/l05/mobys/triggered_spray_emitter.c +++ b/src/overlays/l05/mobys/triggered_spray_emitter.c @@ -57,6 +57,9 @@ void triggered_spray_emitter_update(struct Moby *emitter_moby) { EMITTER_WAIT_FOR_TRIGGER = 1, EMITTER_SPRAY_PARTICLES = 2 }; + enum { + EMITTER_INACTIVE = 3 + }; float v[4]; float particle_velocity[4]; float u[4]; @@ -76,9 +79,9 @@ void triggered_spray_emitter_update(struct Moby *emitter_moby) { switch (state = emitter_moby->state) { case EMITTER_INITIALIZE: if (D_0014C050[current_level_index][emitter_moby->mission] != 0xFF) { - emitter_moby->state = 1; + emitter_moby->state = EMITTER_WAIT_FOR_TRIGGER; } else { - emitter_moby->state = 3; + emitter_moby->state = EMITTER_INACTIVE; } break; case EMITTER_WAIT_FOR_TRIGGER: @@ -120,7 +123,7 @@ void triggered_spray_emitter_update(struct Moby *emitter_moby) { } floor = D_L05_001612D0[emitter_vars->floor].z; if (emitter_moby->pos.z < floor) { - emitter_moby->state = 3; + emitter_moby->state = EMITTER_INACTIVE; } for (i = 0; (float)i < spray_particle_count_limit_per_update_gp; i++) { big = 1; diff --git a/src/overlays/l05/mobys/water.c b/src/overlays/l05/mobys/water.c index d035c458b4..9bedef440e 100644 --- a/src/overlays/l05/mobys/water.c +++ b/src/overlays/l05/mobys/water.c @@ -192,10 +192,10 @@ void water_update(struct Moby *moby) { } } if (visited52[moby->mission + (current_level_index << 4)] == 0xFF) { - moby->state = 7; + moby->state = WATER_RISE_COMPLETE; moby->pos.z = 44.0f; } else { - moby->state = 3; + moby->state = WATER_WAIT_FOR_RISE_TRIGGER; water_vars->timer = scale_game_frames(0x3C); if (moby->pos.z < water_vars->lowered_z) { l05_water_grids[water_vars->record_index].visible_subtiles = 0; @@ -207,14 +207,14 @@ void water_update(struct Moby *moby) { water_vars->lowered_z = z; water_vars->raised_z = z + 4.5f; if (water_vars->starts_raised != 0) { - moby->state = 1; + moby->state = WATER_MOVE_TO_RAISED_HEIGHT; moby->pos.z = water_vars->raised_z; } else { - moby->state = 2; + moby->state = WATER_MOVE_TO_LOWERED_HEIGHT; moby->pos.z = water_vars->lowered_z; } } else { - moby->state = 2; + moby->state = WATER_MOVE_TO_LOWERED_HEIGHT; moby->pos.z = water_vars->lowered_z; } } @@ -228,7 +228,7 @@ void water_update(struct Moby *moby) { set_moby_list_state(moby->group, 1); } else if (water_vars->f10 >= 0) { if (visited52[moby->mission + (current_level_index << 4)] == 0xFF) { - moby->state = 1; + moby->state = WATER_MOVE_TO_RAISED_HEIGHT; moby->pos.z = water_vars->raised_z; } } @@ -291,7 +291,7 @@ void water_update(struct Moby *moby) { if (h->ground_moby != 0 && h->air_frames.s == 0 && h->ground_moby->oclass == 0x33E) { water_vars->f1C = 0; - moby->state = 8; + moby->state = WATER_TIMED_RISE; rise_step = 0; water_vars->timer = scale_game_frames(rise_frames[0]); } @@ -361,7 +361,7 @@ void water_update(struct Moby *moby) { e->z = moby->pos.z; grid_in_view = 0.0f; if (check_scaled_vector_bsphere((char *)moby, 48.0f) != -1 && - (!(moby->state >= 3 && moby->state <= 7) || + (!(moby->state >= WATER_WAIT_FOR_RISE_TRIGGER && moby->state <= WATER_RISE_COMPLETE) || (moby->pos.z > water_vars->lowered_z && moby->pos.z < water_vars->raised_z))) { grid_in_view = 1.0f; } diff --git a/src/overlays/l06/hero/hero_set_state.c b/src/overlays/l06/hero/hero_set_state.c index e066e67e77..b3c51a8d1e 100644 --- a/src/overlays/l06/hero/hero_set_state.c +++ b/src/overlays/l06/hero/hero_set_state.c @@ -69,7 +69,7 @@ extern void clear_moby_transform_history(char *o) __asm__("FUN_L00_00262840"); extern int hero_set_state(int, int) __asm__("FUN_L06_002356a0"); extern char level06_hero_transform_trail_jump_velocity_keys[] __asm__("D_L06_0017C6A0"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int b) { int saved_state_step; char *moby; int old20A7; @@ -79,7 +79,8 @@ int hero_set_state(int a, int b) { } d; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || b != 2)) return 0; } if ((D_L06_0015F5C4 == 2 || D_L06_0015F5C4 == 6) && b != 2) @@ -87,8 +88,16 @@ int hero_set_state(int a, int b) { { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -101,11 +110,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -126,14 +135,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { enter_hero_idle_state_for_current_vehicle_mode(); return 1; } @@ -322,14 +331,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); if (b) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L06_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -659,7 +668,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -672,7 +681,7 @@ int hero_set_state(int a, int b) { q->state.step = 0; qcopy(&q->motion.velocity, &q->motion.resolved_velocity); if (b) { - if (q->vehicle_mode == 1) { + if (q->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(4, 0, (float)scale_game_frames(8)); return 1; } @@ -748,7 +757,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; diff --git a/src/overlays/l06/hero/update_hero_motion_for_current_state.c b/src/overlays/l06/hero/update_hero_motion_for_current_state.c index 4909a1e3c2..aa15aa4243 100644 --- a/src/overlays/l06/hero/update_hero_motion_for_current_state.c +++ b/src/overlays/l06/hero/update_hero_motion_for_current_state.c @@ -27,6 +27,12 @@ /* Ported from rac1-decomp (src/overlays/l06_blarg/help_00223630.c: func_L06_00223630), where it is exact; names translated to the US level program. */ +enum { + HERO_GROUND_MATERIAL_WATER = 0, + HERO_GROUND_MATERIAL_MAGNETIC = 2, + HERO_GROUND_MATERIAL_SINK_SURFACE = 0xD +}; + extern void exit_hero_vehicle_mode_if_mode_three(void) __asm__("FUN_L00_0020b930"); extern int hero_set_state(int, int) __asm__("FUN_L06_002356a0"); float absolute_float(float input) __asm__("func_001F99C0"); @@ -34,6 +40,9 @@ float absolute_float(float input) __asm__("func_001F99C0"); void apply_hero_ground_material_response(void) __asm__("FUN_L06_00222fb8"); void apply_hero_ground_material_response(void) { + enum { + HERO_GROUND_MATERIAL_SLIP_SURFACE = 8 + }; struct Hero *hero_state = &hero; struct Hero *vehicle_response_check_hero; struct Hero *grounded_response_check_hero; @@ -47,17 +56,17 @@ void apply_hero_ground_material_response(void) { hero_state->unk308 = 0; if (previous_ground_type == -1) return; - if (previous_ground_type == 2) { + if (previous_ground_type == HERO_GROUND_MATERIAL_MAGNETIC) { if (hero_state->frames_off_ground.s == 0 || hero_state->ground_distance < 0.3f) { hero_state->on_magnet_ground = 1; - if (hero_state->vehicle_mode == 0) { + if (hero_state->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { char *item_slot_1_moby = ((char *)hero_state->items[1].moby); if (item_slot_1_moby != 0 && MOBY(item_slot_1_moby)->oclass == 0xAD) hero_state->unk308 = 1; } } } - if (previous_ground_type == 0xD) { + if (previous_ground_type == HERO_GROUND_MATERIAL_SINK_SURFACE) { struct Hero *gx = &hero; gx->selector_13 = 1; } @@ -65,7 +74,7 @@ void apply_hero_ground_material_response(void) { struct Hero *gx = &hero; gx->selector_1 = 1; } - if (previous_ground_type == 8) { + if (previous_ground_type == HERO_GROUND_MATERIAL_SLIP_SURFACE) { struct Hero *gx = &hero; gx->on_slip_ground = 1; } @@ -80,7 +89,7 @@ void apply_hero_ground_material_response(void) { vehicle_response_check_hero = &hero; if (vehicle_response_check_hero->selector_1 != 0) { if (vehicle_response_check_hero->grounded_frames != 0 && - vehicle_response_check_hero->vehicle_mode == 1 && + vehicle_response_check_hero->vehicle_mode == HERO_VEHICLE_MODE_CLANK && vehicle_response_check_hero->state.current != 0x7D) { hero_set_state(0x7D, 1); return; @@ -460,7 +469,7 @@ void update_hero_ground_contact(void) { } hero_lui.ground_sound_class = ground_sound_class; hero_lui.ground_type = collision_hit_material(); - if (hero_lui.ground_type == 0) { + if (hero_lui.ground_type == HERO_GROUND_MATERIAL_WATER) { hero_lui.water_surface_z = resolve_camera_surface_height(D_L06_001745E0, (u8 *)&hero_lui + 0x280); if (hero_lui.motion.pos.f[2] < hero_lui.water_surface_z && hero_lui.in_water_frames <= 0) { @@ -475,7 +484,7 @@ void update_hero_ground_contact(void) { } hero_lui.ground_sound_class = ground_sound_class; } - if (hero_lui.ground_type == 0xD) { + if (hero_lui.ground_type == HERO_GROUND_MATERIAL_SINK_SURFACE) { hero_lui.water_surface_z = D_L06_001745E8; ground_ray_start.f[2] = D_L06_001745E8 - 0.01f; if (collision_line(&ground_ray_start, &collision_ray_end, 4, hero_lui.moby, 0) == 0) { @@ -508,7 +517,8 @@ void update_hero_ground_contact(void) { } if (hero_lui.ground_distance < 0.02f) { hero_lui.frames_off_ground.s = 0; - if (hero_lui.ground_slope.f <= 0.87266463f || hero_lui.gravity_mode == 1 || + if (hero_lui.ground_slope.f <= 0.87266463f || + hero_lui.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero_lui.state.control_mode == 0x16) { hero_lui.air_frames.s = 0; hero_lui.last_landed_moby = HH.moby; @@ -638,11 +648,11 @@ void update_hero_airborne_planar_velocity(void) { s32 state; state = hero.state.current; - if (state == 10) { + if (state == HERO_STATE_PACK_JUMP) { build_scaled_hero_move_impulse(0.7f, ED6C * 0.0f); qcopy(&hero.motion.momentum, &hero.move_impulse); hero.ground_speed = hero.motion.flat_speed; - } else if (state == 16) { + } else if (state == HERO_STATE_PACK_LONG_JUMP) { if (FUN_001f96f8_2b438(0x36) < hero.state_timer) { approach_value_2b438(ED70 * 25.0f, ED70 * 7.0f, &hero.jump_gravity); } @@ -654,7 +664,7 @@ void update_hero_airborne_planar_velocity(void) { speed_step(ED70 * 44.0f, ED70 * 45.0f); set_gravity_relative_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, 0.0f); add_hero_forward_offset(&hero.motion.velocity, &hero.motion.velocity, hero.ground_speed); - } else if (state == 0x1C) { + } else if (state == HERO_STATE_LEDGE_JUMP) { if (FUN_001f96f8_2b438(0x28) < hero.state_timer) { turn_to(0, ED64 * 0.04f, ED64 * 0.2f, ED6C * 15.009831f); air_accel(ED70 * 20.0f); @@ -670,7 +680,7 @@ void update_hero_airborne_planar_velocity(void) { FUN_001f9dc8_2b438(hero.motion.rot.f[2]) * hero.ledge_jump_speed; hero.motion.velocity.f[1] = FUN_001f9de0_2b438(hero.motion.rot.f[2]) * hero.ledge_jump_speed; - } else if (state == 0x4C) { + } else if (state == HERO_STATE_ALT_LEDGE_JUMP) { if (5.0f <= hero.anim_frame && hero.anim_frame <= 18.0f) { if (15.0f < hero.anim_frame) { approach_value_2b438(0.0f, ED70 * 8.0f, &hero.ledge_jump_speed); @@ -682,7 +692,7 @@ void update_hero_airborne_planar_velocity(void) { FUN_001f9dc8_2b438(hero.motion.rot.f[2]) * hero.ledge_jump_speed; hero.motion.velocity.f[1] = FUN_001f9de0_2b438(hero.motion.rot.f[2]) * hero.ledge_jump_speed; - } else if (state == 11 || state == 12) { + } else if (state == HERO_STATE_HIGH_JUMP || state == HERO_STATE_STORED_HEADING_JUMP) { hero.motion.move_yaw = hero.takeoff_yaw; turn_to(0, ED64 * 0.04f, ED64 * 0.2f, ED6C * 6.981317f); if (hero.unk450 != 3) { @@ -710,7 +720,7 @@ void update_hero_airborne_planar_velocity(void) { FUN_001f9de0_2b438(hero.takeoff_yaw) * speed_component_or_yaw_delta; build_scaled_hero_move_impulse(0.7f, ED6C * 0.0f); qcopy(&hero.motion.momentum, &hero.move_impulse); - } else if (state == 0x11) { + } else if (state == HERO_STATE_REPEATABLE_JUMP) { hero.motion.move_yaw = hero.unk470.f[3]; qcopy(&hero.motion.move_dir, &hero.unk470); if (FUN_001f96f8_2b438(9) < hero.state_timer) { @@ -732,7 +742,7 @@ void update_hero_airborne_planar_velocity(void) { } hero.ground_speed = hero.motion.flat_speed; } else { - if (state == 0x2D) { + if (state == HERO_STATE_ITEM_RELEASE_FALL) { x = hero.motion.rot.f[2]; hero.motion.yaw_error = FUN_L00_0025bc98_2b438(&x, &hero.motion.yaw_rate, @@ -880,7 +890,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void FUN_L00_00212088(f32, f32); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void adjust_hero_velocity_from_collision_probes(s32) __asm__("FUN_L06_002291d0"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -909,7 +919,7 @@ extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); extern void build_spherical_offset(void *, f32, f32, f32) __asm__("FUN_00214db0"); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L06_00221850(f32, f32); @@ -963,7 +973,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L06_0017C538_c __asm__("D_L06_0017C538"); extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 FUN_001efa68_c(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void update_hero_motion_response_parameters(void) __asm__("FUN_L00_00215b68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); @@ -1132,10 +1142,10 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -1146,11 +1156,11 @@ void update_hero_motion_for_current_state(void) { } else { adjust_hero_velocity_from_collision_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -1214,11 +1224,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && ((struct MobyView *)hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -1237,11 +1248,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if ((struct MobyView *)hero.grapple_target != NULL) { hero.motion.move_yaw = @@ -1414,13 +1426,13 @@ void update_hero_motion_for_current_state(void) { &((struct MobyView *)hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { FUN_001f9a28_c(&position_or_delta_scratch, &hero.motion.pos, &((struct MobyView *)hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1540,7 +1552,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1626,7 +1639,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1676,7 +1690,7 @@ void update_hero_motion_for_current_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1692,10 +1706,11 @@ void update_hero_motion_for_current_state(void) { FUN_L00_00212088(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1718,11 +1733,11 @@ void update_hero_motion_for_current_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { off = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { off = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1767,7 +1782,7 @@ void update_hero_motion_for_current_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || (struct MobyView *)hero.melee_target != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1777,7 +1792,8 @@ void update_hero_motion_for_current_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, D_0015ED6C_c * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1791,10 +1807,11 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -1905,11 +1922,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_velocity_from_collision_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2007,11 +2025,12 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2031,9 +2050,10 @@ void update_hero_motion_for_current_state(void) { release_voice_slot_cf(0, (struct MobyView *)hero.moby, 0); } else { if (hero.grind_voice != -1) { - struct VoiceSlot *e = + struct VoiceSlot *grind_voice_slot = (struct VoiceSlot *)(((u8 *)&voice_pool) + hero.grind_voice * 0x70); - if (e->pm88 == (struct MobyView *)hero.moby && e->b74 != 0) { + if (grind_voice_slot->pm88 == (struct MobyView *)hero.moby && + grind_voice_slot->b74 != 0) { release_voice_slot(hero.grind_voice); } } @@ -2297,7 +2317,7 @@ void update_hero_motion_for_current_state(void) { } else { f32 grind_base_speed_target = D_0015ED6C_c * 12.0f; f32 tt; - f32 e; + f32 rail_ahead_pitch; f32 sp; s32 si; f32 sf; @@ -2343,20 +2363,22 @@ void update_hero_motion_for_current_state(void) { &sf, 0.3f, hero.rail_spline_loops); - e = fast_arc_tan(vector_distance_xy(&hero.rail_point, &vector_or_descriptor_scratch), + rail_ahead_pitch = + fast_arc_tan(vector_distance_xy(&hero.rail_point, &vector_or_descriptor_scratch), vector_or_descriptor_scratch.f[2] - hero.rail_point.f[2]); - if (e > 0.0f) { - sp = e * 1.9098593f * (D_0015ED6C_c * -2.5f); - if (e > 0.2617994f && hero.grind_pose != 2 && hero.grind_pose != 3) { + if (rail_ahead_pitch > 0.0f) { + sp = rail_ahead_pitch * 1.9098593f * (D_0015ED6C_c * -2.5f); + if (rail_ahead_pitch > 0.2617994f && hero.grind_pose != 2 && hero.grind_pose != 3) { hero.grind_pose = 0; - } else if (e < 0.13962634f && hero.grind_pose == 0) { + } else if (rail_ahead_pitch < 0.13962634f && hero.grind_pose == 0) { hero.grind_pose = -1; } } else { - sp = -e * 2.864789f * (D_0015ED6C_c * 8.0f); - if (e < -0.19198622f && hero.grind_pose != 2 && hero.grind_pose != 3) { + sp = -rail_ahead_pitch * 2.864789f * (D_0015ED6C_c * 8.0f); + if (rail_ahead_pitch < -0.19198622f && hero.grind_pose != 2 && + hero.grind_pose != 3) { hero.grind_pose = 1; - } else if (e > -0.12217305f && hero.grind_pose == 1) { + } else if (rail_ahead_pitch > -0.12217305f && hero.grind_pose == 1) { hero.grind_pose = -1; } } @@ -2504,7 +2526,7 @@ void update_hero_motion_for_current_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = D_0015ED6C_c * 5.5f; FUN_L01_00234358(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2541,7 +2563,8 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, D_0015ED6C_c * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(D_0015ED6C_c * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(D_0015ED6C_c * 50.0f)); } @@ -2558,7 +2581,8 @@ void update_hero_motion_for_current_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(D_0015ED6C_c * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(D_0015ED6C_c * 50.0f)); } @@ -2602,7 +2626,7 @@ void update_hero_motion_for_current_state(void) { adjust_hero_velocity_from_collision_probes(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2618,9 +2642,10 @@ void update_hero_motion_for_current_state(void) { f32 sp; if (hero_slot_item_id(3) == 2) { if (hero.voice_slot4 != -1) { - struct VoiceSlot *e = + struct VoiceSlot *landing_item_voice_slot = (struct VoiceSlot *)(((u8 *)&voice_pool) + hero.voice_slot4 * 0x70); - if (e->pm88 == (struct MobyView *)hero.moby && e->b74 != 0) { + if (landing_item_voice_slot->pm88 == (struct MobyView *)hero.moby && + landing_item_voice_slot->b74 != 0) { release_voice_slot(hero.voice_slot4); } } @@ -2628,9 +2653,10 @@ void update_hero_motion_for_current_state(void) { release_voice_slot_cf(3, (struct MobyView *)hero.moby, 2); } else { if (hero.unk2224 != -1) { - struct VoiceSlot *e = + struct VoiceSlot *landing_entry4_voice_slot = (struct VoiceSlot *)(((u8 *)&voice_pool) + hero.unk2224 * 0x70); - if (e->pm88 == (struct MobyView *)hero.moby && e->b74 != 0) { + if (landing_entry4_voice_slot->pm88 == (struct MobyView *)hero.moby && + landing_entry4_voice_slot->b74 != 0) { release_voice_slot(hero.unk2224); } } @@ -2647,7 +2673,7 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], D_0015ED6C_c * 4.0f); } @@ -2734,7 +2760,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&vector_or_hit_descriptor_scratch, &hero.motion.pos); - FUN_L00_00233810( + add_hero_up_offset( &vector_or_hit_descriptor_scratch, &vector_or_hit_descriptor_scratch, 0.5f); qcopy(&v10, &vector_or_hit_descriptor_scratch); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; @@ -2766,10 +2792,10 @@ void update_hero_motion_for_current_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } - if (hero.vehicle_mode == 1) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { update_hero_motion_response_parameters(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2820,7 +2846,7 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -2842,7 +2868,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = D_0015ED6C_a * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = D_0015ED6C_a * 0.9f; } } else { @@ -2853,9 +2879,9 @@ void update_hero_motion_for_current_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, D_0015ED6C_c * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, D_0015ED6C_c * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to( 0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, D_0015ED6C_c * 9.948377f); @@ -2863,20 +2889,21 @@ void update_hero_motion_for_current_state(void) { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } FUN_L00_00212088(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_velocity_from_collision_probes(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2889,11 +2916,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); adjust_hero_velocity_from_collision_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -2918,11 +2946,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); adjust_hero_velocity_from_collision_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_1_ATTACK: { @@ -2930,12 +2959,15 @@ void update_hero_motion_for_current_state(void) { s32 ok; tb = &D_L06_0017C3A8[hero.attack_record]; hero.target_speed = 0.0f; - if ((tb->kind == 0 ? 1 : tb->kind == 1) && hero.anim_frame < 5.5f) { + if ((tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE + ? 1 + : tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) && + hero.anim_frame < 5.5f) { hero.target_speed = D_0015ED6C_c * 3.5f; } if (hero.anim_changing == 0 && (f32)tb->f1C <= hero.anim_frame && hero.anim_frame <= (f32)tb->f20) { - s32 k = tb->kind == 1 ? 0 : 2; + s32 k = tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION ? 0 : 2; moby_point_position((struct MobyView *)hero.moby, k, &v10); moby_point_position((struct MobyView *)hero.moby, k | 1, &vector_or_descriptor_scratch); fast_vec_add(&vector_or_hit_descriptor_scratch, &v10, &vector_or_descriptor_scratch); @@ -2953,7 +2985,7 @@ void update_hero_motion_for_current_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || (struct MobyView *)hero.melee_target != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -2963,7 +2995,8 @@ void update_hero_motion_for_current_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, D_0015ED6C_c * 15.009831f); } else { ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -2992,14 +3025,14 @@ void update_hero_motion_for_current_state(void) { FUN_L00_00212088(frame_time_sq * 15.0f, frame_time_sq * 7.0f); set_planar_vel(99999.0f); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); break; } case HERO_STATE_VEHICLE_MODE_1_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = D_0015ED6C_c * 5.5f; FUN_L01_00234358(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_1_FALL: @@ -3007,7 +3040,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { update_hero_airborne_planar_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); if (hero.motion.velocity.f[2] < D_0015ED6C_c * -10.0f) { hero.motion.velocity.f[2] = D_0015ED6C_c * -10.0f; } @@ -3043,11 +3077,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_velocity_from_collision_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3062,10 +3097,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } @@ -3139,18 +3174,19 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); adjust_hero_velocity_from_collision_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = D_0015ED6C_c * 5.5f; FUN_L01_00234358(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -3158,7 +3194,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { update_hero_airborne_planar_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < D_0015ED6C_c * -15.0f) { hero.motion.velocity.f[2] = D_0015ED6C_c * -15.0f; } @@ -3188,11 +3225,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_velocity_from_collision_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3207,10 +3245,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l06/hero/update_hero_state_machine.c b/src/overlays/l06/hero/update_hero_state_machine.c index 473d924a98..0bc9c76598 100644 --- a/src/overlays/l06/hero/update_hero_state_machine.c +++ b/src/overlays/l06/hero/update_hero_state_machine.c @@ -179,8 +179,10 @@ void update_hero_state_machine(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && D_L06_0015F594 == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0)) { switch (hero.vehicle_mode) { case HERO_VEHICLE_MODE_ON_FOOT: case 3: { @@ -259,7 +261,7 @@ void update_hero_state_machine(void) { } } if (death_fall_trigger_z > hero.motion.pos.f[2] && hero.ground_distance > 2.0f && - hero.vehicle_mode != 2 && hero.state.current != 0x77) { + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { switch (hero.state.current) { @@ -518,7 +520,7 @@ void update_hero_state_machine(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -545,7 +547,7 @@ void update_hero_state_machine(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { enter_hero_idle_state_for_current_vehicle_mode(); break; } @@ -778,7 +780,8 @@ void update_hero_state_machine(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -2657,7 +2660,7 @@ void update_hero_state_machine(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l06/level_class_tables.c b/src/overlays/l06/level_class_tables.c index c6106728d9..49bd1a65ea 100644 --- a/src/overlays/l06/level_class_tables.c +++ b/src/overlays/l06/level_class_tables.c @@ -20,6 +20,9 @@ #include "rnc/overlay/shared/ui/hud/hud_keep_visible.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -53,7 +56,7 @@ void *D_L06_0020239C[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L06_002023B4[6] diff --git a/src/overlays/l06/mobys/alien_queen.c b/src/overlays/l06/mobys/alien_queen.c index d620094604..cde0a1166c 100644 --- a/src/overlays/l06/mobys/alien_queen.c +++ b/src/overlays/l06/mobys/alien_queen.c @@ -24,6 +24,29 @@ #include "rnc/overlay/l06/hero/hero_set_state.h" #include "rnc/overlay/shared/camera.h" +enum { + ALIEN_QUEEN_STATE_INITIALIZE = 0, + ALIEN_QUEEN_STATE_WAIT_TO_START_INTRO = 1, + ALIEN_QUEEN_STATE_INTRO = 2, + ALIEN_QUEEN_STATE_FIRST_RECOVERY_CAMERA = 3, + ALIEN_QUEEN_STATE_FROG_RECOVERY_ORBIT = 4, + ALIEN_QUEEN_STATE_SECOND_RECOVERY_CAMERA = 5, + ALIEN_QUEEN_STATE_GROUP_RECOVERY_ORBIT = 6, + ALIEN_QUEEN_STATE_WAIT_TO_APPROACH_TARGET = 7, + ALIEN_QUEEN_STATE_APPROACH_TARGET = 8, + ALIEN_QUEEN_STATE_ATTACK_WINDUP = 9, + ALIEN_QUEEN_STATE_ATTACK_HIT_QUERIES = 10, + ALIEN_QUEEN_STATE_WAIT_FOR_ORBIT_ANIMATION_END = 11, + ALIEN_QUEEN_STATE_TIMED_ORBIT = 12, + ALIEN_QUEEN_STATE_RETURN_HOME = 13, + ALIEN_QUEEN_STATE_DEATH = 14, + ALIEN_QUEEN_STATE_POST_DEATH = 15 +}; + +enum { + HIT_STATUS_SKIP_DAMAGE_AND_REACTION = 1 +}; + extern int D_L06_001ABFC0[]; extern int D_L06_0015FFD8_d __asm__("D_L06_0015FFD8"); @@ -114,21 +137,22 @@ typedef struct { int count; } QueenProbe; -extern char D_L06_001678D0[]; -extern int D_L06_0016A010[]; +extern char l06_post_death_scan_records[] __asm__("D_L06_001678D0"); +extern int l06_post_death_scan_record_gates[] __asm__("D_L06_0016A010"); extern short D_L06_00161EF0 __attribute__((sda)); -extern short D_L06_00161EF4 __attribute__((sda)); +extern short l06_alien_queen_movement_speed __asm__("D_L06_00161EF4") __attribute__((sda)); f32 alien_queen_movement_acceleration_gp __asm__("D_L06_00161EFC") = 8.0f; -extern short D_L06_00161F00 __attribute__((sda)); -extern short D_L06_00161F04 __attribute__((sda)); -extern short D_L06_00161F08 __attribute__((sda)); -extern void FUN_L06_002fa9c0_c(void *) __asm__("FUN_L06_002fa9c0"); -void set_moby_list_state_18(int idx) __asm__("FUN_L06_002f9948"); -void FUN_L06_002fb870(char *arg); -void FUN_L06_002fbc30(char *arg); -int FUN_L06_002fba28(char *moby); -extern void func_L00_00264B40_q(void *, int, float, void *) __asm__("FUN_L00_00263ac8"); -extern void func_L00_0025B178_q(void *) __asm__("FUN_L00_0025a120"); +extern short l06_alien_queen_attack_distance __asm__("D_L06_00161F00") __attribute__((sda)); +extern short l06_alien_queen_retreat_distance __asm__("D_L06_00161F04") __attribute__((sda)); +extern short l06_alien_queen_attack_heading_tolerance_degrees __asm__("D_L06_00161F08") + __attribute__((sda)); +extern void FUN_L06_002fa9c0_c(void *) __asm__("FUN_L06_002fa9c0"); +void set_moby_list_state_18(int idx) __asm__("FUN_L06_002f9948"); +void FUN_L06_002fb870(char *arg); +void FUN_L06_002fbc30(char *arg); +int FUN_L06_002fba28(char *moby); +extern void func_L00_00264B40_q(void *, int, float, void *) __asm__("FUN_L00_00263ac8"); +extern void func_L00_0025B178_q(void *) __asm__("FUN_L00_0025a120"); extern int queue_animation_update(int, int, void *, void *, void *, void *, int) __asm__("FUN_001ff308"); extern void func_L00_00236710_q(void) __asm__("FUN_L00_00235d80"); @@ -388,50 +412,55 @@ typedef struct AlienQueenVars { /* Moby class 1051 */ void alien_queen_update(unsigned char *moby) { - AlienQueenVars *data = (AlienQueenVars *)MOBY(moby)->pvars; + AlienQueenVars *alien_queen_update_vars = (AlienQueenVars *)MOBY(moby)->pvars; char *target; float step[4]; FUN_L06_002fa9c0_c(moby); - target = data->target; - func_L00_00264B40_q(moby, *(int *)&D_L06_00161EF0, 1.9f, &data->unk130); + target = alien_queen_update_vars->target; + func_L00_00264B40_q(moby, *(int *)&D_L06_00161EF0, 1.9f, &alien_queen_update_vars->unk130); if ((unsigned char)moby[0x31] != 0 && fast_vec_dist(moby + 0x10, D_L06_00167540_q) < 45.0f) { func_L00_0025B178_q(moby); moby[0x7F] = 0x24; } if ((unsigned char)moby[0x20] >= 3 && (unsigned char)moby[0x20] <= 13) { - data->animation_update = queue_animation_update(0x16, - 0xFFFF, - func_L00_00236710_q, - func_L00_00236830_q, - func_L06_0024A080_q, - &data->unk110, - 0x1EF); + alien_queen_update_vars->animation_update = + queue_animation_update(0x16, + 0xFFFF, + func_L00_00236710_q, + func_L00_00236830_q, + func_L06_0024A080_q, + &alien_queen_update_vars->unk110, + 0x1EF); } switch ((unsigned char)moby[0x20]) { - case 0: { + case ALIEN_QUEEN_STATE_INITIALIZE: { int *path; - data->health = 30.0f; - data->max_health = 0x1E; - data->unk29 = 1; - data->unk28 = 3; - data->unk2E = 1; - data->unk58 = truncate_float_to_s32(14.0f); - data->unk5A = truncate_float_to_s32(18.4f); - data->timer_120 = scale_game_frames(0x4B0); - data->unk178 = 0; - qcopy(data->unkC0, moby + 0x10); - data->animation_update = -1; - data->unk114 = *D_L06_001B0C30_q[data->path]; - path = D_L06_001B0C30_q[data->path]; - lerp_vector(data->path_midpoint, path + 4, (char *)path + ((*path / 2) * 16 + 16), 0.5f); - data->path_midpoint[3] = vector_distance_xy(data->unkC0, data->path_midpoint); - data->unk128 = random_angle_radians(); - data->timer_12C = scale_game_frames(0x1E); + alien_queen_update_vars->health = 30.0f; + alien_queen_update_vars->max_health = 0x1E; + alien_queen_update_vars->unk29 = 1; + alien_queen_update_vars->unk28 = 3; + alien_queen_update_vars->unk2E = 1; + alien_queen_update_vars->unk58 = truncate_float_to_s32(14.0f); + alien_queen_update_vars->unk5A = truncate_float_to_s32(18.4f); + alien_queen_update_vars->timer_120 = scale_game_frames(0x4B0); + alien_queen_update_vars->unk178 = 0; + qcopy(alien_queen_update_vars->unkC0, moby + 0x10); + alien_queen_update_vars->animation_update = -1; + alien_queen_update_vars->unk114 = *D_L06_001B0C30_q[alien_queen_update_vars->path]; + path = D_L06_001B0C30_q[alien_queen_update_vars->path]; + lerp_vector(alien_queen_update_vars->path_midpoint, + path + 4, + (char *)path + ((*path / 2) * 16 + 16), + 0.5f); + alien_queen_update_vars->path_midpoint[3] = vector_distance_xy( + alien_queen_update_vars->unkC0, alien_queen_update_vars->path_midpoint); + alien_queen_update_vars->unk128 = random_angle_radians(); + alien_queen_update_vars->timer_12C = scale_game_frames(0x1E); MOBY(moby)->collision = 0; MOBY(moby)->flags = (MOBY(moby)->flags | 0x4001) & 0xEFFF; MOBY(moby)->pos.z = MOBY(moby)->pos.z + 17.5f; - set_moby_list_state_18(data->state18_list); + set_moby_list_state_18(alien_queen_update_vars->state18_list); if (menu_item_enabled_19_lui[4] != 0 && D_0013D4FD_q[8] == 0) { mark_moby_for_removal(moby); return; @@ -439,22 +468,23 @@ void alien_queen_update(unsigned char *moby) { moby[0x20] = 1; break; } - case 1: - if (data->unkB4 == 2) + case ALIEN_QUEEN_STATE_WAIT_TO_START_INTRO: + if (alien_queen_update_vars->unkB4 == 2) return; if (*(short *)(target + 0xA6) != 0) return; - if (data->unk170 == 0) { - data->unk170 = 1; - data->timer_12C = scale_game_frames(10); + if (alien_queen_update_vars->unk170 == 0) { + alien_queen_update_vars->unk170 = 1; + alien_queen_update_vars->timer_12C = scale_game_frames(10); break; } - if (data->timer_12C != 0) + if (alien_queen_update_vars->timer_12C != 0) return; - func_L06_002F6818_q(level_mobys_q + (data->unkFC << 8)); - func_L06_002F6818_q(level_mobys_q + (data->unk100 << 8)); - set_listed_alien_queen_sliders_state_2_and_data_28_to_one(data->slider_list); - data->unk170 = 0; + func_L06_002F6818_q(level_mobys_q + (alien_queen_update_vars->unkFC << 8)); + func_L06_002F6818_q(level_mobys_q + (alien_queen_update_vars->unk100 << 8)); + set_listed_alien_queen_sliders_state_2_and_data_28_to_one( + alien_queen_update_vars->slider_list); + alien_queen_update_vars->unk170 = 0; moby[0x20] = 2; MOBY(moby)->collision = MOBY(moby)->pclass->collision; MOBY(moby)->flags = (MOBY(moby)->flags | 0x1000) & 0xFFFE; @@ -463,18 +493,19 @@ void alien_queen_update(unsigned char *moby) { } func_L06_002FC578_q(moby); return; - case 2: { + case ALIEN_QUEEN_STATE_INTRO: { float gravity = frame_time_sq * 30.0f; - MOBY(moby)->pos.z = MOBY(moby)->pos.z + data->z_velocity; - data->z_velocity = data->z_velocity - gravity; + MOBY(moby)->pos.z = MOBY(moby)->pos.z + alien_queen_update_vars->z_velocity; + alien_queen_update_vars->z_velocity = alien_queen_update_vars->z_velocity - gravity; if ((unsigned char)moby[0x53] == 8) { - if (absolute_float((MOBY(moby)->pos.z - data->unkC0[2]) / data->z_velocity) <= 6.0f && + if (absolute_float((MOBY(moby)->pos.z - alien_queen_update_vars->unkC0[2]) / + alien_queen_update_vars->z_velocity) <= 6.0f && (unsigned char)moby[0x53] != 9) { blend_moby_animation(moby, 9, 0, scale_game_frames(5)); } } else { - if (MOBY(moby)->pos.z < data->unkC0[2]) { - MOBY(moby)->pos.z = data->unkC0[2]; + if (MOBY(moby)->pos.z < alien_queen_update_vars->unkC0[2]) { + MOBY(moby)->pos.z = alien_queen_update_vars->unkC0[2]; } if (MOBY(moby)->anim_time == 0.0f && (moby[0x70] & 2)) { if ((unsigned char)moby[0x53] == 9) { @@ -490,7 +521,7 @@ void alien_queen_update(unsigned char *moby) { } break; } - case 3: + case ALIEN_QUEEN_STATE_FIRST_RECOVERY_CAMERA: if ((unsigned char)moby[0x53] == 6 && MOBY(moby)->anim_time == 0.0f && (moby[0x70] & 2)) { blend_moby_animation(moby, 1, 0, scale_game_frames(0x14)); func_L06_002FC4C0_q(moby); @@ -501,40 +532,40 @@ void alien_queen_update(unsigned char *moby) { return; } break; - case 5: + case ALIEN_QUEEN_STATE_SECOND_RECOVERY_CAMERA: if ((unsigned char)moby[0x53] == 6 && MOBY(moby)->anim_time == 0.0f && (moby[0x70] & 2)) { blend_moby_animation(moby, 1, 0, scale_game_frames(0x14)); - clear_moby_list_state_18(data->state18_list); + clear_moby_list_state_18(alien_queen_update_vars->state18_list); } if (FUN_L06_002fba28(moby) != 0) { moby[0x20] = 6; FUN_L06_002fbc30(moby); } break; - case 4: + case ALIEN_QUEEN_STATE_FROG_RECOVERY_ORBIT: func_L06_002FC4C0_q(moby); - case 6: + case ALIEN_QUEEN_STATE_GROUP_RECOVERY_ORBIT: func_L06_002FD0B8_q(moby); if (((unsigned char)moby[0x20] == 4 && - check_all_listed_frog_states_fe_fd_or_10(data->frog_list) != 0) || + check_all_listed_frog_states_fe_fd_or_10(alien_queen_update_vars->frog_list) != 0) || ((unsigned char)moby[0x20] == 6 && - count_active_moby_group_members(data->state18_list, -1) == 0)) { + count_active_moby_group_members(alien_queen_update_vars->state18_list, -1) == 0)) { moby[0x20] = 8; - data->timer_120 = scale_game_frames(0x4B0); + alien_queen_update_vars->timer_120 = scale_game_frames(0x4B0); if ((unsigned char)moby[0x53] != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(0x14)); } } return; - case 7: - if (data->unkB4 == 2) + case ALIEN_QUEEN_STATE_WAIT_TO_APPROACH_TARGET: + if (alien_queen_update_vars->unkB4 == 2) break; moby[0x20] = 8; if ((unsigned char)moby[0x53] == 3) break; blend_moby_animation(moby, 3, 0, scale_game_frames(0x14)); return; - case 8: { + case ALIEN_QUEEN_STATE_APPROACH_TARGET: { float dist = vector_distance_xy(moby + 0x10, target + 0x10); float turn = fast_difference_between_rotations( MOBY(moby)->rot.z, @@ -543,36 +574,37 @@ void alien_queen_update(unsigned char *moby) { approach_angle((float *)&MOBY(moby)->rot.z, fast_arc_tan(*(float *)(target + 0x10) - MOBY(moby)->pos.x, *(float *)(target + 0x14) - MOBY(moby)->pos.y), - (float *)&data->unkE0, + (float *)&alien_queen_update_vars->unkE0, frame_time_sq * 6.2831855f, frame_time_sq * 6.2831855f, frame_time * 3.1415927f); - if (turn < 0.7853982f && *(float *)&D_L06_00161F00 < dist) { - approach_value(&data->unkE8, - *(float *)&D_L06_00161EF4 * frame_time, + if (turn < 0.7853982f && *(float *)&l06_alien_queen_attack_distance < dist) { + approach_value(&alien_queen_update_vars->unkE8, + *(float *)&l06_alien_queen_movement_speed * frame_time, alien_queen_movement_acceleration_gp * frame_time_sq); - } else if (dist < *(float *)&D_L06_00161F04) { - approach_value(&data->unkE8, - -(*(float *)&D_L06_00161EF4 * frame_time), + } else if (dist < *(float *)&l06_alien_queen_retreat_distance) { + approach_value(&alien_queen_update_vars->unkE8, + -(*(float *)&l06_alien_queen_movement_speed * frame_time), alien_queen_movement_acceleration_gp * frame_time_sq); } else { - approach_value(&data->unkE8, 0.0f, frame_time_sq * 8.0f); + approach_value(&alien_queen_update_vars->unkE8, 0.0f, frame_time_sq * 8.0f); } fast_vec_sub(step, target + 0x10, moby + 0x10); step[2] = 0.0f; - fast_vec_normalize(step, step, data->unkE8); + fast_vec_normalize(step, step, alien_queen_update_vars->unkE8); fast_vec_add(moby + 0x10, moby + 0x10, step); - func_L00_00262DF0_q(data->path, moby + 0x10, 1.0f, moby + 0x10); - if (data->unkB4 == 2) { + func_L00_00262DF0_q(alien_queen_update_vars->path, moby + 0x10, 1.0f, moby + 0x10); + if (alien_queen_update_vars->unkB4 == 2) { moby[0x20] = 0xD; break; } - if (fast_dec_timer(&data->timer_120) != 0) { - data->timer_120 = scale_game_frames(0x168); + if (fast_dec_timer(&alien_queen_update_vars->timer_120) != 0) { + alien_queen_update_vars->timer_120 = scale_game_frames(0x168); moby[0x20] = 0xC; break; } - if (dist < *(float *)&D_L06_00161F00 && turn < *(float *)&D_L06_00161F08 * 0.017453292f) { + if (dist < *(float *)&l06_alien_queen_attack_distance && + turn < *(float *)&l06_alien_queen_attack_heading_tolerance_degrees * 0.017453292f) { moby[0x20] = 9; moby[0xBC] = 7; if ((unsigned char)moby[0x53] != 4) { @@ -582,10 +614,10 @@ void alien_queen_update(unsigned char *moby) { } break; } - case 12: + case ALIEN_QUEEN_STATE_TIMED_ORBIT: func_L06_002FD0B8_q(moby); - if (fast_dec_timer(&data->timer_120) != 0) { - data->timer_120 = scale_game_frames(0x4B0); + if (fast_dec_timer(&alien_queen_update_vars->timer_120) != 0) { + alien_queen_update_vars->timer_120 = scale_game_frames(0x4B0); moby[0x20] = 0xB; moby[0xBC] = 7; if ((unsigned char)moby[0x53] != 6) { @@ -593,11 +625,11 @@ void alien_queen_update(unsigned char *moby) { } } return; - case 9: - fast_dec_timer(&data->timer_120); + case ALIEN_QUEEN_STATE_ATTACK_WINDUP: + fast_dec_timer(&alien_queen_update_vars->timer_120); approach_angle((float *)&MOBY(moby)->rot.z, MOBY(moby)->rot.z, - (float *)&data->unkE0, + (float *)&alien_queen_update_vars->unkE0, frame_time_sq * 6.2831855f, frame_time_sq * 6.2831855f, frame_time * 3.1415927f); @@ -609,10 +641,10 @@ void alien_queen_update(unsigned char *moby) { } } break; - case 10: { + case ALIEN_QUEEN_STATE_ATTACK_HIT_QUERIES: { QueenProbe probe; - float buf[4]; - fast_dec_timer(&data->timer_120); + float hit_query_position[4]; + fast_dec_timer(&alien_queen_update_vars->timer_120); if (1.0f < compute_interpolated_record_value(moby) && compute_interpolated_record_value(moby) < 8.0f) { step[0] = fast_cos(MOBY(moby)->rot.z) * 0.45f; @@ -625,20 +657,20 @@ void alien_queen_update(unsigned char *moby) { probe.dir[0] = fast_cos(MOBY(moby)->rot.z); probe.dir[1] = fast_sin(MOBY(moby)->rot.z); probe.dir[2] = 0.0f; - func_L00_00250800_q(moby, 0, buf); - func_L00_001F2BE8_q(buf, 0.5f, 0, moby, &probe); - func_L00_00250800_q(moby, 1, buf); - func_L00_001F2BE8_q(buf, 0.5f, 0, moby, &probe); - func_L00_00250800_q(moby, 2, buf); - func_L00_001F2BE8_q(buf, 0.5f, 0, moby, &probe); - func_L00_00250800_q(moby, 3, buf); - func_L00_001F2BE8_q(buf, 0.5f, 0, moby, &probe); - func_L00_00250800_q(moby, 4, buf); - func_L00_001F2BE8_q(buf, 0.5f, 0, moby, &probe); - func_L00_00250800_q(moby, 5, buf); - func_L00_001F2BE8_q(buf, 1.1f, 0, moby, &probe); - func_L00_00250800_q(moby, 6, buf); - func_L00_001F2BE8_q(buf, 1.1f, 0, moby, &probe); + func_L00_00250800_q(moby, 0, hit_query_position); + func_L00_001F2BE8_q(hit_query_position, 0.5f, 0, moby, &probe); + func_L00_00250800_q(moby, 1, hit_query_position); + func_L00_001F2BE8_q(hit_query_position, 0.5f, 0, moby, &probe); + func_L00_00250800_q(moby, 2, hit_query_position); + func_L00_001F2BE8_q(hit_query_position, 0.5f, 0, moby, &probe); + func_L00_00250800_q(moby, 3, hit_query_position); + func_L00_001F2BE8_q(hit_query_position, 0.5f, 0, moby, &probe); + func_L00_00250800_q(moby, 4, hit_query_position); + func_L00_001F2BE8_q(hit_query_position, 0.5f, 0, moby, &probe); + func_L00_00250800_q(moby, 5, hit_query_position); + func_L00_001F2BE8_q(hit_query_position, 1.1f, 0, moby, &probe); + func_L00_00250800_q(moby, 6, hit_query_position); + func_L00_001F2BE8_q(hit_query_position, 1.1f, 0, moby, &probe); return; } if (moby[0x70] & 2) { @@ -649,7 +681,7 @@ void alien_queen_update(unsigned char *moby) { } return; } - case 11: + case ALIEN_QUEEN_STATE_WAIT_FOR_ORBIT_ANIMATION_END: if (moby[0x70] & 2) { moby[0x20] = moby[0xBC]; if ((unsigned char)moby[0x53] != 1) { @@ -657,28 +689,29 @@ void alien_queen_update(unsigned char *moby) { } } return; - case 13: { + case ALIEN_QUEEN_STATE_RETURN_HOME: { char *pos = (char *)moby + 0x10; - char *home = data->unkC0; + char *home = alien_queen_update_vars->unkC0; float dist = vector_distance_xy(pos, home); float turn = fast_difference_between_rotations( MOBY(moby)->rot.z, - fast_arc_tan(data->unkC0[0] - MOBY(moby)->pos.x, data->unkC0[1] - MOBY(moby)->pos.y)); - approach_angle( - (float *)&MOBY(moby)->rot.z, - fast_arc_tan(data->unkC0[0] - MOBY(moby)->pos.x, data->unkC0[1] - MOBY(moby)->pos.y), - (float *)&data->unkE0, - frame_time_sq * 6.2831855f, - frame_time_sq * 6.2831855f, - frame_time * 3.1415927f); + fast_arc_tan(alien_queen_update_vars->unkC0[0] - MOBY(moby)->pos.x, + alien_queen_update_vars->unkC0[1] - MOBY(moby)->pos.y)); + approach_angle((float *)&MOBY(moby)->rot.z, + fast_arc_tan(alien_queen_update_vars->unkC0[0] - MOBY(moby)->pos.x, + alien_queen_update_vars->unkC0[1] - MOBY(moby)->pos.y), + (float *)&alien_queen_update_vars->unkE0, + frame_time_sq * 6.2831855f, + frame_time_sq * 6.2831855f, + frame_time * 3.1415927f); if (turn < 0.7853982f) { fast_vec_sub(step, home, pos); step[2] = 0.0f; - fast_vec_normalize(step, step, *(float *)&D_L06_00161EF4 * frame_time); + fast_vec_normalize(step, step, *(float *)&l06_alien_queen_movement_speed * frame_time); fast_vec_add(pos, pos, step); - func_L00_00262DF0_q(data->path, pos, 1.0f, pos); + func_L00_00262DF0_q(alien_queen_update_vars->path, pos, 1.0f, pos); } - if (data->unkB4 != 2) { + if (alien_queen_update_vars->unkB4 != 2) { moby[0x20] = 7; break; } @@ -691,14 +724,15 @@ void alien_queen_update(unsigned char *moby) { } break; } - case 14: { + case ALIEN_QUEEN_STATE_DEATH: { unsigned char *flag; menu_item_enabled_19_lui[4] = 1; - data->unk110 = 0; + alien_queen_update_vars->unk110 = 0; moby[0x30] = 0xFF; - if (data->unk2E == 2) { - func_L06_002F6790_q(level_mobys_q + (data->unk100 << 8)); - set_listed_alien_queen_sliders_state_2_and_clear_data_28(data->slider_list); + if (alien_queen_update_vars->unk2E == 2) { + func_L06_002F6790_q(level_mobys_q + (alien_queen_update_vars->unk100 << 8)); + set_listed_alien_queen_sliders_state_2_and_clear_data_28( + alien_queen_update_vars->slider_list); MOBY(moby)->flags |= 1; moby[0x20] = 0xF; moby[0x31] = 0; @@ -715,8 +749,9 @@ void alien_queen_update(unsigned char *moby) { step[2] = step[2] + 1.0f; func_L00_00260460_q(moby, step, -1, 2.0f, 20.0f); spawn_moby_break_fragments(moby, 0x6A2, 1, 0x6A3, 3, 6, 2); - func_L06_002F6790_q(level_mobys_q + (data->unk100 << 8)); - set_listed_alien_queen_sliders_state_2_and_clear_data_28(data->slider_list); + func_L06_002F6790_q(level_mobys_q + (alien_queen_update_vars->unk100 << 8)); + set_listed_alien_queen_sliders_state_2_and_clear_data_28( + alien_queen_update_vars->slider_list); moby[0x20] = 0xF; if ((unsigned char)moby[0x53] != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(0x14)); @@ -724,7 +759,7 @@ void alien_queen_update(unsigned char *moby) { MOBY(moby)->collision = 0; moby[0x31] = 0; MOBY(moby)->flags |= 1; - if (data->unk178 != 0) + if (alien_queen_update_vars->unk178 != 0) return; flag = D_0013D407_q + 1; if (flag[0xA] != 0) @@ -734,20 +769,20 @@ void alien_queen_update(unsigned char *moby) { queue_dialogue_message(0x53D6, -1); return; } - case 15: { + case ALIEN_QUEEN_STATE_POST_DEATH: { int i; - char *other = 0; + char *post_death_scan_record = 0; for (i = 0; i < 0x30; i++) { - if (D_L06_0016A010[i] != 0) { - other = D_L06_001678D0 + i * 0xA0; - if (*(short *)(other + 0x86) == 0x12) { - release_moby_camera_control(other); + if (l06_post_death_scan_record_gates[i] != 0) { + post_death_scan_record = l06_post_death_scan_records + i * 0xA0; + if (*(short *)(post_death_scan_record + 0x86) == 0x12) { + release_moby_camera_control(post_death_scan_record); break; } } } if (level_game_mode_q == 2) { - func_L06_002F6790_q(level_mobys_q + (data->unkFC << 8)); + func_L06_002F6790_q(level_mobys_q + (alien_queen_update_vars->unkFC << 8)); mark_moby_for_removal(moby); } break; @@ -786,7 +821,7 @@ void update_alien_queen_hit_response_and_recovery(char *moby) { float recovery_hp; int *path; alien_queen_hit_recovery_vars = ((char *)MOBY(moby)->pvars); - if (MOBY(moby)->state == 0) + if (MOBY(moby)->state == ALIEN_QUEEN_STATE_INITIALIZE) return; if ((unsigned int)(MOBY(moby)->state - 4) < 10 && alien_queen_hit_recovery_vars->unk108 != -1) D_L06_0014162A = *(short *)&alien_queen_hit_recovery_vars->unk108; @@ -796,8 +831,8 @@ void update_alien_queen_hit_response_and_recovery(char *moby) { hit = FUN_L00_0025a420(moby, 0x330000, 0); kind = resolve_moby_hit_response( moby, hit, &alien_queen_hit_recovery_vars->health, 0, &hit_status, &dmg, 0, 4); - if (hit_status != 1 && (unsigned char)moby[0x20] != 14 && (unsigned char)moby[0x20] != 3 && - (unsigned char)moby[0x20] != 5) { + if (hit_status != HIT_STATUS_SKIP_DAMAGE_AND_REACTION && (unsigned char)moby[0x20] != 14 && + (unsigned char)moby[0x20] != 3 && (unsigned char)moby[0x20] != 5) { if (*(char **)(hit + 0x20) != 0) { int oclass = *(short *)(*(char **)(hit + 0x20) + 0xA6); switch (oclass) { @@ -835,9 +870,9 @@ void update_alien_queen_hit_response_and_recovery(char *moby) { alien_queen_hit_recovery_vars->health = alien_queen_hit_recovery_vars->recovery_health; } if (alien_queen_hit_recovery_vars->health <= 0.0f) - kind = 1; - else if (kind == 1) - kind = 5; + kind = HIT_RESPONSE_DEATH; + else if (kind == HIT_RESPONSE_DEATH) + kind = HIT_RESPONSE_NONLETHAL_FALLBACK; switch (kind) { case HIT_RESPONSE_SKIP_REACTION: case HIT_RESPONSE_NO_REACTION: diff --git a/src/overlays/l06/mobys/alien_snapper.c b/src/overlays/l06/mobys/alien_snapper.c index e847df38eb..2678dbc082 100644 --- a/src/overlays/l06/mobys/alien_snapper.c +++ b/src/overlays/l06/mobys/alien_snapper.c @@ -16,6 +16,27 @@ #include "rnc/overlay/shared/mobys/test_path_segment_strict_crossing.h" #include "rnc/rendering/clip_volume.h" +enum { + ALIEN_SNAPPER_STATE_INITIALIZE = 0, + ALIEN_SNAPPER_STATE_WAIT_FOR_ACTIVATION = 1, + ALIEN_SNAPPER_STATE_ACTIVATION_SEQUENCE = 2, + ALIEN_SNAPPER_STATE_WAIT_FOR_CLIP_TRIGGER = 3, + ALIEN_SNAPPER_STATE_PREPARE_HOME_NODE_JUMP = 4, + ALIEN_SNAPPER_STATE_JUMP_TO_HOME_NODE = 5, + ALIEN_SNAPPER_STATE_FACE_GOAL_AND_WAIT = 6, + ALIEN_SNAPPER_STATE_WAIT_TO_APPROACH = 7, + ALIEN_SNAPPER_STATE_APPROACH_TARGET = 8, + ALIEN_SNAPPER_STATE_REPOSITION_AROUND_TARGET = 9, + ALIEN_SNAPPER_STATE_WAIT_FOR_REPOSITION_ANIMATION = 10, + ALIEN_SNAPPER_STATE_BITE_TARGET = 11, + ALIEN_SNAPPER_STATE_RETURN_HOME = 12, + ALIEN_SNAPPER_STATE_RETREAT_FROM_TARGET = 13, + ALIEN_SNAPPER_STATE_HIT_KNOCKBACK = 14, + ALIEN_SNAPPER_STATE_FACE_HERO = 15, + ALIEN_SNAPPER_STATE_BITE_HERO = 16, + ALIEN_SNAPPER_STATE_DEATH_MOTION = 17 +}; + extern int D_L06_001ABFC0[]; /* 0x002f9698, 96 bytes. @@ -25,7 +46,7 @@ void transition_moby_group_state_1_to_2(char *group_source_moby) __asm__("FUN_L0 /* angle from a moby to its owner, clamped to the gaps between obstacles in its list */ /* Ported from rac1-decomp (src/overlays/l06_blarg/vendor_002B5990.c: func_L06_002FAB28), where it is exact; names translated to the US level program. */ -extern char *D_L06_0015FFD8; +extern char *level_mobys_q __asm__("D_L06_0015FFD8"); extern char D_0013E533[]; extern short *D_L06_001ABFC0_p[] __asm__("D_L06_001ABFC0"); extern short alien_snapper_gap_angle_limit_degrees_gp __asm__("D_L06_00161ED8") @@ -130,13 +151,16 @@ typedef struct { extern float D_0015ED70; extern float scale_time(float) __asm__("FUN_001f96b0"); extern float D_L06_00161EB0 __attribute__((sda)); -extern float D_L06_00161EB4 __attribute__((sda)); -extern float D_L06_00161EC4 __attribute__((sda)); -extern float D_L06_00161EC8 __attribute__((sda)); -extern float D_L06_00161ED0 __attribute__((sda)); -extern float D_L06_00161ED4 __attribute__((sda)); -extern int D_L06_00161EDC __attribute__((sda)); -extern int D_L06_00161EE0 __attribute__((sda)); +extern float l06_alien_snapper_gravity __asm__("D_L06_00161EB4") __attribute__((sda)); +extern float l06_alien_snapper_bite_approach_radius __asm__("D_L06_00161EC4") __attribute__((sda)); +extern float l06_alien_snapper_max_home_distance __asm__("D_L06_00161EC8") __attribute__((sda)); +extern float l06_alien_snapper_base_targeting_radius __asm__("D_L06_00161ED0") __attribute__((sda)); +extern float l06_alien_snapper_retreat_distance_limit __asm__("D_L06_00161ED4") + __attribute__((sda)); +extern int l06_alien_snapper_retreat_bite_override_enabled __asm__("D_L06_00161EDC") + __attribute__((sda)); +extern int l06_alien_snapper_retreat_bite_start_frame __asm__("D_L06_00161EE0") + __attribute__((sda)); void update_alien_snapper_hit_response_and_targeting(Moby *moby) __asm__("FUN_L06_002f91e8"); extern char D_0013F3D0[]; extern void update_alien_snapper_hit_response_and_targeting(Moby *) __asm__("FUN_L06_002f91e8"); @@ -246,10 +270,14 @@ approach_angle(f32 *angle, f32 target, f32 *vel, f32, f32, f32) __asm__("FUN_L00 /* Moby class 1048 */ void alien_snapper_update(Moby *moby) { - SnapperVars_91A8 *vars = (SnapperVars_91A8 *)moby->pvars; + enum { + ALIEN_SNAPPER_ANIM_ACTIVATION = 3, + ALIEN_SNAPPER_ANIM_HOME_NODE_JUMP_WINDUP = 6 + }; + SnapperVars_91A8 *snapper_behavior = (SnapperVars_91A8 *)moby->pvars; Moby *target; - float dist; - float ang; + float target_goal_radius; + float target_gap_angle_radians; float saved_rot; int start_frame; union { @@ -261,50 +289,50 @@ void alien_snapper_update(Moby *moby) { float path_point[4]; } m; } scratch; - float buf[4]; + float bite_query_position[4]; update_alien_snapper_hit_response_and_targeting(moby); - func_L00_00264B40_91A8(2.3f, moby, 1, vars->f1E0); + func_L00_00264B40_91A8(2.3f, moby, 1, snapper_behavior->f1E0); if (moby->visible != 0 && fast_vec_dist(&moby->pos, D_L06_00167540_macro) < 27.0f) { func_L00_0025B178_91A8(moby); moby->shadow_range = 0x15; } - target = vars->target; + target = snapper_behavior->target; moby->scale = moby->pclass->scale * D_L06_00161EB0; switch (moby->state) { - case 0: - vars->f28 = 3; - vars->f29 = 1; - vars->f20 = 4.0f; - vars->f24 = 4; - vars->f58 = truncate_float_to_s32(10.0f); - vars->f5A = truncate_float_to_s32(14.0f); + case ALIEN_SNAPPER_STATE_INITIALIZE: + snapper_behavior->f28 = 3; + snapper_behavior->f29 = 1; + snapper_behavior->f20 = 4.0f; + snapper_behavior->f24 = 4; + snapper_behavior->f58 = truncate_float_to_s32(10.0f); + snapper_behavior->f5A = truncate_float_to_s32(14.0f); moby->flags |= 0x5000; - qcopy(&vars->home, &moby->pos); - vars->reach_distance = random_float_between(0.0f, 1.0f); - func_L01_0026E8E0_91A8(&vars->movement); - vars->fDC = 2.0f; - vars->fD8 = 2.0f; - vars->movement = truncate_float_to_s32(D_L06_00161EB0 * 1024.0f); - vars->fD4 = D_L06_00161EB0; - vars->speed = vars->base_speed * frame_time; - vars->f90 = truncate_float_to_s32(768.0f); - vars->f98 = 0.75f; - vars->f80 = D_L06_00161EB4 * D_0015ED70; - vars->fAD = 0; - vars->f84 = 0.0005f; - vars->f94 = 9; - vars->f1C8 = random_angle_radians(); - if (vars->f1CC != 0) { + qcopy(&snapper_behavior->home, &moby->pos); + snapper_behavior->reach_distance = random_float_between(0.0f, 1.0f); + func_L01_0026E8E0_91A8(&snapper_behavior->movement); + snapper_behavior->fDC = 2.0f; + snapper_behavior->fD8 = 2.0f; + snapper_behavior->movement = truncate_float_to_s32(D_L06_00161EB0 * 1024.0f); + snapper_behavior->fD4 = D_L06_00161EB0; + snapper_behavior->speed = snapper_behavior->base_speed * frame_time; + snapper_behavior->f90 = truncate_float_to_s32(768.0f); + snapper_behavior->f98 = 0.75f; + snapper_behavior->f80 = l06_alien_snapper_gravity * D_0015ED70; + snapper_behavior->fAD = 0; + snapper_behavior->f84 = 0.0005f; + snapper_behavior->f94 = 9; + snapper_behavior->f1C8 = random_angle_radians(); + if (snapper_behavior->f1CC != 0) { moby->state = 0xF; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, 0); } - } else if (vars->clip_volume >= 0) { + } else if (snapper_behavior->clip_volume >= 0) { moby->state = 3; - } else if (vars->f1B4 != 0) { + } else if (snapper_behavior->f1B4 != 0) { moby->state = 2; - vars->timer = scale_game_frames(1); + snapper_behavior->timer = scale_game_frames(1); if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 0); } @@ -316,32 +344,35 @@ void alien_snapper_update(Moby *moby) { if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 0); } - vars->f1A0 = D_L06_00161ED0; + snapper_behavior->f1A0 = l06_alien_snapper_base_targeting_radius; } break; - case 1: - if (vars->f164 != 2) { + case ALIEN_SNAPPER_STATE_WAIT_FOR_ACTIVATION: + if (snapper_behavior->f164 != 2) { moby->state = 2; - vars->timer = scale_game_frames(1); + snapper_behavior->timer = scale_game_frames(1); if (moby->group != 0xFF) { func_L06_002FAAC8_91A8(moby); } } break; - case 2: + case ALIEN_SNAPPER_STATE_ACTIVATION_SEQUENCE: if (moby->prev_seq == 0) { - if (vars->timer == 0) { - vars->timer = truncate_float_to_s32(scale_time(random_float_between(0.0f, 20.0f))); - } else if (fast_dec_timer(&vars->timer) != 0) { + if (snapper_behavior->timer == 0) { + snapper_behavior->timer = + truncate_float_to_s32(scale_time(random_float_between(0.0f, 20.0f))); + } else if (fast_dec_timer(&snapper_behavior->timer) != 0) { if (moby->prev_seq != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } } } else if (moby->anim_flags & 2) { - if (vector_distance_xy(&moby->pos, ((char *)&D_0013F3D0)) < D_L06_00161ED0) { + if (vector_distance_xy(&moby->pos, ((char *)&D_0013F3D0)) < + l06_alien_snapper_base_targeting_radius) { moby->state = 8; - vars->angle_jitter = random_float_between(vars->jitter_degrees * 0.017453292f, - -(vars->jitter_degrees * 0.017453292f)); + snapper_behavior->angle_jitter = + random_float_between(snapper_behavior->jitter_degrees * 0.017453292f, + -(snapper_behavior->jitter_degrees * 0.017453292f)); if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -356,9 +387,10 @@ void alien_snapper_update(Moby *moby) { } } break; - case 3: - if (vars->clip_volume >= 0) { - if (is_point_inside_clip_volume(((char *)&D_0013F3D0), vars->clip_volume) != 0) { + case ALIEN_SNAPPER_STATE_WAIT_FOR_CLIP_TRIGGER: + if (snapper_behavior->clip_volume >= 0) { + if (is_point_inside_clip_volume(((char *)&D_0013F3D0), snapper_behavior->clip_volume) != + 0) { moby->state = 4; if (moby->prev_seq != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(5)); @@ -366,28 +398,32 @@ void alien_snapper_update(Moby *moby) { } } break; - case 4: + case ALIEN_SNAPPER_STATE_PREPARE_HOME_NODE_JUMP: if (moby->anim_flags & 2) { switch (moby->prev_seq) { - case 3: + case ALIEN_SNAPPER_ANIM_ACTIVATION: blend_moby_animation(moby, 6, 0, scale_game_frames(5)); break; - case 6: + case ALIEN_SNAPPER_ANIM_HOME_NODE_JUMP_WINDUP: moby->state = 5; - qcopy(&vars->home, &l06_cuboids[vars->node].pos); - vars->return_speed = - vector_distance_xy(&moby->pos, &vars->home) / (float)scale_game_frames(60); - vars->f8C = func_L00_0025BC48_91A8( - &moby->pos, &vars->home, 0, vars->return_speed, -vars->f80); - vars->f94 = 5; - vars->fAD = 3; - func_L00_0025D5B0_91A8( - moby, - vars->f70, - 7, - 1, - 0, - fast_arc_tan(vars->home.x - moby->pos.x, vars->home.y - moby->pos.y)); + qcopy(&snapper_behavior->home, &l06_cuboids[snapper_behavior->node].pos); + snapper_behavior->return_speed = + vector_distance_xy(&moby->pos, &snapper_behavior->home) / + (float)scale_game_frames(60); + snapper_behavior->f8C = func_L00_0025BC48_91A8(&moby->pos, + &snapper_behavior->home, + 0, + snapper_behavior->return_speed, + -snapper_behavior->f80); + snapper_behavior->f94 = 5; + snapper_behavior->fAD = 3; + func_L00_0025D5B0_91A8(moby, + snapper_behavior->f70, + 7, + 1, + 0, + fast_arc_tan(snapper_behavior->home.x - moby->pos.x, + snapper_behavior->home.y - moby->pos.y)); if (moby->prev_seq != 7) { blend_moby_animation(moby, 7, 0, 5); } @@ -395,50 +431,53 @@ void alien_snapper_update(Moby *moby) { } } break; - case 5: - if (func_L00_0025D6F0_91A8(moby, vars->f70) & 1) { + case ALIEN_SNAPPER_STATE_JUMP_TO_HOME_NODE: + if (func_L00_0025D6F0_91A8(moby, snapper_behavior->f70) & 1) { moby->state = 6; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, 5); } } break; - case 6: + case ALIEN_SNAPPER_STATE_FACE_GOAL_AND_WAIT: func_L00_002592B0_91A8(moby, - fast_arc_tan(vars->goal_x - moby->pos.x, vars->goal_y - moby->pos.y), - &vars->turn_speed, + fast_arc_tan(snapper_behavior->goal_x - moby->pos.x, + snapper_behavior->goal_y - moby->pos.y), + &snapper_behavior->turn_speed, 0.05f, 0.3f, frame_time * 6.2831855f); - if (vars->f164 != 2) { + if (snapper_behavior->f164 != 2) { moby->state = 7; - vars->timer = truncate_float_to_s32(random_float_between(0.0f, (float)vars->timer_max)); - } else if (vars->f1AC != 0) { + snapper_behavior->timer = truncate_float_to_s32( + random_float_between(0.0f, (float)snapper_behavior->timer_max)); + } else if (snapper_behavior->f1AC != 0) { moby->state = 9; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } } break; - case 9: { + case ALIEN_SNAPPER_STATE_REPOSITION_AROUND_TARGET: { int near; - approach_value(&vars->speed, vars->base_speed * frame_time, D_0015ED70 * 6.0f); + approach_value( + &snapper_behavior->speed, snapper_behavior->base_speed * frame_time, D_0015ED70 * 6.0f); func_L00_002592B0_91A8( moby, fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y), - &vars->turn_speed, + &snapper_behavior->turn_speed, 0.05f, 0.3f, frame_time * 6.2831855f); - dist = vector_distance_xy(&moby->pos, &target->pos); - if (D_L06_00161EC4 < dist) { - dist = D_L06_00161EC4; + target_goal_radius = vector_distance_xy(&moby->pos, &target->pos); + if (l06_alien_snapper_bite_approach_radius < target_goal_radius) { + target_goal_radius = l06_alien_snapper_bite_approach_radius; } - ang = func_L06_002FAB28_91A8(moby); + target_gap_angle_radians = func_L06_002FAB28_91A8(moby); near = 0; - scratch.m.goal[0] = fast_cos(ang) * dist; - scratch.m.goal[1] = fast_sin(ang) * dist; + scratch.m.goal[0] = fast_cos(target_gap_angle_radians) * target_goal_radius; + scratch.m.goal[1] = fast_sin(target_gap_angle_radians) * target_goal_radius; scratch.m.goal[2] = 0.0f; fast_vec_add(scratch.m.goal, scratch.m.goal, &target->pos); saved_rot = moby->rot.z; @@ -447,21 +486,24 @@ void alien_snapper_update(Moby *moby) { scratch.m.dir[0] = fast_cos(moby->rot.z) * 2.0f; scratch.m.dir[1] = fast_sin(moby->rot.z) * 2.0f; scratch.m.dir[2] = 0.0f; - func_L00_00259B88_91A8(moby, &vars->movement, scratch.m.dir, scratch.m.out, 1.0f); + func_L00_00259B88_91A8( + moby, &snapper_behavior->movement, scratch.m.dir, scratch.m.out, 1.0f); moby->rot.z = saved_rot; - func_L00_00262DF0_91A8(0.5f, vars->path, &moby->pos, &moby->pos); - if (FUN_L00_00261b48(vars->path, &moby->pos, &target->pos, scratch.m.path_point) != 0 && - fast_vec_dist(&moby->pos, scratch.m.path_point) < vars->reach_distance) { + func_L00_00262DF0_91A8(0.5f, snapper_behavior->path, &moby->pos, &moby->pos); + if (FUN_L00_00261b48( + snapper_behavior->path, &moby->pos, &target->pos, scratch.m.path_point) != 0 && + fast_vec_dist(&moby->pos, scratch.m.path_point) < snapper_behavior->reach_distance) { near = 1; } - if (vars->f1AC == 0) { + if (snapper_behavior->f1AC == 0) { moby->state = 0xC; } else if (near) { moby->state = 0xA; if (moby->prev_seq != 5) { blend_moby_animation(moby, 5, 0, scale_game_frames(10)); } - } else if (vector_distance_xy(&moby->pos, &target->pos) < D_L06_00161EC4) { + } else if (vector_distance_xy(&moby->pos, &target->pos) < + l06_alien_snapper_bite_approach_radius) { moby->state = 0xB; if (moby->prev_seq != 4) { blend_moby_animation(moby, 4, 0, scale_game_frames(10)); @@ -469,7 +511,7 @@ void alien_snapper_update(Moby *moby) { } break; } - case 10: + case ALIEN_SNAPPER_STATE_WAIT_FOR_REPOSITION_ANIMATION: if (moby->anim_flags & 2) { moby->state = 9; if (moby->prev_seq != 1) { @@ -477,36 +519,39 @@ void alien_snapper_update(Moby *moby) { } } break; - case 7: - if (fast_dec_timer(&vars->timer) != 0) { + case ALIEN_SNAPPER_STATE_WAIT_TO_APPROACH: + if (fast_dec_timer(&snapper_behavior->timer) != 0) { moby->state = 8; - vars->angle_jitter = random_float_between(vars->jitter_degrees * 0.017453292f, - -(vars->jitter_degrees * 0.017453292f)); + snapper_behavior->angle_jitter = + random_float_between(snapper_behavior->jitter_degrees * 0.017453292f, + -(snapper_behavior->jitter_degrees * 0.017453292f)); if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } } break; - case 8: { - if (D_L06_00161EC4 < vector_distance_xy(&moby->pos, &target->pos)) { - approach_value(&vars->speed, vars->base_speed * frame_time, D_0015ED70 * 6.0f); + case ALIEN_SNAPPER_STATE_APPROACH_TARGET: { + if (l06_alien_snapper_bite_approach_radius < vector_distance_xy(&moby->pos, &target->pos)) { + approach_value(&snapper_behavior->speed, + snapper_behavior->base_speed * frame_time, + D_0015ED70 * 6.0f); } else { - approach_value(&vars->speed, 0.0f, D_0015ED70 * 20.0f); + approach_value(&snapper_behavior->speed, 0.0f, D_0015ED70 * 20.0f); } func_L00_002592B0_91A8( moby, fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y), - &vars->turn_speed, + &snapper_behavior->turn_speed, 0.05f, 0.3f, frame_time * 6.2831855f); - dist = vector_distance_xy(&moby->pos, &target->pos); - if (D_L06_00161EC4 < dist) { - dist = D_L06_00161EC4; + target_goal_radius = vector_distance_xy(&moby->pos, &target->pos); + if (l06_alien_snapper_bite_approach_radius < target_goal_radius) { + target_goal_radius = l06_alien_snapper_bite_approach_radius; } - ang = func_L06_002FAB28_91A8(moby); - scratch.m.goal[0] = fast_cos(ang) * dist; - scratch.m.goal[1] = fast_sin(ang) * dist; + target_gap_angle_radians = func_L06_002FAB28_91A8(moby); + scratch.m.goal[0] = fast_cos(target_gap_angle_radians) * target_goal_radius; + scratch.m.goal[1] = fast_sin(target_gap_angle_radians) * target_goal_radius; scratch.m.goal[2] = 0.0f; fast_vec_add(scratch.m.goal, scratch.m.goal, &target->pos); saved_rot = moby->rot.z; @@ -515,12 +560,16 @@ void alien_snapper_update(Moby *moby) { scratch.m.dir[0] = fast_cos(moby->rot.z) * 2.0f; scratch.m.dir[1] = fast_sin(moby->rot.z) * 2.0f; scratch.m.dir[2] = 0.0f; - func_L00_00259B88_91A8(moby, &vars->movement, scratch.m.dir, scratch.m.out, 1.0f); + func_L00_00259B88_91A8( + moby, &snapper_behavior->movement, scratch.m.dir, scratch.m.out, 1.0f); moby->rot.z = saved_rot; - func_L00_00262DF0_91A8(0.5f, vars->path, &moby->pos, &moby->pos); - if (D_L06_00161EC8 < fast_vec_dist(&moby->pos, &vars->home) || vars->f164 == 2) { + func_L00_00262DF0_91A8(0.5f, snapper_behavior->path, &moby->pos, &moby->pos); + if (l06_alien_snapper_max_home_distance < + fast_vec_dist(&moby->pos, &snapper_behavior->home) || + snapper_behavior->f164 == 2) { moby->state = 0xC; - } else if (vector_distance_xy(&moby->pos, &target->pos) < D_L06_00161EC4) { + } else if (vector_distance_xy(&moby->pos, &target->pos) < + l06_alien_snapper_bite_approach_radius) { if (absolute_float(target->pos.z - moby->pos.z) < 1.0f) { char *hero = ((char *)&D_0013F350); @@ -534,11 +583,11 @@ void alien_snapper_update(Moby *moby) { } break; } - case 11: + case ALIEN_SNAPPER_STATE_BITE_TARGET: func_L00_002592B0_91A8( moby, fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y), - &vars->turn_speed, + &snapper_behavior->turn_speed, 0.05f, 0.3f, frame_time * 6.2831855f); @@ -547,7 +596,7 @@ void alien_snapper_update(Moby *moby) { scratch.bite.push[0] = fast_cos(moby->rot.z) * 0.2f; scratch.bite.push[1] = fast_sin(moby->rot.z) * 0.2f; scratch.bite.push[2] = 0.0f; - func_L00_00250800_91A8(moby, 0, buf); + func_L00_00250800_91A8(moby, 0, bite_query_position); scratch.bite.moby = moby; scratch.bite.f14 = 1; scratch.bite.f20 = 1; @@ -555,7 +604,7 @@ void alien_snapper_update(Moby *moby) { scratch.bite.dir[0] = fast_cos(moby->rot.z); scratch.bite.dir[1] = fast_sin(moby->rot.z); scratch.bite.dir[2] = 0.0f; - func_L00_001F2BE8_91A8(0.5f, buf, 0, moby, &scratch.bite); + func_L00_001F2BE8_91A8(0.5f, bite_query_position, 0, moby, &scratch.bite); } else if (moby->anim_flags & 2) { moby->state = 8; if (moby->prev_seq != 1) { @@ -563,12 +612,14 @@ void alien_snapper_update(Moby *moby) { } } break; - case 13: { - approach_value(&vars->speed, vars->base_speed * 3.0f * frame_time, D_0015ED70 * 20.0f); + case ALIEN_SNAPPER_STATE_RETREAT_FROM_TARGET: { + approach_value(&snapper_behavior->speed, + snapper_behavior->base_speed * 3.0f * frame_time, + D_0015ED70 * 20.0f); func_L00_002592B0_91A8( moby, fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y), - &vars->turn_speed, + &snapper_behavior->turn_speed, 0.05f, 0.3f, frame_time * 6.2831855f); @@ -578,16 +629,18 @@ void alien_snapper_update(Moby *moby) { scratch.m.dir[0] = fast_cos(moby->rot.z) * 2.0f; scratch.m.dir[1] = fast_sin(moby->rot.z) * 2.0f; scratch.m.dir[2] = 0.0f; - func_L00_00259B88_91A8(moby, &vars->movement, scratch.m.dir, scratch.m.out, 1.0f); + func_L00_00259B88_91A8( + moby, &snapper_behavior->movement, scratch.m.dir, scratch.m.out, 1.0f); moby->rot.z = saved_rot; - func_L00_00262DF0_91A8(0.5f, vars->path, &moby->pos, &moby->pos); - if (fast_dec_timer(&vars->timer) != 0 || - D_L06_00161ED4 < fast_vec_dist(&moby->pos, &target->pos)) { + func_L00_00262DF0_91A8(0.5f, snapper_behavior->path, &moby->pos, &moby->pos); + if (fast_dec_timer(&snapper_behavior->timer) != 0 || + l06_alien_snapper_retreat_distance_limit < fast_vec_dist(&moby->pos, &target->pos)) { moby->state = 0xB; - vars->speed = frame_time * 5.0f; - if (D_L06_00161EDC != 0) { + snapper_behavior->speed = frame_time * 5.0f; + if (l06_alien_snapper_retreat_bite_override_enabled != 0) { if (moby->prev_seq != 4) { - blend_moby_animation(moby, 4, D_L06_00161EE0, scale_game_frames(5)); + blend_moby_animation( + moby, 4, l06_alien_snapper_retreat_bite_start_frame, scale_game_frames(5)); } } else { if (moby->prev_seq != 4) { @@ -597,25 +650,28 @@ void alien_snapper_update(Moby *moby) { } break; } - case 12: { - approach_value(&vars->speed, vars->base_speed * frame_time, D_0015ED70 * 6.0f); + case ALIEN_SNAPPER_STATE_RETURN_HOME: { + approach_value( + &snapper_behavior->speed, snapper_behavior->base_speed * frame_time, D_0015ED70 * 6.0f); func_L00_002592B0_91A8(moby, - fast_arc_tan(vars->home.x - moby->pos.x, vars->home.y - moby->pos.y), - &vars->turn_speed, + fast_arc_tan(snapper_behavior->home.x - moby->pos.x, + snapper_behavior->home.y - moby->pos.y), + &snapper_behavior->turn_speed, 0.05f, 0.3f, frame_time * 6.2831855f); scratch.m.dir[0] = fast_cos(moby->rot.z) * 2.0f; scratch.m.dir[1] = fast_sin(moby->rot.z) * 2.0f; scratch.m.dir[2] = 0.0f; - func_L00_00259B88_91A8(moby, &vars->movement, scratch.m.dir, scratch.m.out, 1.0f); - func_L00_00262DF0_b91A8(vars->path, &moby->pos, &moby->pos, 0.5f); - if (fast_vec_dist(&moby->pos, &vars->home) < 1.0f) { + func_L00_00259B88_91A8( + moby, &snapper_behavior->movement, scratch.m.dir, scratch.m.out, 1.0f); + func_L00_00262DF0_b91A8(snapper_behavior->path, &moby->pos, &moby->pos, 0.5f); + if (fast_vec_dist(&moby->pos, &snapper_behavior->home) < 1.0f) { moby->state = 6; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(20)); } - } else if (vars->f164 != 2) { + } else if (snapper_behavior->f164 != 2) { moby->state = 8; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(20)); @@ -623,13 +679,13 @@ void alien_snapper_update(Moby *moby) { } break; } - case 15: { + case ALIEN_SNAPPER_STATE_FACE_HERO: { char *hero = ((char *)&D_0013F350); approach_angle(&moby->rot.z, fast_arc_tan(*(float *)(hero + 0x80) - moby->pos.x, *(float *)(hero + 0x84) - moby->pos.y), - &vars->turn_speed, + &snapper_behavior->turn_speed, D_0015ED70 * 6.2831855f, D_0015ED70 * 6.2831855f, frame_time * 12.566371f); @@ -641,13 +697,13 @@ void alien_snapper_update(Moby *moby) { } break; } - case 16: { + case ALIEN_SNAPPER_STATE_BITE_HERO: { char *hero = ((char *)&D_0013F350); approach_angle(&moby->rot.z, fast_arc_tan(*(float *)(hero + 0x80) - moby->pos.x, *(float *)(hero + 0x84) - moby->pos.y), - &vars->turn_speed, + &snapper_behavior->turn_speed, D_0015ED70 * 6.2831855f, D_0015ED70 * 6.2831855f, frame_time * 12.566371f); @@ -656,7 +712,7 @@ void alien_snapper_update(Moby *moby) { scratch.bite.push[0] = fast_cos(moby->rot.z) * 0.2f; scratch.bite.push[1] = fast_sin(moby->rot.z) * 0.2f; scratch.bite.push[2] = 0.0f; - func_L00_00250800_91A8(moby, 0, buf); + func_L00_00250800_91A8(moby, 0, bite_query_position); scratch.bite.moby = moby; scratch.bite.f14 = 1; scratch.bite.f20 = 1; @@ -664,8 +720,8 @@ void alien_snapper_update(Moby *moby) { scratch.bite.dir[0] = fast_cos(moby->rot.z); scratch.bite.dir[1] = fast_sin(moby->rot.z); scratch.bite.dir[2] = 0.0f; - func_L00_001F2BE8_91A8(0.5f, buf, 0, moby, &scratch.bite); - collision_line(buf, &moby->pos, 0, moby, &scratch.bite); + func_L00_001F2BE8_91A8(0.5f, bite_query_position, 0, moby, &scratch.bite); + collision_line(bite_query_position, &moby->pos, 0, moby, &scratch.bite); } else if (moby->anim_flags & 2) { moby->state = 0xF; if (moby->prev_seq != 2) { @@ -674,9 +730,9 @@ void alien_snapper_update(Moby *moby) { } break; } - case 14: - if (func_L00_0025D6F0_91A8(moby, vars->f70) & 0x41) { - int *route = D_L06_001B0C30_macro[vars->path]; + case ALIEN_SNAPPER_STATE_HIT_KNOCKBACK: + if (func_L00_0025D6F0_91A8(moby, snapper_behavior->f70) & 0x41) { + int *route = D_L06_001B0C30_macro[snapper_behavior->path]; if (point_in_path_xy(&moby->pos, route + 4, *route) == 0) { mark_moby_for_removal(moby); @@ -687,12 +743,12 @@ void alien_snapper_update(Moby *moby) { if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(20)); } - vars->timer = scale_game_frames(30); + snapper_behavior->timer = scale_game_frames(30); } - func_L00_00262DF0_91A8(0.5f, vars->path, &moby->pos, &moby->pos); + func_L00_00262DF0_91A8(0.5f, snapper_behavior->path, &moby->pos, &moby->pos); break; - case 17: - if (func_L00_0025D6F0_91A8(moby, vars->f70) & 0x40) { + case ALIEN_SNAPPER_STATE_DEATH_MOTION: + if (func_L00_0025D6F0_91A8(moby, snapper_behavior->f70) & 0x40) { qcopy(scratch.m.dir, &moby->pos); func_L00_00260460_91A8(moby, scratch.m.dir, -1, 1.5f, 10.0f); spawn_moby_break_fragments(moby, 0x6A0, 2, 0x69F, 1, 5, 2); @@ -745,7 +801,8 @@ void update_alien_snapper_hit_response_and_targeting(Moby *moby) { reaction = resolve_moby_hit_response(moby, target, &snapper_vars->health, 0, &hit, &damage, 0, 4); - if (hit != 1 && moby->state != 0x11 && moby->state != 3) { + if (hit != 1 && moby->state != ALIEN_SNAPPER_STATE_DEATH_MOTION && + moby->state != ALIEN_SNAPPER_STATE_WAIT_FOR_CLIP_TRIGGER) { snapper_vars->health = snapper_vars->health - damage; if (moby->group != 0xFF) { func_L06_002FAAC8_2FA618(moby); @@ -768,7 +825,7 @@ void update_alien_snapper_hit_response_and_targeting(Moby *moby) { case HIT_RESPONSE_NONLETHAL_ANIMATION_MAINTENANCE: case HIT_RESPONSE_NONLETHAL_ANIMATION_FEEDBACK: case HIT_RESPONSE_NONLETHAL_KNOCKBACK: - moby->state = 14; + moby->state = ALIEN_SNAPPER_STATE_HIT_KNOCKBACK; snapper_vars->f88 = frame_time + frame_time; snapper_vars->f8C = frame_time; snapper_vars->fC0 = 5.0f; @@ -779,7 +836,7 @@ void update_alien_snapper_hit_response_and_targeting(Moby *moby) { break; case REACTION_DEATH: case HIT_RESPONSE_DEATH_SEQUENCE: - moby->state = 0x11; + moby->state = ALIEN_SNAPPER_STATE_DEATH_MOTION; moby->flags &= 0xEFFF; snapper_vars->f88 = frame_time * 8.0f; snapper_vars->f8C = frame_time * 5.0f; @@ -814,15 +871,15 @@ void update_alien_snapper_hit_response_and_targeting(Moby *moby) { D_L06_00161EE8, D_L06_00161EEC, (fast_sin(snapper_vars->f1C8) + 1.0f) * 0.5f); if (snapper_vars->f1AC != 0) { - snapper_vars->f1A0 = D_L06_00161ED0 + 6.0f; - } else if (moby->state == 1) { + snapper_vars->f1A0 = l06_alien_snapper_base_targeting_radius + 6.0f; + } else if (moby->state == ALIEN_SNAPPER_STATE_WAIT_FOR_ACTIVATION) { if (moby == ((Moby *)hero.unk240) || moby == ((Moby *)hero.coll_hit_moby)) { snapper_vars->f1A0 = 6.0f; } else { snapper_vars->f1A0 = 0.0f; } } else { - snapper_vars->f1A0 = D_L06_00161ED0; + snapper_vars->f1A0 = l06_alien_snapper_base_targeting_radius; } if (activate_effect_l08(snapper_vars->f1A0, @@ -847,7 +904,7 @@ void transition_moby_group_state_1_to_2(char *group_source_moby) { if (table != 0) { short *moby_index_cursor = table; do { - char *moby = (char *)(((*moby_index_cursor & 0x7FFF) << 8) + (int)D_L06_0015FFD8); + char *moby = (char *)(((*moby_index_cursor & 0x7FFF) << 8) + (int)level_mobys_q); if ((unsigned char)moby[0x20] == 1) { moby[0x20] = 2; } @@ -881,12 +938,12 @@ float compute_alien_snapper_target_gap_angle(char *snapper_moby) { } do { int listed_moby_index = *(unsigned short *)moby_index_cursor & 0x7FFF; - char *listed_moby = (char *)(listed_moby_index * 256 + (int)D_L06_0015FFD8); + char *listed_moby = (char *)(listed_moby_index * 256 + (int)level_mobys_q); if ((unsigned char)listed_moby[0x20] == 8 || fast_vec_dist(listed_moby + 0x10, target_moby + 0x10) < owner_to_self_distance) { - float d = fast_arc_tan(*(float *)(D_L06_0015FFD8 + listed_moby_index * 256 + 0x10) - + float d = fast_arc_tan(*(float *)(level_mobys_q + listed_moby_index * 256 + 0x10) - *(float *)(target_moby + 0x10), - *(float *)(D_L06_0015FFD8 + listed_moby_index * 256 + 0x14) - + *(float *)(level_mobys_q + listed_moby_index * 256 + 0x14) - *(float *)(target_moby + 0x14)); float listed_moby_angle_offset_radians = fast_subtract_rotations(d, owner_to_self_angle_radians); diff --git a/src/overlays/l06/mobys/alien_snapper_spawner.c b/src/overlays/l06/mobys/alien_snapper_spawner.c index d6b91328eb..93adcb3bb3 100644 --- a/src/overlays/l06/mobys/alien_snapper_spawner.c +++ b/src/overlays/l06/mobys/alien_snapper_spawner.c @@ -11,7 +11,7 @@ /* Trigger moby: waits for the hero in its zone, plays its open animation, then launches a listed moby. */ /* Ported from rac1-decomp (src/overlays/l06_blarg/vendor_002FE5D0.c: func_L06_002FEE60), where it is exact; names translated to the US level program. */ -extern int D_L06_0015FFD8; +extern int level_mobys_q __asm__("D_L06_0015FFD8"); extern short *D_L06_001ABFC0[]; extern void blend_moby_animation(void *, int, int, int) __asm__("FUN_00212f90"); void alien_snapper_spawner_update(char *moby) __asm__("FUN_L06_002fda30"); @@ -23,11 +23,14 @@ void alien_snapper_spawner_update(char *moby) { WAIT_FOR_ANIMATION_SIGNAL = 1, ACTIVATE_LISTED_MOBYS_AT_INTERVAL = 2 }; + enum { + ACTIVATION_SEQUENCE_FINISHED = 3 + }; int *moby_vars = ((int *)MOBY(moby)->pvars); switch (((unsigned char *)moby)[0x20]) { case WAIT_FOR_HERO_IN_CLIP_VOLUME: if (moby_vars[1] >= 0 && is_point_inside_clip_volume(&hero.motion.pos, moby_vars[1])) { - MOBY(moby)->state = 1; + MOBY(moby)->state = WAIT_FOR_ANIMATION_SIGNAL; if (((unsigned char *)moby)[0x53] != 1) { blend_moby_animation(moby, 1, 0, 5); } @@ -36,9 +39,9 @@ void alien_snapper_spawner_update(char *moby) { case WAIT_FOR_ANIMATION_SIGNAL: if (MOBY(moby)->anim_flags & 2) { if (moby_vars[0] >= 0) { - MOBY(moby)->state = 2; + MOBY(moby)->state = ACTIVATE_LISTED_MOBYS_AT_INTERVAL; } else { - MOBY(moby)->state = 3; + MOBY(moby)->state = ACTIVATION_SEQUENCE_FINISHED; } if (((unsigned char *)moby)[0x53] != 2) { blend_moby_animation(moby, 2, 0, 5); @@ -54,7 +57,7 @@ void alien_snapper_spawner_update(char *moby) { char *pos = moby + 0x10; do { if (activate_state_15_moby_at_position( - D_L06_0015FFD8 + ((*(unsigned short *)moby_list_entry & 0x7FFF) << 8), + level_mobys_q + ((*(unsigned short *)moby_list_entry & 0x7FFF) << 8), pos)) { found = 1.0f; break; @@ -64,7 +67,7 @@ void alien_snapper_spawner_update(char *moby) { if (found != 0.0f) { moby_vars[2] = scale_game_frames(0x14); } else { - MOBY(moby)->state = 3; + MOBY(moby)->state = ACTIVATION_SEQUENCE_FINISHED; } } break; diff --git a/src/overlays/l06/mobys/beam_barrier.c b/src/overlays/l06/mobys/beam_barrier.c index e0ce819da7..00ae458dbe 100644 --- a/src/overlays/l06/mobys/beam_barrier.c +++ b/src/overlays/l06/mobys/beam_barrier.c @@ -16,7 +16,7 @@ extern void allocate_voice_for_target_entry(int, int, int) __asm__("FUN_0022da68 /* angle from a moby to its owner, clamped to the gaps between obstacles in its list */ /* Ported from rac1-decomp (src/overlays/l06_blarg/vendor_002B5990.c: func_L06_002FAB28), where it is exact; names translated to the US level program. */ -extern char *D_L06_0015FFD8; +extern char *level_mobys_q __asm__("D_L06_0015FFD8"); #include "qcopy.h" @@ -46,15 +46,15 @@ extern int help_request(int, int) __asm__("FUN_L00_00203908"); typedef struct GbMoby GbMoby; extern GbMoby *D_L06_001745D8 NOT_SDA; -extern float D_L06_001DAFD0[]; -extern float D_L06_001DB060[]; +extern float l06_beam_barrier_segment_local_offsets[] __asm__("D_L06_001DAFD0"); +extern float l06_beam_barrier_segment_euler_rotations[] __asm__("D_L06_001DB060"); extern int D_L06_00161E40[] MACRO_ADDR; extern int D_L06_00161E50; extern int D_L06_00161E54; -extern f32 D_L06_00161E08 __attribute__((sda)); -extern float D_L06_00161E0C __attribute__((sda)); -float beam_barrier_collision_z_offset_gp __asm__("D_L06_00161E18") = 2.25f; -extern int beam_barrier_burst_color_from_gp __asm__("D_L06_00161E1C") __attribute__((sda)); +extern f32 l06_beam_barrier_strand_length __asm__("D_L06_00161E08") __attribute__((sda)); +extern float l06_beam_barrier_transform_scale __asm__("D_L06_00161E0C") __attribute__((sda)); +float beam_barrier_collision_z_offset_gp __asm__("D_L06_00161E18") = 2.25f; +extern int beam_barrier_burst_color_from_gp __asm__("D_L06_00161E1C") __attribute__((sda)); int beam_barrier_burst_color_to_gp __asm__("D_L06_00161E20") = 0x80802080; /* RGBA, 0xAABBGGRR */ float beam_barrier_burst_scale_min_gp __asm__("D_L06_00161E24") = 0.125f; float beam_barrier_burst_scale_max_gp __asm__("D_L06_00161E28") = 0.333f; @@ -135,7 +135,7 @@ void beam_barrier_update(struct Moby *moby) { D_L06_00161E40[3] = 0x22; D_L06_00161E40[0] = 0; beam_barrier_control_vars->voice = -1; - moby->state = 1; + moby->state = BEAM_BARRIER_ACTIVE; moby->flags = moby->flags | 0x4000; return; } @@ -238,7 +238,7 @@ void beam_barrier_update(struct Moby *moby) { { int all_done = 1; int count_usage = 1; - char *moby_table = D_L06_0015FFD8; + char *moby_table = level_mobys_q; int link; for (link = 0; link < 4; link++) { int index = beam_barrier_control_vars->links[link]; @@ -257,7 +257,7 @@ void beam_barrier_update(struct Moby *moby) { if (!all_done) return; moby->collision = 0; - moby->state = 2; + moby->state = BEAM_BARRIER_EMIT_SPARK_BURST; { int voice = beam_barrier_control_vars->voice; if (voice != -1) { @@ -289,7 +289,7 @@ void beam_barrier_update(struct Moby *moby) { int spark; int segment_offset; euler_rotation_matrix(work.matrix, &moby->rot); - set_scale_matrix(work.shared.local, D_L06_00161E0C); + set_scale_matrix(work.shared.local, l06_beam_barrier_transform_scale); segment = 0; pos = (float *)&moby->pos; multiply_matrix(work.matrix, work.matrix, work.shared.local); @@ -297,14 +297,18 @@ void beam_barrier_update(struct Moby *moby) { do { segment_offset = segment * 16; spark = 19; - euler_rotation_matrix(work.shared.local, (char *)D_L06_001DB060 + segment_offset); + euler_rotation_matrix(work.shared.local, + (char *)l06_beam_barrier_segment_euler_rotations + + segment_offset); next_segment = segment + 1; multiply_matrix(work.shared.local, work.matrix, work.shared.local); - transform_vector(work.point, (char *)D_L06_001DAFD0 + segment_offset, work.matrix); + transform_vector(work.point, + (char *)l06_beam_barrier_segment_local_offsets + segment_offset, + work.matrix); fast_vec_add(work.shared.collision.delta, work.point, pos); work.shared.collision.delta[3] = 1.0f; do { - radius = randf_sym(0.0f, D_L06_00161E08 * 0.5f); + radius = randf_sym(0.0f, l06_beam_barrier_strand_length * 0.5f); fast_vec_normalize(work.offset, column, radius); fast_vec_add(work.offset, work.offset, work.shared.collision.delta); blend = random_float_between(0.0f, 1.0f); @@ -329,7 +333,7 @@ void beam_barrier_update(struct Moby *moby) { } while (spark >= 0); segment = next_segment; } while (segment < 9); - moby->state = 3; + moby->state = BEAM_BARRIER_REMOVE; return; } case BEAM_BARRIER_REMOVE: @@ -381,7 +385,7 @@ void draw_beam_barrier_segments(char *moby) { int j; euler_rotation_matrix(base_matrix, moby + 0x40); - set_scale_matrix(yaw_matrix, D_L06_00161E0C); + set_scale_matrix(yaw_matrix, l06_beam_barrier_transform_scale); multiply_matrix(base_matrix, base_matrix, yaw_matrix); vu1_add_g_sregister(6, get_effect_texture(14)); vu1_add_g_sregister(0x14, 0xFF9000000260L); @@ -393,8 +397,8 @@ void draw_beam_barrier_segments(char *moby) { font_queue_vu_state(); first_matrix = segment_matrix[0]; segment_params = beam_segment_draw_params; - rotation = D_L06_001DB060; - offset_src = D_L06_001DAFD0; + rotation = l06_beam_barrier_segment_euler_rotations; + offset_src = l06_beam_barrier_segment_local_offsets; translation = segment_matrix[0] + 12; matrix = first_matrix; for (i = 8; i >= 0; i--) { @@ -462,8 +466,8 @@ void animate_beam_barrier_strands(struct Moby *moby) { if (phase > 1.0f) { D_L06_00161DFC = phase - 1.0f; } - step = D_L06_00161E08 / 30.0f; - y = -(D_L06_00161E08 * 0.5f); + step = l06_beam_barrier_strand_length / 30.0f; + y = -(l06_beam_barrier_strand_length * 0.5f); for (i = 0; i < 4; i++) { if (D_L06_00161E40[i] == 0) { for (k = 0; k < 30; k++) { diff --git a/src/overlays/l06/mobys/breakable_window.c b/src/overlays/l06/mobys/breakable_window.c index 1aa7b08238..15a8192d0e 100644 --- a/src/overlays/l06/mobys/breakable_window.c +++ b/src/overlays/l06/mobys/breakable_window.c @@ -578,7 +578,7 @@ void breakable_window_update(char *moby) { switch ((unsigned char)MOBY(moby)->state) { case INITIALIZE_DRAW_SELECTION: camera_sequence_and_draw_vars[1] = 1; - MOBY(moby)->state = 1; + MOBY(moby)->state = WAIT_FOR_LINKED_MOBY_TRIGGER; break; case WAIT_FOR_LINKED_MOBY_TRIGGER: if ((camera_sequence_and_draw_vars[2] < 0 || @@ -588,11 +588,11 @@ void breakable_window_update(char *moby) { break; } if (vector_distance_xy(moby + 0x10, D_0013F3D0) < 32.0f) { - MOBY(moby)->state = 2; + MOBY(moby)->state = WAIT_CAMERA_START_DELAY; camera_sequence_and_draw_vars[9] = scale_game_frames(30); } else { spawn_moby_breakup_effect(moby); - MOBY(moby)->state = 4; + MOBY(moby)->state = WAIT_FOR_NEARBY_HERO; } break; case WAIT_CAMERA_START_DELAY: @@ -600,7 +600,7 @@ void breakable_window_update(char *moby) { { int state; int base; - MOBY(moby)->state = 3; + MOBY(moby)->state = BLEND_CAMERA_TO_HERO; scripted_camera_sequence_active = 1; D_L06_0015F408 = 0x12; state = camera_sequence_and_draw_vars[5]; diff --git a/src/overlays/l06/mobys/breakaway_piece.c b/src/overlays/l06/mobys/breakaway_piece.c index 9be0ca6550..b8f8932434 100644 --- a/src/overlays/l06/mobys/breakaway_piece.c +++ b/src/overlays/l06/mobys/breakaway_piece.c @@ -37,7 +37,7 @@ void breakaway_piece_update(char *moby) { MOBY(moby)->draw_dist = 0x200; ((unsigned char *)moby)[0x30] = 0xFF; bobbing_and_motion_vars->unkC = MOBY(moby)->pos.z; - MOBY(moby)->state = 1; + MOBY(moby)->state = UPDATE_BOBBING_HEIGHT; break; case UPDATE_BOBBING_HEIGHT: if (*(int *)(D_0013E533 + 0x2EA1) == 0x72) { diff --git a/src/overlays/l06/mobys/countdown_sequence.c b/src/overlays/l06/mobys/countdown_sequence.c index e5e820442e..6478db2d42 100644 --- a/src/overlays/l06/mobys/countdown_sequence.c +++ b/src/overlays/l06/mobys/countdown_sequence.c @@ -199,6 +199,9 @@ void countdown_sequence_update(unsigned char *moby) { UPDATE_POST_PATH_TIMED_EVENTS = 4, RAMP_SHARED_VALUE_AFTER_DELAY = 5 }; + enum { + DIALOGUE_PHASE_READY_TO_CONTINUE = 3 + }; CountdownSequenceVars *moby_vars = (CountdownSequenceVars *)MOBY(moby)->pvars; float va[4] __attribute__((aligned(16))); float vc[4] __attribute__((aligned(16))); @@ -234,7 +237,7 @@ void countdown_sequence_update(unsigned char *moby) { moby[0x20] = 3; moby_vars->unkB0 = 1; request_music_track(6, 9); - if (*(short *)dialogue_playback_phase == 3) + if (*(short *)dialogue_playback_phase == DIALOGUE_PHASE_READY_TO_CONTINUE) continue_audio_stream_if_ready(); set_moby_list_state_17(moby_vars->unk10); set_moby_list_state_15(moby_vars->unk14); @@ -305,7 +308,7 @@ void countdown_sequence_update(unsigned char *moby) { char *q; x = scale_game_frames(0x708); if (moby_vars->timer_B4 == x) { - if (*(short *)dialogue_playback_phase == 3) + if (*(short *)dialogue_playback_phase == DIALOGUE_PHASE_READY_TO_CONTINUE) continue_audio_stream_if_ready(); } else { x = scale_game_frames(900); @@ -313,7 +316,8 @@ void countdown_sequence_update(unsigned char *moby) { select_localized_moby_voice_line((struct Moby *)moby, 2); else { x = scale_game_frames(300); - if (moby_vars->timer_B4 == x && *(short *)dialogue_playback_phase == 3) + if (moby_vars->timer_B4 == x && + *(short *)dialogue_playback_phase == DIALOGUE_PHASE_READY_TO_CONTINUE) continue_audio_stream_if_ready(); } } @@ -422,9 +426,12 @@ void begin_red_button_rotation(char *moby) { } s32 get_red_button_sequence_status(const u8 *moby) { + enum { + RED_BUTTON_STATE_SEQUENCE_COMPLETE = 7 + }; u32 state = moby[0x20]; - if (state == 7) { + if (state == RED_BUTTON_STATE_SEQUENCE_COMPLETE) { return 2; } if (state > 3) { diff --git a/src/overlays/l06/mobys/cutscene_camera_target.c b/src/overlays/l06/mobys/cutscene_camera_target.c index 7c01203c8b..50b6a6deae 100644 --- a/src/overlays/l06/mobys/cutscene_camera_target.c +++ b/src/overlays/l06/mobys/cutscene_camera_target.c @@ -23,7 +23,7 @@ void cutscene_camera_target_update(struct Moby *moby) { switch (moby->state) { case MOBY_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = MOBY_CONDITIONAL_CAMERA_TARGET_UPDATE; break; case MOBY_CONDITIONAL_CAMERA_TARGET_UPDATE: if (D_L06_0015F5C4 == 2) { diff --git a/src/overlays/l06/mobys/drawbridge.c b/src/overlays/l06/mobys/drawbridge.c index a3fdec6add..423daa0021 100644 --- a/src/overlays/l06/mobys/drawbridge.c +++ b/src/overlays/l06/mobys/drawbridge.c @@ -127,6 +127,9 @@ void drawbridge_update(Moby *moby) { FADE_AFTER_DRAWBRIDGE_ANIMATION = 5, DRAWBRIDGE_COMPLETE = 6 }; + enum { + DRAWBRIDGE_MISSION_ALREADY_COMPLETE = 0xFF + }; Vec_2F69D0 position, rotation, from_pos, from_rot, to_pos, to_rot; Data *drawbridge_control_vars = (struct Data *)moby->pvars; float previous_fade, blend; @@ -135,13 +138,13 @@ void drawbridge_update(Moby *moby) { switch (moby->state) { case INITIALIZE_DRAWBRIDGE_SEGMENTS: { int status = visited52[moby->mission + (current_level_index << 4)]; - if (status == 0xFF) { - moby->state = 6; + if (status == DRAWBRIDGE_MISSION_ALREADY_COMPLETE) { + moby->state = DRAWBRIDGE_COMPLETE; drawbridge_extension_gp = 20.0f; drawbridge_pitch_degrees_gp = 1000.0f; drawbridge_yaw_degrees_gp = 1000.0f; } else { - moby->state = 1; + moby->state = WAIT_FOR_DRAWBRIDGE_ACTIVATION; } for (i = 0; i < 20; i++) { drawbridge_control_vars->a[i] = create_moby(0x405); @@ -181,7 +184,7 @@ void drawbridge_update(Moby *moby) { case WAIT_FOR_DRAWBRIDGE_ACTIVATION: if (D_001413F4_r[0] == 1 && D_0013D4D6[0] != 0 && D_L06_0015F5C4 == 0) { D_L06_0015F3FC = 1.0f; - moby->state = 3; + moby->state = FADE_BEFORE_DRAWBRIDGE_ANIMATION; drawbridge_control_vars->fade = -0.01f; } break; @@ -199,7 +202,7 @@ void drawbridge_update(Moby *moby) { 0, 0); } else if (1.0f <= drawbridge_control_vars->fade) { - moby->state = 4; + moby->state = ANIMATE_DRAWBRIDGE_AND_CAMERA; moby->command = allocate_voice_for_target_entry(0, 4, drawbridge_control_vars->c[9]); } break; @@ -232,7 +235,7 @@ void drawbridge_update(Moby *moby) { drawbridge_yaw_max_speed_gp * frame_time); } if (1000.0f <= drawbridge_yaw_degrees_gp) { - moby->state = 5; + moby->state = FADE_AFTER_DRAWBRIDGE_ANIMATION; drawbridge_control_vars->fade = -1.0f; } slot = moby->command; @@ -280,7 +283,7 @@ void drawbridge_update(Moby *moby) { enter_hero_idle_state_for_current_vehicle_mode(); jet_end_mount(3); } else if (1.0f <= drawbridge_control_vars->fade) { - moby->state = 6; + moby->state = DRAWBRIDGE_COMPLETE; help_request(0x1776, 0x2D); queue_dialogue_message(0x177C, -1); memcard_save_data(0, -1); diff --git a/src/overlays/l06/mobys/elevator.c b/src/overlays/l06/mobys/elevator.c index 013326ff29..573a218b9c 100644 --- a/src/overlays/l06/mobys/elevator.c +++ b/src/overlays/l06/mobys/elevator.c @@ -206,9 +206,9 @@ void elevator_update(Moby_2FDA70 *moby) { moby_data->f94 = 0; moby_data->f88 = -1; if (D_0013D4AF_2FDA70[0] == 0) { - moby->state = 1; + moby->state = WAIT_FOR_INITIAL_HERO_ACTIVATION; } else { - moby->state = 3; + moby->state = WAIT_FOR_HERO_TRIGGER_AT_NODE_OFFSET_HEIGHT; } moby->pos.z = l06_cuboids_macro[moby_data->f78].pos.z + l06_cuboids_macro[moby_data->f78].axes[2].z; @@ -227,16 +227,16 @@ void elevator_update(Moby_2FDA70 *moby) { if (((Flags *)(alternate_item_available))->f20 == 0) { ((Flags *)(alternate_item_available))->f20 = 1; } - moby->state = 3; + moby->state = WAIT_FOR_HERO_TRIGGER_AT_NODE_OFFSET_HEIGHT; moby_data->f90 = 0; } else if (((Hero_2FDA70 *)(D_0013F350))->moby->fA6 == 0x57) { - moby->state = 3; + moby->state = WAIT_FOR_HERO_TRIGGER_AT_NODE_OFFSET_HEIGHT; moby_data->f84 = 1; } break; case WAIT_FOR_SCENE_GAME_MODE_CLEAR: if (D_L06_0015F5C4_macro == 0) { - moby->state = 3; + moby->state = WAIT_FOR_HERO_TRIGGER_AT_NODE_OFFSET_HEIGHT; } break; case WAIT_FOR_HERO_TRIGGER_AT_NODE_OFFSET_HEIGHT: @@ -278,7 +278,7 @@ void elevator_update(Moby_2FDA70 *moby) { if (D_0013D5DD_2FDA70[0x10] != 0 && D_L06_00161F78 == 0) { D_L06_00161F78 = 1; start_scene(3); - moby->state = 2; + moby->state = WAIT_FOR_SCENE_GAME_MODE_CLEAR; break; } } else if (D_0013D5CA_2FDA70[0] == 0) { @@ -336,26 +336,28 @@ void elevator_update(Moby_2FDA70 *moby) { moby->pos.z + 0.29f < ((Hero_2FDA70 *)(D_0013F350))->pos.z && vector_distance_xy(&((Hero_2FDA70 *)(D_0013F350))->pos, &moby->pos) < 1.0f) { allocate_voice_for_target_entry(0, 0, (int)moby); - if (moby->state == 3) { - moby->state = 5; + if (moby->state == WAIT_FOR_HERO_TRIGGER_AT_NODE_OFFSET_HEIGHT) { + moby->state = MOVE_TO_NODE_BASE_HEIGHT; set_moby_and_links_to_states_8_and_9(D_L06_0015FFD8_macro + (moby_data->f64 << 8)); moby_data->f90 = scale_game_frames(0x78); } else { - moby->state = 6; + moby->state = MOVE_TO_NODE_OFFSET_HEIGHT; set_moby_and_links_to_states_8_and_9(D_L06_0015FFD8_macro + (moby_data->f68 << 8)); moby_data->f90 = scale_game_frames(0x78); } } else if (vector_distance_xy(&moby->pos, &((Hero_2FDA70 *)(D_0013F350))->pos) < 24.0f && - moby->state == 3 && ((Hero_2FDA70 *)(D_0013F350))->pos.z + 5.0f < moby->pos.z) { + moby->state == WAIT_FOR_HERO_TRIGGER_AT_NODE_OFFSET_HEIGHT && + ((Hero_2FDA70 *)(D_0013F350))->pos.z + 5.0f < moby->pos.z) { moby_data->f84 = 1; moby_data->f94 = 1; - moby->state = 5; + moby->state = MOVE_TO_NODE_BASE_HEIGHT; set_moby_and_links_to_states_8_and_9(D_L06_0015FFD8_macro + (moby_data->f64 << 8)); set_moby_and_links_to_states_8_and_9(D_L06_0015FFD8_macro + (moby_data->f60 << 8)); moby_data->f90 = scale_game_frames(0x78); } else if (vector_distance_xy(&moby->pos, &((Hero_2FDA70 *)(D_0013F350))->pos) < 24.0f && - moby->state == 4 && moby->pos.z < ((Hero_2FDA70 *)(D_0013F350))->pos.z - 5.0f) { - moby->state = 6; + moby->state == WAIT_FOR_HERO_TRIGGER_AT_NODE_BASE_HEIGHT && + moby->pos.z < ((Hero_2FDA70 *)(D_0013F350))->pos.z - 5.0f) { + moby->state = MOVE_TO_NODE_OFFSET_HEIGHT; set_moby_and_links_to_states_8_and_9(D_L06_0015FFD8_macro + (moby_data->f68 << 8)); moby_data->f90 = scale_game_frames(0x78); } @@ -365,7 +367,7 @@ void elevator_update(Moby_2FDA70 *moby) { float target; float height_acceleration_step; target = l06_cuboids_macro[moby_data->f78].pos.z; - if (moby->state == 6) { + if (moby->state == MOVE_TO_NODE_OFFSET_HEIGHT) { target += l06_cuboids_macro[moby_data->f78].axes[2].z; } height_acceleration_step = height_cycle_acceleration_gp * frame_time_sq_macro; @@ -376,12 +378,12 @@ void elevator_update(Moby_2FDA70 *moby) { height_acceleration_step, height_cycle_max_speed_gp * D_0015ED6C); if (absolute_float(moby->pos.z - target) < 0.01f) { - if (moby->state == 6) { - moby->state = 7; + if (moby->state == MOVE_TO_NODE_OFFSET_HEIGHT) { + moby->state = WAIT_FOR_HERO_CLEARANCE_AT_NODE_OFFSET_HEIGHT; set_moby_and_links_to_states_4_and_5(D_L06_0015FFD8_macro + (moby_data->f64 << 8)); } else { set_moby_and_links_to_states_4_and_5(D_L06_0015FFD8_macro + (moby_data->f68 << 8)); - moby->state = 8; + moby->state = WAIT_FOR_HERO_CLEARANCE_AT_NODE_BASE_HEIGHT; } } break; @@ -389,10 +391,10 @@ void elevator_update(Moby_2FDA70 *moby) { case WAIT_FOR_HERO_CLEARANCE_AT_NODE_OFFSET_HEIGHT: case WAIT_FOR_HERO_CLEARANCE_AT_NODE_BASE_HEIGHT: if (vector_distance_xy(&((Hero_2FDA70 *)(D_0013F350))->pos, &moby->pos) >= 1.0f) { - if (moby->state == 7) { - moby->state = 3; + if (moby->state == WAIT_FOR_HERO_CLEARANCE_AT_NODE_OFFSET_HEIGHT) { + moby->state = WAIT_FOR_HERO_TRIGGER_AT_NODE_OFFSET_HEIGHT; } else { - moby->state = 4; + moby->state = WAIT_FOR_HERO_TRIGGER_AT_NODE_BASE_HEIGHT; } } break; @@ -402,7 +404,8 @@ void elevator_update(Moby_2FDA70 *moby) { } else { ((Hero_2FDA70 *)(D_0013F350))->f22CB = 0; } - if (moby->state >= 5 && moby->state <= 8) { + if (moby->state >= MOVE_TO_NODE_BASE_HEIGHT && + moby->state <= WAIT_FOR_HERO_CLEARANCE_AT_NODE_BASE_HEIGHT) { moby_data->f9C = 0.0f; moby->f90 = D_L06_00161F74; } else { diff --git a/src/overlays/l06/mobys/fred.c b/src/overlays/l06/mobys/fred.c index 48a037455f..8c1b10edca 100644 --- a/src/overlays/l06/mobys/fred.c +++ b/src/overlays/l06/mobys/fred.c @@ -145,7 +145,7 @@ void fred_update(struct Moby *moby) { fred_vars->f174 = scale_game_frames(0x2D); set_moby_and_links_to_states_8_and_9(D_L06_0015FFD8_301070 + (fred_vars->f160 << 8)); fred_vars->f20 = D_L06_00201880; - moby->state = 1; + moby->state = UPDATE_FRED_DIALOGUE; initialize_npc_dialogue(moby, fred_vars); break; case UPDATE_FRED_DIALOGUE: @@ -158,7 +158,7 @@ void fred_update(struct Moby *moby) { if (check_all_listed_frog_states_fe_fd_or_10(fred_vars->f170) != 0) { if (fast_dec_timer_s16(&fred_vars->f174) != 0 && update_npc_dialogue(moby, fred_vars) != 0) { - moby->state = 2; + moby->state = HANDLE_FRED_DIALOGUE_RESULT; if (fred_vars->f176 != 0) { Vec_301070 t; fast_vec_normalize(t, ((char *)&moby->rot_row0), 2.0f); @@ -182,7 +182,7 @@ void fred_update(struct Moby *moby) { jet_clear_persistent(moby->mission); set_moby_and_links_to_states_4_and_5(D_L06_0015FFD8_301070 + (fred_vars->f164 << 8)); - moby->state = 1; + moby->state = UPDATE_FRED_DIALOGUE; } if (fred_vars->f4 == 2) { grant_inventory_item(0x1D, 1); @@ -206,7 +206,7 @@ void fred_update(struct Moby *moby) { set_race_camera(&hero.motion.pos, &hero.motion.rot, 0x72, 1); set_moby_and_links_to_states_8_and_9(D_L06_0015FFD8_301070 + (fred_vars->f164 << 8)); - moby->state = 3; + moby->state = INTERPOLATE_FRED_CUTSCENE_CAMERA; moby->visible = 0; moby->flags |= 1; *(int *)&moby->collision = 0; @@ -275,7 +275,7 @@ void fred_update(struct Moby *moby) { if (D_L06_0015F3FC_macro == 1.0f) { set_race_camera(&hero.motion.pos, &hero.motion.rot, 0, 0); jet_end_mount(0); - moby->state = 4; + moby->state = RAMP_FRED_POST_CUTSCENE_SCALAR_TO_ZERO; } } break; @@ -283,7 +283,7 @@ void fred_update(struct Moby *moby) { case RAMP_FRED_POST_CUTSCENE_SCALAR_TO_ZERO: approach_value(&D_L06_0015F3FC_macro, 0.0f, frame_time_macro * 4.0f); if (D_L06_0015F3FC_macro == 0.0f) { - moby->state = 5; + moby->state = WAIT_FOR_FRED_REMOVAL_TRIGGER; } break; case WAIT_FOR_FRED_REMOVAL_TRIGGER: diff --git a/src/overlays/l06/mobys/hangar_door.c b/src/overlays/l06/mobys/hangar_door.c index f0a012d363..a305be13d5 100644 --- a/src/overlays/l06/mobys/hangar_door.c +++ b/src/overlays/l06/mobys/hangar_door.c @@ -11,9 +11,10 @@ /* Ported from rac1-decomp (src/overlays/l06_blarg/vendor_002B5990.c: func_L06_002B5990), where it is exact; names translated to the US level program. */ #include "rnc/overlay/shared/world/cuboid.h" -extern float FUN_L00_0025be00(float *, float *, float, float, float, float); -extern int D_L06_0015F5C4; -void hangar_door_update(char *m) __asm__("FUN_L06_002b4770"); +extern float + approach_angle(float *, float *, float, float, float, float) __asm__("FUN_L00_0025be00"); +extern int D_L06_0015F5C4; +void hangar_door_update(char *m) __asm__("FUN_L06_002b4770"); #include "sda.h" @@ -58,12 +59,12 @@ void hangar_door_update(char *door_moby) { door_data->unk10 = 0; } if (door_data->unk18 != door_data->unk14) { - FUN_L00_0025be00(&door_data->unk18, - &door_data->unk8, - door_data->unk14, - frame_time_sq * 1.5707964f, - frame_time_sq * 1.5707964f, - frame_time * 1.5707964f); + approach_angle(&door_data->unk18, + &door_data->unk8, + door_data->unk14, + frame_time_sq * 1.5707964f, + frame_time_sq * 1.5707964f, + frame_time * 1.5707964f); } switch (((unsigned char *)door_moby)[0x20]) { case HANGAR_DOOR_INITIALIZE: diff --git a/src/overlays/l06/mobys/red_button.c b/src/overlays/l06/mobys/red_button.c index 763ec68474..8dfa11ccdd 100644 --- a/src/overlays/l06/mobys/red_button.c +++ b/src/overlays/l06/mobys/red_button.c @@ -98,6 +98,9 @@ void red_button_update(struct Moby *moby) { RAISE_CAMERA_AND_TRIGGER_LISTED_EFFECTS = 5, HOLD_OFFSET_CAMERA_UNTIL_PROGRESS_COMPLETE = 6 }; + enum { + IDLE_AFTER_CAMERA_SEQUENCE = 7 + }; Data_304098 *red_button_vars = *(struct Data_304098 **)&moby->pvars; Vector_304098 camera_position; Vector_304098 camera_rotation; @@ -114,7 +117,7 @@ void red_button_update(struct Moby *moby) { case INITIALIZE_RED_BUTTON: moby->update_dist = 0xFF; moby->rot.x = fast_subtract_rotations(moby->rot.x, 0.78539819f); - moby->state = 1; + moby->state = IDLE_AFTER_INITIALIZATION; red_button_vars->f48 = -1; break; case IDLE_AFTER_INITIALIZATION: @@ -136,7 +139,7 @@ void red_button_update(struct Moby *moby) { update_moby_304098(&D_L06_0015FFD8_304098[red_button_vars->moby1]); update_moby_304098(&D_L06_0015FFD8_304098[red_button_vars->moby2]); if (1.0f <= red_button_vars->t) { - moby->state = 3; + moby->state = WAIT_FOR_NEARBY_HELP_TRIGGER; allocate_voice_for_target_entry(1, 0, moby); D_0013D3AA = 1; } @@ -148,7 +151,7 @@ void red_button_update(struct Moby *moby) { if ((*(int *)(D_0013A5E0 + 0x2504) & 0x10) && help_message_available) { allocate_voice_for_target_entry(2, 0, moby); remove_help_message_for_selector(4); - moby->state = 4; + moby->state = WAIT_CAMERA_START_DELAY; red_button_vars->timer = scale_game_frames(0x1E); } } @@ -157,7 +160,7 @@ void red_button_update(struct Moby *moby) { if (fast_dec_timer(&red_button_vars->timer)) { qcopy_nc(&camera_position, &l06_cuboids[red_button_vars->cut].pos); qcopy(&camera_rotation, &l06_cuboids[red_button_vars->cut].rot); - moby->state = 5; + moby->state = RAISE_CAMERA_AND_TRIGGER_LISTED_EFFECTS; red_button_vars->t = 0.0f; red_button_vars->vel = 0.0f; fade_to_black(scale_game_frames(0xF)); @@ -216,7 +219,7 @@ void red_button_update(struct Moby *moby) { 0x72, 0); fade_to_black(scale_game_frames(10)); - moby->state = 6; + moby->state = HOLD_OFFSET_CAMERA_UNTIL_PROGRESS_COMPLETE; jet_end_mount(3); qcopy(&next_position, &l06_cuboids[red_button_vars->cut2].pos); next_position.z = next_position.z + 1.0f; @@ -246,7 +249,7 @@ void red_button_update(struct Moby *moby) { set_camera_position(&camera_rotation); set_camera_rotation(&camera_position); if (2.0f <= red_button_vars->t) { - moby->state = 7; + moby->state = IDLE_AFTER_CAMERA_SEQUENCE; red_button_vars->timer2 = scale_game_frames(0xE10); set_race_camera(&l06_cuboids[red_button_vars->cut2].pos, &l06_cuboids[red_button_vars->cut2].rot, diff --git a/src/overlays/l06/mobys/shuttle.c b/src/overlays/l06/mobys/shuttle.c index a7dc21d43a..e52a68745f 100644 --- a/src/overlays/l06/mobys/shuttle.c +++ b/src/overlays/l06/mobys/shuttle.c @@ -136,8 +136,8 @@ int shuttle_forced_return_requested_gp __asm__("D_L06_00162100") = 0; #include "rnc/overlay/l06/mobys/shuttle_data/shuttle_update.h" -extern int D_L06_0016210C __attribute__((sda)); -extern int D_L06_00162110 __attribute__((sda)); +extern int l06_shuttle_projected_sprite_start_color __asm__("D_L06_0016210C") __attribute__((sda)); +extern int l06_shuttle_projected_sprite_end_color __asm__("D_L06_00162110") __attribute__((sda)); extern unsigned char D_0013D4D5[] NOT_SDA; /* Update of moby class 1109 (shuttle): waits at one of three camera points, takes the hero's choice of destination, flies there through a cutscene and hands over to the level's travel sequence. */ @@ -192,26 +192,42 @@ Colors D_L06_00201948 = { {0x4f008fff, 0x4f008fff, 0x4f007fff, 0x4f006fff, 0x2fffffff, 0x2fffffff} }; -extern float D_L06_00162114 __attribute__((sda)); -extern float D_L06_00162118 __attribute__((sda)); -extern float D_L06_0016211C __attribute__((sda)); -extern float D_L06_00162120 __attribute__((sda)); -extern float D_L06_00162124 __attribute__((sda)); -extern float D_L06_00162128 __attribute__((sda)); -extern float D_L06_0016212C __attribute__((sda)); -extern float D_L06_00162130 __attribute__((sda)); -extern int D_L06_00162134 __attribute__((sda)); -extern int D_L06_00162138 __attribute__((sda)); -extern int D_L06_0016213C __attribute__((sda)); -extern int D_L06_00162140 __attribute__((sda)); -extern int D_L06_00162144 __attribute__((sda)); -extern int D_L06_00162148 __attribute__((sda)); -extern int D_L06_0016214C __attribute__((sda)); -extern int D_L06_00162150 __attribute__((sda)); -extern int D_L06_00162154 __attribute__((sda)); -extern int D_L06_00162158 __attribute__((sda)); -extern void random_vector(void *, float, float) __asm__("FUN_L00_00257d78"); -extern int fast_tween_color(int, int, float) __asm__("FUN_001fa6e0"); +extern float l06_shuttle_explosion_spark_velocity_scale_random_bound_a __asm__("D_L06_00162114") + __attribute__((sda)); +extern float l06_shuttle_explosion_spark_velocity_scale_random_bound_b __asm__("D_L06_00162118") + __attribute__((sda)); +extern float l06_shuttle_explosion_spark_velocity_w_random_bound_a __asm__("D_L06_0016211C") + __attribute__((sda)); +extern float l06_shuttle_explosion_spark_velocity_w_random_bound_b __asm__("D_L06_00162120") + __attribute__((sda)); +extern float l06_shuttle_explosion_spark_acceleration_scale_random_bound_a __asm__("D_L06_00162124") + __attribute__((sda)); +extern float l06_shuttle_explosion_spark_acceleration_scale_random_bound_b __asm__("D_L06_00162128") + __attribute__((sda)); +extern float l06_shuttle_explosion_spark_acceleration_w_random_bound_a __asm__("D_L06_0016212C") + __attribute__((sda)); +extern float l06_shuttle_explosion_spark_acceleration_w_random_bound_b __asm__("D_L06_00162130") + __attribute__((sda)); +extern int l06_shuttle_explosion_spark_first_color_blend_a __asm__("D_L06_00162134") + __attribute__((sda)); +extern int l06_shuttle_explosion_spark_first_color_blend_b __asm__("D_L06_00162138") + __attribute__((sda)); +extern int l06_shuttle_explosion_spark_second_color_blend_a __asm__("D_L06_0016213C") + __attribute__((sda)); +extern int l06_shuttle_explosion_spark_second_color_blend_b __asm__("D_L06_00162140") + __attribute__((sda)); +extern int l06_shuttle_explosion_spark_timing_random_min_frames __asm__("D_L06_00162144") + __attribute__((sda)); +extern int l06_shuttle_explosion_spark_timing_base_a_frames __asm__("D_L06_00162148") + __attribute__((sda)); +extern int l06_shuttle_explosion_spark_timing_base_b_frames __asm__("D_L06_0016214C") + __attribute__((sda)); +extern int D_L06_00162150 __attribute__((sda)); +extern int l06_shuttle_explosion_spark_table_index __asm__("D_L06_00162154") __attribute__((sda)); +extern int l06_shuttle_explosion_spark_alternate_mode_flag __asm__("D_L06_00162158") + __attribute__((sda)); +extern void random_vector(void *, float, float) __asm__("FUN_L00_00257d78"); +extern int fast_tween_color(int, int, float) __asm__("FUN_001fa6e0"); extern u8 * spawn_spark(void *, void *, void *, int, int, int, int, int, int) __asm__("FUN_00218888"); extern void cart_burst(void *, void *, int, float, float) __asm__("FUN_L00_0025f090"); @@ -273,8 +289,8 @@ void shuttle_update(struct Moby *moby) { *(u128_302578 *)b = *(u128_302578 *)((char *)&hero.motion.pos + 0x50); spawn_timed_projected_sprite_effect((char *)b, scale_game_frames(class_076a_moby_rate_input_frames_gp), - D_L06_0016210C, - D_L06_00162110); + l06_shuttle_projected_sprite_start_color, + l06_shuttle_projected_sprite_end_color); } switch (moby->state) { case INITIALIZE_SHUTTLE: @@ -288,7 +304,7 @@ void shuttle_update(struct Moby *moby) { moby->update_dist = 0xFF; moby->draw_dist = 0x80; moby->spawn_frame = hero.moby->spawn_frame; - moby->state = 1; + moby->state = WAIT_FOR_SHUTTLE_ROUTE_REQUEST; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, 0); } @@ -385,7 +401,7 @@ void shuttle_update(struct Moby *moby) { } if (shuttle_vars->go != 0) { shuttle_vars->go = 0; - moby->state = 3; + moby->state = UPDATE_SHUTTLE_PATH_RIDE; remove_help_message_for_selector(10); if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 0); @@ -411,7 +427,7 @@ void shuttle_update(struct Moby *moby) { if (update_shuttle_path_ride((char *)moby, shuttle_vars->side) != 0) { int ofs; int base; - moby->state = 4; + moby->state = RESTORE_SHUTTLE_IDLE_ANIMATION; shuttle_vars->fF4 = 0; ofs = shuttle_vars->cam[shuttle_vars->sel] << 7; base = (int)l06_cuboids; @@ -439,7 +455,7 @@ void shuttle_update(struct Moby *moby) { initialize_moby_particle_effect_state(D_L06_0015FFD8_302578 + (shuttle_vars->f10C << 8)); shuttle_vars->f114 = 0; - moby->state = 6; + moby->state = WAIT_FOR_HERO_NEAR_LINKED_MOBY; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(30)); } @@ -459,7 +475,7 @@ void shuttle_update(struct Moby *moby) { start_scene(12); mark_moby_for_removal(linked_moby); unlock_planet(5); - moby->state = 8; + moby->state = WAIT_TO_ENTER_SHUTTLE_SAVE_FLOW; jet_clear_persistent(shuttle_vars->fF8); jet_reset_camera(b, rot); } @@ -472,11 +488,11 @@ void shuttle_update(struct Moby *moby) { shuttle_vars->sel = 0; shuttle_vars->go = 1; shuttle_vars->f114 = 1; - moby->state = 1; + moby->state = WAIT_FOR_SHUTTLE_ROUTE_REQUEST; } break; case RESTORE_SHUTTLE_IDLE_ANIMATION: - moby->state = 1; + moby->state = WAIT_FOR_SHUTTLE_ROUTE_REQUEST; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(30)); } @@ -485,10 +501,10 @@ void shuttle_update(struct Moby *moby) { if (D_L06_0015F5C4 != 2) { if (D_0013D4D5[9] != 0) { start_scene(5); - moby->state = 9; + moby->state = WAIT_TO_SAVE_AND_RESUME_SHUTTLE_REQUESTS; } else { queue_planet_unlock_message(5); - moby->state = 1; + moby->state = WAIT_FOR_SHUTTLE_ROUTE_REQUEST; enter_hero_idle_state_for_current_vehicle_mode(); memcard_save_data(0, -1); } @@ -498,13 +514,13 @@ void shuttle_update(struct Moby *moby) { if (D_L06_0015F5C4 != 2) { queue_planet_unlock_message(5); memcard_save_data(0, -1); - moby->state = 1; + moby->state = WAIT_FOR_SHUTTLE_ROUTE_REQUEST; } break; case WAIT_TO_ENTER_SHUTTLE_SAVE_FLOW: if (D_L06_0015F5C4 != 2) { queue_scene_movie_with_game_language(5); - moby->state = 7; + moby->state = WAIT_TO_SELECT_SHUTTLE_SAVE_FLOW; } break; } @@ -671,12 +687,17 @@ int update_shuttle_path_ride(char *moby, int path) { return ride->progress == 1.0f; } -void FUN_L06_00303748(float scale, char *moby, char *pos, char *push, int count) { +void spawn_shuttle_explosion_effect( + float scale, char *moby, char *pos, char *push, int count) __asm__("FUN_L06_00303748"); + +void spawn_shuttle_explosion_effect( + + float scale, char *moby, char *explosion_origin, char *push, int count) { float position[4], direction[4], velocity[4], acceleration[4]; Colors first_colors, second_colors; int i; float strength; - cart_burst(moby, pos, -1, 2.0f, 13.0f); + cart_burst(moby, explosion_origin, -1, 2.0f, 13.0f); first_colors = D_L06_00201948; second_colors = D_L06_00201960; { @@ -699,7 +720,7 @@ void FUN_L06_00303748(float scale, char *moby, char *pos, char *push, int count) high = scale_game_frames(30); second_time = random_int_between(low, high); } - spawn_particle(pos, + spawn_particle(explosion_origin, push, *first_color, *second_color, @@ -715,26 +736,45 @@ void FUN_L06_00303748(float scale, char *moby, char *pos, char *push, int count) int color1, color2, life, size, fade; i++; random_vector(position, 0.0f, 1.0f); - fast_vec_add(position, position, pos); + fast_vec_add(position, position, explosion_origin); random_vector(direction, 0.0f, 0.9f); fast_vec_add(direction, direction, push); fast_vec_scale( - velocity, direction, random_float_between(D_L06_00162114, D_L06_00162118) * frame_time); + velocity, + direction, + random_float_between(l06_shuttle_explosion_spark_velocity_scale_random_bound_a, + l06_shuttle_explosion_spark_velocity_scale_random_bound_b) * + frame_time); random_vector(direction, 0.0f, 0.9f); fast_vec_add(direction, direction, push); - fast_vec_scale(acceleration, - direction, - random_float_between(D_L06_00162124, D_L06_00162128) * frame_time); - velocity[3] = random_float_between(D_L06_0016211C, D_L06_00162120) * scale; - acceleration[3] = random_float_between(D_L06_0016212C, D_L06_00162130) * scale; - color1 = fast_tween_color(D_L06_00162134, D_L06_00162138, random_float_between(0.0f, 1.0f)); - color2 = fast_tween_color(D_L06_0016213C, D_L06_00162140, random_float_between(0.0f, 1.0f)); - life = truncate_float_to_s32( - scale_time(random_float_between((float)D_L06_00162144, (float)(D_L06_00162144 << 1)))); - size = truncate_float_to_s32( - scale_time(random_float_between((float)D_L06_00162148, (float)D_L06_00162148 * 1.2f))); - fade = truncate_float_to_s32( - scale_time(random_float_between((float)D_L06_0016214C * 0.8f, (float)D_L06_0016214C))); + fast_vec_scale( + acceleration, + direction, + random_float_between(l06_shuttle_explosion_spark_acceleration_scale_random_bound_a, + l06_shuttle_explosion_spark_acceleration_scale_random_bound_b) * + frame_time); + velocity[3] = random_float_between(l06_shuttle_explosion_spark_velocity_w_random_bound_a, + l06_shuttle_explosion_spark_velocity_w_random_bound_b) * + scale; + acceleration[3] = + random_float_between(l06_shuttle_explosion_spark_acceleration_w_random_bound_a, + l06_shuttle_explosion_spark_acceleration_w_random_bound_b) * + scale; + color1 = fast_tween_color(l06_shuttle_explosion_spark_first_color_blend_a, + l06_shuttle_explosion_spark_first_color_blend_b, + random_float_between(0.0f, 1.0f)); + color2 = fast_tween_color(l06_shuttle_explosion_spark_second_color_blend_a, + l06_shuttle_explosion_spark_second_color_blend_b, + random_float_between(0.0f, 1.0f)); + life = truncate_float_to_s32(scale_time(random_float_between( + (float)l06_shuttle_explosion_spark_timing_random_min_frames, + (float)(l06_shuttle_explosion_spark_timing_random_min_frames << 1)))); + size = truncate_float_to_s32(scale_time( + random_float_between((float)l06_shuttle_explosion_spark_timing_base_a_frames, + (float)l06_shuttle_explosion_spark_timing_base_a_frames * 1.2f))); + fade = truncate_float_to_s32(scale_time( + random_float_between((float)l06_shuttle_explosion_spark_timing_base_b_frames * 0.8f, + (float)l06_shuttle_explosion_spark_timing_base_b_frames))); spawn_spark(position, velocity, acceleration, @@ -743,7 +783,8 @@ void FUN_L06_00303748(float scale, char *moby, char *pos, char *push, int count) life, size, fade, - D_L06_00162154 + (D_L06_00162158 << 16)); + l06_shuttle_explosion_spark_table_index + + (l06_shuttle_explosion_spark_alternate_mode_flag << 16)); } } @@ -770,8 +811,8 @@ void break_apart_shuttle_linked_mobys(struct Moby *moby) { center[2] = 173.07f; spawn_timed_projected_sprite_effect(center, scale_game_frames(class_076a_moby_rate_input_frames_gp), - D_L06_0016210C, - D_L06_00162110); + l06_shuttle_projected_sprite_start_color, + l06_shuttle_projected_sprite_end_color); largest = 0.0f; clear_u64_value(middle); list = D_L06_001ABFC0_03b68[*(int *)(shuttle_linkage_vars + 0xCC)]; @@ -779,7 +820,7 @@ void break_apart_shuttle_linked_mobys(struct Moby *moby) { do { id = *list & 0x7FFF; random_vector(push, 1.0f, 2.0f); - FUN_L06_00303748( + spawn_shuttle_explosion_effect( 30.0f, moby, &((struct Moby *)(D_L06_0015FFD8_03b68 + (id << 8)))->pos, push, 1); fast_vec_add(middle, middle, &((struct Moby *)(D_L06_0015FFD8_03b68 + (id << 8)))->pos); count++; diff --git a/src/overlays/l06/mobys/spark_emitter.c b/src/overlays/l06/mobys/spark_emitter.c index a878dc4d84..d70ae28234 100644 --- a/src/overlays/l06/mobys/spark_emitter.c +++ b/src/overlays/l06/mobys/spark_emitter.c @@ -68,6 +68,9 @@ void spark_emitter_update(struct Moby *emitter) { SPARK_EMITTER_RANDOMIZED_SPRAY = 3, SPARK_EMITTER_TIMED_BURSTS = 4 }; + enum { + SPARK_EMITTER_AWAITING_ACTIVATION = 1 + }; SparkData *emitter_data = *(void **)&emitter->pvars; SparkVector position_test_vector; SparkVector rotation_based_spark_vector; @@ -83,20 +86,20 @@ void spark_emitter_update(struct Moby *emitter) { case SPARK_EMITTER_INITIALIZE: euler_rotation_basis(&*(SparkVector *)&emitter->rot_row0, &*(SparkVector *)&emitter->rot); if (emitter_data->f4 != 0) { - emitter->state = 1; + emitter->state = SPARK_EMITTER_AWAITING_ACTIVATION; } else if (emitter_data->f0 != 0) { - emitter->state = 4; + emitter->state = SPARK_EMITTER_TIMED_BURSTS; } else { - emitter->state = 3; + emitter->state = SPARK_EMITTER_RANDOMIZED_SPRAY; } break; case SPARK_EMITTER_DELAYED_ACTION: if (fast_dec_timer(&emitter_data->f28)) { cart_burst(emitter, &*(SparkVector *)&emitter->pos, -1, 0.333f, 13.0f); if (emitter_data->f0 != 0) { - emitter->state = 4; + emitter->state = SPARK_EMITTER_TIMED_BURSTS; } else { - emitter->state = 3; + emitter->state = SPARK_EMITTER_RANDOMIZED_SPRAY; } } break; @@ -247,7 +250,7 @@ void spark_emitter_update(struct Moby *emitter) { /* finds the mobys of type 0x5E8 in state 1 in a level list and starts those within range */ /* Ported from rac1-decomp (src/overlays/l06_blarg/vendor_002FE5D0.c: func_L06_0030A680), where it is exact; names translated to the US level program. */ -extern char *D_L06_0015FFD8; +extern char *level_mobys_q __asm__("D_L06_0015FFD8"); extern short *D_L06_001ABFC0[]; void activate_listed_spark_emitters(int moby_list_index) __asm__("FUN_L06_00309240"); @@ -260,7 +263,7 @@ void activate_listed_spark_emitters(int moby_list_index) { if (D_L06_001ABFC0[moby_list_index] != 0) { moby_index_entry = D_L06_001ABFC0[moby_list_index]; do { - moby = D_L06_0015FFD8 + ((*(unsigned short *)moby_index_entry & 0x7FFF) << 8); + moby = level_mobys_q + ((*(unsigned short *)moby_index_entry & 0x7FFF) << 8); if (MOBY(moby)->oclass == 0x5E8 && (unsigned char)moby[0x20] == 1) { qcopy(position_test_vector, moby + 0x10); position_test_vector[3] = 0.25f; diff --git a/src/overlays/l06/mobys/split_door.c b/src/overlays/l06/mobys/split_door.c index 20348477df..86416cf8a4 100644 --- a/src/overlays/l06/mobys/split_door.c +++ b/src/overlays/l06/mobys/split_door.c @@ -89,6 +89,10 @@ void split_door_update(char *moby) { ANIMATE_PAIR_WITH_TIMED_PHASES = 4, WAIT_FOR_RESET = 5 }; + enum { + SPLIT_DOOR_PHASE_TARGET_CURRENT_TRANSFORMS = 1, + SPLIT_DOOR_PHASE_TARGET_CONFIGURED_TRANSFORMS = 2 + }; SplitDoorVars *pair_transform_vars = (SplitDoorVars *)MOBY(moby)->pvars; char *child; float position_offset[4]; @@ -115,7 +119,7 @@ void split_door_update(char *moby) { qcopy(child, moby + 0x10); qcopy(child + 0x30, moby + 0x40); if (*(int *)pair_transform_vars >= 0) { - MOBY(moby)->state = 1; + MOBY(moby)->state = WAIT_FOR_HERO_IN_CLIP_VOLUME; return; } if (pair_transform_vars->unk4 == 2) { @@ -130,18 +134,18 @@ void split_door_update(char *moby) { fast_vec_add( pair_transform_vars->unk40 + 0x10, &pair_transform_vars->unk10, position_offset); update_entity(pair_transform_vars->unk40); - MOBY(moby)->state = 5; + MOBY(moby)->state = WAIT_FOR_RESET; return; case WAIT_FOR_HERO_IN_CLIP_VOLUME: if (!is_point_inside_clip_volume(&hero.motion.pos, *(int *)pair_transform_vars)) return; if (pair_transform_vars->unk4 == 1) { - MOBY(moby)->state = 4; + MOBY(moby)->state = ANIMATE_PAIR_WITH_TIMED_PHASES; pair_transform_vars->timer_4C = scale_game_frames(0x14); } else if ((unsigned char)MOBY(moby)->group != 0xff) { set_moby_list_state((unsigned char)MOBY(moby)->group, 3); } else { - MOBY(moby)->state = 3; + MOBY(moby)->state = MOVE_PAIR_TO_FIXED_OFFSETS; } allocate_voice_for_target_entry(0, 0, (int)pair_transform_vars->unk40); return; @@ -170,7 +174,7 @@ void split_door_update(char *moby) { update_entity(pair_transform_vars->unk40); if (absolute_float(parent_distance - moby_pair_parent_fixed_distance_gp) < 0.01f && absolute_float(child_distance - moby_pair_child_fixed_distance_gp) < 0.01f) - MOBY(moby)->state = 5; + MOBY(moby)->state = WAIT_FOR_RESET; return; case ANIMATE_PAIR_WITH_TIMED_PHASES: target_delta = fast_vec_dist(moby + 0x10, &pair_transform_vars->unk10); @@ -178,11 +182,11 @@ void split_door_update(char *moby) { phase_a = target_delta; phase_b = fast_vec_dist(child + 0x10, &pair_transform_vars->unk10); phase = (unsigned char)MOBY(moby)->command; - if (phase == 1) + if (phase == SPLIT_DOOR_PHASE_TARGET_CURRENT_TRANSFORMS) goto phase_one; - if (phase < 2) + if (phase < SPLIT_DOOR_PHASE_TARGET_CONFIGURED_TRANSFORMS) goto phase_default; - if (phase == 2) + if (phase == SPLIT_DOOR_PHASE_TARGET_CONFIGURED_TRANSFORMS) goto phase_two; phase_default: @@ -196,7 +200,7 @@ void split_door_update(char *moby) { rotation_acceleration = 10.0f; rotation_speed = 10.0f; rotation_damping = 5.0f; - next_phase = 1; + next_phase = SPLIT_DOOR_PHASE_TARGET_CURRENT_TRANSFORMS; next_timer = 30; goto phase_join; phase_one: @@ -210,7 +214,7 @@ void split_door_update(char *moby) { rotation_acceleration = moby_pair_phase_rotation_y_acceleration_degrees_gp; rotation_speed = moby_pair_phase_rotation_y_deceleration_degrees_gp; rotation_damping = moby_pair_phase_rotation_y_max_speed_degrees_gp; - next_phase = 2; + next_phase = SPLIT_DOOR_PHASE_TARGET_CONFIGURED_TRANSFORMS; next_timer = truncate_float_to_s32( random_float_between((float)moby_pair_phase_two_duration_min_frames_gp, (float)moby_pair_phase_two_duration_max_frames_gp)); @@ -226,7 +230,7 @@ void split_door_update(char *moby) { rotation_acceleration = moby_pair_phase_rotation_y_acceleration_degrees_gp; rotation_speed = moby_pair_phase_rotation_y_deceleration_degrees_gp; rotation_damping = moby_pair_phase_rotation_y_max_speed_degrees_gp; - next_phase = 1; + next_phase = SPLIT_DOOR_PHASE_TARGET_CURRENT_TRANSFORMS; next_timer = truncate_float_to_s32( random_float_between((float)moby_pair_phase_one_duration_min_frames_gp, (float)moby_pair_phase_one_duration_max_frames_gp)); @@ -268,14 +272,14 @@ void split_door_update(char *moby) { target_delta = moby_pair_parent_phase_target_distance_gp; if (absolute_float(phase_a - target_delta) < 0.01f) { if (absolute_float(phase_b - moby_pair_child_phase_target_distance_gp) < 0.01f) - MOBY(moby)->state = 5; + MOBY(moby)->state = WAIT_FOR_RESET; } return; case WAIT_FOR_RESET: if (moby_pair_reset_enabled_gp == 0.0f) return; MOBY(moby)->command = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = WAIT_FOR_HERO_IN_CLIP_VOLUME; qcopy(moby + 0x10, &pair_transform_vars->unk10); qcopy(moby + 0x40, pair_transform_vars->unk20); child = pair_transform_vars->unk40 + 0x10; diff --git a/src/overlays/l06/mobys/switchable_beam_barrier.c b/src/overlays/l06/mobys/switchable_beam_barrier.c index a475ac1fe2..f02cbf16df 100644 --- a/src/overlays/l06/mobys/switchable_beam_barrier.c +++ b/src/overlays/l06/mobys/switchable_beam_barrier.c @@ -14,7 +14,7 @@ extern float D_L06_00167540[]; -extern char *D_L06_0015FFD8 __asm__("D_L06_0015FFD8"); +extern char *level_mobys_q __asm__("D_L06_0015FFD8"); extern int fast_tween_color(int, int, float) __asm__("FUN_001fa6e0"); @@ -36,7 +36,7 @@ extern float D_0015ED6C; #include "rnc/overlay/l06/mobys/switchable_beam_barrier_data/update_switchable_beam_barrier_3.h" -extern float D_L06_001FE890[]; +extern float l06_vector_stream_copy_rotations[] __asm__("D_L06_001FE890"); extern int D_L06_00162234; extern int D_L06_00162238; extern float D_L06_001621F8 __attribute__((sda)); @@ -64,6 +64,9 @@ void switchable_beam_barrier_update(char *moby) { UPDATE_VECTOR_STREAMS = 2, EMIT_PARTICLE_BURST = 3 }; + enum { + PARTICLE_BURST_COMPLETE = 4 + }; Data_305E38 *vector_stream_vars = ((Data_305E38 *)MOBY(moby)->pvars); union { float tmp[30][4]; @@ -86,18 +89,18 @@ void switchable_beam_barrier_update(char *moby) { vector_stream_vars->timer[0] = 0; vector_stream_vars->f18 = -1; if (vector_stream_vars->f10 != -1) { - MOBY(moby)->state = 1; + MOBY(moby)->state = WAIT_FOR_LINKED_MOBY; MOBY(moby)->collision = 0; } else { - MOBY(moby)->state = 2; + MOBY(moby)->state = UPDATE_VECTOR_STREAMS; } break; case WAIT_FOR_LINKED_MOBY: { - char *e = D_L06_0015FFD8 + (vector_stream_vars->f10 << 8); + char *e = level_mobys_q + (vector_stream_vars->f10 << 8); if (*(short *)(e + 0xA6) == 0x463 && (unsigned char)e[0x20] < 3) { return; } - MOBY(moby)->state = 2; + MOBY(moby)->state = UPDATE_VECTOR_STREAMS; MOBY(moby)->collision = MOBY(moby)->pclass->collision; break; } @@ -151,10 +154,10 @@ void switchable_beam_barrier_update(char *moby) { add_draw_callback((int)draw_moby_vector_streams, moby); } if (vector_stream_vars->f14 >= 0 && - *(unsigned char *)(D_L06_0015FFD8 + 0xBC + (vector_stream_vars->f14 << 8)) != 0) { + *(unsigned char *)(level_mobys_q + 0xBC + (vector_stream_vars->f14 << 8)) != 0) { int voice_slot_index; MOBY(moby)->collision = 0; - MOBY(moby)->state = 3; + MOBY(moby)->state = EMIT_PARTICLE_BURST; voice_slot_index = vector_stream_vars->f18; if (voice_slot_index != -1) { char *e = ((char *)&voice_pool) + voice_slot_index * 0x70; @@ -175,7 +178,7 @@ void switchable_beam_barrier_update(char *moby) { set_scale_matrix(u.m.b, D_L06_00162208); multiply_matrix(u.m.a, u.m.a, u.m.b); for (i = 0; i < 4; i++) { - euler_rotation_matrix(u.m.b, &D_L06_001FE890[i * 4]); + euler_rotation_matrix(u.m.b, &l06_vector_stream_copy_rotations[i * 4]); multiply_matrix(u.m.b, u.m.a, u.m.b); fast_vec_add(u.m.b + 12, u.m.b + 12, moby + 0x10); u.m.b[14] += (float)i * 1.7f + 0.6f; @@ -209,7 +212,7 @@ void switchable_beam_barrier_update(char *moby) { 0); } } - MOBY(moby)->state = 4; + MOBY(moby)->state = PARTICLE_BURST_COMPLETE; break; } } @@ -298,7 +301,7 @@ void draw_moby_vector_streams(char *moby) { transform_matrix_base = copy_transform_matrices[0]; sp = shared_helper_arguments; pp = copy_transform_matrices[0] + 12; - tp = D_L06_001FE890; + tp = l06_vector_stream_copy_rotations; mp = transform_matrix_base; for (i = 0; i < 4; i++) { euler_rotation_matrix(mp, tp); diff --git a/src/overlays/l07/level_class_tables.c b/src/overlays/l07/level_class_tables.c index 7a4c013628..f76d0a6d24 100644 --- a/src/overlays/l07/level_class_tables.c +++ b/src/overlays/l07/level_class_tables.c @@ -6,7 +6,7 @@ #include "rnc/camera/update_cam.h" #include "rnc/mobys/moby_class_tables.h" -void FUN_L00_002caf40(); +void get_morphoray_chicken_slot_record() __asm__("FUN_L00_002caf40"); void FUN_L00_002ea7a0(); void blarg_helicopter_update() __asm__("FUN_L03_002cca00"); void blaster_update() __asm__("FUN_L00_002b49a8"); @@ -147,7 +147,7 @@ void *D_L07_002125DC[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; struct MobyClassUpdate moby_classes[187] __asm__("D_L07_00211D00") diff --git a/src/overlays/l07/mobys/bombomatic.c b/src/overlays/l07/mobys/bombomatic.c index abfa1e13ce..b8347e9382 100644 --- a/src/overlays/l07/mobys/bombomatic.c +++ b/src/overlays/l07/mobys/bombomatic.c @@ -23,7 +23,7 @@ char *spawn_bombomatic_projectile(char *spawn_position, short burst_index) __asm__("FUN_L07_0030ba90"); /* Ported from rac1-decomp (src/overlays/l07_umbris/vendor_002CE470.c: func_L07_0030E820), where it is exact; names translated to the US level program. */ -extern char D_L07_00166E40[]; +extern char debris_far_point[] __asm__("D_L07_00166E40"); extern int allocate_voice_for_target_entry(int, int, void *) __asm__("FUN_0022da68"); extern void mark_moby_for_removal(void *) __asm__("FUN_0020c828"); extern int resolve_moby_hit_response(void *, void *, void *, int, int *, float *, int, int); @@ -80,7 +80,7 @@ extern float FUN_L00_0025abf0(void *, void *, void *, float, float) extern int D_L07_0015F5CC MACRO_ADDR; extern void * FUN_L00_00263fd8(char *, int, float *, void *, int, int, float, float *, float *, float *); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern void FUN_L00_0024f7c8(void *, int, void *); extern void FUN_L00_00257470(void *, int, int); extern void FUN_L00_0025a120(void *); @@ -222,7 +222,7 @@ void bombomatic_update(char *moby) { } moby_data = (BombomaticVars *)MOBY(moby)->pvars; if (((unsigned char *)moby)[0x31] != 0) { - if (fast_vec_dist(moby + 0x10, D_L07_00166E40) < 27.0f) { + if (fast_vec_dist(moby + 0x10, debris_far_point) < 27.0f) { FUN_L00_0025a120(moby); MOBY(moby)->shadow_range = 0x15; } @@ -344,7 +344,7 @@ void bombomatic_update(char *moby) { attach_manipulator(moby, 0, &moby_data->manipulator_70); *(int *)&moby_data->unkC0 = 0; allocate_voice_for_target_entry(0, 4, (int)moby); - MOBY(moby)->state = 1; + MOBY(moby)->state = BOMBOMATIC_WAIT_TO_LAUNCH; moby_data->unkC4 = 0; break; } @@ -355,7 +355,7 @@ void bombomatic_update(char *moby) { moby_data->timer_B8 = 0; moby_data->unkBC = random_angle_radians(); moby_data->unkBA = 0; - MOBY(moby)->state = 2; + MOBY(moby)->state = BOMBOMATIC_LAUNCH_BURST; } break; } @@ -364,9 +364,9 @@ void bombomatic_update(char *moby) { if (fast_dec_timer_s16(&moby_data->timer_B8) != 0) { moby_data->timer_B8 = scale_game_frames(7); if (((unsigned char *)moby)[0x31] == 0) { - if (!(vector_distance_xy(moby + 0x10, D_L07_00166E40) < 90.0f && + if (!(vector_distance_xy(moby + 0x10, debris_far_point) < 90.0f && (moby_data->unkC4 & 1) != 0)) { - if (!(vector_distance_xy(moby + 0x10, D_L07_00166E40) < 40.0f)) { + if (!(vector_distance_xy(moby + 0x10, debris_far_point) < 40.0f)) { goto eeE4; } } @@ -414,7 +414,7 @@ void bombomatic_update(char *moby) { if (moby_data->unkB4 <= D_L07_0015F5CC) { int r9 = scale_game_frames(0x78); moby_data->unkB4 = D_L07_0015F5CC + r9; - MOBY(moby)->state = 1; + MOBY(moby)->state = BOMBOMATIC_WAIT_TO_LAUNCH; } break; } @@ -424,6 +424,6 @@ void bombomatic_update(char *moby) { float f = D_0015ED6C_gp * 17.80235863f; float g = fast_add_rotations(moby_data->unkC0, f); moby_data->unkC0 = g; - FUN_L00_001fff28(&moby_data->unk80, 2, g); + build_axis_rotation_quaternion(&moby_data->unk80, 2, g); } } diff --git a/src/overlays/l07/mobys/command_falling_platform.c b/src/overlays/l07/mobys/command_falling_platform.c index df6b03f1e0..7136f98264 100644 --- a/src/overlays/l07/mobys/command_falling_platform.c +++ b/src/overlays/l07/mobys/command_falling_platform.c @@ -92,7 +92,7 @@ void command_falling_platform_update(char *moby) { parent_data = *(char **)(parent + 0x78); } if (((unsigned char *)moby)[0xBC] == 2) { - MOBY(moby)->state = 2; + MOBY(moby)->state = PLATFORM_TIMED_SWAY_BEFORE_FALL; MOBY(moby)->command = 3; falling_platform_vars->unkAC = falling_platform_vars->unkBD; } @@ -108,7 +108,7 @@ void command_falling_platform_update(char *moby) { falling_platform_vars->saved_rot_x = MOBY(moby)->rot.x; falling_platform_vars->saved_rot_y = MOBY(moby)->rot.y; falling_platform_vars->unkC8 = -1; - MOBY(moby)->state = 1; + MOBY(moby)->state = PLATFORM_COMMAND_GATED_SWAY; MOBY(moby)->command = 0; if (((unsigned char *)moby)[0xB0] != 0xFF) { if (visited52[((unsigned char *)moby)[0xB0] + current_level_index * 16] != 0xFF) @@ -118,7 +118,7 @@ void command_falling_platform_update(char *moby) { mark_moby_for_removal(moby); return; } - MOBY(moby)->state = 5; + MOBY(moby)->state = PLATFORM_HEIGHT_RECOVERY_AND_SWAY; } break; case PLATFORM_COMMAND_GATED_SWAY: @@ -156,7 +156,7 @@ void command_falling_platform_update(char *moby) { parent_data[0x19D] = falling_platform_vars->unkBF; parent[0x20] = 12; } - MOBY(moby)->state = 3; + MOBY(moby)->state = PLATFORM_TILT_AND_FALL; break; case PLATFORM_TILT_AND_FALL: speed = 1.3962634f; @@ -175,7 +175,7 @@ void command_falling_platform_update(char *moby) { break; if (falling_platform_vars->unkBC != 0) { falling_platform_vars->fall_speed = 0.0f; - MOBY(moby)->state = 4; + MOBY(moby)->state = PLATFORM_PARENT_GATED_RECOVERY_SETUP; } else { mark_moby_for_removal(moby); return; @@ -188,7 +188,7 @@ void command_falling_platform_update(char *moby) { falling_platform_vars->fall_speed = random_float_between(frame_time, frame_time * 4.0f); falling_platform_vars->unkC0 = random_angle_radians(); falling_platform_vars->unkC4 = random_angle_radians(); - MOBY(moby)->state = 5; + MOBY(moby)->state = PLATFORM_HEIGHT_RECOVERY_AND_SWAY; MOBY(moby)->rot.x = 0.0f; MOBY(moby)->rot.y = 0.0f; falling_platform_vars->unkAC = 0; diff --git a/src/overlays/l07/mobys/cutscene_effects.c b/src/overlays/l07/mobys/cutscene_effects.c index 29c7ce9214..cb2ed7fcfa 100644 --- a/src/overlays/l07/mobys/cutscene_effects.c +++ b/src/overlays/l07/mobys/cutscene_effects.c @@ -42,7 +42,7 @@ void cutscene_effects_update(struct Moby *moby) { switch (state) { case MOBY_STATE_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = MOBY_STATE_UPDATE; break; case MOBY_STATE_UPDATE: current_scene_state = scene_state; diff --git a/src/overlays/l07/mobys/cutscene_joint_trails.c b/src/overlays/l07/mobys/cutscene_joint_trails.c index 72f7e18bfb..76f3a2ae81 100644 --- a/src/overlays/l07/mobys/cutscene_joint_trails.c +++ b/src/overlays/l07/mobys/cutscene_joint_trails.c @@ -27,7 +27,7 @@ void cutscene_joint_trails_update(struct Moby *moby) { switch (moby->state) { case TRAIL_STATE_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = TRAIL_STATE_UPDATE; break; case TRAIL_STATE_UPDATE: if (scene_state == 2) { diff --git a/src/overlays/l07/mobys/equalizer_ammo_spawner.c b/src/overlays/l07/mobys/equalizer_ammo_spawner.c index fa7100e256..83dd07a9a0 100644 --- a/src/overlays/l07/mobys/equalizer_ammo_spawner.c +++ b/src/overlays/l07/mobys/equalizer_ammo_spawner.c @@ -44,13 +44,18 @@ void equalizer_ammo_spawner_update(struct Moby *moby) __asm__("FUN_L07_0031d2e0" /* Moby class 1142 */ void equalizer_ammo_spawner_update(struct Moby *moby) { + enum { + EQUALIZER_AMMO_SPAWNER_INITIALIZE_PATH = 0, + EQUALIZER_AMMO_SPAWNER_WAIT_FOR_TRIGGER = 1, + EQUALIZER_AMMO_SPAWNER_COMPLETE = 2 + }; int *ammo_spawner_state = ((int *)moby->pvars); int state = moby->state; - if (state == 1) + if (state == EQUALIZER_AMMO_SPAWNER_WAIT_FOR_TRIGGER) goto state_one; - if (state >= 2) + if (state >= EQUALIZER_AMMO_SPAWNER_COMPLETE) return; - if (state != 0) + if (state != EQUALIZER_AMMO_SPAWNER_INITIALIZE_PATH) return; { int bad = 0; @@ -76,7 +81,7 @@ void equalizer_ammo_spawner_update(struct Moby *moby) { *(float *)(ammo_spawner_state + 8) += ((L07PathNode *)(D_L07_001B0530[ammo_spawner_state[1]] + (i << 4)))[1].length; } - moby->state = 1; + moby->state = EQUALIZER_AMMO_SPAWNER_WAIT_FOR_TRIGGER; } return; state_one: { @@ -154,7 +159,7 @@ state_one: { } } } - moby->state = 2; + moby->state = EQUALIZER_AMMO_SPAWNER_COMPLETE; } } diff --git a/src/overlays/l07/mobys/fading_ring_effect.c b/src/overlays/l07/mobys/fading_ring_effect.c index 1e600f948e..851655943d 100644 --- a/src/overlays/l07/mobys/fading_ring_effect.c +++ b/src/overlays/l07/mobys/fading_ring_effect.c @@ -14,7 +14,7 @@ extern char *create_moby(int) __asm__("FUN_0020c4f8"); extern void update_entity(void *) __asm__("FUN_L00_00250df8"); /* Ported from rac1-decomp (src/overlays/l07_umbris/vendor_002CE470.c: func_L07_0030E820), where it is exact; names translated to the US level program. */ -extern char D_L07_00166E40[]; +extern char debris_far_point[] __asm__("D_L07_00166E40"); /* Slows and steers a moby toward another when it is below and close in height. */ /* Ported from rac1-decomp (src/overlays/l07_umbris/vendor_002CE470.c: func_L07_0030F4C0), where it is exact; names translated to the US level program. */ @@ -59,10 +59,10 @@ extern void draw_geometry_quad(void *, int, int) __asm__("func_001F7D30"); unsigned char *spawn_fading_ring_effect(int spawning_moby, void *spawn_position, - int b, - float f0, - float f1, - float f2, + int texture_index, + float initial_radius, + float terminal_radius, + float ring_height, float spawn_speed, float f4) { @@ -77,15 +77,15 @@ unsigned char *spawn_fading_ring_effect(int spawning_moby, MOBY(moby)->visible = 1; qcopy(moby + 0x10, spawn_position); *(int *)(spawned_moby_vars + 0x14) = spawning_moby; - *(float *)(spawned_moby_vars + 4) = f1; - *(float *)(spawned_moby_vars + 0x10) = f2; + *(float *)(spawned_moby_vars + 4) = terminal_radius; + *(float *)(spawned_moby_vars + 0x10) = ring_height; *(float *)(spawned_moby_vars + 0xC) = spawn_speed; - *(float *)spawned_moby_vars = f0; - *(float *)(spawned_moby_vars + 8) = f0; - *(int *)(spawned_moby_vars + 0x18) = b; + *(float *)spawned_moby_vars = initial_radius; + *(float *)(spawned_moby_vars + 8) = initial_radius; + *(int *)(spawned_moby_vars + 0x18) = texture_index; *(float *)(spawned_moby_vars + 0x1C) = f4; MOBY(moby)->flags |= 0x200; - distance_reference_position = D_L07_00166E40; + distance_reference_position = debris_far_point; distance_response_state = distance_reference_position - 0x140; *(float *)(distance_response_state + 0x160) = 0.3f - vector_distance_xy(moby + 0x10, distance_reference_position) / 100.0f; diff --git a/src/overlays/l07/mobys/get_target_sight.c b/src/overlays/l07/mobys/get_target_sight.c index a90bdab3ed..9edf862780 100644 --- a/src/overlays/l07/mobys/get_target_sight.c +++ b/src/overlays/l07/mobys/get_target_sight.c @@ -16,6 +16,11 @@ extern struct Hero hero_lui __asm__("D_0013F350") NOT_SDA; int get_target_sight(char *a, char *o, float best) __asm__("FUN_L07_002886d8"); int get_target_sight(char *source_moby, char *sight_out, float best) { + enum { + TARGET_SIGHT_DEFAULT_HERO = 0, + TARGET_SIGHT_CANDIDATE_SELECTED = 1, + TARGET_SIGHT_HERO_EXCLUDED = 2 + }; struct Hero *hero_context = &hero_lui; char *target_moby; char *candidate_moby; @@ -25,10 +30,10 @@ int get_target_sight(char *source_moby, char *sight_out, float best) { float candidate_metric; target_moby = ((char *)hero_context->moby); - target_selection_status = 0; + target_selection_status = TARGET_SIGHT_DEFAULT_HERO; if (hero_context->state.control_mode == 0x18 || hero_context->state.current == 0x72) { target_moby = 0; - target_selection_status = 2; + target_selection_status = TARGET_SIGHT_HERO_EXCLUDED; } for (i = 1; i <= D_L07_001B08B0[0]; i++) { candidate_moby = level_mobys + (D_L07_001B08B0[i] << 8); @@ -46,7 +51,7 @@ int get_target_sight(char *source_moby, char *sight_out, float best) { if (candidate_metric < best) { target_moby = candidate_moby; best = candidate_metric; - target_selection_status = 1; + target_selection_status = TARGET_SIGHT_CANDIDATE_SELECTED; } } for (j = 0; j < 20; j++) { @@ -65,7 +70,7 @@ int get_target_sight(char *source_moby, char *sight_out, float best) { if (candidate_metric < best) { target_moby = candidate_moby; best = candidate_metric; - target_selection_status = 1; + target_selection_status = TARGET_SIGHT_CANDIDATE_SELECTED; } } if (target_moby != 0) { diff --git a/src/overlays/l07/mobys/homing_mine.c b/src/overlays/l07/mobys/homing_mine.c index 6b4898c9e2..0390f9b5c8 100644 --- a/src/overlays/l07/mobys/homing_mine.c +++ b/src/overlays/l07/mobys/homing_mine.c @@ -174,7 +174,7 @@ void homing_mine_update(struct Moby *moby) { moby->flags |= 0x1000; qcopy(&homing_mine_vars->home, &moby->pos); moby->collision = moby->pclass->collision; - moby->state = 1; + moby->state = HOMING_MINE_WAIT_FOR_PROXIMITY; break; case HOMING_MINE_WAIT_FOR_PROXIMITY: timer = scale_game_frames(600); @@ -189,16 +189,16 @@ void homing_mine_update(struct Moby *moby) { homing_mine_vars->timeout = scale_game_frames(600); moby->command = 1; homing_mine_vars->bob_timer = scale_game_frames(7); - moby->state = 3; + moby->state = HOMING_MINE_CHASE; if (homing_mine_vars->sound != -1) set_moby_list_state(homing_mine_vars->sound, 2); - moby->state = 2; + moby->state = HOMING_MINE_START_CHASE; } break; case HOMING_MINE_START_CHASE: if (moby->prev_seq != 1) FUN_00212f90(moby, 1, 0, 10); - moby->state = 3; + moby->state = HOMING_MINE_CHASE; case HOMING_MINE_CHASE: if ((moby->anim_flags & 2) && moby->seq == 1 && moby->prev_seq != 2) { FUN_00212f90(moby, 2, 0, 10); diff --git a/src/overlays/l07/mobys/linked_sliding_platform.c b/src/overlays/l07/mobys/linked_sliding_platform.c index f613a23f3e..0c58f15db4 100644 --- a/src/overlays/l07/mobys/linked_sliding_platform.c +++ b/src/overlays/l07/mobys/linked_sliding_platform.c @@ -73,7 +73,7 @@ void linked_sliding_platform_update(struct Moby *moby) { sliding_platform_vars->sound_slot = -1; if (sliding_platform_vars->flag_index != -1) D_L07_00184528[sliding_platform_vars->flag_index] = 0; - moby->state = 1; + moby->state = PLATFORM_WAIT_TO_MOVE_OUTWARD; break; } case PLATFORM_WAIT_TO_MOVE_OUTWARD: @@ -85,7 +85,7 @@ void linked_sliding_platform_update(struct Moby *moby) { } if (sliding_platform_vars->trigger_sound != -1) allocate_voice_for_target_entry(sliding_platform_vars->trigger_sound, 0, moby); - moby->state = 2; + moby->state = PLATFORM_MOVE_OUTWARD; break; case PLATFORM_MOVE_OUTWARD: if (sliding_platform_vars->target_index != -1 && @@ -94,7 +94,7 @@ void linked_sliding_platform_update(struct Moby *moby) { target->state != 0xfe && target->state != 0xfd && target->state == sliding_platform_vars->target_state_word) { allocate_voice_for_target_entry(sliding_platform_vars->trigger_sound, 0, moby); - moby->state = 4; + moby->state = PLATFORM_RETURN_TO_ORIGIN; break; } distance = vector_distance_xy(&moby->pos, origin); @@ -103,7 +103,7 @@ void linked_sliding_platform_update(struct Moby *moby) { allocate_voice_for_target_entry(sliding_platform_vars->arrival_sound, 0, moby); if (sliding_platform_vars->flag_index != -1) D_L07_00184528[sliding_platform_vars->flag_index] = 1; - moby->state = 3; + moby->state = PLATFORM_WAIT_TO_RETURN; } else { step.q = 0; step.f[1] = -(frame_scale * 0.01f); @@ -123,7 +123,7 @@ void linked_sliding_platform_update(struct Moby *moby) { return; if (sliding_platform_vars->trigger_sound != -1) allocate_voice_for_target_entry(sliding_platform_vars->trigger_sound, 0, moby); - moby->state = 4; + moby->state = PLATFORM_RETURN_TO_ORIGIN; } } break; @@ -134,7 +134,7 @@ void linked_sliding_platform_update(struct Moby *moby) { target->state == 0xfe || target->state == 0xfd || target->state == sliding_platform_vars->target_state) { allocate_voice_for_target_entry(sliding_platform_vars->trigger_sound, 0, moby); - moby->state = 2; + moby->state = PLATFORM_MOVE_OUTWARD; return; } distance = vector_distance_xy(&moby->pos, origin); @@ -156,7 +156,7 @@ void linked_sliding_platform_update(struct Moby *moby) { allocate_voice_for_target_entry(sliding_platform_vars->arrival_sound, 0, moby); if (sliding_platform_vars->flag_index != -1) D_L07_00184528[sliding_platform_vars->flag_index] = 0; - moby->state = 1; + moby->state = PLATFORM_WAIT_TO_MOVE_OUTWARD; break; } step.q = 0; diff --git a/src/overlays/l07/mobys/machinegun_turret.c b/src/overlays/l07/mobys/machinegun_turret.c index 4122ba354d..1d61ae0dfc 100644 --- a/src/overlays/l07/mobys/machinegun_turret.c +++ b/src/overlays/l07/mobys/machinegun_turret.c @@ -90,7 +90,7 @@ void machinegun_turret_update(unsigned char *moby) { animation = &turret_instance_vars->anim_state; hit = find_moby_hit(moby, 0x230000, 0); resolve_moby_hit_response((void *)moby, (MobyHit *)hit, collision, 0, contact, 0, 0, 4); - if ((u8)MOBY(moby)->state < 2 && contact[0] > 1) { + if ((u8)MOBY(moby)->state < TURRET_HIT_SPIN && contact[0] > 1) { FUN_0022da68(1, 0, moby); FUN_L00_00257470(moby, 0, -1); MOBY(moby)->flags &= 0xefff; @@ -100,7 +100,7 @@ void machinegun_turret_update(unsigned char *moby) { turret_instance_vars->unk7C = scale_game_frames(60); if ((u8)MOBY(moby)->prev_seq != 2) FUN_00212f90(moby, 2, 0, 5); - MOBY(moby)->state = 2; + MOBY(moby)->state = TURRET_HIT_SPIN; } MOBY(moby)->hit_slot = 0xff; trooper_anim_finish(moby, animation); @@ -136,7 +136,7 @@ void machinegun_turret_update(unsigned char *moby) { turret_instance_vars->unk9C = turret_instance_vars->unk94; if ((u8)MOBY(moby)->prev_seq != 1) FUN_00212f90(moby, 1, 0, 0); - MOBY(moby)->state = 1; + MOBY(moby)->state = TURRET_SWEEP_AND_FIRE; break; case TURRET_SWEEP_AND_FIRE: if ((u8)MOBY(moby)->seq != 1 && ((u8)MOBY(moby)->anim_flags & 2) != 0 && @@ -210,7 +210,7 @@ void machinegun_turret_update(unsigned char *moby) { if (fast_dec_timer_s16(&turret_instance_vars->unk7C) == 0) return; turret_instance_vars->unk7C = scale_game_frames(180); - MOBY(moby)->state = 3; + MOBY(moby)->state = TURRET_LOWER_AND_REALIGN; break; case TURRET_LOWER_AND_REALIGN: if ((u8)MOBY(moby)->seq != 4 && ((u8)MOBY(moby)->anim_flags & 2) && @@ -232,7 +232,7 @@ void machinegun_turret_update(unsigned char *moby) { FUN_0022da68(2, 0, moby); if ((u8)MOBY(moby)->prev_seq != 3) FUN_00212f90(moby, 3, 0, 5); - MOBY(moby)->state = 4; + MOBY(moby)->state = TURRET_RESTORE_HEIGHT; } break; case TURRET_RESTORE_HEIGHT: @@ -244,7 +244,7 @@ void machinegun_turret_update(unsigned char *moby) { MOBY(moby)->flags |= 0x1000; if ((u8)MOBY(moby)->prev_seq != 1) FUN_00212f90(moby, 1, 0, 5); - MOBY(moby)->state = 1; + MOBY(moby)->state = TURRET_SWEEP_AND_FIRE; break; case 5: break; diff --git a/src/overlays/l07/mobys/mine.c b/src/overlays/l07/mobys/mine.c index f96e81f4cd..6f88b8588e 100644 --- a/src/overlays/l07/mobys/mine.c +++ b/src/overlays/l07/mobys/mine.c @@ -221,7 +221,7 @@ void diving_mine_update(struct Moby *moby) { moby->rot.z = fast_arc_tan(swooper_instance_vars->goal.f[0] - moby->pos.x, swooper_instance_vars->goal.f[1] - moby->pos.y); swooper_instance_vars->unk29 = 0; - moby->state = 1; + moby->state = MINE_WAIT_AT_GOAL; moby->command = 0; break; case MINE_WAIT_AT_GOAL: @@ -250,7 +250,7 @@ void diving_mine_update(struct Moby *moby) { swooper_instance_vars->life_timer = scale_game_frames(600); moby->command = 1; swooper_instance_vars->bob_timer = scale_game_frames(7); - moby->state = 2; + moby->state = MINE_CHASE_TARGET; } break; case MINE_CHASE_TARGET: diff --git a/src/overlays/l07/mobys/mine_group.c b/src/overlays/l07/mobys/mine_group.c index 31662074f3..198040d60c 100644 --- a/src/overlays/l07/mobys/mine_group.c +++ b/src/overlays/l07/mobys/mine_group.c @@ -356,7 +356,7 @@ void mine_group_update(struct Moby *moby) { } if (!boltcrate_pvars->unk95) moby->flags |= 1; - moby->state = 1; + moby->state = ADVANCE_PATH_CHILDREN; break; } case ADVANCE_PATH_CHILDREN: { diff --git a/src/overlays/l07/mobys/mission_gated_taxi_platform.c b/src/overlays/l07/mobys/mission_gated_taxi_platform.c index 781057409a..3975c17b14 100644 --- a/src/overlays/l07/mobys/mission_gated_taxi_platform.c +++ b/src/overlays/l07/mobys/mission_gated_taxi_platform.c @@ -66,6 +66,10 @@ typedef struct MissionGatedTaxiPlatformVars { /* Moby class 1474 */ void mission_gated_taxi_platform_update(struct Moby *moby) { + enum { + TAXI_PLATFORM_STATE_UNINITIALIZED = 0, + TAXI_PLATFORM_STATE_INITIALIZED = 1 + }; MissionGatedTaxiPlatformVars *mission_gated_taxi_vars = (MissionGatedTaxiPlatformVars *)moby->pvars; char *path; @@ -81,7 +85,7 @@ void mission_gated_taxi_platform_update(struct Moby *moby) { path = D_L07_001B0530[mission_gated_taxi_vars->path]; qcopy(orig, &moby->pos); fast_dec_timer_s16(&mission_gated_taxi_vars->timer); - if (moby->state == 0) { + if (moby->state == TAXI_PLATFORM_STATE_UNINITIALIZED) { float f; char *pts; mission_gated_taxi_vars->unk28 = 4; @@ -98,7 +102,7 @@ void mission_gated_taxi_platform_update(struct Moby *moby) { mission_gated_taxi_vars->timer = 0; *(int *)&mission_gated_taxi_vars->unkA8 = 0; *(int *)&mission_gated_taxi_vars->unkBC = 0; - moby->state = 1; + moby->state = TAXI_PLATFORM_STATE_INITIALIZED; moby->update_dist = 0xFF; moby->draw_dist = 0xFF; mission_gated_taxi_vars->unkC4 = -1; diff --git a/src/overlays/l07/mobys/ocean_umbris.c b/src/overlays/l07/mobys/ocean_umbris.c index 077fb8028b..e3150ddf56 100644 --- a/src/overlays/l07/mobys/ocean_umbris.c +++ b/src/overlays/l07/mobys/ocean_umbris.c @@ -8,7 +8,7 @@ #include "rnc/runtime/callbacks/add_draw_callback.h" /* Ported from rac1-decomp (src/overlays/l07_umbris/vendor_002CE470.c: func_L07_0030E820), where it is exact; names translated to the US level program. */ -extern char D_L07_00166E40[]; +extern char debris_far_point[] __asm__("D_L07_00166E40"); extern void l07_moby_draw_callback(void) __asm__("FUN_L07_0030d420"); extern char ocean_umbris_scaled_table[] __asm__("D_L07_00208560"); extern void prepare_scaled_table_with_byte_128(void *, float) __asm__("FUN_L02_002a40d0"); @@ -23,11 +23,11 @@ void ocean_umbris_update(unsigned char *moby) { switch (MOBY(moby)->state) { case OCEAN_UMBRIS_INITIALIZE: prepare_scaled_table_with_byte_128(ocean_umbris_scaled_table, 0.66666669f); - MOBY(moby)->state = 1; + MOBY(moby)->state = OCEAN_UMBRIS_QUEUE_DRAW_OUTSIDE_CLIP_VOLUME; MOBY(moby)->update_dist = 0xFF; break; case OCEAN_UMBRIS_QUEUE_DRAW_OUTSIDE_CLIP_VOLUME: - if (!is_point_inside_clip_volume(D_L07_00166E40, *((int *)MOBY(moby)->pvars))) { + if (!is_point_inside_clip_volume(debris_far_point, *((int *)MOBY(moby)->pvars))) { add_draw_callback((void *)l07_moby_draw_callback, moby); } break; diff --git a/src/overlays/l07/mobys/sharkigator.c b/src/overlays/l07/mobys/sharkigator.c index 0d4b4f9b16..dc5b3a1b40 100644 --- a/src/overlays/l07/mobys/sharkigator.c +++ b/src/overlays/l07/mobys/sharkigator.c @@ -12,6 +12,26 @@ #include "rnc/overlay/shared/world/level_labels.h" #include "rnc/mobys/animation/blend_moby_animation.h" +enum { + SHARKIGATOR_INITIALIZE = 0, + SHARKIGATOR_SWIM_IDLE = 1, + SHARKIGATOR_SWIM_WANDER = 2, + SHARKIGATOR_TARGET_PURSUIT = 4, + SHARKIGATOR_TARGET_LUNGE_INTERPOLATION = 5, + SHARKIGATOR_POST_LUNGE_PATH_FOLLOW = 6, + SHARKIGATOR_GRAVITY_IDLE = 7, + SHARKIGATOR_GRAVITY_WANDER = 8, + SHARKIGATOR_TARGET_APPROACH = 9, + SHARKIGATOR_TARGET_CONTACT_ATTACK = 10, + SHARKIGATOR_TARGET_CONTACT_RECOIL_RECOVERY = 11, + SHARKIGATOR_HIT_KNOCKBACK_RECOVERY = 0xC, + SHARKIGATOR_HIT_ANIMATION_RECOVERY = 0xD, + SHARKIGATOR_DEATH_FALL_AND_REMOVE = 0xE, + SHARKIGATOR_SMALL_WATER_GAP_GRAVITY_IDLE = 15, + SHARKIGATOR_DAMPED_GRAVITY_RECOVERY = 16, + SHARKIGATOR_DAMPED_RECOVERY = 17 +}; + extern void make_hit_descriptor(char *arg, int a, int b, void *src, float scale) __asm__("FUN_L00_00259888"); extern float random_angle_radians(void) __asm__("FUN_00213308"); @@ -442,14 +462,14 @@ void handle_sharkigator_hit(struct Moby *moby, char *x, float *hp) { case SHARKIGATOR_LAUNCH_HIT_KNOCKBACK_RECOVERY: case SHARKIGATOR_ENTER_HIT_KNOCKBACK_RECOVERY: start_sharkigator_hit_knockback(moby, x + 0x70, hit_record + 0x10); - moby->state = 0xC; + moby->state = SHARKIGATOR_HIT_KNOCKBACK_RECOVERY; break; case SHARKIGATOR_HIT_ANIMATION_RESPONSE: case SHARKIGATOR_ALTERNATE_HIT_ANIMATION_RESPONSE: if (((unsigned char *)moby)[0x53] != 4) { blend_moby_animation(moby, 4, 4, 4); } - moby->state = 0xD; + moby->state = SHARKIGATOR_HIT_ANIMATION_RECOVERY; break; case HIT_REACTION_NO_ANIMATION_RESPONSE: break; @@ -462,7 +482,7 @@ void handle_sharkigator_hit(struct Moby *moby, char *x, float *hp) { FUN_L00_00257470(moby, 0, -1); x[0x67] = 0x78; trooper_anim_update(moby, (short *)(x + 0x60)); - moby->state = 0xE; + moby->state = SHARKIGATOR_DEATH_FALL_AND_REMOVE; } else { *hp -= *(float *)(hit_record + 0x2C); ((unsigned char *)x)[0x67] = 0xFA; @@ -762,23 +782,9 @@ int test_other_group_moby_state_range(unsigned char *moby, int lower, int upper) /* Moby class 1059 */ void sharkigator_update(unsigned char *moby) { enum { - SHARKIGATOR_INITIALIZE = 0, - SHARKIGATOR_SWIM_IDLE = 1, - SHARKIGATOR_SWIM_WANDER = 2, - SHARKIGATOR_TARGET_PURSUIT = 4, - SHARKIGATOR_TARGET_LUNGE_INTERPOLATION = 5, - SHARKIGATOR_POST_LUNGE_PATH_FOLLOW = 6, - SHARKIGATOR_GRAVITY_IDLE = 7, - SHARKIGATOR_GRAVITY_WANDER = 8, - SHARKIGATOR_TARGET_APPROACH = 9, - SHARKIGATOR_TARGET_CONTACT_ATTACK = 10, - SHARKIGATOR_TARGET_CONTACT_RECOIL_RECOVERY = 11, - SHARKIGATOR_HIT_KNOCKBACK_RECOVERY = 12, - SHARKIGATOR_HIT_ANIMATION_RECOVERY = 13, - SHARKIGATOR_DEATH_FALL_AND_REMOVE = 14, - SHARKIGATOR_SMALL_WATER_GAP_GRAVITY_IDLE = 15, - SHARKIGATOR_DAMPED_GRAVITY_RECOVERY = 16, - SHARKIGATOR_DAMPED_RECOVERY = 17 + WALKER_TARGET_HERO = 0, + WALKER_TARGET_NONE = 2, + SHARKIGATOR_WATER_GAP_TRANSITION_NONE = 0xFF }; char *sharkigator_instance_vars; struct WalkerTarget target; @@ -829,14 +835,14 @@ void sharkigator_update(unsigned char *moby) { qcopy(&target.q10, hero + 0x10); qcopy(&target.q20, hero + 0x40); qcopy(&target.q30, hero + 0x50); - target.kind = 0; + target.kind = WALKER_TARGET_HERO; } else { target.moby = 0; qzero(&target.pos); qzero(&target.q10); qzero(&target.q30); qzero(&target.q20); - target.kind = 2; + target.kind = WALKER_TARGET_NONE; } } if (*(int *)(sharkigator_instance_vars + 0x110) != 0) { @@ -844,7 +850,7 @@ void sharkigator_update(unsigned char *moby) { FUN_L00_00259740(moby + 0x10, path + 0x10, *(int *)path); } old_command = moby[0xBC]; - next_state = 0xFF; + next_state = SHARKIGATOR_WATER_GAP_TRANSITION_NONE; next_sequence = 0xFF; moby[0xBC] = classify_sharkigator_water_height_gap((char *)moby, sharkigator_instance_vars); command = moby[0xBC]; @@ -935,7 +941,7 @@ void sharkigator_update(unsigned char *moby) { frame_time_sq * 15.0f, frame_time_sq * 50.0f, frame_time * 8.0f); - if (next_state != 0xFF) { + if (next_state != SHARKIGATOR_WATER_GAP_TRANSITION_NONE) { if (moby[0x53] != next_sequence) { blend_moby_animation(moby, next_sequence, 0, 6); } @@ -1007,7 +1013,7 @@ void sharkigator_update(unsigned char *moby) { frame_time_sq * 15.0f, frame_time_sq * 50.0f, frame_time * 8.0f); - if (next_state != 0xFF) { + if (next_state != SHARKIGATOR_WATER_GAP_TRANSITION_NONE) { if (moby[0x53] != next_sequence) { blend_moby_animation(moby, next_sequence, 0, 6); } @@ -1078,7 +1084,7 @@ void sharkigator_update(unsigned char *moby) { } moby[0x20] = 2; } - if (next_state != 0xFF) { + if (next_state != SHARKIGATOR_WATER_GAP_TRANSITION_NONE) { if (moby[0x53] != next_sequence) { blend_moby_animation(moby, next_sequence, 0, 6); } @@ -1171,7 +1177,7 @@ void sharkigator_update(unsigned char *moby) { if ((moby[0x70] & 2) && moby[0x53] != 1) { blend_moby_animation(moby, 1, 0, 10); } - if (next_state != 0xFF) { + if (next_state != SHARKIGATOR_WATER_GAP_TRANSITION_NONE) { if (moby[0x53] != next_sequence) { blend_moby_animation(moby, next_sequence, 0, 6); } @@ -1202,7 +1208,7 @@ void sharkigator_update(unsigned char *moby) { fast_vec_scale( sharkigator_instance_vars + 0xD0, sharkigator_instance_vars + 0xD0, 0.5f); } - if (next_state != 0xFF) { + if (next_state != SHARKIGATOR_WATER_GAP_TRANSITION_NONE) { if (moby[0x53] != next_sequence) { blend_moby_animation(moby, next_sequence, 0, 6); } @@ -1263,7 +1269,7 @@ void sharkigator_update(unsigned char *moby) { fast_vec_scale( sharkigator_instance_vars + 0xD0, sharkigator_instance_vars + 0xD0, 0.5f); } - if (next_state != 0xFF) { + if (next_state != SHARKIGATOR_WATER_GAP_TRANSITION_NONE) { if (moby[0x53] != next_sequence) { blend_moby_animation(moby, next_sequence, 0, 6); } @@ -1331,7 +1337,7 @@ void sharkigator_update(unsigned char *moby) { *(int *)(sharkigator_instance_vars + 0x134) = rand() % 200 + 300; moby[0x20] = 8; } - if (next_state != 0xFF) { + if (next_state != SHARKIGATOR_WATER_GAP_TRANSITION_NONE) { if (moby[0x53] != next_sequence) { blend_moby_animation(moby, next_sequence, 0, 6); } @@ -1399,7 +1405,7 @@ void sharkigator_update(unsigned char *moby) { F(sharkigator_instance_vars, 0xD8) -= frame_time * 9.8f; move_moby_with_collision_integer_radius( (int)moby, (int)(sharkigator_instance_vars + 0xD0), 0x400, 0x10, 1.0f, 0.0f); - if (next_state != 0xFF) { + if (next_state != SHARKIGATOR_WATER_GAP_TRANSITION_NONE) { if (moby[0x53] != next_sequence) { blend_moby_animation(moby, next_sequence, 0, 6); } diff --git a/src/overlays/l07/mobys/sliding_gate.c b/src/overlays/l07/mobys/sliding_gate.c index 3e27b825b4..732185b523 100644 --- a/src/overlays/l07/mobys/sliding_gate.c +++ b/src/overlays/l07/mobys/sliding_gate.c @@ -68,7 +68,7 @@ void sliding_gate_update(struct Moby *moby) { qcopy(&offset_motion->home, &moby->pos); if (offset_motion->indicator != -1) D_L07_00184528[offset_motion->indicator] = 0; - moby->state = 1; + moby->state = MOVING_MOBY_WAIT_AT_HOME; offset_motion->home.w = 0; return; case MOVING_MOBY_WAIT_AT_HOME: @@ -86,7 +86,7 @@ void sliding_gate_update(struct Moby *moby) { offset_motion->home.w = fast_vec_length(&offset_vector); if (offset_motion->startSound != -1) allocate_voice_for_target_entry(offset_motion->startSound, 0, moby); - moby->state = 2; + moby->state = MOVING_MOBY_MOVE_TO_OFFSET; break; case MOVING_MOBY_MOVE_TO_OFFSET: if (force_start || @@ -95,7 +95,7 @@ void sliding_gate_update(struct Moby *moby) { target->state != 0xfd && target->state == offset_motion->shutState)) { if (offset_motion->startSound != -1) allocate_voice_for_target_entry(offset_motion->startSound, 0, moby); - moby->state = 4; + moby->state = MOVING_MOBY_RETURN_HOME; break; } start.q = 0; @@ -114,7 +114,7 @@ void sliding_gate_update(struct Moby *moby) { offset_motion->home.w = 0; if (offset_motion->indicator != -1) D_L07_00184528[offset_motion->indicator] = 1; - moby->state = 3; + moby->state = MOVING_MOBY_WAIT_AT_OFFSET; if (offset_motion->endSound != -1) allocate_voice_for_target_entry(offset_motion->startSound, 0, moby); return; @@ -127,7 +127,7 @@ void sliding_gate_update(struct Moby *moby) { offset_motion->home.w = 0; if (offset_motion->startSound != -1) allocate_voice_for_target_entry(offset_motion->startSound, 0, moby); - moby->state = 4; + moby->state = MOVING_MOBY_RETURN_HOME; break; case MOVING_MOBY_RETURN_HOME: if (!force_start && @@ -136,7 +136,7 @@ void sliding_gate_update(struct Moby *moby) { target->state == 0xfd || target->state == offset_motion->openState)) { if (offset_motion->startSound != -1) allocate_voice_for_target_entry(offset_motion->startSound, 0, moby); - moby->state = 2; + moby->state = MOVING_MOBY_MOVE_TO_OFFSET; break; } start.q = 0; @@ -157,7 +157,7 @@ void sliding_gate_update(struct Moby *moby) { allocate_voice_for_target_entry(offset_motion->endSound, 0, moby); if (offset_motion->indicator != -1) D_L07_00184528[offset_motion->indicator] = 0; - moby->state = 1; + moby->state = MOVING_MOBY_WAIT_AT_HOME; break; case 5: break; diff --git a/src/overlays/l07/mobys/snagglebeast.c b/src/overlays/l07/mobys/snagglebeast.c index fa130dacd2..4da29cc31a 100644 --- a/src/overlays/l07/mobys/snagglebeast.c +++ b/src/overlays/l07/mobys/snagglebeast.c @@ -42,6 +42,26 @@ #include "rnc/overlay/shared/math/split_float_fraction.h" /* Ported from rac1-decomp (src/overlays/l07_umbris/effect_00313D28.c: func_L07_00313D28). */ +enum { + SNAGGLEBEAST_INITIALIZE = 0, + SNAGGLEBEAST_IDLE = 1, + SNAGGLEBEAST_ALTERNATING_JOINT_EMISSION_BURST = 2, + SNAGGLEBEAST_TRIPLE_SPAWN_ATTACK = 3, + SNAGGLEBEAST_SWEEP_BEAM_ATTACK = 4, + SNAGGLEBEAST_CHASE_TARGET = 5, + SNAGGLEBEAST_CHASE_AFTER_TRANSFORM_RESTORE = 6, + SNAGGLEBEAST_TURN_TOWARD_TARGET = 7, + SNAGGLEBEAST_CAPTURE_HERO_AND_DRAIN_AMMO = 8, + SNAGGLEBEAST_ROPE_ATTACK = 9, + SNAGGLEBEAST_DEATH_EXPLOSION = 10, + SNAGGLEBEAST_WAIT_AFTER_HEALTH_THRESHOLD_HIT = 11, + SNAGGLEBEAST_START_TIMED_DAMAGE_SEQUENCE = 12, + SNAGGLEBEAST_WAIT_BEFORE_TIMED_DAMAGE = 13, + SNAGGLEBEAST_APPLY_TIMED_DAMAGE_AND_SELECT_PATH = 14, + SNAGGLEBEAST_RESTORE_TRANSFORM_AND_RESUME_CHASE = 15, + SNAGGLEBEAST_POST_DEATH_CLEANUP = 16 +}; + extern s32 level_frame_count __asm__("D_L07_0015F5CC"); /* [4] is depth_buffer_address. */ @@ -652,7 +672,7 @@ struct ChaserTarget { extern s32 level_frame_count_lui __asm__("D_L07_0015F5CC"); extern float D_0015ED6C; extern struct ChaserTarget D_L07_00173EC0; -extern int FUN_L00_00259028(struct Moby *, void *, int, void *); +extern int step_mover_2e3f20(struct Moby *, void *, int, void *) __asm__("FUN_L00_00259028"); extern int probe_vertical_ground_collision(void *, struct Moby *, int, float, float) __asm__("FUN_L00_002583f0"); int update_snagglebeast_chase_movement(struct Moby *chaser_moby, struct ChaserVars *chaser_vars, @@ -674,7 +694,7 @@ int update_snagglebeast_chase_movement( path = D_L07_001B0530[chaser_vars->path]; if (range < goal_distance) { navigation_result = - FUN_L00_00259028(chaser_moby, chaser_vars->nav, mode, chaser_vars->navOut); + step_mover_2e3f20(chaser_moby, chaser_vars->nav, mode, chaser_vars->navOut); if (navigation_result == 2) { fast_vec_sub( position_delta, @@ -788,7 +808,7 @@ int start_snagglebeast_turn_toward_target(unsigned char *moby, blend_moby_animation(moby, 0xE, r, random_int_between(0xF, 0x14)); } } - MOBY(moby)->state = 7; + MOBY(moby)->state = SNAGGLEBEAST_TURN_TOWARD_TARGET; return 1; } return 0; @@ -946,25 +966,6 @@ void snagglebeast_update(unsigned char *moby) __asm__("FUN_L07_00314150" /* Moby class 1106 */ void snagglebeast_update(unsigned char *moby) { - enum { - SNAGGLEBEAST_INITIALIZE = 0, - SNAGGLEBEAST_IDLE = 1, - SNAGGLEBEAST_ALTERNATING_JOINT_EMISSION_BURST = 2, - SNAGGLEBEAST_TRIPLE_SPAWN_ATTACK = 3, - SNAGGLEBEAST_SWEEP_BEAM_ATTACK = 4, - SNAGGLEBEAST_CHASE_TARGET = 5, - SNAGGLEBEAST_CHASE_AFTER_TRANSFORM_RESTORE = 6, - SNAGGLEBEAST_TURN_TOWARD_TARGET = 7, - SNAGGLEBEAST_CAPTURE_HERO_AND_DRAIN_AMMO = 8, - SNAGGLEBEAST_ROPE_ATTACK = 9, - SNAGGLEBEAST_DEATH_EXPLOSION = 10, - SNAGGLEBEAST_WAIT_AFTER_HEALTH_THRESHOLD_HIT = 11, - SNAGGLEBEAST_START_TIMED_DAMAGE_SEQUENCE = 12, - SNAGGLEBEAST_WAIT_BEFORE_TIMED_DAMAGE = 13, - SNAGGLEBEAST_APPLY_TIMED_DAMAGE_AND_SELECT_PATH = 14, - SNAGGLEBEAST_RESTORE_TRANSFORM_AND_RESUME_CHASE = 15, - SNAGGLEBEAST_POST_DEATH_CLEANUP = 16 - }; enum { SNAGGLEBEAST_ROPE_START_ATTACK_ANIMATION = 0, SNAGGLEBEAST_ROPE_WAIT_FOR_ORIGIN_FRAME = 1, @@ -1761,14 +1762,14 @@ void snagglebeast_update(unsigned char *moby) { 0x78); if (*(int *)(linked_moby_vars + 0x28) != -1 && *(int *)(paired_linked_moby_vars + 0x28) != -1) { - float d1 = vector_distance_xy( + float hero_to_linked_cuboid_distance = vector_distance_xy( ((char *)&hero) + 0x80, (char *)l07_cuboids + (*(int *)(linked_moby_vars + 0x28) << 7) + 0x30); int sel; if (vector_distance_xy(((char *)&hero) + 0x80, (char *)l07_cuboids + (*(int *)(paired_linked_moby_vars + 0x28) << 7) + - 0x30) < d1) { + 0x30) < hero_to_linked_cuboid_distance) { sel = *(int *)(paired_linked_moby_vars + 0x28); k = k2; } else { @@ -1880,12 +1881,12 @@ void snagglebeast_update(unsigned char *moby) { snagglebeast_instance_state->navigation_mask &= 0xFD; break; case SNAGGLEBEAST_PATH_SELECT_FARTHER_PAIRED_POINT: { - float d1 = vector_distance_xy( + float hero_to_first_paired_path_point_distance = vector_distance_xy( ((char *)&hero) + 0x80, D_L07_001B0530[snagglebeast_instance_state->path_1A0] + 0x30); if (vector_distance_xy(((char *)&hero) + 0x80, D_L07_001B0530[snagglebeast_instance_state->path_1A0] + - 0x40) < d1) { + 0x40) < hero_to_first_paired_path_point_distance) { qcopy(snagglebeast_instance_state->unk120, D_L07_001B0530[snagglebeast_instance_state->path_1A0] + 0x30); } else { @@ -2057,7 +2058,7 @@ void snagglebeast_update(unsigned char *moby) { char *path = D_L07_001B0530[snagglebeast_instance_state->measured_path]; int pidx = 0; float pfrac = 0.0f; - float d1; + float hero_to_sample_distance; float moby_to_sample_distance; pidx = select_point_index_by_distance(((char *)&hero) + 0x80, path, 0.0f); @@ -2069,9 +2070,11 @@ void snagglebeast_update(unsigned char *moby) { &pfrac, snagglebeast_instance_state->unk1AC, 1); - d1 = vector_distance_xy(((char *)&hero) + 0x80, &start); + hero_to_sample_distance = + vector_distance_xy(((char *)&hero) + 0x80, &start); moby_to_sample_distance = vector_distance_xy(moby + 0x10, &start); - } while (d1 < 8.0f || moby_to_sample_distance < 12.0f); + } while (hero_to_sample_distance < 8.0f || + moby_to_sample_distance < 12.0f); add_random_xy_offset((float *)&start, 0.5f); fast_vec_sub(&direction, &start, ((char *)&hero) + 0x80); zv = start.f[2]; diff --git a/src/overlays/l07/mobys/snagglebeast_effects.c b/src/overlays/l07/mobys/snagglebeast_effects.c index 25999c4aaa..1e14191330 100644 --- a/src/overlays/l07/mobys/snagglebeast_effects.c +++ b/src/overlays/l07/mobys/snagglebeast_effects.c @@ -15,7 +15,7 @@ #include "rnc/overlay/shared/rendering/effects/spawn_explosion.h" /* Ported from rac1-decomp (src/overlays/l07_umbris/vendor_002CE470.c: func_L07_0030E820), where it is exact; names translated to the US level program. */ -extern char D_L07_00166E40[]; +extern char debris_far_point[] __asm__("D_L07_00166E40"); extern void moby_point_position(void *, int, void *) __asm__("FUN_L00_0024f7c8"); /* Ported from rac1-decomp (src/overlays/l07_umbris/vendor_002CE470.c: func_L07_003134B8), where it is exact; names translated to the US level program. */ @@ -150,11 +150,11 @@ void configure_timed_point_light(float radius, } void rumble_by_distance(char *moby) { - float distance = fast_vec_dist(moby + 0x10, D_L07_00166E40); + float distance = fast_vec_dist(moby + 0x10, debris_far_point); char *state; if (distance > 80.0f) distance = 80.0f; - state = D_L07_00166E40 - 0x140; + state = debris_far_point - 0x140; *(int *)(state + 0x168) = 0x14; *(float *)(state + 0x160) = ((80.0f - distance) / 80.0f) * 0.1f; } diff --git a/src/overlays/l07/mobys/swing_gate.c b/src/overlays/l07/mobys/swing_gate.c index 4c21de3ed5..fffe588966 100644 --- a/src/overlays/l07/mobys/swing_gate.c +++ b/src/overlays/l07/mobys/swing_gate.c @@ -42,7 +42,7 @@ void swing_gate_update(struct Moby *moby) { switch (moby->state) { case SWING_GATE_INITIALIZE: moby->rot.y = 0; - moby->state = 1; + moby->state = SWING_GATE_WAIT_FOR_OPEN_CONDITION; gate_motion->vel = 0; break; case SWING_GATE_WAIT_FOR_OPEN_CONDITION: @@ -53,7 +53,7 @@ void swing_gate_update(struct Moby *moby) { gate_motion->vel = gate_motion->speed * frame_time; moby->rot.y = gate_motion->vel; allocate_voice_for_target_entry(0, 0, moby); - moby->state = 3; + moby->state = SWING_GATE_SWINGING; break; case SWING_GATE_HOLD_ROTATION: break; @@ -67,14 +67,14 @@ void swing_gate_update(struct Moby *moby) { break; if (target->state != gate_motion->shutState) return; - moby->state = 4; + moby->state = SWING_GATE_RETURN_TO_ZERO; break; case SWING_GATE_RETURN_TO_ZERO: if (gate_motion->target == -1 || (target = &D_L07_0015FFD8[gate_motion->target]) == 0 || target->state == 0xFE || target->state == 0xFD || target->state == gate_motion->openState) { allocate_voice_for_target_entry(0, 0, moby); - moby->state = 2; + moby->state = SWING_GATE_HOLD_ROTATION; break; } updated_y_rotation = fast_subtract_rotations(moby->rot.y, gate_motion->rate); @@ -82,7 +82,7 @@ void swing_gate_update(struct Moby *moby) { if (0.0f < updated_y_rotation) { moby->rot.y = 0; gate_motion->vel = 0; - moby->state = 1; + moby->state = SWING_GATE_WAIT_FOR_OPEN_CONDITION; } break; case 5: diff --git a/src/overlays/l07/mobys/taxi_platform.c b/src/overlays/l07/mobys/taxi_platform.c index 758ed3a483..4ef84d5ba3 100644 --- a/src/overlays/l07/mobys/taxi_platform.c +++ b/src/overlays/l07/mobys/taxi_platform.c @@ -40,6 +40,10 @@ s32 allocate_voice_for_target_entry(s32 entry_index, /* Moby class 38 */ void taxi_platform_update(unsigned char *moby) { + enum { + TAXI_PLATFORM_STATE_UNINITIALIZED = 0, + TAXI_PLATFORM_STATE_INITIALIZED = 1 + }; char *taxi_platform_vars = ((char *)MOBY(moby)->pvars); char *path; float orig[4], delta[4], path_segment_offset[4]; @@ -49,7 +53,7 @@ void taxi_platform_update(unsigned char *moby) { path = D_L07_001B0530[*(int *)(taxi_platform_vars + 0xB4)]; qcopy(orig, moby + 0x10); fast_dec_timer_s16(taxi_platform_vars + 0xBA); - if (MOBY(moby)->state == 0) { + if (MOBY(moby)->state == TAXI_PLATFORM_STATE_UNINITIALIZED) { float f; char *pts; taxi_platform_vars[0x28] = 4; @@ -66,7 +70,7 @@ void taxi_platform_update(unsigned char *moby) { *(short *)(taxi_platform_vars + 0xBA) = 0; *(int *)(taxi_platform_vars + 0xA8) = 0; *(int *)(taxi_platform_vars + 0xBC) = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = TAXI_PLATFORM_STATE_INITIALIZED; MOBY(moby)->update_dist = 0xFF; MOBY(moby)->draw_dist = 0xFF; *(int *)(taxi_platform_vars + 0xC4) = -1; diff --git a/src/overlays/l07/mobys/umbris_scene_progression.c b/src/overlays/l07/mobys/umbris_scene_progression.c index 327988f1c5..b86659c940 100644 --- a/src/overlays/l07/mobys/umbris_scene_progression.c +++ b/src/overlays/l07/mobys/umbris_scene_progression.c @@ -56,6 +56,12 @@ void umbris_scene_progression_update(struct Moby *moby) { CONTROLLER_CLEANUP_LINKED_MOBY = 12, CONTROLLER_DELETE_SELF = 13 }; + enum { + SCENE_STATE_IDLE = 0, + SCENE_STATE_ACTIVE = 2, + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xFD, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xFE + }; Class436Vars *scene_controller_vars = (Class436Vars *)moby->pvars; float linked_moby_to_hero_offset[4]; @@ -65,24 +71,24 @@ void umbris_scene_progression_update(struct Moby *moby) { mark_moby_for_removal( &((struct Moby *)level_mobys)[scene_controller_vars->removed_moby]); } - if (scene_state == 0) - moby->state = 1; + if (scene_state == SCENE_STATE_IDLE) + moby->state = CONTROLLER_START_INITIAL_SCENE; break; case CONTROLLER_START_INITIAL_SCENE: if (alternate_item_available[0x28] == 0) { alternate_item_available[0x28] = 1; - moby->state = 2; + moby->state = CONTROLLER_WAIT_FOR_INITIAL_SCENE; start_scene(0); } else { - moby->state = 3; + moby->state = CONTROLLER_ADVANCE_TO_OPEN_VOLUME_WAIT; } break; case CONTROLLER_WAIT_FOR_INITIAL_SCENE: - if (scene_state != 2) - moby->state = 3; + if (scene_state != SCENE_STATE_ACTIVE) + moby->state = CONTROLLER_ADVANCE_TO_OPEN_VOLUME_WAIT; break; case CONTROLLER_ADVANCE_TO_OPEN_VOLUME_WAIT: - moby->state = 4; + moby->state = CONTROLLER_WAIT_FOR_OPEN_VOLUME; break; case CONTROLLER_WAIT_FOR_OPEN_VOLUME: if (alternate_item_available[0x29] == 0) { @@ -100,32 +106,33 @@ void umbris_scene_progression_update(struct Moby *moby) { &((struct Moby *)level_mobys)[scene_controller_vars->moby_14]; e->flags |= 0x41; } - moby->state = 5; + moby->state = CONTROLLER_WAIT_FOR_FIRST_OPEN_SCENE; start_scene(1); } } else { - moby->state = 8; + moby->state = CONTROLLER_WAIT_FOR_FINISH_VOLUME; } } else { - moby->state = 7; + moby->state = CONTROLLER_CLEAR_LINKED_MOBY_FLAGS; } - if (moby->state != 4 && scene_controller_vars->removed_moby != -1) { + if (moby->state != CONTROLLER_WAIT_FOR_OPEN_VOLUME && + scene_controller_vars->removed_moby != -1) { mark_moby_for_removal( &((struct Moby *)level_mobys)[scene_controller_vars->removed_moby]); } break; case CONTROLLER_WAIT_FOR_FIRST_OPEN_SCENE: - if (scene_state == 2) + if (scene_state == SCENE_STATE_ACTIVE) break; if (scene_controller_vars->moby_0c != -1) { struct Moby *e = &((struct Moby *)level_mobys)[scene_controller_vars->moby_0c]; e->flags |= 0x41; } - moby->state = 6; + moby->state = CONTROLLER_WAIT_FOR_SECOND_OPEN_SCENE; start_scene(2); break; case CONTROLLER_WAIT_FOR_SECOND_OPEN_SCENE: - if (scene_state == 2) + if (scene_state == SCENE_STATE_ACTIVE) break; if (scene_controller_vars->points_18 != -1) { set_race_camera(&l07_cuboids[scene_controller_vars->points_18].pos, @@ -133,7 +140,7 @@ void umbris_scene_progression_update(struct Moby *moby) { 0, 1); } - moby->state = 7; + moby->state = CONTROLLER_CLEAR_LINKED_MOBY_FLAGS; break; case CONTROLLER_CLEAR_LINKED_MOBY_FLAGS: if (scene_controller_vars->moby_0c != -1) { @@ -145,14 +152,15 @@ void umbris_scene_progression_update(struct Moby *moby) { e->flags &= 0xFFBE; } request_music_track(2, 4); - moby->state = 8; + moby->state = CONTROLLER_WAIT_FOR_FINISH_VOLUME; break; case CONTROLLER_WAIT_FOR_FINISH_VOLUME: if (alternate_item_available[0x2A] == 0) { struct Moby *e; if (scene_controller_vars->moby_0c == -1 || (e = &((struct Moby *)level_mobys)[scene_controller_vars->moby_0c]) == 0 || - e->state == 0xFE || e->state == 0xFD) { + e->state == MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END || + e->state == MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { if (scene_controller_vars->finish_volume != -1) { if (is_point_inside_clip_volume(&hero.motion.pos, scene_controller_vars->finish_volume) != 0) { @@ -161,34 +169,35 @@ void umbris_scene_progression_update(struct Moby *moby) { 0x72, 1); alternate_item_available[0x2A] = 1; - moby->state = 9; + moby->state = CONTROLLER_WAIT_FOR_FINISH_VOLUME_SCENE; start_scene(3); } } else { - moby->state = 13; + moby->state = CONTROLLER_DELETE_SELF; } } } else { - moby->state = 12; + moby->state = CONTROLLER_CLEANUP_LINKED_MOBY; } - if (moby->state != 8 && scene_controller_vars->moby_10 != -1) { + if (moby->state != CONTROLLER_WAIT_FOR_FINISH_VOLUME && + scene_controller_vars->moby_10 != -1) { struct Moby *e = &((struct Moby *)level_mobys)[scene_controller_vars->moby_10]; e->flags |= 0x41; } break; case CONTROLLER_WAIT_FOR_FINISH_VOLUME_SCENE: - if (scene_state == 2) + if (scene_state == SCENE_STATE_ACTIVE) break; - moby->state = 10; + moby->state = CONTROLLER_WAIT_TO_START_FINAL_SCENE; queue_scene_movie_with_game_language(8); break; case CONTROLLER_WAIT_TO_START_FINAL_SCENE: - if (scene_state == 2) + if (scene_state == SCENE_STATE_ACTIVE) break; - moby->state = 11; + moby->state = CONTROLLER_WAIT_FOR_FINAL_SCENE_AND_UNLOCK_PLANET; start_scene(4); case CONTROLLER_WAIT_FOR_FINAL_SCENE_AND_UNLOCK_PLANET: - if (scene_state == 2) + if (scene_state == SCENE_STATE_ACTIVE) break; if (scene_controller_vars->points_1c != -1) { set_race_camera(&l07_cuboids[scene_controller_vars->points_1c].pos, @@ -207,16 +216,17 @@ void umbris_scene_progression_update(struct Moby *moby) { unlock_planet(8); memcard_save_data(0, 8); request_space_load(8); - moby->state = 12; + moby->state = CONTROLLER_CLEANUP_LINKED_MOBY; break; case CONTROLLER_CLEANUP_LINKED_MOBY: if (scene_controller_vars->moby_10 != -1) { struct Moby *e = &((struct Moby *)level_mobys)[scene_controller_vars->moby_10]; - if (e != 0 && e->state != 0xFE && e->state != 0xFD) { + if (e != 0 && e->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + e->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { mark_moby_for_removal(e); } } - moby->state = 13; + moby->state = CONTROLLER_DELETE_SELF; break; case CONTROLLER_DELETE_SELF: mark_moby_for_removal(moby); diff --git a/src/overlays/l07/mobys/water.c b/src/overlays/l07/mobys/water.c index 72b69a3d4b..b8ce1e9bd3 100644 --- a/src/overlays/l07/mobys/water.c +++ b/src/overlays/l07/mobys/water.c @@ -222,15 +222,15 @@ void water_update(Moby_30D8E8 *water_moby) { } } if (water_data->fC != 0) { - water_moby->state = 3; + water_moby->state = WATER_WAIT_FOR_HERO_IN_VOLUME; water_data->timer = scale_game_frames(0x3C); if (water_moby->pos[2] < water_data->lo) { l07_water_grids[water_data->idx].visible_subtiles = 0; } } else if (water_data->f8 != 0) { - water_moby->state = 1; + water_moby->state = WATER_APPROACH_HIGH_HEIGHT; } else { - water_moby->state = 2; + water_moby->state = WATER_APPROACH_LOW_HEIGHT; } break; case WATER_APPROACH_LOW_HEIGHT: @@ -277,19 +277,19 @@ void water_update(Moby_30D8E8 *water_moby) { case WATER_WAIT_BEFORE_RISING: if (fast_dec_timer(&water_data->timer)) { water_data->timer = scale_game_frames(0x708); - water_moby->state = 5; + water_moby->state = WATER_TIMED_RISE; } break; case WATER_TIMED_RISE: water_moby->pos[2] += D_0015ED6C * 0.32f; if (fast_dec_timer(&water_data->timer)) { - water_moby->state = 6; + water_moby->state = WATER_RISE_TO_HEIGHT_54; } break; case WATER_RISE_TO_HEIGHT_54: water_moby->pos[2] += D_0015ED6C * 0.42f; if (water_moby->pos[2] >= 54.0f) { - water_moby->state = 7; + water_moby->state = WATER_REMOVE_ABOVE_HIGH_HEIGHT; } break; case WATER_REMOVE_ABOVE_HIGH_HEIGHT: @@ -311,7 +311,8 @@ void water_update(Moby_30D8E8 *water_moby) { l07_water_grids[water_data->idx].z = water_moby->pos[2]; on = 0.0f; if (water_moby->f94 != 0 && FUN_L01_00275690_2cd2b0(water_moby, 48.0f) != -1) { - if (!(water_moby->state >= 3 && water_moby->state <= 7) || + if (!(water_moby->state >= WATER_WAIT_FOR_HERO_IN_VOLUME && + water_moby->state <= WATER_REMOVE_ABOVE_HIGH_HEIGHT) || (water_moby->pos[2] > water_data->lo && water_moby->pos[2] < water_data->hi)) { on = 1.0f; } diff --git a/src/overlays/l08/hero/hero_set_state.c b/src/overlays/l08/hero/hero_set_state.c index b19e34f4d9..4c7f997d7a 100644 --- a/src/overlays/l08/hero/hero_set_state.c +++ b/src/overlays/l08/hero/hero_set_state.c @@ -68,23 +68,33 @@ extern int hero_set_state(int, int) __asm__("FUN_L08_00230b38"); extern char hero_water_surface_jump_velocity_keys[] __asm__("D_L08_0017C760"); extern char hero_transform_trail_jump_velocity_keys[] __asm__("D_L08_0017C720"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int animation_request_mode) { int previous_state_step; char *moby; int old20A7; float grind_vector_scratch[4]; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || + animation_request_mode != 2)) return 0; } - if ((level_game_mode == 2 || level_game_mode == 6) && b != 2) + if ((level_game_mode == 2 || level_game_mode == 6) && animation_request_mode != 2) return 0; { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -97,11 +107,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -122,14 +132,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); return 1; } @@ -142,7 +152,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; q->rand_timer.range = 0x68; } - if (b) { + if (animation_request_mode) { if (get_hero_idle_animation_index(0) == 0x54) { set_hero_animation( get_hero_idle_animation_index(0), 0, (float)scale_game_frames(0x12)); @@ -158,7 +168,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; clear_u64_value(&p->motion.momentum); p->rand_timer.range = 0x68; - if (b) { + if (animation_request_mode) { if (get_hero_idle_animation_index(0) == 0x54) { set_hero_animation( get_hero_idle_animation_index(0), 0, (float)scale_game_frames(0x12)); @@ -184,7 +194,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (animation_request_mode) set_hero_animation(0x45, 0, (float)scale_game_frames(0xC)); break; } @@ -195,7 +205,7 @@ int hero_set_state(int a, int b) { p->health.hp = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); FUN_L00_0025f730(&p->motion.momentum, frame_time * 3.5f); - if (b) + if (animation_request_mode) set_hero_animation(0x7C, 0, (float)scale_game_frames(0xC)); break; } @@ -211,7 +221,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->unk6A0 = 0; p->unk690 = p->motion.pos.f[2] - p->unk69C; - if (b) + if (animation_request_mode) set_hero_animation(0x74, 0, (float)scale_game_frames(0xB)); break; } @@ -233,7 +243,7 @@ int hero_set_state(int a, int b) { q->rand_timer.range = 0x68; q->unk8E0 = 0; n = scale_game_frames(0xC); - if (b) + if (animation_request_mode) set_hero_animation(0x3B, 0, (float)n); } break; @@ -254,7 +264,7 @@ int hero_set_state(int a, int b) { n = scale_game_frames(0xB); if (p->state.prev == 0x33) n = scale_game_frames(0xF); - if (b) + if (animation_request_mode) set_hero_animation(0x3D, 0, (float)n); break; } @@ -271,7 +281,7 @@ int hero_set_state(int a, int b) { t = -2; if (p->state.prev != 0x35) t = n; - if (b) + if (animation_request_mode) set_hero_animation(0x3C, 0, (float)t); break; } @@ -344,7 +354,7 @@ int hero_set_state(int a, int b) { s->motion.momentum.f[2] = 0.0f; FUN_L00_0025f730(&s->motion.momentum, frame_time * 5.5f); s->rand_timer.range = 0x68; - if (b) + if (animation_request_mode) set_hero_animation(0x3A, 0, (float)scale_game_frames(0x16)); } break; @@ -368,7 +378,7 @@ int hero_set_state(int a, int b) { int t = scale_game_frames(0x4D); struct Hero *q = &hero; q->invulnerable_frames = t; - if (b) { + if (animation_request_mode) { if (q->state.current == 0x75) { set_hero_animation(0x70, 3, -3.0f); } else { @@ -391,7 +401,7 @@ int hero_set_state(int a, int b) { *(int *)&p->drown_sink_speed = 0; p->unk698 = scale_game_frames(0x2D); p->rand_timer.range = 0x68; - if (b) + if (animation_request_mode) set_hero_animation(0x65, 0, (float)scale_game_frames(0x11)); break; } @@ -431,7 +441,7 @@ int hero_set_state(int a, int b) { v = (char *)&hero.motion.momentum; qcopy(v, v - 0x40); } - if (b) + if (animation_request_mode) set_hero_animation(0x5F, 0, (float)scale_game_frames(0xA)); break; } @@ -442,7 +452,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->health.hp = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (animation_request_mode) set_hero_animation(0x80, 0, (float)scale_game_frames(0xA)); break; } @@ -454,7 +464,7 @@ int hero_set_state(int a, int b) { *(int *)&D_L08_0015F688 = scale_game_frames(0x3C); if (p->unk20AA == 0) { t = get_hero_idle_animation_index(1); - if (p->moby->prev_seq != t && b) { + if (p->moby->prev_seq != t && animation_request_mode) { set_hero_animation(t, 0, (float)scale_game_frames(0x12)); } } @@ -546,7 +556,7 @@ int hero_set_state(int a, int b) { scale_game_frames(5) < u->rail_land_frames) n = scale_game_frames(0xD); } - if (b) { + if (animation_request_mode) { struct Hero *v = &hero; set_hero_animation(v->state.step + 3, D_L08_0015F6D8[v->state.step], (float)n); } @@ -558,7 +568,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 1; p->unk2284 = 0; - if (b) { + if (animation_request_mode) { if (p->state.prev == 4) { set_hero_animation(0x5E, 2, (float)scale_game_frames(5)); } else { @@ -573,14 +583,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); - if (b) { + if (animation_request_mode) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L08_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -594,7 +604,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; fill_transfer_words((char *)p + 0x9D0, 0, 0x20); qcopy(&p->motion.momentum, &p->motion.displacement); - if (b) + if (animation_request_mode) set_hero_animation(0x64, 0, (float)scale_game_frames(0xF)); break; } @@ -616,7 +626,7 @@ int hero_set_state(int a, int b) { } return 0; } - if (b) { + if (animation_request_mode) { struct Hero *q = &hero; float d = q->anim_frame; int id = 6; @@ -633,7 +643,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = gravity_length_xy((float *)v); qcopy(&p->motion.momentum, v); - if (b) { + if (animation_request_mode) { int id = 6; float d = p->anim_frame; if (return_hero_animation_id_unchanged(MOBY(moby)->seq) == 4 && 3.0f < d && d < 16.0f) @@ -660,7 +670,7 @@ int hero_set_state(int a, int b) { FUN_L00_0025f730(&q->motion.momentum, frame_time * 7.0f); if (frame_time * 3.5f < q->motion.forward_speed) allocate_hero_voice_for_entry(0xC, 0); - if (b) { + if (animation_request_mode) { if (q->moby->seq == get_hero_idle_animation_index(0)) { set_hero_animation(0xD, 2, (float)scale_game_frames(9)); } else { @@ -687,7 +697,7 @@ int hero_set_state(int a, int b) { } p->motion.move_yaw = fast_arc_tan(p->grapple_target->pos.x - p->motion.pos.f[0], p->grapple_target->pos.y - p->motion.pos.f[1]); - if (b) { + if (animation_request_mode) { set_hero_animation(0x2F, 2, (float)scale_game_frames(5)); hero_queue_sequence(0xA, 0xE); } @@ -700,7 +710,7 @@ int hero_set_state(int a, int b) { *(int *)&p->grapple_pull_speed = 0; p->grapple_pull_ending = 0; p->item_use_locked = 1; - if (b) + if (animation_request_mode) set_hero_animation(0x30, 1, (float)scale_game_frames(0xA)); break; } @@ -712,7 +722,7 @@ int hero_set_state(int a, int b) { *(int *)&p->grapple_pull_speed = 0; p->grapple_pull_ending = 0; p->tether_radius = fast_vec_dist(&p->motion.pos, &p->grapple_target->pos); - if (b) + if (animation_request_mode) set_hero_animation(0x30, 1, (float)scale_game_frames(5)); break; } @@ -768,7 +778,7 @@ int hero_set_state(int a, int b) { } else if (q->state.prev_control_mode == 2) { q->swing_gravity = q->fall_state_gravity; } - if (b) { + if (animation_request_mode) { set_hero_animation(0x34, 0, (float)scale_game_frames(0xB)); { struct Hero *r = &hero; @@ -784,7 +794,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 7; clear_u64_value(&p->motion.rot_spring_vel); qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_request_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xF)); break; } @@ -796,7 +806,7 @@ int hero_set_state(int a, int b) { *(int *)&p->past_apex = 0; p->rise_fall_land_frames = 0; p->rise_fall_gravity = frame_time_sq * 100.0f; - if (b) + if (animation_request_mode) set_hero_animation(0x2A, 0, (float)scale_game_frames(6)); break; } @@ -846,7 +856,7 @@ int hero_set_state(int a, int b) { } } } - if (b) { + if (animation_request_mode) { struct Hero *r = &hero; set_hero_animation(r->grind_anim_variant + 0x31, 0, (float)scale_game_frames(6)); } @@ -863,7 +873,7 @@ int hero_set_state(int a, int b) { p->unk4F0 = p->smoothed_ground_z; } p->item_select_blocked = 1; - if (b) { + if (animation_request_mode) { if (frame_time * 3.5f < p->motion.flat_speed) { set_hero_animation(0x20, 0, (float)scale_game_frames(9)); } else { @@ -878,7 +888,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0xD; p->item_select_blocked = 1; p->rand_timer.range = 0x68; - if (b) + if (animation_request_mode) set_hero_animation(0x21, 0, (float)scale_game_frames(6)); break; } @@ -887,7 +897,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (animation_request_mode) set_hero_animation(0x24, 0, (float)scale_game_frames(6)); break; } @@ -896,7 +906,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (animation_request_mode) set_hero_animation(0x25, 0, (float)scale_game_frames(6)); break; } @@ -905,7 +915,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_request_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xC)); break; } @@ -917,7 +927,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -929,7 +939,7 @@ int hero_set_state(int a, int b) { q->rand_timer.range = 0x68; q->state.step = 0; qcopy(&q->motion.velocity, &q->motion.resolved_velocity); - if (b) { + if (animation_request_mode) { if (q->vehicle_mode == 3) { set_hero_animation(6, 0, (float)scale_game_frames(8)); return 1; @@ -955,7 +965,7 @@ int hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) { + if (animation_request_mode) { set_hero_animation(0x13, 0, (float)animation_timing_profile_selector); } break; @@ -970,7 +980,7 @@ int hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.displacement); - if (b) { + if (animation_request_mode) { set_hero_animation(0x13, 0, (float)animation_timing_selector); } break; @@ -1002,7 +1012,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; @@ -1258,7 +1269,7 @@ int hero_set_state(int a, int b) { u->unk4A6 = scale_game_frames(0x55); u->ledge_probe_cooldown = scale_game_frames(0x46); u->velocity_keys_active = 1; - if (pal_mode != 0) { + if (pal_mode != FALSE) { u->unk3D0 = scale_game_frames(0x22); } else { u->unk3D0 = scale_game_frames(0x23); @@ -1321,7 +1332,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; if (q->fall_start_distance == 0.0f) q->fall_start_distance = q->unk430 * 1.5f; - if (b) { + if (animation_request_mode) { int s = q->state.current; if (s == 7) { set_hero_animation(7, 0, (float)scale_game_frames(5)); @@ -1422,7 +1433,7 @@ int hero_set_state(int a, int b) { update_hero_target_heading(8.0f, 1.0471976f, -1.0f); *(int *)&q->slam_descending = 0; q->items[0].timer = 0xA; - if (b) { + if (animation_request_mode) { char *m; int n = scale_game_frames(0xB); if (q->state.prev == 0xB && scale_game_frames(0x2A) > q->state.prev_timer) @@ -1459,7 +1470,7 @@ int hero_set_state(int a, int b) { q->saved_item[0] = 0; update_hero_target_heading(14.0f, 0.5235988f, -1.0f); q->unkA7C = q->unkA7C == 0; - if (b) { + if (animation_request_mode) { int n = scale_game_frames(0xA); if (q->moby->prev_seq == 0x1A) n = scale_game_frames(3); @@ -1474,7 +1485,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; if (((void *)q->items[0].moby) == 0) break; - if (b) { + if (animation_request_mode) { set_hero_animation(0x67, 4, -1.0f); blend_moby_animation(((void *)q->items[0].moby), 3, 4, -1); } @@ -1505,7 +1516,7 @@ int hero_set_state(int a, int b) { r->attack_record = k; } update_hero_target_heading(5.0f, 0.7853982f, 0.7853982f); - if (b) { + if (animation_request_mode) { char *m; int j = 0; int n; @@ -1536,7 +1547,7 @@ int hero_set_state(int a, int b) { } case HERO_STATE_ANIMATION_RECOVERY_WITH_JUMP_CANCEL: { struct Hero *q; - if (b) + if (animation_request_mode) set_hero_animation(0x2C, 7, (float)scale_game_frames(9)); q = &hero; if (q->items[0].item_id == 0xA && ((char *)q->throw_target) != 0) { @@ -1565,7 +1576,7 @@ int hero_set_state(int a, int b) { { struct Hero *q = &hero; int e = D_L08_0017C428[q->attack_record].kind; - if (b) { + if (animation_request_mode) { char *m; int z = e == 0; int n = scale_game_frames(5); @@ -1586,7 +1597,7 @@ int hero_set_state(int a, int b) { } else { p->attack_record = 0; } - if (b) { + if (animation_request_mode) { struct Hero *q = &hero; char *m; int n = scale_game_frames(4); @@ -1602,7 +1613,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0xA; p->unk2284 = 0; p->ground_speed = frame_time * 9.0f; - if (b) { + if (animation_request_mode) { char *m; HeroTableRow2C *e = &D_L08_0017C428[p->attack_record]; int k = e->kind; @@ -1623,7 +1634,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->pushback_yaw = fast_add_rotations(p->motion.rot.f[2], 3.1415927f); p->ground_speed = frame_time * 9.0f; - if (b) + if (animation_request_mode) set_hero_animation(0x29, 5, (float)scale_game_frames(8)); break; } @@ -1645,7 +1656,7 @@ int hero_set_state(int a, int b) { { struct Hero *q = &hero; q->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (animation_request_mode) { set_hero_animation(0x10, 3, -3.0f); q->moby->anim_time = hero_animation_blend_curves[q->anim_blend_curve][(q->anim_blend_step)++]; @@ -1657,7 +1668,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) + if (animation_request_mode) set_hero_animation(0, 0, (float)scale_game_frames(0xE)); break; } @@ -1665,7 +1676,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) { + if (animation_request_mode) { set_hero_animation(4, 0, (float)scale_game_frames(7)); hero_queue_sequence(0xE, 0x22); } @@ -1676,7 +1687,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_request_mode) set_hero_animation(6, 0, (float)scale_game_frames(0xC)); break; } @@ -1687,7 +1698,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_request_mode) set_hero_animation(6, 0, (float)scale_game_frames(7)); break; } @@ -1704,7 +1715,7 @@ int hero_set_state(int a, int b) { if (frame_time * 1.5f < planar_speed) hero_base->ground_speed = frame_time * 1.5f; hero_base->unk3B8 = 0; - if (b) + if (animation_request_mode) set_hero_animation(1, 0, (float)scale_game_frames(8)); } break; @@ -1714,7 +1725,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (animation_request_mode) set_hero_animation(3, 0, (float)scale_game_frames(0xC)); break; } @@ -1727,7 +1738,7 @@ int hero_set_state(int a, int b) { FUN_L00_0025f730(&p->motion.velocity, frame_time * 5.0f); hero_change_health(1); p->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (animation_request_mode) { set_hero_animation(2, 3, -3.0f); p->moby->anim_time = hero_animation_blend_curves[p->anim_blend_curve][(p->anim_blend_step)++]; @@ -1748,7 +1759,7 @@ int hero_set_state(int a, int b) { clear_u64_value(&p->motion.velocity); clear_u64_value(&p->motion.displacement); p->motion.velocity.f[2] = frame_time * 10.0f; - if (b) + if (animation_request_mode) set_hero_animation(0x10, 2, -3.0f); break; } @@ -1800,7 +1811,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->tilt_disabled = 1; p->item_use_locked = 1; - if (b) + if (animation_request_mode) set_hero_animation(get_hero_idle_animation_index(0), 0, -1.0f); break; } @@ -1811,7 +1822,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->item_use_locked = 1; clear_u64_value(&p->motion.velocity); - if (b) + if (animation_request_mode) set_hero_animation(0xB, 0, -1.0f); break; } @@ -1835,7 +1846,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x18; p->item_use_locked = 1; cancel_hero_item_animation(); - if (b) + if (animation_request_mode) set_hero_animation(get_hero_idle_animation_index(0), 0, -1.0f); break; } diff --git a/src/overlays/l08/hero/update_hero_motion_for_current_state.c b/src/overlays/l08/hero/update_hero_motion_for_current_state.c index 1493d8da10..6b6b2907ae 100644 --- a/src/overlays/l08/hero/update_hero_motion_for_current_state.c +++ b/src/overlays/l08/hero/update_hero_motion_for_current_state.c @@ -35,6 +35,12 @@ float absolute_float(float input) __asm__("func_001F99C0"); void apply_hero_ground_type_effects(void) __asm__("FUN_L08_0021d9c0"); void apply_hero_ground_type_effects(void) { + enum { + HERO_GROUND_TYPE_WATER = 0, + HERO_GROUND_TYPE_MAGNET = 2, + HERO_GROUND_TYPE_SINK_TRIGGER = 0xD, + HERO_GROUND_TYPE_FIXED_SHALLOW_WATER = 0xE + }; struct Hero *hero_ptr = &hero; int saved_ground_type; int x; @@ -47,23 +53,23 @@ void apply_hero_ground_type_effects(void) { hero_ptr->unk308 = 0; if (saved_ground_type == -1) return; - if (saved_ground_type == 2) { + if (saved_ground_type == HERO_GROUND_TYPE_MAGNET) { if (hero_ptr->frames_off_ground.s == 0 || hero_ptr->ground_distance < 0.3f) { hero_ptr->on_magnet_ground = 1; - if (hero_ptr->vehicle_mode == 0) { + if (hero_ptr->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { char *item_moby = ((char *)hero_ptr->items[1].moby); if (item_moby != 0 && MOBY(item_moby)->oclass == 0xAD) hero_ptr->unk308 = 1; } } } - if (saved_ground_type == 0xE) { + if (saved_ground_type == HERO_GROUND_TYPE_FIXED_SHALLOW_WATER) { struct Hero *q = &hero; q->base_condition = 1; q->water_depth = 0.2f; q->water_surface_z = q->ground_z.f + 0.2f; } - if (saved_ground_type == 0) { + if (saved_ground_type == HERO_GROUND_TYPE_WATER) { struct Hero *q = &hero; q->water_depth = q->water_surface_z - q->ground_z.f; if (q->water_depth < 0.85f) { @@ -88,7 +94,7 @@ void apply_hero_ground_type_effects(void) { struct Hero *q = &hero; *(char *)&q->selector_11 = 1; } - if (saved_ground_type == 2) { + if (saved_ground_type == HERO_GROUND_TYPE_MAGNET) { struct Hero *q = &hero; *(char *)&q->on_magnet_ground = 1; } @@ -96,7 +102,7 @@ void apply_hero_ground_type_effects(void) { struct Hero *q = &hero; *(char *)&q->selector_4 = 1; } - if (saved_ground_type == 0xD) { + if (saved_ground_type == HERO_GROUND_TYPE_SINK_TRIGGER) { struct Hero *q = &hero; *(char *)&q->selector_13 = 1; } @@ -258,7 +264,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void clip_hero_horizontal_velocity(s32) __asm__("FUN_L01_00232978"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -286,7 +292,7 @@ extern void moby_point_position(struct MobyView *, s32, void *) __asm__("FUN_L00 extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L08_0021c270(f32, f32); @@ -337,7 +343,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L08_0017C5B8; extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); extern s32 is_moby_in_class_range_500_to_540(s32) __asm__("FUN_L00_0025e3b8"); @@ -505,10 +511,10 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -519,11 +525,11 @@ void update_hero_motion_for_current_state(void) { } else { clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -835,7 +841,7 @@ void update_hero_motion_for_current_state(void) { &hero.motion.velocity, hero.ground_speed, hero.motion.rot.f[2], yaw); } else if (hero.state.current == 0x33) { f32 sp = hero.ground_speed * - FUN_L00_00209018(l08_swim_speed_animation_samples, 0x1E) * 5.0f; + vector_length_xyz_cf(l08_swim_speed_animation_samples, 0x1E) * 5.0f; if (hero.state.prev == 0x35 && scale_game_frames(15) > hero.state_timer) { if (sp < frame_time * 4.5f) { sp = frame_time * 4.5f; @@ -966,7 +972,7 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 4.0f, frame_time_sq * 5.0f); { f32 sp = hero.ground_speed * - FUN_L00_00209018(l08_swim_speed_animation_samples, 0x1E) * 5.5f; + vector_length_xyz_cf(l08_swim_speed_animation_samples, 0x1E) * 5.5f; hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[2] = 0.0f; @@ -998,11 +1004,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && MV(hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -1020,11 +1027,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (MV(hero.grapple_target) != NULL) { hero.motion.move_yaw = @@ -1192,13 +1200,13 @@ void update_hero_motion_for_current_state(void) { if (vector_distance_xy(&hero.motion.pos, &MV(hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&movement_vector_scratch, &hero.motion.pos, &MV(hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1312,7 +1320,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1398,7 +1407,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1444,7 +1454,7 @@ void update_hero_motion_for_current_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1460,10 +1470,11 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1483,11 +1494,11 @@ void update_hero_motion_for_current_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { attack_target_distance_offset = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { attack_target_distance_offset = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1532,7 +1543,7 @@ void update_hero_motion_for_current_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || MV(hero.melee_target) != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1542,7 +1553,8 @@ void update_hero_motion_for_current_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1556,10 +1568,11 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -1673,11 +1686,12 @@ void update_hero_motion_for_current_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1735,10 +1749,11 @@ void update_hero_motion_for_current_state(void) { hero.air_frames.s = 0; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1832,11 +1847,12 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2394,7 +2410,7 @@ void update_hero_motion_for_current_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2431,7 +2447,8 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2448,7 +2465,8 @@ void update_hero_motion_for_current_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2492,7 +2510,7 @@ void update_hero_motion_for_current_state(void) { clip_hero_horizontal_velocity(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2537,7 +2555,7 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2641,9 +2659,9 @@ void update_hero_motion_for_current_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&vector_and_attack_descriptor_scratch, &hero.motion.pos); - FUN_L00_00233810(&vector_and_attack_descriptor_scratch, - &vector_and_attack_descriptor_scratch, - 0.5f); + add_hero_up_offset(&vector_and_attack_descriptor_scratch, + &vector_and_attack_descriptor_scratch, + 0.5f); qcopy(&v10, &vector_and_attack_descriptor_scratch); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; v10.f[1] += fast_sin(hero.motion.rot.f[2]) * 0.85f; @@ -2678,7 +2696,7 @@ void update_hero_motion_for_current_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2725,7 +2743,7 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -2747,7 +2765,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = D_0015ED6C_a * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = D_0015ED6C_a * 0.9f; } } else { @@ -2758,29 +2776,30 @@ void update_hero_motion_for_current_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { clip_hero_horizontal_velocity(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2793,11 +2812,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -2815,18 +2835,19 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -2834,7 +2855,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -2863,11 +2885,12 @@ void update_hero_motion_for_current_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2884,10 +2907,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l08/hero/update_hero_state_transitions.c b/src/overlays/l08/hero/update_hero_state_transitions.c index 90a492ecf5..e9e754ba1a 100644 --- a/src/overlays/l08/hero/update_hero_state_transitions.c +++ b/src/overlays/l08/hero/update_hero_state_transitions.c @@ -189,9 +189,11 @@ void update_hero_state_transitions(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && D_L08_0015F594 == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -254,7 +256,7 @@ void update_hero_state_transitions(void) { } } if (hero_fatal_fall_z_threshold > hero.motion.pos.f[2] && hero.ground_distance > 2.0f && - hero.vehicle_mode != 2 && hero.state.current != 0x77) { + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { switch (hero.state.current) { @@ -657,7 +659,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -684,7 +686,7 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); break; } @@ -947,7 +949,8 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -2462,7 +2465,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l08/level_class_tables.c b/src/overlays/l08/level_class_tables.c index 287e8b0f5b..6a10a90291 100644 --- a/src/overlays/l08/level_class_tables.c +++ b/src/overlays/l08/level_class_tables.c @@ -19,6 +19,9 @@ #include "rnc/overlay/shared/ui/hud/hud_keep_visible.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -59,7 +62,7 @@ void *D_L08_001FD218[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; struct MobyClassUpdate moby_classes[190] __asm__("D_L08_001FC900") diff --git a/src/overlays/l08/mobys/batalia_bolt_pickup.c b/src/overlays/l08/mobys/batalia_bolt_pickup.c index 3c5e4fa650..9ad9dbfc44 100644 --- a/src/overlays/l08/mobys/batalia_bolt_pickup.c +++ b/src/overlays/l08/mobys/batalia_bolt_pickup.c @@ -248,7 +248,7 @@ void update_batalia_bolt_pickup(struct Moby *moby) { convert_pose_to_reference_local( moby, linked, vars->anchor, vars->v10, vars->v20, vars->v30); } - moby->state = 1; + moby->state = BOLT_PICKUP_WAIT_FOR_HERO; vars->s6C = 0; vars->u70.i = truncate_float_to_s32(random_float_between(0.0f, (float)scale_game_frames(600))); @@ -268,14 +268,14 @@ void update_batalia_bolt_pickup(struct Moby *moby) { &moby->rot_row1, l08_bolt_pickup_detached_fall_spin_speed_degrees * 0.017453292f * frame_time); - moby->state = 4; + moby->state = BOLT_PICKUP_FALL_AND_BOUNCE; break; } } if (absolute_float(moby->pos.z - hero.motion.pos.f[2]) < hero.reach_distance && vector_distance_xy(&moby->pos, hero.motion.pos.f) < hero.reach_height) { vars->timer = scale_game_frames(1); - moby->state = 2; + moby->state = BOLT_PICKUP_TURN_TOWARD_HERO; } if (moby->visible == 0) { if (moby > D_L08_0015FFDC && @@ -363,7 +363,7 @@ void update_batalia_bolt_pickup(struct Moby *moby) { } else { vars->f64 = random_float_between(-30.0f, 30.0f) * deg_to_rad; } - moby->state = 3; + moby->state = BOLT_PICKUP_FLY_TO_HERO_AND_CREDIT_BOLTS; } else { if (scale_game_frames(10) < vars->timer) { float goal_yaw = fast_add_rotations( @@ -578,7 +578,7 @@ void update_batalia_bolt_pickup(struct Moby *moby) { *(u128_4BE8_p *)vars->v10 = *(u128_4BE8_p *)((char *)&hero + 0x90); vars->timer = scale_game_frames(1); - moby->state = 2; + moby->state = BOLT_PICKUP_TURN_TOWARD_HERO; break; } if (coll_sphere(0.25f, &moby->pos, 0x22, moby) != 0) { @@ -620,7 +620,7 @@ void update_batalia_bolt_pickup(struct Moby *moby) { vars->spin_x = fast_subtract_rotations(vars->v30[0], moby->rot.x) * per_frame; vars->spin_y = fast_subtract_rotations(vars->v30[1], moby->rot.y) * per_frame; vars->spin_z = fast_subtract_rotations(vars->v30[2], moby->rot.z) * per_frame; - moby->state = 5; + moby->state = BOLT_PICKUP_RETURN_TO_SURFACE; vars->timer = frames; vars->u7C.i = D_L08_00174658_lui; if (absolute_float(moby->pos.z - hero.motion.pos.f[2]) < hero.reach_distance && @@ -628,7 +628,7 @@ void update_batalia_bolt_pickup(struct Moby *moby) { Vars_4BE8 *vars = (Vars_4BE8 *)moby->pvars; vars->timer = scale_game_frames(1); - moby->state = 2; + moby->state = BOLT_PICKUP_TURN_TOWARD_HERO; } } } @@ -649,11 +649,11 @@ void update_batalia_bolt_pickup(struct Moby *moby) { if (absolute_float(moby->pos.z - hero.motion.pos.f[2]) < hero.reach_distance && vector_distance_xy(&moby->pos, hero.motion.pos.f) < hero.reach_height) { vars->timer = scale_game_frames(1); - moby->state = 2; + moby->state = BOLT_PICKUP_TURN_TOWARD_HERO; break; } if (moby->command != 0) { - moby->state = 1; + moby->state = BOLT_PICKUP_WAIT_FOR_HERO; if (vars->u7C.i != 0) { Vars_4BE8 *vars = (Vars_4BE8 *)moby->pvars; diff --git a/src/overlays/l08/mobys/batalia_cannon.c b/src/overlays/l08/mobys/batalia_cannon.c index 64cf4a06c3..1e65b9fc01 100644 --- a/src/overlays/l08/mobys/batalia_cannon.c +++ b/src/overlays/l08/mobys/batalia_cannon.c @@ -754,7 +754,7 @@ void batalia_cannon_update(Moby *moby) { (*(float(*)[4]) & moby->rot)[1] = 0.0f; moby->command = 2; jet_end_mount(0); - moby->state = 4; + moby->state = CANNON_UNMOUNTED_IDLE; node = (Moby *)(D_L08_0015FFD8 + (cannon_control_vars->platform_index << 8)); qcopy(direction, (*(float(*)[4]) & node->rot)); direction[2] = fast_add_rotations(direction[2], 3.1415927f); @@ -782,15 +782,15 @@ void batalia_cannon_update(Moby *moby) { func_L00_00217718_2E16A0(work, direction, 0, 1); jet_end_mount(0); hero.motion.rot.f[2] = fast_add_rotations(hero.motion.rot.f[2], 3.1415927f); - moby->state = 4; + moby->state = CANNON_UNMOUNTED_IDLE; } else { int *indices; int count; - if (moby->state != 5) { + if (moby->state != CANNON_MOUNTED_CONTROL) { cannon_control_vars->camera_timer = 2; jet_mount((*(float(*)[4]) & moby->pos), (*(float(*)[4]) & moby->rot), 1, 0, 0); } - moby->state = 5; + moby->state = CANNON_MOUNTED_CONTROL; { int waiting = 2, activated = 3; indices = cannon_control_vars->indices; @@ -819,7 +819,7 @@ void batalia_cannon_update(Moby *moby) { Moby *node; int *indices; int count; - moby->state = 4; + moby->state = CANNON_UNMOUNTED_IDLE; cannon_control_vars->health = 200; cannon_control_vars->range = 10.0f; node = create_moby(0x710); @@ -1048,7 +1048,7 @@ void batalia_cannon_update(Moby *moby) { (*(float(*)[4]) & moby->rot)[1] = 0.0f; moby->command = 2; jet_end_mount(0); - moby->state = 4; + moby->state = CANNON_UNMOUNTED_IDLE; node = (Moby *)(D_L08_0015FFD8 + (cannon_control_vars->platform_index << 8)); qcopy(muzzle, (*(float(*)[4]) & node->rot)); @@ -1191,16 +1191,20 @@ void request_batalia_cannon_mount(struct Moby *command_target_moby) { /* Puts the cannon's platform moby back in state 1, leaving with mode 3 (targets cleared, mode 1) * or 4 (cannon destroyed, mode 0); mode -1 respawns the hero instead. */ void set_batalia_cannon_platform_mode(u8 *platform, s32 mode) { + enum { + CANNON_PLATFORM_CANNON_DESTROYED = 0, + CANNON_PLATFORM_TARGETS_CLEARED = 1 + }; u8 *payload; platform[0x20] = 1; payload = *(u8 **)(platform + 0x78); switch (mode) { - case 1: + case CANNON_PLATFORM_TARGETS_CLEARED: payload[8] = 1; *(s16 *)(payload + 0x36) = 3; break; - case 0: + case CANNON_PLATFORM_CANNON_DESTROYED: payload[8] = 1; *(s16 *)(payload + 0x36) = 4; break; diff --git a/src/overlays/l08/mobys/batalia_deserter.c b/src/overlays/l08/mobys/batalia_deserter.c index 4e3bcb3f30..56ed495da7 100644 --- a/src/overlays/l08/mobys/batalia_deserter.c +++ b/src/overlays/l08/mobys/batalia_deserter.c @@ -186,14 +186,14 @@ void batalia_deserter_update(WM *moby) { } deserter_data->f2C = 4.0f; deserter_data->p40 = (void *)batalia_deserter_name_text; - moby->state = 1; + moby->state = DESERTER_WAIT_FOR_PLAYER; if (deserter_data->i64 >= 0) initialize_npc_dialogue(moby, (char *)deserter_data + 0x20); break; case DESERTER_WAIT_FOR_PLAYER: if (vector_distance(moby->position, (char *)&D_0013E633_watch + 0xE9D) < 8.0f) { jet_clear_persistent(((unsigned char *)moby)[0xB0]); - moby->state = 2; + moby->state = DESERTER_UPDATE_DIALOGUE; } break; case DESERTER_UPDATE_DIALOGUE: diff --git a/src/overlays/l08/mobys/batalia_textured_effect.c b/src/overlays/l08/mobys/batalia_textured_effect.c index 6caf935e22..5fac1c94ce 100644 --- a/src/overlays/l08/mobys/batalia_textured_effect.c +++ b/src/overlays/l08/mobys/batalia_textured_effect.c @@ -252,7 +252,7 @@ void batalia_textured_effect_update(struct Moby *moby) { 1); batalia_rgba_tables_initialized = 1; } - moby->state = 1; + moby->state = MOBY_ACTIVE; for (i = 0; i < 3; i++) { D_L08_001F8548[i].a = 0; D_L08_001F8548[i].b = 0; diff --git a/src/overlays/l08/mobys/blarg_bombthrower.c b/src/overlays/l08/mobys/blarg_bombthrower.c index 432d560211..f3d4fd4395 100644 --- a/src/overlays/l08/mobys/blarg_bombthrower.c +++ b/src/overlays/l08/mobys/blarg_bombthrower.c @@ -105,7 +105,7 @@ extern float FUN_L00_0025abf0(void *, void *, void *, float, float); extern int D_L08_001619AC_gp __asm__("D_L08_001619AC") __attribute__((sda)); extern int l08_bombthrower_fade_interpolation_divisor_gp __asm__("D_L08_001619D0") __attribute__((sda)); -extern int FUN_L00_00259028(char *m, char *p, float *pos, char *v); +extern int step_mover_2e3f20(char *m, char *p, float *pos, char *v) __asm__("FUN_L00_00259028"); extern int select_nearest_xy_moby_with_hero_fallback(void *, float, void *) __asm__("FUN_L08_0026a3d0"); extern void FUN_L00_0025a120(void *); @@ -206,6 +206,9 @@ void blarg_bombthrower_update(struct Moby *moby) { BOMBTHROWER_STATE_FALL_RECOVERY = 0x5D, BOMBTHROWER_STATE_DYING = 0x63 }; + enum { + BOMBTHROWER_STATE_FADE_OUT = 100 + }; Data_DBF68 *bombthrower_vars = (Data_DBF68 *)moby->pvars; Look search; float point[4]; @@ -225,12 +228,12 @@ void blarg_bombthrower_update(struct Moby *moby) { moby->shadow_range = 0x17; } } - if (moby->state == 3) { + if (moby->state == BOMBTHROWER_STATE_WAIT_TO_THROW) { moby->flags &= 0xFBFF; } else { moby->flags |= 0x400; } - if (moby->state == 100) { + if (moby->state == BOMBTHROWER_STATE_FADE_OUT) { float duration = convert_integer_to_float(l08_bombthrower_fade_interpolation_divisor_gp); int start_alpha = bombthrower_vars->s132; moby->alpha = truncate_float_to_s32( @@ -243,7 +246,7 @@ void blarg_bombthrower_update(struct Moby *moby) { } resolve_moby_hit_response( moby, find_moby_hit(moby, 0x330000, 0), &bombthrower_vars->health, 0, &hit, &damage, 0, 4); - if (hit != 1 && moby->state != 0x63) { + if (hit != 1 && moby->state != BOMBTHROWER_STATE_DYING) { moby->flags |= 0x1000; bombthrower_vars->health -= damage; if (0.0f < bombthrower_vars->health) { @@ -268,7 +271,7 @@ void blarg_bombthrower_update(struct Moby *moby) { bombthrower_vars->fC0 = 6.0f; bombthrower_vars->fC4 = 10.0f; bombthrower_vars->tint = 0x78; - moby->state = 0x5A; + moby->state = BOMBTHROWER_STATE_DAMAGE_KNOCKBACK; } } else { char *hero_bytes; @@ -291,7 +294,7 @@ void blarg_bombthrower_update(struct Moby *moby) { bombthrower_vars->fC4 = 10.0f; explode_2D5FA8_c(moby, 0, -1); bombthrower_vars->tint = 0xFA; - moby->state = 0x63; + moby->state = BOMBTHROWER_STATE_DYING; moby->flags &= 0xEFFF; bombthrower_vars->waypoint->command = 0; } @@ -324,14 +327,14 @@ void blarg_bombthrower_update(struct Moby *moby) { if (moby->prev_seq != 4) { FUN_00212f90(moby, 4, 0, 0); } - moby->state = 1; + moby->state = BOMBTHROWER_STATE_APPROACH_WAYPOINT; bombthrower_vars->i134 = scale_game_frames(0xF0); break; case BOMBTHROWER_STATE_APPROACH_WAYPOINT: - FUN_L00_00259028((char *)moby, - bombthrower_vars->blkD0, - (float *)&bombthrower_vars->waypoint->pos, - (char *)bombthrower_vars->v40); + step_mover_2e3f20((char *)moby, + bombthrower_vars->blkD0, + (float *)&bombthrower_vars->waypoint->pos, + (char *)bombthrower_vars->v40); if (fast_vec_dist(&moby->pos, &bombthrower_vars->waypoint->pos) < 3.0f) { if (fast_difference_between_rotations( moby->rot.z, @@ -341,7 +344,7 @@ void blarg_bombthrower_update(struct Moby *moby) { if (moby->prev_seq != 5) { FUN_00212f90(moby, 5, 0, 10); } - moby->state = 6; + moby->state = BOMBTHROWER_STATE_MOVE_ONTO_WAYPOINT; break; } bombthrower_vars->i134 = scale_game_frames(0xF0); @@ -370,10 +373,10 @@ void blarg_bombthrower_update(struct Moby *moby) { } break; case BOMBTHROWER_STATE_MOVE_ONTO_WAYPOINT: - FUN_L00_00259028((char *)moby, - bombthrower_vars->blkD0, - (float *)&bombthrower_vars->waypoint->pos, - (char *)bombthrower_vars->v40); + step_mover_2e3f20((char *)moby, + bombthrower_vars->blkD0, + (float *)&bombthrower_vars->waypoint->pos, + (char *)bombthrower_vars->v40); if (moby->anim_flags & 2) { FUN_00212f90(bombthrower_vars->waypoint, 1, 0, scale_game_frames(6)); qcopy(&moby->pos, &bombthrower_vars->waypoint->pos); @@ -381,7 +384,7 @@ void blarg_bombthrower_update(struct Moby *moby) { if (moby->prev_seq != 1) { FUN_00212f90(moby, 1, 0, 10); } - moby->state = 3; + moby->state = BOMBTHROWER_STATE_WAIT_TO_THROW; moby->flags &= 0xEFFF; moby->rot.z = fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y); bombthrower_vars->i128 = scale_game_frames(0x78); @@ -414,7 +417,7 @@ void blarg_bombthrower_update(struct Moby *moby) { if (moby->prev_seq != 2) { FUN_00212f90(moby, 2, 0, scale_game_frames(7)); } - moby->state = 4; + moby->state = BOMBTHROWER_STATE_MOVE_TO_THROW_POSITION; moby->flags |= 0x1000; moby->collision = moby->pclass->collision; break; @@ -425,7 +428,7 @@ void blarg_bombthrower_update(struct Moby *moby) { point[2] = 0.0f; fast_vec_add(point, point, &bombthrower_vars->waypoint->pos); if (0.2f < vector_distance_xy(&moby->pos, point)) { - FUN_L00_00259028( + step_mover_2e3f20( (char *)moby, bombthrower_vars->blkD0, point, (char *)bombthrower_vars->v40); } if (moby->anim_flags & 2) { @@ -446,13 +449,13 @@ void blarg_bombthrower_update(struct Moby *moby) { if (moby->prev_seq != 4) { FUN_00212f90(moby, 4, 0, scale_game_frames(7)); } - moby->state = 1; + moby->state = BOMBTHROWER_STATE_APPROACH_WAYPOINT; bombthrower_vars->i134 = scale_game_frames(0xF0); } else { if (moby->prev_seq != 3) { FUN_00212f90(moby, 3, 0, scale_game_frames(6)); } - moby->state = 5; + moby->state = BOMBTHROWER_STATE_THROW_BOMB; } } break; @@ -498,7 +501,7 @@ void blarg_bombthrower_update(struct Moby *moby) { break; } if (moby->anim_flags & 2) { - moby->state = 1; + moby->state = BOMBTHROWER_STATE_APPROACH_WAYPOINT; if (moby->prev_seq != 4) { FUN_00212f90(moby, 4, 0, 3); } @@ -510,7 +513,7 @@ void blarg_bombthrower_update(struct Moby *moby) { if (moby->prev_seq != 7) { FUN_00212f90(moby, 7, 0, 3); } - moby->state = 0x5D; + moby->state = BOMBTHROWER_STATE_FALL_RECOVERY; } break; case BOMBTHROWER_STATE_DAMAGE_KNOCKBACK: @@ -528,7 +531,7 @@ void blarg_bombthrower_update(struct Moby *moby) { if (moby->prev_seq != 4) { FUN_00212f90(moby, 4, 0, 10); } - moby->state = 1; + moby->state = BOMBTHROWER_STATE_APPROACH_WAYPOINT; bombthrower_vars->i134 = scale_game_frames(0xF0); } if (moby->pos.z < 5.0f) { @@ -539,7 +542,7 @@ void blarg_bombthrower_update(struct Moby *moby) { case BOMBTHROWER_STATE_DYING: if (step_moby_motion(moby, bombthrower_vars->blk70) & 0x40) { moby->anim_speed = 0.0f; - moby->state = 100; + moby->state = BOMBTHROWER_STATE_FADE_OUT; moby->collision = 0; bombthrower_vars->s132 = 0x28; bombthrower_vars->s130 = l08_bombthrower_fade_interpolation_divisor_gp; diff --git a/src/overlays/l08/mobys/bolt_pickup.c b/src/overlays/l08/mobys/bolt_pickup.c index cff558b21b..0cba1d707f 100644 --- a/src/overlays/l08/mobys/bolt_pickup.c +++ b/src/overlays/l08/mobys/bolt_pickup.c @@ -120,15 +120,15 @@ void bolt_pickup_update(Moby_2B94B0 *moby) { int hit, ok, bob_period_ticks; moby_data->ticks++; - if (moby->state != 0) + if (moby->state != MOBY_STATE_INITIALIZE) moby->pos[2] = moby_data->f8; switch (moby->state) { case MOBY_STATE_INITIALIZE: initialize_bolt_pickup(moby); if (moby_data->f2C != 0) - moby->state = 1; + moby->state = MOBY_STATE_PHYSICS_MOVEMENT; else - moby->state = 2; + moby->state = MOBY_STATE_CHECK_COLLECTION; break; case MOBY_STATE_PHYSICS_MOVEMENT: qcopy(P, moby->pos); @@ -170,7 +170,7 @@ void bolt_pickup_update(Moby_2B94B0 *moby) { P[2] = P[2] + bolt_pickup_collision_clearance_distance_gp; if (*(int *)D_L08_001746D8_2B94B0 == 0) { clear_u64_value(moby_data->vel); - moby->state = 2; + moby->state = MOBY_STATE_CHECK_COLLECTION; } } } else { diff --git a/src/overlays/l08/mobys/bolt_thief.c b/src/overlays/l08/mobys/bolt_thief.c index e13ec4a7c8..ee0181c90f 100644 --- a/src/overlays/l08/mobys/bolt_thief.c +++ b/src/overlays/l08/mobys/bolt_thief.c @@ -109,6 +109,13 @@ void bolt_thief_update(struct Moby *moby) { BOLT_THIEF_FACE_HERO = 7, BOLT_THIEF_KNOCKBACK = 8 }; + enum { + BOLT_PICKUP_CONTROLLED_BY_THIEF = 3, + BOLT_PICKUP_COLLECTION_TRIGGERED = 4 + }; + enum { + BOLT_PICKUP_RELEASED_FROM_THIEF = 1 + }; Vec4 point; Vec4 step; BoltThiefVars *bolt_thief_instance_vars; @@ -121,14 +128,14 @@ void bolt_thief_update(struct Moby *moby) { moby->shadow_range = 0x17; } } - if (FUN_L00_0025a420(moby, 0x210000, 0) != 0 && moby->state != 8) { + if (FUN_L00_0025a420(moby, 0x210000, 0) != 0 && moby->state != BOLT_THIEF_KNOCKBACK) { int i; for (i = 0; i < 0x32; i++) { struct Moby *other = bolt_thief_instance_vars->list[i]; - if (other != 0 && other->state == 3) { - other->state = 1; + if (other != 0 && other->state == BOLT_PICKUP_CONTROLLED_BY_THIEF) { + other->state = BOLT_PICKUP_RELEASED_FROM_THIEF; } } { @@ -150,7 +157,7 @@ void bolt_thief_update(struct Moby *moby) { 0); bolt_thief_instance_vars->b67 = 0x78; FUN_L00_00257470(moby, 0, -1); - moby->state = 8; + moby->state = BOLT_THIEF_KNOCKBACK; } moby->hit_slot = 0xFF; switch (moby->state) { @@ -168,7 +175,7 @@ void bolt_thief_update(struct Moby *moby) { bolt_thief_instance_vars->b29 = 0; moby->spawn_frame = *(u64 *)(*(char **)D_001413D0 + 0x38); clear_u64_value(&bolt_thief_instance_vars->v40); - moby->state = 1; + moby->state = BOLT_THIEF_WAIT_FOR_HERO_NEAR_TRIGGER; if (moby->prev_seq != 1) { FUN_00212f90(moby, 1, 0, 0); } @@ -177,7 +184,7 @@ void bolt_thief_update(struct Moby *moby) { qcopy(&point, &l08_paths[bolt_thief_instance_vars->w220]->points[0]); if (fast_vec_dist(hero.motion.pos.f, &point) < 24.0f) { build_bolt_thief_target_list((char *)moby); - moby->state = 5; + moby->state = BOLT_THIEF_FOLLOW_PRIMARY_PATH_TO_EXIT; if (moby->prev_seq != 3) { FUN_00212f90(moby, 3, 0, 6); } @@ -198,7 +205,7 @@ void bolt_thief_update(struct Moby *moby) { path = follower->path; qcopy(&point, &path->points[next]); if (path->points[next].f[3] == 0.0f) { - moby->state = 3; + moby->state = BOLT_THIEF_WAIT_FOR_ANIMATION_BEFORE_PULLING_PICKUPS; if (moby->prev_seq != 2) { FUN_00212f90(moby, 2, 0, 6); } @@ -222,10 +229,10 @@ void bolt_thief_update(struct Moby *moby) { struct Moby *other = bolt_thief_instance_vars->list[i]; if (other != 0 && (signed char)other->state >= 0) { - other->state = 3; + other->state = BOLT_PICKUP_CONTROLLED_BY_THIEF; } } - moby->state = 4; + moby->state = BOLT_THIEF_PULL_PICKUPS_TO_JOINT; if (moby->prev_seq != 6) { FUN_00212f90(moby, 6, 0, 6); } @@ -247,14 +254,14 @@ void bolt_thief_update(struct Moby *moby) { FUN_L00_0025f730(&point, D_0015ED6C * 4.0f); fast_vec_add(&other->pos, &other->pos, &point); if (fast_vec_length(&point) < 2.0f * D_0015ED6C) { - other->state = 4; + other->state = BOLT_PICKUP_COLLECTION_TRIGGERED; bolt_thief_instance_vars->list[i] = 0; bolt_thief_instance_vars->w22C++; } } } if (active_count == 0) { - moby->state = 5; + moby->state = BOLT_THIEF_FOLLOW_PRIMARY_PATH_TO_EXIT; if (moby->prev_seq != 3) { FUN_00212f90(moby, 3, 0, 6); } @@ -295,7 +302,7 @@ void bolt_thief_update(struct Moby *moby) { } if (follower->path->count - 1 == next) { if (bolt_thief_instance_vars->follow[1].path_id >= 0) { - moby->state = 6; + moby->state = BOLT_THIEF_FOLLOW_SECONDARY_PATH; break; } mark_moby_for_removal(moby); @@ -328,7 +335,7 @@ void bolt_thief_update(struct Moby *moby) { follower->point = next; } if (fast_vec_dist(hero.motion.pos.f, &moby->pos) > 19.0f) { - moby->state = 7; + moby->state = BOLT_THIEF_FACE_HERO; } break; } @@ -349,7 +356,7 @@ void bolt_thief_update(struct Moby *moby) { follower = &bolt_thief_instance_vars->follow[1]; next = (follower->point + follower->path->count + follower->direction) % follower->path->count; - moby->state = 6; + moby->state = BOLT_THIEF_FOLLOW_SECONDARY_PATH; if (fast_vec_dist(hero_position, &follower->path->points[next]) < distance) { follower->direction *= -1; } diff --git a/src/overlays/l08/mobys/bomb.c b/src/overlays/l08/mobys/bomb.c index 77cd306f1f..7259628a57 100644 --- a/src/overlays/l08/mobys/bomb.c +++ b/src/overlays/l08/mobys/bomb.c @@ -54,30 +54,29 @@ extern int collision_line(void *, void *, int, void *, int) __asm__ extern int coll_sphere(float, void *, int, void *) __asm__("FUN_L00_001f0d60"); extern int collect_mobies_in_sphere(void *, float, int, void *, void *) __asm__("FUN_L00_001f2868"); float bomb_downward_acceleration_gp __asm__("D_L08_00161860") = 15.0f; -extern void FUN_L00_001ff660_c(void *, void *, void *) __asm__("FUN_L00_001ff660"); -extern void jet_animate(void *, float) __asm__("FUN_L00_00259fe8"); -extern void trooper_anim_update(void *, short *) __asm__("FUN_L00_0025d458"); -extern void trooper_anim_finish(void *, void *) __asm__("FUN_L00_0025d538"); -extern void spawn_explosion(void *, - void *, - void *, - float, - float, - int, - int, - int, - float, - float, - float, - float, - int, - float, - int, - int, - int, - int) __asm__("FUN_L00_0025e450"); -extern void -FUN_L00_00269958_c(void *, void *, int, int, int, int, int, int) __asm__("FUN_L00_00269958"); +extern void FUN_L00_001ff660_c(void *, void *, void *) __asm__("FUN_L00_001ff660"); +extern void jet_animate(void *, float) __asm__("FUN_L00_00259fe8"); +extern void trooper_anim_update(void *, short *) __asm__("FUN_L00_0025d458"); +extern void trooper_anim_finish(void *, void *) __asm__("FUN_L00_0025d538"); +extern void spawn_explosion(void *, + void *, + void *, + float, + float, + int, + int, + int, + float, + float, + float, + float, + int, + float, + int, + int, + int, + int) __asm__("FUN_L00_0025e450"); +extern void spawn_effect(void *, void *, int, int, int, int, int, int) __asm__("FUN_L00_00269958"); extern float D_L08_0015F580_macro[] __asm__("D_L08_0015F580") MACRO_ADDR; void moby_248_update(char *moby) __asm__("FUN_L08_002d23f0"); extern float D_0015ED6C; @@ -125,9 +124,9 @@ void moby_248_update(char *moby) { if (sphere_hit_moby != 0 && (sphere_hit_moby != bomb_vars->unk30 || bomb_vars->unk24 != 0)) { if (!(MOBY(moby)->command & 2)) - MOBY(moby)->state = 0x62; + MOBY(moby)->state = BOMB_STATE_EXPLODE_AND_REMOVE; else - MOBY(moby)->state = 0x63; + MOBY(moby)->state = BOMB_STATE_BURST_AND_REMOVE; qcopy((moby + 0x10), ((char *)D_L08_00174660)); FUN_L00_001ff660_c( &bomb_vars->unk10, &bomb_vars->unk10, ((char *)D_L08_00174660) + 0x20); @@ -155,14 +154,14 @@ void moby_248_update(char *moby) { *(v128_36F8 *)normalized_direction = *(v128_36F8 *)random_direction; fast_vec_normalize(normalized_direction, normalized_direction, D_0015ED6C); selected_table_entry = (int *)table_or_bounce_scratch.b + random_integer_below(4); - FUN_L00_00269958_c((moby + 0x10), - normalized_direction, - *selected_table_entry, - 0x4FFF, - scale_game_frames(0x2D), - 0x32, - 0x78, - 1); + spawn_effect((moby + 0x10), + normalized_direction, + *selected_table_entry, + 0x4FFF, + scale_game_frames(0x2D), + 0x32, + 0x78, + 1); } qcopy(c.r.start, moby + 0x10); collision_z_offset = 0.16f; @@ -182,9 +181,9 @@ void moby_248_update(char *moby) { if (v != 0) { if (v != bomb_vars->unk30 || bomb_vars->unk24 != 0) { if (!(MOBY(moby)->command & 2)) - MOBY(moby)->state = 0x62; + MOBY(moby)->state = BOMB_STATE_EXPLODE_AND_REMOVE; else - MOBY(moby)->state = 0x63; + MOBY(moby)->state = BOMB_STATE_BURST_AND_REMOVE; qcopy((moby + 0x10), ((char *)D_L08_00174660)); { char *v = &bomb_vars->unk10; @@ -220,7 +219,7 @@ void moby_248_update(char *moby) { clear_u64_value((&bomb_vars->unk10)); } } else { - MOBY(moby)->state = 0x62; + MOBY(moby)->state = BOMB_STATE_EXPLODE_AND_REMOVE; qcopy((moby + 0x10), collision_result + 0x20); FUN_L00_001ff660_c( (&bomb_vars->unk10), (&bomb_vars->unk10), collision_result + 0x40); @@ -230,16 +229,16 @@ void moby_248_update(char *moby) { } } else if (fast_dec_timer(&bomb_vars->timer_20)) { if (MOBY(moby)->command & 2) { - MOBY(moby)->state = 0x63; + MOBY(moby)->state = BOMB_STATE_BURST_AND_REMOVE; } else { - MOBY(moby)->state = 0x62; + MOBY(moby)->state = BOMB_STATE_EXPLODE_AND_REMOVE; } } break; } case BOMB_STATE_STATIONARY_FUSE: if (fast_dec_timer(&bomb_vars->timer_20)) { - MOBY(moby)->state = 0x63; + MOBY(moby)->state = BOMB_STATE_BURST_AND_REMOVE; } else if (bomb_vars->timer_20 == scale_game_frames(0x3C) || bomb_vars->timer_20 == scale_game_frames(0x28) || bomb_vars->timer_20 == scale_game_frames(0x14)) { diff --git a/src/overlays/l08/mobys/bomber_tank.c b/src/overlays/l08/mobys/bomber_tank.c index 5aebfd6276..60878eb424 100644 --- a/src/overlays/l08/mobys/bomber_tank.c +++ b/src/overlays/l08/mobys/bomber_tank.c @@ -31,6 +31,16 @@ #include "qcopy.h" /* Level 8 moby update (class 152): state machine that steers the moby toward the hero and fires its event. */ +enum { + BOMBER_TANK_STATE_INITIALIZE = 0, + BOMBER_TANK_MODE_INHIBIT_ACTIVATION_AND_TARGET_AIM = 2, + BOMBER_TANK_STATE_FOLLOW_PATH_AND_FIRE = 3, + BOMBER_TANK_STATE_FOLLOW_PATH = 6, + BOMBER_TANK_STATE_WAIT_FOR_TRIGGER = 11, + BOMBER_TANK_STATE_SCATTER_GROUP_AND_ACTIVATE = 14, + BOMBER_TANK_STATE_DAMAGED_FOLLOW_PATH = 99 +}; + typedef struct Moby Moby; extern float D_0015ED70; extern int D_0015ED84; @@ -130,14 +140,6 @@ void bomber_tank_update(Moby *moby) __asm__("FUN_L08_002d42d8"); /* Moby class 253 */ void bomber_tank_update(Moby *moby) { - enum { - BOMBER_TANK_STATE_INITIALIZE = 0, - BOMBER_TANK_STATE_FOLLOW_PATH_AND_FIRE = 3, - BOMBER_TANK_STATE_FOLLOW_PATH = 6, - BOMBER_TANK_STATE_WAIT_FOR_TRIGGER = 11, - BOMBER_TANK_STATE_SCATTER_GROUP_AND_ACTIVATE = 14, - BOMBER_TANK_STATE_DAMAGED_FOLLOW_PATH = 99 - }; float old_pos[4]; float old_rot[4]; float velocity[4]; @@ -193,7 +195,7 @@ void bomber_tank_update(Moby *moby) { moby->flags |= 0x1000; bomber_tank_update_vars->unk16C = frame_time + frame_time; if (bomber_tank_update_vars->trigger_moby > 0) { - moby->state = 11; + moby->state = BOMBER_TANK_STATE_WAIT_FOR_TRIGGER; moby->flags = (moby->flags & 0xEFFF) | 0x41; bomber_tank_update_vars->part_a->flags |= 0x41; bomber_tank_update_vars->part_b->flags |= 0x41; @@ -204,7 +206,7 @@ void bomber_tank_update(Moby *moby) { blend_moby_animation(moby, 0, 0, 0); } else if (bomber_tank_update_vars->unk144 > 0) { if (D_0013D3B6 == 0) { - moby->state = 14; + moby->state = BOMBER_TANK_STATE_SCATTER_GROUP_AND_ACTIVATE; moby->flags |= 0x41; bomber_tank_update_vars->part_a->flags |= 0x41; bomber_tank_update_vars->part_b->flags |= 0x41; @@ -216,13 +218,13 @@ void bomber_tank_update(Moby *moby) { } else { remove_bomber_tank_linked_debris(moby); qcopy(&moby->pos, (char *)l08_paths[bomber_tank_update_vars->path] + 0x10); - moby->state = 6; + moby->state = BOMBER_TANK_STATE_FOLLOW_PATH; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, 0); } } else { qcopy(&moby->pos, (char *)l08_paths[bomber_tank_update_vars->path] + 0x10); - moby->state = 6; + moby->state = BOMBER_TANK_STATE_FOLLOW_PATH; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, 0); } @@ -242,21 +244,21 @@ void bomber_tank_update(Moby *moby) { break; case BOMBER_TANK_STATE_FOLLOW_PATH: advance_bomber_tank_along_path(moby, bomber_tank_update_vars->path); - if (bomber_tank_update_vars->mode != 2 && + if (bomber_tank_update_vars->mode != BOMBER_TANK_MODE_INHIBIT_ACTIVATION_AND_TARGET_AIM && vector_distance_xy(&moby->pos, &target->pos) < 20.0f) { if (D_00141C38 == 0 && D_0013D4CB == 0) { help_request(0x1F44, 0x5A); } - moby->state = 3; + moby->state = BOMBER_TANK_STATE_FOLLOW_PATH_AND_FIRE; if (moby->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } break; case BOMBER_TANK_STATE_FOLLOW_PATH_AND_FIRE: advance_bomber_tank_along_path(moby, bomber_tank_update_vars->path); - if (bomber_tank_update_vars->mode == 2 || + if (bomber_tank_update_vars->mode == BOMBER_TANK_MODE_INHIBIT_ACTIVATION_AND_TARGET_AIM || vector_distance_xy(&moby->pos, &target->pos) > 22.0f) { - moby->state = 6; + moby->state = BOMBER_TANK_STATE_FOLLOW_PATH; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -296,15 +298,16 @@ void bomber_tank_update(Moby *moby) { bomber_tank_update_vars->part_b->collision = bomber_tank_update_vars->part_b->pclass->collision; moby->flags |= 0x1000; - if (bomber_tank_update_vars->mode != 2) { - moby->state = 6; + if (bomber_tank_update_vars->mode != + BOMBER_TANK_MODE_INHIBIT_ACTIVATION_AND_TARGET_AIM) { + moby->state = BOMBER_TANK_STATE_FOLLOW_PATH; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } } break; case BOMBER_TANK_STATE_SCATTER_GROUP_AND_ACTIVATE: - if (bomber_tank_update_vars->mode != 2) { + if (bomber_tank_update_vars->mode != BOMBER_TANK_MODE_INHIBIT_ACTIVATION_AND_TARGET_AIM) { unsigned char *event_flags; scatter_bomber_tank_linked_debris((char *)moby); event_flags = (unsigned char *)D_0013D388; @@ -322,8 +325,9 @@ void bomber_tank_update(Moby *moby) { bomber_tank_update_vars->part_b->collision = bomber_tank_update_vars->part_b->pclass->collision; moby->flags |= 0x1000; - if (bomber_tank_update_vars->mode != 2) { - moby->state = 6; + if (bomber_tank_update_vars->mode != + BOMBER_TANK_MODE_INHIBIT_ACTIVATION_AND_TARGET_AIM) { + moby->state = BOMBER_TANK_STATE_FOLLOW_PATH; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -445,7 +449,7 @@ void update_bomber_tank_damage_and_aim(Moby *moby) { resolve_moby_hit_response( moby, source, &bomber_tank_damage_and_aim_vars->health, 0, &hit, &damage, 0, 4); one = 1; - if (hit != one && moby->state != 0) { + if (hit != one && moby->state != BOMBER_TANK_STATE_INITIALIZE) { bomber_tank_damage_and_aim_vars->health -= damage; if (damage != 0.0f) allocate_voice_for_target_entry(4, 0, moby); @@ -668,7 +672,8 @@ void update_bomber_tank_damage_and_aim(Moby *moby) { ((Path *)l08_paths[bomber_tank_damage_and_aim_vars->path])->count); if (bomber_tank_damage_and_aim_vars->fF0 == 0) bomber_tank_damage_and_aim_vars->fF0 = *(int *)D_001413D0; - if (bomber_tank_damage_and_aim_vars->mode != 2) { + if (bomber_tank_damage_and_aim_vars->mode != + BOMBER_TANK_MODE_INHIBIT_ACTIVATION_AND_TARGET_AIM) { float yaw, distance, pitch; fast_vec_sub(burst_position_or_aim_scratch, bomber_tank_damage_and_aim_vars->target, @@ -709,8 +714,10 @@ void update_bomber_tank_damage_and_aim(Moby *moby) { D_0015ED70 * 12.566371f, D_0015ED6C_lui * 9.424778f); } - rotation_2D5FA8(burst_position_or_aim_scratch, 1, bomber_tank_damage_and_aim_vars->pitch); - rotation_2D5FA8(bomber_tank_damage_and_aim_vars->f110, 2, bomber_tank_damage_and_aim_vars->yaw); + build_axis_rotation_quaternion( + burst_position_or_aim_scratch, 1, bomber_tank_damage_and_aim_vars->pitch); + build_axis_rotation_quaternion( + bomber_tank_damage_and_aim_vars->f110, 2, bomber_tank_damage_and_aim_vars->yaw); multiply_quaternions(bomber_tank_damage_and_aim_vars->f110, burst_position_or_aim_scratch, bomber_tank_damage_and_aim_vars->f110); @@ -1164,6 +1171,9 @@ void scatter_bomber_tank_linked_debris(struct Moby *moby) { /* Remove active mobys of the selected classes from this moby's linked group. */ void remove_bomber_tank_linked_debris(struct Moby *moby) { + enum { + LINKED_MOBY_ACTIVE_STATE_LIMIT = 0x7f + }; short *list = D_L08_001AC040[(((struct Moby *)D_L08_0015FFD8) + *(s32 *)(moby->pvars + 0x144))->group]; struct Moby *linked_group_moby; @@ -1173,7 +1183,8 @@ void remove_bomber_tank_linked_debris(struct Moby *moby) { index = *list & 0x7fff; linked_group_moby = (struct Moby *)D_L08_0015FFD8 + index; while (1) { - if (linked_group_moby->state < 0x7f && linked_group_moby != moby) { + if (linked_group_moby->state < LINKED_MOBY_ACTIVE_STATE_LIMIT && + linked_group_moby != moby) { u16 class_id = linked_group_moby->oclass; if ((u32)(class_id - 0x24c) < 0xb) { mark_moby_for_removal(linked_group_moby); diff --git a/src/overlays/l08/mobys/commando.c b/src/overlays/l08/mobys/commando.c index 7eacd67cdf..fc071a01f2 100644 --- a/src/overlays/l08/mobys/commando.c +++ b/src/overlays/l08/mobys/commando.c @@ -142,13 +142,13 @@ void commando_update(WM *moby) { commando_vars->f2C = 3.0f; commando_vars->p40 = commando_name_string; if (!D_0013D3B4) { - moby->state = 1; + moby->state = COMMANDO_DIALOGUE_BEFORE_REPOSITION; } else { char *b = D_L08_001600EC; int j = commando_vars->joint; qcopy(moby->position, b + j * 0x80 + 0x30); qcopy((char *)moby + 0x40, b + j * 0x80 + 0x70); - moby->state = 2; + moby->state = COMMANDO_DIALOGUE_AFTER_REPOSITION; } initialize_npc_dialogue(moby, (char *)commando_vars + 0x20); break; @@ -158,7 +158,7 @@ void commando_update(WM *moby) { int j = commando_vars->joint; qcopy(moby->position, b + j * 0x80 + 0x30); qcopy((char *)moby + 0x40, b + j * 0x80 + 0x70); - moby->state = 2; + moby->state = COMMANDO_DIALOGUE_AFTER_REPOSITION; D_0013D3B4 = 1; } break; @@ -168,7 +168,7 @@ void commando_update(WM *moby) { blend_moby_animation(moby, random_integer_below(2) + 1, 0, scale_game_frames(20)); } if (update_npc_dialogue(moby, (char *)commando_vars + 0x20)) { - moby->state = 3; + moby->state = COMMANDO_POST_DIALOGUE; begin_dialogue_camera_transition(moby, 2.2f); } break; @@ -185,7 +185,7 @@ void commando_update(WM *moby) { mark_moby_for_removal(moby); return; } - moby->state = 2; + moby->state = COMMANDO_DIALOGUE_AFTER_REPOSITION; } break; } diff --git a/src/overlays/l08/mobys/cutscene_camera_target.c b/src/overlays/l08/mobys/cutscene_camera_target.c index b3a70d9f47..9f972d0581 100644 --- a/src/overlays/l08/mobys/cutscene_camera_target.c +++ b/src/overlays/l08/mobys/cutscene_camera_target.c @@ -36,7 +36,7 @@ void cutscene_camera_target_update(struct Moby *moby) { switch (moby->state) { case MOBY_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = MOBY_ACTIVE; break; case MOBY_ACTIVE: if (level_game_mode == 2) { diff --git a/src/overlays/l08/mobys/falling_debris.c b/src/overlays/l08/mobys/falling_debris.c index d53259d997..7ed717a9b7 100644 --- a/src/overlays/l08/mobys/falling_debris.c +++ b/src/overlays/l08/mobys/falling_debris.c @@ -78,7 +78,7 @@ void falling_debris_update(Moby_2E2A38 *debris_moby) { random_float_between(-(D_0015ED6C_gp * 1.5707964f), D_0015ED6C_gp * 1.5707964f); debris_data->life = (int)random_float_between((float)scale_game_frames(0x5A), (float)scale_game_frames(0x96)); - debris_moby->state = 2; + debris_moby->state = FALLING_DEBRIS_BEFORE_BURST; case FALLING_DEBRIS_BEFORE_BURST: debris_data->vel[2] -= D_0015ED70 * 10.8f * 0.5f; fast_vec_add(debris_moby->pos, debris_moby->pos, debris_data); @@ -160,7 +160,7 @@ void falling_debris_update(Moby_2E2A38 *debris_moby) { burst_tertiary_frame_count, -1); } - debris_moby->state = 3; + debris_moby->state = FALLING_DEBRIS_AFTER_BURST; } break; case FALLING_DEBRIS_AFTER_BURST: diff --git a/src/overlays/l08/mobys/flickering_mesh_effect.c b/src/overlays/l08/mobys/flickering_mesh_effect.c index 553e436423..ec87a2daa9 100644 --- a/src/overlays/l08/mobys/flickering_mesh_effect.c +++ b/src/overlays/l08/mobys/flickering_mesh_effect.c @@ -626,6 +626,10 @@ void flickering_mesh_effect_update(struct Moby *moby) __asm__("FUN_L08_002f70a0" /* Moby class 671 */ void flickering_mesh_effect_update(struct Moby *moby) { + enum { + FLICKERING_MESH_STATE_UNINITIALIZED = 0, + FLICKERING_MESH_STATE_INITIALIZED = 1 + }; FlickerLightVars *light_vars; Vec4 pos; f32 view, draw_fade_distance, fade; @@ -641,7 +645,7 @@ void flickering_mesh_effect_update(struct Moby *moby) { return; hidden = 0; at = &moby->pos; - if (moby->state == 0) { + if (moby->state == FLICKERING_MESH_STATE_UNINITIALIZED) { light_vars->light = -1; light_vars->particle_timer = light_vars->particle_ticks; qcopy(&light_vars->light_pos, at); @@ -662,7 +666,7 @@ void flickering_mesh_effect_update(struct Moby *moby) { light_vars->noise[i] = random_float_between(light_vars->jitter, 1.0f); light_vars->goal[i] = random_float_between(light_vars->jitter, 1.0f); } - moby->state = 1; + moby->state = FLICKERING_MESH_STATE_INITIALIZED; } moby->scale = moby->pclass->scale * diff --git a/src/overlays/l08/mobys/gunship.c b/src/overlays/l08/mobys/gunship.c index 8c1a431af5..eb696a98a6 100644 --- a/src/overlays/l08/mobys/gunship.c +++ b/src/overlays/l08/mobys/gunship.c @@ -242,6 +242,11 @@ void update_linked_moby_parts(struct Moby *moby) { } void process_gunship_part_hits(struct Moby *moby) { + enum { + GUNSHIP_TARGETS_EXHAUSTED_VOICE_ENTRY = 0, + GUNSHIP_NON_TARGET_HIT_VOICE_ENTRY = 1, + GUNSHIP_TARGET_HIT_VOICE_ENTRY = 2 + }; char *gunship_instance_vars = *(char **)((char *)moby + 0x78); char *entries = gunship_instance_vars + 0x60; char *part_entry_cursor = entries; @@ -256,18 +261,18 @@ void process_gunship_part_hits(struct Moby *moby) { if (i < 7) { if (score <= 0) { score = 1; - state = 1; + state = GUNSHIP_NON_TARGET_HIT_VOICE_ENTRY; } } else if (i < 10) { if (score < 2) { score = 2; - state = 1; + state = GUNSHIP_NON_TARGET_HIT_VOICE_ENTRY; } } else { if (score < 4) { score += 4; chosen = i; - state = 2; + state = GUNSHIP_TARGET_HIT_VOICE_ENTRY; } } (*(unsigned char **)part_entry_cursor)[0xA4] = 0xFF; @@ -275,7 +280,7 @@ void process_gunship_part_hits(struct Moby *moby) { } *(short *)(gunship_instance_vars + 0x28C) += score; if (*(short *)(gunship_instance_vars + 0x28C) >= 8) { - state = 0; + state = GUNSHIP_TARGETS_EXHAUSTED_VOICE_ENTRY; *(short *)(gunship_instance_vars + 0x28C) = *(short *)(gunship_instance_vars + 0x28C) % 8; if (chosen != 0) { int off = chosen * 16; @@ -314,7 +319,7 @@ void process_gunship_part_hits(struct Moby *moby) { ((char *)moby)[0x20] = 99; } } - if (state >= 0) + if (state >= GUNSHIP_TARGETS_EXHAUSTED_VOICE_ENTRY) allocate_voice_for_target_entry(state, 0, moby); } @@ -327,6 +332,9 @@ void gunship_update(struct Moby *moby) { GUNSHIP_BEGIN_PRIMARY_PATH = 3, GUNSHIP_BREAK_APART_AND_REMOVE = 0x63 }; + enum { + GUNSHIP_PART_RELEASED = 1 + }; GunshipVars *gunship_control_vars = (GunshipVars *)moby->pvars; SwarmPathFollower *follower; struct Moby *target; @@ -367,7 +375,7 @@ void gunship_update(struct Moby *moby) { truncate_float_to_s32(scale_time(random_float_between(300.0f, 600.0f))); qcopy(&moby->pos, &gunship_control_vars->follow[1].path->points[0]); spawn_gunship_parts(moby); - moby->state = 2; + moby->state = GUNSHIP_FOLLOW_SECONDARY_PATH_AND_FIRE_RANDOMLY; moby->rot.z = fast_arc_tan(gunship_control_vars->follow[1].path->points[1].f[0] - moby->pos.x, gunship_control_vars->follow[1].path->points[1].f[1] - moby->pos.y); @@ -486,7 +494,7 @@ void gunship_update(struct Moby *moby) { case GUNSHIP_BEGIN_PRIMARY_PATH: { LevelPath *path; - moby->state = 1; + moby->state = GUNSHIP_FOLLOW_PRIMARY_PATH_AND_FIRE_AT_TARGET; path = gunship_control_vars->follow[0].path; qcopy(&moby->pos, &path->points[0]); moby->rot.z = @@ -503,7 +511,7 @@ void gunship_update(struct Moby *moby) { cart_burst(moby, &part->pos, -1, 3.0f, 13.0f); fast_vec_sub(drift, &part->pos, &moby->pos); fast_vec_normalize(drift, drift, frame_time * 5.0f); - part->state = 1; + part->state = GUNSHIP_PART_RELEASED; gunship_control_vars->links[i].part = NULL; } } diff --git a/src/overlays/l08/mobys/heavy_gunship.c b/src/overlays/l08/mobys/heavy_gunship.c index a0ec1982da..47827f2f51 100644 --- a/src/overlays/l08/mobys/heavy_gunship.c +++ b/src/overlays/l08/mobys/heavy_gunship.c @@ -21,6 +21,14 @@ #include "rnc/overlay/l08/mobys/rocket.h" /* Pvars of the heavy gunship. */ +enum { + HEAVY_GUNSHIP_INITIALIZE = 0, + HEAVY_GUNSHIP_FOLLOW_PRIMARY_PATH = 1, + HEAVY_GUNSHIP_FOLLOW_SECONDARY_PATH = 2, + HEAVY_GUNSHIP_START_PRIMARY_PATH = 3, + HEAVY_GUNSHIP_DISPERSE_AND_REMOVE = 99 +}; + typedef struct { SwarmPathFollower follow[2]; /* 0x00: [0] cruising (state 1), [1] circling (state 2) */ SwarmPart root; /* 0x60 */ @@ -197,7 +205,7 @@ void process_heavy_gunship_part_hits(struct Moby *moby) { } i++; } while (i < 8); - moby->state = 99; + moby->state = HEAVY_GUNSHIP_DISPERSE_AND_REMOVE; } } if (sound >= 0) @@ -253,11 +261,7 @@ void heavy_gunship_update(struct Moby *moby) __asm__("FUN_L08_002e9b70"); /* Moby class 463 */ void heavy_gunship_update(struct Moby *moby) { enum { - HEAVY_GUNSHIP_INITIALIZE = 0, - HEAVY_GUNSHIP_FOLLOW_PRIMARY_PATH = 1, - HEAVY_GUNSHIP_FOLLOW_SECONDARY_PATH = 2, - HEAVY_GUNSHIP_START_PRIMARY_PATH = 3, - HEAVY_GUNSHIP_DISPERSE_AND_REMOVE = 0x63 + HEAVY_GUNSHIP_PART_DETACHED = 1 }; HeavyGunshipVars *swarm_vars = (HeavyGunshipVars *)moby->pvars; SwarmPathFollower *follower; @@ -300,7 +304,7 @@ void heavy_gunship_update(struct Moby *moby) { moby->flags |= 0x4000; qcopy(&moby->pos, &swarm_vars->follow[1].path->points[0]); spawn_heavy_gunship_parts(moby); - moby->state = 2; + moby->state = HEAVY_GUNSHIP_FOLLOW_SECONDARY_PATH; moby->rot.z = fast_arc_tan(swarm_vars->follow[1].path->points[1].f[0] - moby->pos.x, swarm_vars->follow[1].path->points[1].f[1] - moby->pos.y); break; @@ -404,7 +408,7 @@ void heavy_gunship_update(struct Moby *moby) { case HEAVY_GUNSHIP_START_PRIMARY_PATH: { LevelPath *path; - moby->state = 1; + moby->state = HEAVY_GUNSHIP_FOLLOW_PRIMARY_PATH; path = swarm_vars->follow[0].path; qcopy(&moby->pos, &path->points[0]); moby->rot.z = @@ -420,7 +424,7 @@ void heavy_gunship_update(struct Moby *moby) { cart_burst(moby, &part->pos, -1, 3.0f, 13.0f); fast_vec_sub(drift, &part->pos, &moby->pos); fast_vec_normalize(drift, drift, frame_time * 5.0f); - part->state = 1; + part->state = HEAVY_GUNSHIP_PART_DETACHED; swarm_vars->parts[i].moby = NULL; } } diff --git a/src/overlays/l08/mobys/help_hints.c b/src/overlays/l08/mobys/help_hints.c index e010dcedc3..194327d991 100644 --- a/src/overlays/l08/mobys/help_hints.c +++ b/src/overlays/l08/mobys/help_hints.c @@ -42,11 +42,11 @@ void help_hints_update(struct Moby *moby) { case VENDOR_EVENT_WAIT_FOR_ARMING: if (is_point_inside_clip_volume(&hero.motion.pos, event_trigger_data->third) && hero.state.control_mode == 15) - event_trigger_data->state = 1; + event_trigger_data->state = VENDOR_EVENT_ARMED; break; case VENDOR_EVENT_ARMED: if (hero.state.current == 0x42) { - event_trigger_data->state = 0; + event_trigger_data->state = VENDOR_EVENT_WAIT_FOR_ARMING; } else if (is_point_inside_clip_volume(&hero.motion.pos, event_trigger_data->fourth) && item_unlocked[11] == 0) { item_unlocked[11] = 1; diff --git a/src/overlays/l08/mobys/landmine.c b/src/overlays/l08/mobys/landmine.c index 0cccdd3eef..2237a391f4 100644 --- a/src/overlays/l08/mobys/landmine.c +++ b/src/overlays/l08/mobys/landmine.c @@ -62,7 +62,7 @@ void landmine_update(struct Moby *moby) { switch (moby->state) { case PATH_FOLLOWER_INITIALIZE_HEIGHT_OFFSET: { fade = moby->pos.z; - moby->state = 1; + moby->state = PATH_FOLLOWER_CHECK_HIT_AND_PROXIMITY; moby->pos.z = fade + 0.4f; return; } @@ -189,7 +189,7 @@ void landmine_update(struct Moby *moby) { mark_moby_for_removal(moby); return; } - moby->state = 3; + moby->state = PATH_FOLLOWER_FADE_OUT; } if (fast_vec_dist(&moby->pos, &point) < 0.1f) { follower->point = waypoint; diff --git a/src/overlays/l08/mobys/layered_mesh_effect.c b/src/overlays/l08/mobys/layered_mesh_effect.c index efb992869f..06db3e6611 100644 --- a/src/overlays/l08/mobys/layered_mesh_effect.c +++ b/src/overlays/l08/mobys/layered_mesh_effect.c @@ -123,7 +123,7 @@ void layered_mesh_effect_update(struct Moby *moby) { 1); *(int *)&layered_mesh_rgba_tables_initialized = 1; } - moby->state = 1; + moby->state = DRAW_ELEMENTS_UPDATE; for (i = 0; i < 3; i++) { D_L08_001E8348[i].a = 0; D_L08_001E8348[i].b = 0; diff --git a/src/overlays/l08/mobys/lift.c b/src/overlays/l08/mobys/lift.c index 2ff4ba6442..2f961739be 100644 --- a/src/overlays/l08/mobys/lift.c +++ b/src/overlays/l08/mobys/lift.c @@ -26,7 +26,7 @@ void lift_update(char *moby) { switch (MOBY(moby)->state) { case POSITION_BASELINE_INITIALIZE: *(float *)(position_vars + 4) = MOBY(moby)->pos.z; - MOBY(moby)->state = 1; + MOBY(moby)->state = POSITION_FOLLOW_DRIVER; break; case POSITION_FOLLOW_DRIVER: i = *(int *)(position_vars + 8); @@ -38,7 +38,7 @@ void lift_update(char *moby) { break; menu_item_enabled_41 = 1; allocate_voice_for_target_entry(0, 0, moby); - MOBY(moby)->state = 2; + MOBY(moby)->state = POSITION_APPROACH_TARGET; } else { approach_value(moby + 0x18, (*(float *)position_vars - *(float *)(position_vars + 4)) * diff --git a/src/overlays/l08/mobys/path_following_moby.c b/src/overlays/l08/mobys/path_following_moby.c index 8e65986b59..2788d966d9 100644 --- a/src/overlays/l08/mobys/path_following_moby.c +++ b/src/overlays/l08/mobys/path_following_moby.c @@ -135,7 +135,7 @@ void path_following_moby_update(char *moby) { moby_vars->unk4 = moby_vars->unk4 * (float)*path; moby_vars->unkC = randf_sym(0.0f, 5.0f); } - MOBY(moby)->state = 1; + MOBY(moby)->state = MOBY_STATE_FOLLOW_PATH; MOBY(moby)->update_dist = 0xFF; case MOBY_STATE_FOLLOW_PATH: { float path_point_count; @@ -197,7 +197,7 @@ void path_following_moby_update(char *moby) { } else { MOBY(moby)->collision = MOBY(moby)->pclass->collision; } - if (find_moby_hit(moby, 0x10000, 0) != 0 && MOBY(moby)->state != 2) { + if (find_moby_hit(moby, 0x10000, 0) != 0 && MOBY(moby)->state != MOBY_STATE_FALLING) { if (camera_secondary_mode_lui == 0x32 && D_0013D408[0xC] == 0) { D_0013D408[0xC] = 1; allocate_voice_for_bank_entry(1, 0, 0); @@ -224,7 +224,7 @@ void path_following_moby_update(char *moby) { 1, -1, 0); - MOBY(moby)->state = 2; + MOBY(moby)->state = MOBY_STATE_FALLING; } MOBY(moby)->hit_slot = 0xFF; if (MOBY(moby)->visible != 0) { diff --git a/src/overlays/l08/mobys/rocket.c b/src/overlays/l08/mobys/rocket.c index ef1728f670..c19e2f21aa 100644 --- a/src/overlays/l08/mobys/rocket.c +++ b/src/overlays/l08/mobys/rocket.c @@ -16,6 +16,16 @@ #include "qcopy.h" #include "rnc/overlay/shared/world/level_path.h" +enum { + ROCKET_STATE_INITIALIZE = 0, + ROCKET_STATE_APPROACH_TARGET_OFFSET = 1, + ROCKET_STATE_HOME_TOWARD_TARGET = 2, + ROCKET_STATE_WAIT_FOR_ACTIVATION = 3, + ROCKET_STATE_FOLLOW_ROUTE = 4, + ROCKET_STATE_FLY_CONFIGURED_HEADING = 5, + ROCKET_STATE_EXPLODE_AND_REMOVE = 6 +}; + extern int FUN_L08_002025d0(void *, int, int, void *, int); extern void mark_moby_for_removal(void *) __asm__("func_0020C828"); @@ -167,15 +177,6 @@ void spawn_rocket_explosion_and_debris(char *moby, /* Moby class 435 */ void rocket_update(M46 *moby) { - enum { - ROCKET_STATE_INITIALIZE = 0, - ROCKET_STATE_APPROACH_TARGET_OFFSET = 1, - ROCKET_STATE_HOME_TOWARD_TARGET = 2, - ROCKET_STATE_WAIT_FOR_ACTIVATION = 3, - ROCKET_STATE_FOLLOW_ROUTE = 4, - ROCKET_STATE_FLY_CONFIGURED_HEADING = 5, - ROCKET_STATE_EXPLODE_AND_REMOVE = 6 - }; enum { LINKED_CLASS_NEGATIVE_X_POSITIVE_Y_POSITIVE_Z_LAUNCH_OFFSET = 0, LINKED_CLASS_NEGATIVE_X_POSITIVE_Y_NEGATIVE_Z_LAUNCH_OFFSET = 1, @@ -186,7 +187,7 @@ void rocket_update(M46 *moby) { }; V46 target, delta, velocity_correction_or_effect_velocity, effect, aux; D46 *data = moby->data; - if (FUN_L00_0025a420(moby, 0x210000, 0) && moby->state != 4) { + if (FUN_L00_0025a420(moby, 0x210000, 0) && moby->state != ROCKET_STATE_FOLLOW_ROUTE) { allocate_voice_for_target_entry(0, 0, moby); cart_burst(moby, moby->position, -1, 0.5f, 13.0f); mark_moby_for_removal(moby); @@ -209,7 +210,7 @@ void rocket_update(M46 *moby) { data->path = ((Route_2dd4f8_2dd3c0 *)l08_paths[data->path_index]); qcopy(moby->position, data->path->e[0]); data->waypoint = 1; - moby->state = 3; + moby->state = ROCKET_STATE_WAIT_FOR_ACTIVATION; moby->animation = 0; moby->flags = 0; return; @@ -236,7 +237,7 @@ void rocket_update(M46 *moby) { moby->rotation[2] = fast_arc_tan(data->velocity[0], data->velocity[1]); if (fast_difference_between_rotations(yaw, data->yaw) < 0.08726646f && fast_difference_between_rotations(pitch, data->pitch) < 0.08726646f) - moby->state = 2; + moby->state = ROCKET_STATE_HOME_TOWARD_TARGET; radius = random_float_between(0.0f, rocket_effect_radial_speed_range_end_gp) * D_0015ED6C; angle = random_angle_radians(); fast_vec_normalize(effect, moby->matrix[2], radius * fast_cos(angle)); @@ -280,7 +281,7 @@ void rocket_update(M46 *moby) { target_data->health -= 60; clear_u64_value(data->velocity); allocate_voice_for_target_entry(0, 0, moby); - moby->state = 6; + moby->state = ROCKET_STATE_EXPLODE_AND_REMOVE; } radius = random_float_between(0.0f, rocket_effect_radial_speed_range_end_gp) * D_0015ED6C; angle = random_angle_radians(); @@ -310,7 +311,7 @@ void rocket_update(M46 *moby) { data->activation_range && fast_dec_timer(&data->timer)) { moby->flags = 0x40; - moby->state = 4; + moby->state = ROCKET_STATE_FOLLOW_ROUTE; moby->animation = moby->model->animation; moby->rotation[2] = fast_arc_tan(data->path->e[1][0] - moby->position[0], data->path->e[1][1] - moby->position[1]); @@ -491,7 +492,7 @@ void rocket_update(M46 *moby) { else FUN_L08_002de528_u(moby, data->effect_path, 30, 0); allocate_voice_for_target_entry(2, 0, moby); - moby->state = 6; + moby->state = ROCKET_STATE_EXPLODE_AND_REMOVE; } return; } @@ -510,7 +511,7 @@ void rocket_update(M46 *moby) { moby->position[0] > 500.0f || moby->position[1] < 5.0f || moby->position[1] > 500.0f || moby->position[2] < 5.0f || moby->position[2] > 500.0f || fast_vec_dist(D_0013F3D0, moby->position) < 16.0f) - moby->state = 6; + moby->state = ROCKET_STATE_EXPLODE_AND_REMOVE; return; case ROCKET_STATE_EXPLODE_AND_REMOVE: if (D_L08_0015FFDC < (unsigned int)moby) @@ -576,7 +577,7 @@ struct Moby *spawn_rocket(void *pos, struct Moby *target, void *velocity, float scale *= rocket_scale_multiplier_gp; moby->update_dist = 0xFF; moby->visible = 1; - *(volatile u8 *)&moby->state = 1; + *(volatile u8 *)&moby->state = ROCKET_STATE_APPROACH_TARGET_OFFSET; moby->draw_dist = 0xFF; moby->scale = scale; set_moby_color(moby, rocket_color_red_gp, rocket_color_green_gp, rocket_color_blue_gp); diff --git a/src/overlays/l08/mobys/shattering_prop.c b/src/overlays/l08/mobys/shattering_prop.c index 58c81067f2..7c70033e8b 100644 --- a/src/overlays/l08/mobys/shattering_prop.c +++ b/src/overlays/l08/mobys/shattering_prop.c @@ -23,13 +23,13 @@ void shattering_prop_update(struct Moby *moby) { char *hit_result = find_moby_hit(moby, 0x10000, 0); switch (moby->state) { case MOBY_STATE_INITIALIZE: - moby->state = 1; + moby->state = MOBY_STATE_WAIT_FOR_HIT; break; case MOBY_STATE_WAIT_FOR_HIT: if (hit_result != 0 && *(float *)(hit_result + 0x2C) > 0.0f) hit = 1; if (hit) - moby->state = 2; + moby->state = MOBY_STATE_REMOVE; break; case MOBY_STATE_REMOVE: allocate_voice_for_target_entry(0, 0, (int)moby); diff --git a/src/overlays/l08/mobys/shrub.c b/src/overlays/l08/mobys/shrub.c index f1760cd49f..2f2858d6fa 100644 --- a/src/overlays/l08/mobys/shrub.c +++ b/src/overlays/l08/mobys/shrub.c @@ -20,6 +20,14 @@ /* spawns the child mobys this object owns and fills its part table */ /* Ported from rac1-decomp (src/overlays/l08_batalia/vendor_002E0258.c: func_L08_002E9B60), where it is exact; names translated to the US level program. */ +enum { + SHRUB_INITIALIZE = 0, + SHRUB_FOLLOW_PRIMARY_PATH_AND_FIRE_AT_TARGET = 1, + SHRUB_FOLLOW_SECONDARY_PATH_AND_FIRE_RANDOMLY = 2, + SHRUB_BEGIN_PRIMARY_PATH = 3, + SHRUB_BREAK_APART_AND_REMOVE = 0x63 +}; + extern int FUN_L08_002e1c98_c() __asm__("FUN_L08_002e1c98"); void spawn_shrub_parts(char *moby) __asm__("FUN_L08_002e8788"); @@ -175,7 +183,7 @@ void process_shrub_part_hits(struct Moby *parent_moby) { return; } } - parent_moby->state = 0x63; + parent_moby->state = SHRUB_BREAK_APART_AND_REMOVE; } } if (hit_sound_id >= 0) @@ -215,11 +223,7 @@ void update_shrub_parts(struct Moby *parent_moby) { /* Moby class 462 */ void shrub_update(struct Moby *moby) { enum { - SHRUB_INITIALIZE = 0, - SHRUB_FOLLOW_PRIMARY_PATH_AND_FIRE_AT_TARGET = 1, - SHRUB_FOLLOW_SECONDARY_PATH_AND_FIRE_RANDOMLY = 2, - SHRUB_BEGIN_PRIMARY_PATH = 3, - SHRUB_BREAK_APART_AND_REMOVE = 0x63 + SHRUB_PART_RELEASED = 1 }; SwarmVars *shrub_control_vars = (SwarmVars *)moby->pvars; SwarmPathFollower *follower; @@ -262,7 +266,7 @@ void shrub_update(struct Moby *moby) { moby->flags |= 0x4000; qcopy(&moby->pos, &shrub_control_vars->follow[1].path->points[0]); spawn_shrub_parts((char *)moby); - moby->state = 2; + moby->state = SHRUB_FOLLOW_SECONDARY_PATH_AND_FIRE_RANDOMLY; moby->rot.z = fast_arc_tan(shrub_control_vars->follow[1].path->points[1].f[0] - moby->pos.x, shrub_control_vars->follow[1].path->points[1].f[1] - moby->pos.y); @@ -372,7 +376,7 @@ void shrub_update(struct Moby *moby) { case SHRUB_BEGIN_PRIMARY_PATH: { LevelPath *path; - moby->state = 1; + moby->state = SHRUB_FOLLOW_PRIMARY_PATH_AND_FIRE_AT_TARGET; path = shrub_control_vars->follow[0].path; qcopy(&moby->pos, &path->points[0]); moby->rot.z = @@ -388,7 +392,7 @@ void shrub_update(struct Moby *moby) { cart_burst(moby, &part->pos, -1, 3.0f, 13.0f); fast_vec_sub(drift, &part->pos, &moby->pos); fast_vec_normalize(drift, drift, frame_time * 5.0f); - part->state = 1; + part->state = SHRUB_PART_RELEASED; shrub_control_vars->parts[i].moby = NULL; } } diff --git a/src/overlays/l08/mobys/shuttle.c b/src/overlays/l08/mobys/shuttle.c index f6d49939cc..5004e8a382 100644 --- a/src/overlays/l08/mobys/shuttle.c +++ b/src/overlays/l08/mobys/shuttle.c @@ -97,6 +97,9 @@ void shuttle_update(struct Moby *moby) { SHUTTLE_STATE_WAIT_FOR_DEPARTURE = 2, SHUTTLE_STATE_TRAVEL = 3 }; + enum { + SHUTTLE_STATE_NO_PATH = 4 + }; LiftVars *shuttle_vars = (LiftVars *)moby->pvars; Vec4 old_pos; Vec4 old_rot; @@ -122,13 +125,13 @@ void shuttle_update(struct Moby *moby) { if (shuttle_vars->path == -1) { qcopy(&shuttle_vars->home_pos, &moby->pos); qcopy(&shuttle_vars->home_rot, &moby->rot); - moby->state = 4; + moby->state = SHUTTLE_STATE_NO_PATH; shuttle_vars->ridable = 1; } else { shuttle_vars->unk100 = -1; shuttle_vars->unkE0 = -1; select_shuttle_route_for_hero((char *)moby); - moby->state = 2; + moby->state = SHUTTLE_STATE_WAIT_FOR_DEPARTURE; moby->update_dist = 0xFF; } break; @@ -142,7 +145,7 @@ void shuttle_update(struct Moby *moby) { try_set_shuttle_departure_help_message((char *)moby); if ((pad_pressed_words[0] & 0x10) && hero.air_frames.s == 0 && D_L08_0015F594 == 10) - moby->state = 3; + moby->state = SHUTTLE_STATE_TRAVEL; } } } else { @@ -155,7 +158,7 @@ void shuttle_update(struct Moby *moby) { hero.path_constrain_pending = shuttle_vars->stop; if (advance_shuttle_path_travel((char *)moby)) { select_shuttle_route_for_hero((char *)moby); - moby->state = 2; + moby->state = SHUTTLE_STATE_WAIT_FOR_DEPARTURE; } break; } diff --git a/src/overlays/l08/mobys/swing_gate.c b/src/overlays/l08/mobys/swing_gate.c index e9116fb4b5..ef516cc24e 100644 --- a/src/overlays/l08/mobys/swing_gate.c +++ b/src/overlays/l08/mobys/swing_gate.c @@ -40,6 +40,11 @@ void swing_gate_update(struct Moby *moby) __asm__("FUN_L08_002ea4c0"); /* Moby classes 468, 469 */ void swing_gate_update(struct Moby *moby) { + enum { + SWING_GATE_STATE_INITIALIZE = 0, + SWING_GATE_STATE_FOLLOW_DRIVER = 1, + SWING_GATE_STATE_OPEN_LATCHED = 2 + }; SwingGateVars *swing_gate_vars = (SwingGateVars *)moby->pvars; f32 progress = *(f32 *)D_L08_0015FFD8[swing_gate_vars->driver].pvars; Vec4 gate_rotation_matrix[4]; @@ -55,12 +60,12 @@ void swing_gate_update(struct Moby *moby) { moby->visible = 1; moby->flags &= ~1; } - if (moby->state == 0) { - moby->state = 1; + if (moby->state == SWING_GATE_STATE_INITIALIZE) { + moby->state = SWING_GATE_STATE_FOLLOW_DRIVER; qcopy(&swing_gate_vars->home, &moby->pos); return; } - if (moby->state != 1) + if (moby->state != SWING_GATE_STATE_FOLLOW_DRIVER) return; yaw = fast_subtract_rotations(swing_gate_vars->open_deg * DEG_TO_RAD, swing_gate_vars->shut_deg * DEG_TO_RAD); @@ -96,7 +101,7 @@ void swing_gate_update(struct Moby *moby) { fast_vec_add(&moby->pos, &swing_gate_vars->home, &gate_position_offset); if (progress == 1.0f && moby->oclass == 0x1D4) { D_0013D388[swing_gate_vars->flag + 0x30] = 1; - moby->state = 2; + moby->state = SWING_GATE_STATE_OPEN_LATCHED; allocate_voice_for_target_entry(1, 0, moby); if (moby->oclass == 0x1D4 && voice_is_playing(moby, swing_gate_vars->voice)) release_voice_slot(swing_gate_vars->voice); diff --git a/src/overlays/l08/mobys/the_plumber_batalia.c b/src/overlays/l08/mobys/the_plumber_batalia.c index 84851e2293..ae73b83423 100644 --- a/src/overlays/l08/mobys/the_plumber_batalia.c +++ b/src/overlays/l08/mobys/the_plumber_batalia.c @@ -183,7 +183,7 @@ void the_plumber_batalia_update(L14WatchMoby *moby) { return; } watch_data->p20 = (void *)batalia_plumber_name_text; - moby->state = 1; + moby->state = PLUMBER_UPDATE_DIALOGUE; initialize_npc_dialogue(moby, watch_data); break; case PLUMBER_UPDATE_DIALOGUE: @@ -192,12 +192,12 @@ void the_plumber_batalia_update(L14WatchMoby *moby) { if (watch_data->h36 == 2) { char *camera_record = D_L08_001600EC + watch_data->i48 * 128; jet_reset_camera(camera_record + 0x30, camera_record + 0x70); - moby->state = 2; + moby->state = PLUMBER_SCRIPTED_HANDOFF; request_batalia_cannon_mount(D_L08_0015FFD8 + watch_data->i50 * 256); } if (watch_data->sub == 3) { FUN_L08_002a1880(1); - moby->state = 5; + moby->state = PLUMBER_SAVE_AND_REMOVE; } if (watch_data->sub == 4) { hero_respawn(); diff --git a/src/overlays/l09/draw_level09_textured_surfaces.c b/src/overlays/l09/draw_level09_textured_surfaces.c index 5535558107..9d5d3ccea1 100644 --- a/src/overlays/l09/draw_level09_textured_surfaces.c +++ b/src/overlays/l09/draw_level09_textured_surfaces.c @@ -218,6 +218,9 @@ void build_packet_and_draw_scaled_entries(void *data_ptr, int count) __asm__("FUN_L09_002c1978"); void build_packet_and_draw_scaled_entries(void *data_ptr, void *list_ptr, int count) { + enum { + TEXTURED_GRID_USE_CURRENT_VIEW_SETTINGS = 1 + }; char *surface_draw_settings = data_ptr; char *list = list_ptr; int i; @@ -240,7 +243,7 @@ void build_packet_and_draw_scaled_entries(void *data_ptr, void *list_ptr, int co saved_textured_grid_fog_far_distance = saved1; saved_textured_grid_fog_near_intensity = saved2; D_L09_00161304 = saved3; - if (textured_grid_view_settings_mode != 1) { + if (textured_grid_view_settings_mode != TEXTURED_GRID_USE_CURRENT_VIEW_SETTINGS) { current[0x218 / 4] = *(float *)(surface_draw_settings + 0x20); current[0x21c / 4] = *(float *)(surface_draw_settings + 0x24); current[0x228 / 4] = *(float *)(surface_draw_settings + 0x28); @@ -311,7 +314,8 @@ void build_packet_and_draw_scaled_entries(void *data_ptr, void *list_ptr, int co (unsigned char)surface_draw_settings[0x31] << 8 | (unsigned char)surface_draw_settings[0x32] << 16; /* Retail reads the mode after the packet cursor stores. */ - if (*(volatile int *)&textured_grid_view_settings_mode == 1) + if (*(volatile int *)&textured_grid_view_settings_mode == + TEXTURED_GRID_USE_CURRENT_VIEW_SETTINGS) color = (long)(*(int *)(current + 0x230 / 4) | (*(int *)(current + 0x234 / 4) << 8) | (*(int *)(current + 0x238 / 4) << 16)); { diff --git a/src/overlays/l09/level_class_tables.c b/src/overlays/l09/level_class_tables.c index 90a21bae16..73ecadc6ed 100644 --- a/src/overlays/l09/level_class_tables.c +++ b/src/overlays/l09/level_class_tables.c @@ -17,6 +17,9 @@ #include "rnc/overlay/shared/vehicles.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -57,7 +60,7 @@ void *D_L09_00209B18[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; struct MobyClassUpdate moby_classes[158] __asm__("D_L09_00209380") diff --git a/src/overlays/l09/mobys/airship_part.c b/src/overlays/l09/mobys/airship_part.c index 0c8e6ed071..156a046d94 100644 --- a/src/overlays/l09/mobys/airship_part.c +++ b/src/overlays/l09/mobys/airship_part.c @@ -234,7 +234,7 @@ void airship_part_update(struct Moby *moby) { joint_offset_scale = moby->scale * 0.0009765625f; get_moby_joint_matrices(moby, 1, &joint, transform_and_effect_scratch.m); fast_vec_scale(part_vars->off, transform_and_effect_scratch.m[3], joint_offset_scale); - moby->state = 1; + moby->state = AIRSHIP_PART_STATE_WAIT_FOR_BREAKUP_COMMAND; break; } case AIRSHIP_PART_STATE_WAIT_FOR_BREAKUP_COMMAND: @@ -267,7 +267,7 @@ void airship_part_update(struct Moby *moby) { moby->flags |= part_vars->parent->flags & 1; moby->command = part_vars->parent->command; } - if (moby->state == 2) { + if (moby->state == AIRSHIP_PART_STATE_WAIT_FOR_BREAKUP_GATE) { if (moby->oclass == 0x4A0) { moby->rot.x = fast_add_rotations(moby->rot.x, @@ -275,7 +275,7 @@ void airship_part_update(struct Moby *moby) { 0.017453292f * frame_time); } if (fast_dec_timer_s16(&part_vars->h2A) != 0) { - moby->state = 3; + moby->state = AIRSHIP_PART_STATE_BEGIN_BREAKUP; } } else if (moby->command == 1) { int i; @@ -288,7 +288,7 @@ void airship_part_update(struct Moby *moby) { part_vars->parts[i]->update_dist = 0xFF; } } - moby->state = 2; + moby->state = AIRSHIP_PART_STATE_WAIT_FOR_BREAKUP_GATE; } break; } @@ -338,7 +338,7 @@ void airship_part_update(struct Moby *moby) { airship_part_downward_acceleration_override_range_end_gp * frame_time_sq_macro); } moby->collision = 0; - moby->state = 4; + moby->state = AIRSHIP_PART_STATE_FALLING_WITH_EFFECTS; break; } case AIRSHIP_PART_STATE_FALLING_WITH_EFFECTS: @@ -401,7 +401,7 @@ void airship_part_update(struct Moby *moby) { part_vars->f20 *= 0.9f; part_vars->f24 *= 0.9f; allocate_voice_for_target_entry(0, 0, (int)moby); - moby->state = 5; + moby->state = AIRSHIP_PART_STATE_FALLING_AFTER_DAMPING; } break; case AIRSHIP_PART_STATE_FALLING_AFTER_DAMPING: diff --git a/src/overlays/l09/mobys/asteroid.c b/src/overlays/l09/mobys/asteroid.c index d90d856188..cfc9ccf4ce 100644 --- a/src/overlays/l09/mobys/asteroid.c +++ b/src/overlays/l09/mobys/asteroid.c @@ -333,6 +333,10 @@ void update_fading_asteroid_debris(unsigned char *moby) { } void update_falling_asteroid(Moby *falling_rock) { + enum { + FALLING_ASTEROID_STATE_FALLING = 0, + FALLING_ASTEROID_IMPACT_REMOVAL_STATE = 3 + }; float movement_step[4]; float collision_probe_offset[4]; float position_or_movement_step[4]; @@ -358,7 +362,7 @@ void update_falling_asteroid(Moby *falling_rock) { updated_rotation_x = fast_add_rotations(falling_rock->rot.x, moby_vars->f40); falling_rock->rot.x = updated_rotation_x; falling_rock->rot.y = fast_add_rotations(updated_rotation_x, moby_vars->f44); - if (falling_rock->state == 0) { + if (falling_rock->state == FALLING_ASTEROID_STATE_FALLING) { if (moby_vars->pos[2] < 100.0f && moby_vars->pos[0] < 500.0f && moby_vars->pos[1] < 500.0f) { position_or_movement_step[0] = random_float_between(-5.0f, 5.0f); @@ -568,7 +572,7 @@ void update_falling_asteroid(Moby *falling_rock) { 1200000.0f, sc); } - if (falling_rock->state >= 3) { + if (falling_rock->state >= FALLING_ASTEROID_IMPACT_REMOVAL_STATE) { mark_moby_for_removal(falling_rock); } } @@ -577,6 +581,10 @@ void update_falling_asteroid(Moby *falling_rock) { /* Moby classes 263-267 */ void asteroid_update(struct Moby *asteroid_moby) { + enum { + ASTEROID_MODE_FALLING = 1, + ASTEROID_MODE_FADING_DEBRIS = 2 + }; Data_2ECC50 *moby_vars = (*(Data_2ECC50 **)&asteroid_moby->pvars); Path *path; float displacement_vector[4]; @@ -585,11 +593,11 @@ void asteroid_update(struct Moby *asteroid_moby) { float dot; int i; - if (moby_vars->mode == 2) { + if (moby_vars->mode == ASTEROID_MODE_FADING_DEBRIS) { update_fading_asteroid_debris((unsigned char *)asteroid_moby); return; } - if (moby_vars->mode == 1) { + if (moby_vars->mode == ASTEROID_MODE_FALLING) { update_falling_asteroid((void *)asteroid_moby); return; } diff --git a/src/overlays/l09/mobys/barrier.c b/src/overlays/l09/mobys/barrier.c index 6411db55cf..66d4266a5e 100644 --- a/src/overlays/l09/mobys/barrier.c +++ b/src/overlays/l09/mobys/barrier.c @@ -71,11 +71,14 @@ extern void func_L00_0025F4A8_309688(void *, void barrier_update(Moby *moby) __asm__("FUN_L09_003082d8"); char *spawn_barrier_replacement(struct Moby *source_moby, int spawned_moby_class) { + enum { + BARRIER_REPLACEMENT_DRAW_DISTANCE = 0xFF + }; char *moby = create_moby(spawned_moby_class); if (moby != 0) { unsigned char state; ((unsigned char *)moby)[0x30] = 0xFF; - state = 0xFF; + state = BARRIER_REPLACEMENT_DRAW_DISTANCE; MOBY(moby)->draw_dist = state; moby[0x31] = 1; moby[0x20] = 0; @@ -93,6 +96,10 @@ char *spawn_barrier_replacement(struct Moby *source_moby, int spawned_moby_class /* Moby classes 1285-1288 */ void barrier_update(Moby *moby) { + enum { + BARRIER_STATE_UNINITIALIZED = 0, + BARRIER_STATE_INITIALIZED = 1 + }; BarrierData *barrier_vars = (*(BarrierData **)&moby->pvars); float origin[4], center[4], piece_pos[4], piece_velocity[4], push[4]; Hit_309688 *hit; @@ -102,10 +109,10 @@ void barrier_update(Moby *moby) { float angle; float scale; - if (moby->state == 0) { + if (moby->state == BARRIER_STATE_UNINITIALIZED) { if (barrier_vars->idx != -1) ((Flags_309688 *)(alternate_item_available + barrier_vars->idx))->f43 = 0; - moby->state = 1; + moby->state = BARRIER_STATE_INITIALIZED; } if (moby->mission != 0xFF) { int row = current_level_index * 16; diff --git a/src/overlays/l09/mobys/damage_causer.c b/src/overlays/l09/mobys/damage_causer.c index 6f92494a07..01adbb6702 100644 --- a/src/overlays/l09/mobys/damage_causer.c +++ b/src/overlays/l09/mobys/damage_causer.c @@ -32,6 +32,10 @@ extern s32 D_L09_0015F5CC NOT_SDA; /* Moby class 1206 */ void damage_causer_update(struct Moby *moby) { + enum { + DAMAGE_CAUSER_STATE_UNINITIALIZED = 0, + DAMAGE_CAUSER_STATE_INITIALIZED = 1 + }; char *damage_causer_vars = (char *)moby->pvars; float sphere_query_workspace[24]; int i; @@ -39,8 +43,8 @@ void damage_causer_update(struct Moby *moby) { float start; float end; - if (moby->state == 0) { - moby->state = 1; + if (moby->state == DAMAGE_CAUSER_STATE_UNINITIALIZED) { + moby->state = DAMAGE_CAUSER_STATE_INITIALIZED; *(s32 *)(damage_causer_vars + 0x14) = -1; } if ((D_L09_0015F5CC & 7) == (((int)moby >> 8) & 7)) { diff --git a/src/overlays/l09/mobys/display.c b/src/overlays/l09/mobys/display.c index 1c3503da58..fbebc244ef 100644 --- a/src/overlays/l09/mobys/display.c +++ b/src/overlays/l09/mobys/display.c @@ -89,6 +89,10 @@ void display_update(struct Moby *moby) { BREAKABLE_STACK_ANTEPENULTIMATE_CLASS = 0x512, BREAKABLE_STACK_PENULTIMATE_CLASS = 0x513 }; + enum { + BREAKABLE_STACK_STATE_UNINITIALIZED = 0, + BREAKABLE_STACK_STATE_INITIALIZED = 1 + }; float center[4]; float top[4]; float push[4]; @@ -107,8 +111,8 @@ void display_update(struct Moby *moby) { } replaced = 0; hit = find_moby_hit(moby, 0x40000, 0); - if (moby->state == 0) { - moby->state = 1; + if (moby->state == BREAKABLE_STACK_STATE_UNINITIALIZED) { + moby->state = BREAKABLE_STACK_STATE_INITIALIZED; } if (FUN_L00_001fefc8(&moby->command) == 0 || hit == 0) { return; diff --git a/src/overlays/l09/mobys/elevator.c b/src/overlays/l09/mobys/elevator.c index 487f4dfd4a..9fac9c0ca6 100644 --- a/src/overlays/l09/mobys/elevator.c +++ b/src/overlays/l09/mobys/elevator.c @@ -39,6 +39,10 @@ void elevator_update(unsigned char *moby) { ELEVATOR_STATE_AT_PATH_START = 1, ELEVATOR_STATE_MOVING = 2 }; + enum { + ELEVATOR_MOBY_STATE_UNINITIALIZED = 0, + ELEVATOR_MOBY_STATE_INITIALIZED = 1 + }; char *elevator_vars = *(char **)(moby + 0x78); char *path; float orig[4], delta[4], segment_offset[4]; @@ -66,7 +70,7 @@ void elevator_update(unsigned char *moby) { } qcopy(orig, moby + 0x10); fast_dec_timer_s16(elevator_vars + 0xBA); - if (MOBY(moby)->state == 0) { + if (MOBY(moby)->state == ELEVATOR_MOBY_STATE_UNINITIALIZED) { float f; char *pts; elevator_vars[0x28] = 4; @@ -83,7 +87,7 @@ void elevator_update(unsigned char *moby) { *(short *)(elevator_vars + 0xBA) = 0; *(int *)(elevator_vars + 0xA8) = 0; *(int *)(elevator_vars + 0xBC) = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = ELEVATOR_MOBY_STATE_INITIALIZED; MOBY(moby)->update_dist = 0xFF; MOBY(moby)->draw_dist = 0xFF; *(int *)(elevator_vars + 0xC4) = -1; diff --git a/src/overlays/l09/mobys/floating_ship_piece.c b/src/overlays/l09/mobys/floating_ship_piece.c index 300797094e..34a8589627 100644 --- a/src/overlays/l09/mobys/floating_ship_piece.c +++ b/src/overlays/l09/mobys/floating_ship_piece.c @@ -85,11 +85,11 @@ void floating_ship_piece_update(char *moby) { MOBY(moby)->pos.z = start_z - 5.0f; MOBY(moby)->rot.x = random_float_between(-1.57079637f, 1.57079637f); MOBY(moby)->rot.y = random_float_between(-1.57079637f, 1.57079637f); - MOBY(moby)->state = 1; + MOBY(moby)->state = PLATFORM_STATE_WAIT_FOR_LINK_REMOVAL; } else { func_001E9730_30A560( D_L09_00209518_30A560, *(short *)(moby + 0xB2), MOBY(moby)->oclass); - MOBY(moby)->state = 2; + MOBY(moby)->state = PLATFORM_STATE_ACTIVE; } break; case PLATFORM_STATE_WAIT_FOR_LINK_REMOVAL: @@ -105,7 +105,7 @@ void floating_ship_piece_update(char *moby) { break; } set2: - MOBY(moby)->state = 2; + MOBY(moby)->state = PLATFORM_STATE_ACTIVE; break; case PLATFORM_STATE_ACTIVE: if (hero.air_frames.s == 0 && ((char *)hero.ground_moby) == moby) { diff --git a/src/overlays/l09/mobys/handle_linked_moby_damage.c b/src/overlays/l09/mobys/handle_linked_moby_damage.c index 5f6f516215..22e29f3978 100644 --- a/src/overlays/l09/mobys/handle_linked_moby_damage.c +++ b/src/overlays/l09/mobys/handle_linked_moby_damage.c @@ -44,11 +44,14 @@ void handle_linked_moby_damage(struct Moby *moby, DAMAGE_RESULT_UNAVAILABLE = 0, DAMAGE_RESULT_NO_HIT_OR_SUPPRESSED_RESPONSE = 11 }; + enum { + LINKED_MOBY_STATE_DESTROYED = 3 + }; VendorHitSource *damage_hit_record; struct Moby *link; s32 hit; - if (moby->state != 3) { + if (moby->state != LINKED_MOBY_STATE_DESTROYED) { damage_hit_record = find_moby_hit(moby, 0x330000, 0); if (damage_hit_record != 0) { debug_print(D_L09_00208FF0, moby->oclass, fptodp(damage_hit_record->damage)); @@ -90,7 +93,7 @@ void handle_linked_moby_damage(struct Moby *moby, } } FUN_L00_00257470(moby, 0, -1); - moby->state = 3; + moby->state = LINKED_MOBY_STATE_DESTROYED; } else { *health -= damage_hit_record->damage; linked_moby_damage_vars->hurt_timer = scale_game_frames(60); diff --git a/src/overlays/l09/mobys/lamp.c b/src/overlays/l09/mobys/lamp.c index a8d747fd88..e151bfd4bb 100644 --- a/src/overlays/l09/mobys/lamp.c +++ b/src/overlays/l09/mobys/lamp.c @@ -25,13 +25,13 @@ void lamp_update(struct Moby *lamp_moby) { struct Moby *hit_moby = find_moby_hit(lamp_moby, 0x10000, 0); switch (lamp_moby->state) { case LAMP_STATE_INITIALIZE: - lamp_moby->state = 1; + lamp_moby->state = LAMP_STATE_WAIT_FOR_HIT; break; case LAMP_STATE_WAIT_FOR_HIT: if (hit_moby != 0 && hit_moby->scale > 0.0f) hit = 1; if (hit) - lamp_moby->state = 2; + lamp_moby->state = LAMP_STATE_REMOVAL_SEQUENCE; break; case LAMP_STATE_REMOVAL_SEQUENCE: allocate_voice_for_target_entry(0, 0, (int)lamp_moby); diff --git a/src/overlays/l09/mobys/refueling_station.c b/src/overlays/l09/mobys/refueling_station.c index 29b0f5dbab..3690245b70 100644 --- a/src/overlays/l09/mobys/refueling_station.c +++ b/src/overlays/l09/mobys/refueling_station.c @@ -12,6 +12,13 @@ #include "rnc/mobys/moby.h" /* Damage source returned by find_moby_hit. */ +enum { + REFUELING_STATION_STATE_INITIALIZE = 0, + REFUELING_STATION_STATE_WAIT_COMMAND = 1, + REFUELING_STATION_STATE_EXPLOSION_DELAY = 2, + REFUELING_STATION_STATE_EXPLODE = 3 +}; + typedef struct { u8 pad0[0x2C]; f32 damage; @@ -96,11 +103,15 @@ void handle_refueling_station_damage(struct Moby *moby, DAMAGE_RESULT_UNAVAILABLE = 0, DAMAGE_RESULT_NO_HIT_OR_SUPPRESSED_RESPONSE = 11 }; + enum { + MOBY_STATE_REMOVAL_PENDING_BELOW_ADDRESS_BOUNDARY = 0xFD, + MOBY_STATE_REMOVAL_PENDING_AT_OR_ABOVE_ADDRESS_BOUNDARY = 0xFE + }; VendorHitSource *damage_hit_record; struct Moby *link; s32 hit; - if (moby->state != 3) { + if (moby->state != REFUELING_STATION_STATE_EXPLODE) { damage_hit_record = find_moby_hit(moby, 0x330000, 0); if (damage_hit_record != 0) { debug_print(D_L09_00208F90, moby->oclass, fptodp(damage_hit_record->damage)); @@ -128,7 +139,9 @@ void handle_refueling_station_damage(struct Moby *moby, moby->flags &= ~0x1000; if (refueling_station_vars->link != -1) { link = &moby_list[refueling_station_vars->link]; - if (link != 0 && link->state != 0xFE && link->state != 0xFD && + if (link != 0 && + link->state != MOBY_STATE_REMOVAL_PENDING_AT_OR_ABOVE_ADDRESS_BOUNDARY && + link->state != MOBY_STATE_REMOVAL_PENDING_BELOW_ADDRESS_BOUNDARY && (link->oclass == 0x494 || link->oclass == 0x49D || link->oclass == 0x4A0)) { link->command = 1; } @@ -136,7 +149,7 @@ void handle_refueling_station_damage(struct Moby *moby, FUN_L00_00257470(moby, 0, -1); refueling_station_vars->anim[7] = 0x78; trooper_anim_update(moby, refueling_station_vars->anim); - moby->state = 3; + moby->state = REFUELING_STATION_STATE_EXPLODE; } else { *health -= damage_hit_record->damage; refueling_station_vars->anim[7] = 0xFA; @@ -162,12 +175,6 @@ typedef struct RefuelingStationVars { /* Moby class 1172 */ void refueling_station_update(struct Moby *moby) { - enum { - REFUELING_STATION_STATE_INITIALIZE = 0, - REFUELING_STATION_STATE_WAIT_COMMAND = 1, - REFUELING_STATION_STATE_EXPLOSION_DELAY = 2, - REFUELING_STATION_STATE_EXPLODE = 3 - }; RefuelingStationVars *station_vars = (RefuelingStationVars *)moby->pvars; float explosion_offset[4]; unsigned char *removal_check_base; @@ -180,7 +187,7 @@ void refueling_station_update(struct Moby *moby) { return; } station_vars->voice = -1; - moby->state = 1; + moby->state = REFUELING_STATION_STATE_WAIT_COMMAND; break; case REFUELING_STATION_STATE_WAIT_COMMAND: if ((D_L09_0015F5CC & 7) == (((int)moby >> 8) & 7)) { @@ -206,7 +213,7 @@ void refueling_station_update(struct Moby *moby) { } station_vars->voice = -1; moby->update_dist = 0xFF; - moby->state = 2; + moby->state = REFUELING_STATION_STATE_EXPLOSION_DELAY; } break; case REFUELING_STATION_STATE_EXPLOSION_DELAY: @@ -221,7 +228,7 @@ void refueling_station_update(struct Moby *moby) { o[0xBC] = 1; } } - moby->state = 3; + moby->state = REFUELING_STATION_STATE_EXPLODE; } break; case REFUELING_STATION_STATE_EXPLODE: diff --git a/src/overlays/l09/mobys/shuttle.c b/src/overlays/l09/mobys/shuttle.c index 3c72403cf6..32a720d849 100644 --- a/src/overlays/l09/mobys/shuttle.c +++ b/src/overlays/l09/mobys/shuttle.c @@ -20,7 +20,7 @@ extern char D_0013E550[]; #include "rnc/mobys/moby.h" extern int D_L09_0015F5CC; -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern void update_moby_vertical_oscillation(float, float, char *, float *, float *) __asm__("FUN_L00_00262b00"); extern void update_moby_rotation_oscillation(void *, char *, char *, float, float, float) __asm__("FUN_L00_00262b80"); @@ -119,7 +119,7 @@ void shuttle_update(struct Moby *moby) { Vec4 *endpoint; attach_manipulator(moby, 0, (u8 *)shuttle_vars + 0x60); path = (PathNodes_00309c08 *)l09_paths[shuttle_vars->path]; - moby->state = 1; + moby->state = SHUTTLE_STATE_WAIT_FOR_DEPARTURE; if (D_0014C050[moby->mission + current_level_index * 16] == 0xFF) { shuttle_vars->dir = -1; shuttle_vars->node = path->count - 2; @@ -149,7 +149,7 @@ void shuttle_update(struct Moby *moby) { frame_time * 0.31415927f, frame_time * 0.4886922f); if (hero.ground_moby != moby) - moby->state = 1; + moby->state = SHUTTLE_STATE_WAIT_FOR_DEPARTURE; break; case SHUTTLE_STATE_WAIT_FOR_DEPARTURE: shuttle_vars->lag += (1.0f - shuttle_vars->lag) * 0.01f; @@ -169,12 +169,12 @@ void shuttle_update(struct Moby *moby) { is_point_inside_clip_volume(D_0013F3D0, *(s32 *)((u8 *)shuttle_vars + 0xB4))) || (shuttle_vars->dir < 0 && *(s32 *)((u8 *)shuttle_vars + 0xB0) != -1 && is_point_inside_clip_volume(D_0013F3D0, *(s32 *)((u8 *)shuttle_vars + 0xB0)))) { - moby->state = 3; + moby->state = SHUTTLE_STATE_FOLLOW_PATH; } } if (hero.ground_moby == moby && hero.air_frames.s == 0) { *(s32 *)((u8 *)shuttle_vars + 0xC8) = 1; - moby->state = 3; + moby->state = SHUTTLE_STATE_FOLLOW_PATH; } break; case SHUTTLE_STATE_FOLLOW_PATH: @@ -218,7 +218,7 @@ void shuttle_update(struct Moby *moby) { *(s32 *)((u8 *)shuttle_vars + 0xC4) = -1; shuttle_vars->lag = 0.0f; *(s32 *)((u8 *)shuttle_vars + 0xDC) = 0; - moby->state = 2; + moby->state = SHUTTLE_STATE_WAIT_FOR_DISMOUNT; shuttle_vars->yaw_offset = 3.1415927f; dir = shuttle_vars->dir; shuttle_vars->dir = -dir; @@ -308,7 +308,7 @@ int advance_shuttle_along_path(struct Moby *moby) { shuttle_path_state->yaw_offset = 0.0f; shuttle_path_state->spin = fast_add_rotations(shuttle_path_state->spin, shuttle_path_state->speed); - FUN_L00_001fff28(shuttle_path_state->unk70, 0, shuttle_path_state->spin); + build_axis_rotation_quaternion(shuttle_path_state->unk70, 0, shuttle_path_state->spin); if (vector_distance_xy(&moby->pos, &path->node[path->count - 1]) > 8.0f && vector_distance_xy(&moby->pos, &path->node[0]) > 8.0f && !random_integer_below(7)) { qcopy(&puff, &moby->pos); diff --git a/src/overlays/l09/mobys/turret.c b/src/overlays/l09/mobys/turret.c index c3d6cffa64..78f6ea2e53 100644 --- a/src/overlays/l09/mobys/turret.c +++ b/src/overlays/l09/mobys/turret.c @@ -85,7 +85,7 @@ extern void FUN_L00_0026dd20(void *, void *, int, int, float); extern void divide_vector_xyz(void *, void *, float) __asm__("FUN_L00_001ff378"); extern void suck_draw_reticle(void *, int, void *, int, int, int, float, float, float) __asm__("FUN_L00_001edf60"); extern float compute_interpolated_record_value(void *) __asm__("FUN_0020c9e0"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); void turret_update(struct Moby *moby) __asm__("FUN_L09_00304c80"); /* Moby class 1201 */ @@ -113,7 +113,7 @@ void turret_update(struct Moby *moby) { moby->flags &= ~4; moby_point_position(moby, 3, &seat); seat.f[2] += 0.4f; - if (moby->state >= 4) { + if (moby->state >= TURRET_STATE_IDLE) { if (fast_dec_timer_s16(&turret_vars->mount_delay) != 0 && moby->command == 1 && hero.state.control_mode != 0x14 && hero.state.control_mode != 7 && hero.state.current != 0x3D) { @@ -129,17 +129,17 @@ void turret_update(struct Moby *moby) { jet_end_mount(0); hero_set_state(0, 1); moby->command = 2; - moby->state = 4; + moby->state = TURRET_STATE_IDLE; blend_moby_animation(moby, 0, 0, 1); } else { - if (moby->state != 5) { + if (moby->state != TURRET_STATE_MOUNTED) { turret_vars->dismount_delay = 2; jet_mount(&moby->pos, &moby->rot, 0, 0, 0); if (moby->prev_seq != 5) { blend_moby_animation(moby, 5, 0, scale_game_frames(5)); } } - moby->state = 5; + moby->state = TURRET_STATE_MOUNTED; } } else if (moby->command == 2) { if (fast_vec_dist(&seat, &hero.moby->pos) > 1.2f || hero.ground_moby != moby) { @@ -158,7 +158,7 @@ void turret_update(struct Moby *moby) { attach_manipulator(moby, 0, turret_vars); work_vector.q = *(u128 *)&moby->pos; spawn_turret_base(moby, &work_vector); - moby->state = 4; + moby->state = TURRET_STATE_IDLE; turret_vars->rest_z = moby->pos.z; turret_vars->pitch = 0.0f; moby->rot.z = 0.0f; @@ -249,7 +249,7 @@ void turret_update(struct Moby *moby) { } turret_vars->yaw_speed *= 0.97f; turret_vars->pitch_speed *= 0.97f; - FUN_L00_001fff28(&turret_vars->aim, 1, -turret_vars->pitch); + build_axis_rotation_quaternion(&turret_vars->aim, 1, -turret_vars->pitch); if (controller_state.held & 0x20) { if (controller_state.pressed & 0x20) { blend_moby_animation(moby, turret_vars->barrel == 0 ? 4 : 3, 0, 1); diff --git a/src/overlays/l10/level_class_tables.c b/src/overlays/l10/level_class_tables.c index 8a60bad711..ca0d350a42 100644 --- a/src/overlays/l10/level_class_tables.c +++ b/src/overlays/l10/level_class_tables.c @@ -6,10 +6,10 @@ #include "rnc/camera/update_cam.h" #include "rnc/mobys/moby_class_tables.h" -void FUN_L00_002caf40(); +void get_morphoray_chicken_slot_record() __asm__("FUN_L00_002caf40"); void FUN_L00_002ea7a0(); void FUN_L00_002ed230(); -void FUN_L10_002f5f18(); +void update_path_flythrough_camera() __asm__("FUN_L10_002f5f18"); void background_ship_2_update() __asm__("FUN_L02_002ece18"); void blarg_ship_rocket_update() __asm__("FUN_L10_002cc2e8"); void blarg_ship_update() __asm__("FUN_L10_002e4a88"); @@ -163,7 +163,7 @@ void *D_L10_001DDE40[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L10_001DDE58[6] @@ -369,7 +369,7 @@ struct CameraType level_camera_types[9] __asm__("D_L10_001DDE80") __attribute__( {17, FUN_L00_002ed230, noop_main_callback, noop_main_callback, noop_main_callback}, {19, evaluate_descriptor_eligibility, initialize_path_camera, - FUN_L10_002f5f18, noop_main_callback }, + update_path_flythrough_camera, noop_main_callback }, {23, volume_camera_check, noop_main_callback, noop_main_callback, noop_main_callback}, {-1, 0, 0, 0, 0}, }; diff --git a/src/overlays/l10/mobys/blarg_ship.c b/src/overlays/l10/mobys/blarg_ship.c index d600630db0..9175d17f69 100644 --- a/src/overlays/l10/mobys/blarg_ship.c +++ b/src/overlays/l10/mobys/blarg_ship.c @@ -21,6 +21,22 @@ #include "rnc/overlay/shared/world/level_path.h" #include "rnc/overlay/l10/mobys/aligned_vector.h" +enum { + BLARG_SHIP_STATE_INITIALIZE = 0, + BLARG_SHIP_STATE_WAIT_FOR_TARGET_IN_VOLUME = 1, + BLARG_SHIP_STATE_RISE_TO_ENTRY_PATH = 2, + BLARG_SHIP_STATE_FOLLOW_ENTRY_PATH = 3, + BLARG_SHIP_STATE_FIRE_AT_TARGET = 4, + BLARG_SHIP_STATE_FIRE_COOLDOWN = 5, + BLARG_SHIP_STATE_FLY_AWAY = 6, + BLARG_SHIP_STATE_HIT_REACTION = 7, + BLARG_SHIP_STATE_EXPLODE = 8 +}; + +enum { + HIT_STATUS_SKIP_DAMAGE_AND_REACTION = 1 +}; + typedef struct Moby Moby; extern float D_0015ED6C; extern float D_0015ED6C, D_0015ED70; @@ -178,17 +194,6 @@ void blarg_ship_update(Ship_5E48 *m) __asm__("FUN_L10_002e4a88"); /* Moby class 1229 */ void blarg_ship_update(Ship_5E48 *ship) { - enum { - BLARG_SHIP_STATE_INITIALIZE = 0, - BLARG_SHIP_STATE_WAIT_FOR_TARGET_IN_VOLUME = 1, - BLARG_SHIP_STATE_RISE_TO_ENTRY_PATH = 2, - BLARG_SHIP_STATE_FOLLOW_ENTRY_PATH = 3, - BLARG_SHIP_STATE_FIRE_AT_TARGET = 4, - BLARG_SHIP_STATE_FIRE_COOLDOWN = 5, - BLARG_SHIP_STATE_FLY_AWAY = 6, - BLARG_SHIP_STATE_HIT_REACTION = 7, - BLARG_SHIP_STATE_EXPLODE = 8 - }; ShipD_5E48 *d = ship->d; Ship_5E48 *tgt; AlignedVec4f A; @@ -221,14 +226,14 @@ void blarg_ship_update(Ship_5E48 *ship) { ship->s34 |= 0x41; if (ship->b53 != 0) blend_moby_animation(ship, 0, 0, 0); - ship->state = 1; + ship->state = BLARG_SHIP_STATE_WAIT_FOR_TARGET_IN_VOLUME; if (visited52[ship->bB0 + (D_0015ED84 << 4)] != 0xFF) break; goto del; case BLARG_SHIP_STATE_WAIT_FOR_TARGET_IN_VOLUME: if (!is_point_inside_clip_volume(&tgt->pos, d->i148)) break; - ship->state = 2; + ship->state = BLARG_SHIP_STATE_RISE_TO_ENTRY_PATH; if (ship->b53 != 1) blend_moby_animation(ship, 1, 0, scale_game_frames(20)); ship->s34 &= 0xFFBE; @@ -250,7 +255,7 @@ void blarg_ship_update(Ship_5E48 *ship) { blend_moby_animation(ship, 2, 0, scale_game_frames(20)); ship->pos.z += D_0015ED6C * 4.0f; if (fast_vec_dist(&ship->pos, &l10_paths[d->i140]->points[0]) < 0.5f) { - ship->state = 3; + ship->state = BLARG_SHIP_STATE_FOLLOW_ENTRY_PATH; if (ship->b53 != 2) blend_moby_animation(ship, 2, 0, scale_game_frames(10)); } @@ -273,14 +278,14 @@ void blarg_ship_update(Ship_5E48 *ship) { d->i158 = n; } else { d->i158 = 0; - ship->state = 4; + ship->state = BLARG_SHIP_STATE_FIRE_AT_TARGET; d->i168 = truncate_float_to_s32(FUN_L04_001f1978(d->f160 * 60.0f)); } } break; case BLARG_SHIP_STATE_FIRE_AT_TARGET: if (is_point_inside_clip_volume(&(&hero)->motion.pos, d->i1B0)) { - ship->state = 6; + ship->state = BLARG_SHIP_STATE_FLY_AWAY; break; } *(u128_2E52B0 *)&A = *(u128_2E52B0 *)&tgt->pos; @@ -330,7 +335,7 @@ void blarg_ship_update(Ship_5E48 *ship) { if (fast_dec_timer(&d->i168)) { if (ship->b53 != 2) blend_moby_animation(ship, 2, 0, scale_game_frames(10)); - ship->state = 5; + ship->state = BLARG_SHIP_STATE_FIRE_COOLDOWN; d->i168 = truncate_float_to_s32(FUN_L04_001f1978(d->f164 * 60.0f)); } qcopy(&B, &l10_paths[d->i144]->points[d->i158]); @@ -345,7 +350,7 @@ void blarg_ship_update(Ship_5E48 *ship) { break; case BLARG_SHIP_STATE_FIRE_COOLDOWN: if (is_point_inside_clip_volume(&(&hero)->motion.pos, d->i1B0)) { - ship->state = 6; + ship->state = BLARG_SHIP_STATE_FLY_AWAY; break; } *(u128_2E52B0 *)&A = *(u128_2E52B0 *)&tgt->pos; @@ -371,7 +376,7 @@ void blarg_ship_update(Ship_5E48 *ship) { if (fast_dec_timer(&d->i168)) { blend_moby_animation(ship, 3, 0, scale_game_frames(10)); ship->f58 = blarg_ship_firing_animation_speed_gp; - ship->state = 4; + ship->state = BLARG_SHIP_STATE_FIRE_AT_TARGET; d->i168 = truncate_float_to_s32(FUN_L04_001f1978(d->f160 * 60.0f)); } qcopy(&B, &l10_paths[d->i144]->points[d->i158]); @@ -399,17 +404,17 @@ void blarg_ship_update(Ship_5E48 *ship) { if (!(ship->b70 & 2)) break; pre_hit_state = ship->bBC; - if (pre_hit_state == 4) { + if (pre_hit_state == BLARG_SHIP_STATE_FIRE_AT_TARGET) { blend_moby_animation(ship, 3, 0, scale_game_frames(10)); ship->f58 = blarg_ship_firing_animation_speed_gp; ship->state = pre_hit_state; d->i168 = truncate_float_to_s32(FUN_L04_001f1978(d->f160 * 60.0f)); - } else if (pre_hit_state == 6) { + } else if (pre_hit_state == BLARG_SHIP_STATE_FLY_AWAY) { blend_moby_animation(ship, 2, 0, scale_game_frames(10)); ship->state = pre_hit_state; } else { blend_moby_animation(ship, 2, 0, scale_game_frames(10)); - ship->state = 5; + ship->state = BLARG_SHIP_STATE_FIRE_COOLDOWN; d->i168 = truncate_float_to_s32(FUN_L04_001f1978(d->f164 * 60.0f)); } break; @@ -495,7 +500,8 @@ void update_blarg_ship_hit_reactions_and_targeting(struct Moby *moby) { dmg = 0.0f; hit_response_code = resolve_moby_hit_response( moby, ship_hit_record, &pvars->unk20, 5, &ship_hit_processing_status, &dmg, 0, 4); - if (ship_hit_record != 0 && ship_hit_processing_status != 1 && moby->state != 8) { + if (ship_hit_record != 0 && ship_hit_processing_status != HIT_STATUS_SKIP_DAMAGE_AND_REACTION && + moby->state != BLARG_SHIP_STATE_EXPLODE) { if ((pvars->unk20 -= dmg) <= 0.0f) { hit_response_code = 1; } @@ -512,7 +518,7 @@ void update_blarg_ship_hit_reactions_and_targeting(struct Moby *moby) { case LETHAL_HIT_RESPONSE: pvars->unkC7 = 0xFA; trooper_anim_update(moby, &pvars->anim_state); - moby->state = 8; + moby->state = BLARG_SHIP_STATE_EXPLODE; break; case NO_REACTION_HIT_RESPONSE: break; @@ -522,13 +528,13 @@ void update_blarg_ship_hit_reactions_and_targeting(struct Moby *moby) { trooper_anim_update(moby, &pvars->anim_state); blend_moby_animation(moby, 4, 0, scale_game_frames(6)); moby->command = moby->state; - moby->state = 7; + moby->state = BLARG_SHIP_STATE_HIT_REACTION; break; } } moby->hit_slot = 0xFF; trooper_anim_finish(moby, &pvars->anim_state); - if (hero.vehicle_mode == 1) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { select_hero_or_gadgebot_target(101.0f, moby, &pvars->unk110); if (*(char **)&pvars->unk110 == 0) { pvars->unk114 = 2; diff --git a/src/overlays/l10/mobys/bombthrower_grass.c b/src/overlays/l10/mobys/bombthrower_grass.c index abba7dd8d9..97781d1be4 100644 --- a/src/overlays/l10/mobys/bombthrower_grass.c +++ b/src/overlays/l10/mobys/bombthrower_grass.c @@ -77,13 +77,17 @@ int spawn_bombthrower_grass_projectile(int firing_moby, /* Moby class 939 */ void bombthrower_grass_update(struct Moby *moby) { + enum { + BOMBTHROWER_GRASS_STATE_LAUNCH_TIMER_UNINITIALIZED = 0, + BOMBTHROWER_GRASS_STATE_LAUNCH_TIMER_INITIALIZED = 1 + }; char *launch_timer = (char *)moby->pvars; float launch_offset[4]; float launch_position[4]; - if (moby->state == 0) { + if (moby->state == BOMBTHROWER_GRASS_STATE_LAUNCH_TIMER_UNINITIALIZED) { *(int *)launch_timer = scale_game_frames(random_int_between(D_L10_00161BF0, D_L10_00161BF4)); - moby->state = 1; + moby->state = BOMBTHROWER_GRASS_STATE_LAUNCH_TIMER_INITIALIZED; } if (fast_dec_timer((int *)launch_timer)) { float x = bombthrower_grass_yaw_offset_limit_degrees_gp; diff --git a/src/overlays/l10/mobys/breakable_prop.c b/src/overlays/l10/mobys/breakable_prop.c index 4b94081b72..14d9549a15 100644 --- a/src/overlays/l10/mobys/breakable_prop.c +++ b/src/overlays/l10/mobys/breakable_prop.c @@ -22,7 +22,7 @@ void breakable_prop_update(struct Moby *moby) { char *hit_result = find_moby_hit(moby, 0x10000, 0); switch (moby->state) { case HIT_RESPONSE_STATE_INITIALIZE: - moby->state = 1; + moby->state = HIT_RESPONSE_STATE_WAIT_FOR_HIT; break; case HIT_RESPONSE_STATE_WAIT_FOR_HIT: if (hit_result != 0) { @@ -30,7 +30,7 @@ void breakable_prop_update(struct Moby *moby) { ok = 1; } if (ok != 0) - moby->state = 2; + moby->state = HIT_RESPONSE_STATE_RESPOND_AND_REMOVE; break; case HIT_RESPONSE_STATE_RESPOND_AND_REMOVE: allocate_voice_for_target_entry(0, 0, (int)moby); diff --git a/src/overlays/l10/mobys/button.c b/src/overlays/l10/mobys/button.c index 31e5b7eec3..f5f5162acc 100644 --- a/src/overlays/l10/mobys/button.c +++ b/src/overlays/l10/mobys/button.c @@ -39,6 +39,10 @@ void button_update(struct Moby *m) __asm__("FUN_L10_002d92b8"); /* Moby class 1031 */ void button_update(struct Moby *moby) { + enum { + DOOR_STATE_CLOSING = 1, + DOOR_STATE_OPENING = 3 + }; FloorPlateVars *plate_vars = (FloorPlateVars *)moby->pvars; s32 pressed = 0; struct Moby *door; @@ -75,8 +79,8 @@ void button_update(struct Moby *moby) { } else { plate_vars->held = 0; } - if (door->state == 1 || door->state == 2) { - door->state = 3; + if (door->state == DOOR_STATE_CLOSING || door->state == 2) { + door->state = DOOR_STATE_OPENING; if (plate_vars->sound_timer == 0) { allocate_voice_for_target_entry(0, 0, door); allocate_voice_for_target_entry(0, 0, moby); @@ -86,7 +90,7 @@ void button_update(struct Moby *moby) { FUN_L00_002502f0_u(moby, 0x7F, 0x7F, 0x7F); } else { if (door->state == 4) { - door->state = 1; + door->state = DOOR_STATE_CLOSING; if (plate_vars->sound_timer == 0) { allocate_voice_for_target_entry(1, 0, door); allocate_voice_for_target_entry(0, 0, moby); diff --git a/src/overlays/l10/mobys/configurable_particle_emitter.c b/src/overlays/l10/mobys/configurable_particle_emitter.c index ea5db4f33e..84e20ca28f 100644 --- a/src/overlays/l10/mobys/configurable_particle_emitter.c +++ b/src/overlays/l10/mobys/configurable_particle_emitter.c @@ -46,7 +46,7 @@ void configurable_particle_emitter_update(char *moby) { case EFFECT_STATE_INITIALIZE: switch (*(int *)effect_pvars) { case EFFECT_MODE_BURST_PARTICLES: - MOBY(moby)->state = 1; + MOBY(moby)->state = EFFECT_STATE_EMIT_BURST_PARTICLES; break; case EFFECT_MODE_CACHE_GROUND_HEIGHT: if (*(int *)(effect_pvars + 4) != -1) { @@ -66,10 +66,10 @@ void configurable_particle_emitter_update(char *moby) { } } else *(float *)(effect_pvars + 0x88) = probe_ground_height(moby + 0x10, 0, 0.5f); - MOBY(moby)->state = 2; + MOBY(moby)->state = EFFECT_STATE_UPDATE_WITH_GROUND_HEIGHT; break; case EFFECT_MODE_TIMED_PARTICLES: - MOBY(moby)->state = 3; + MOBY(moby)->state = EFFECT_STATE_EMIT_TIMED_PARTICLES; break; } break; diff --git a/src/overlays/l10/mobys/cutscene_camera_target.c b/src/overlays/l10/mobys/cutscene_camera_target.c index 9ed0284796..0a41e5b7c4 100644 --- a/src/overlays/l10/mobys/cutscene_camera_target.c +++ b/src/overlays/l10/mobys/cutscene_camera_target.c @@ -28,7 +28,7 @@ void cutscene_camera_target_update(struct Moby *moby) { switch (moby->state) { case LEVEL_MODE_STATE_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = LEVEL_MODE_STATE_DISPATCH; break; case LEVEL_MODE_STATE_DISPATCH: if (D_L10_0015F5C4_vendor == 2) { diff --git a/src/overlays/l10/mobys/darter.c b/src/overlays/l10/mobys/darter.c index c9d0d12f91..ea32ffa7dc 100644 --- a/src/overlays/l10/mobys/darter.c +++ b/src/overlays/l10/mobys/darter.c @@ -22,6 +22,22 @@ #include "rnc/overlay/shared/world/level_path.h" #include "rnc/overlay/l10/mobys/aligned_vector.h" +enum { + DARTER_STATE_INITIALIZE = 0, + DARTER_STATE_RISE_TO_HOME_HEIGHT = 2, + DARTER_STATE_WANDER = 3, + DARTER_STATE_WAIT_BETWEEN_WANDER_GOALS = 4, + DARTER_STATE_RETURN_HOME = 5, + DARTER_STATE_ATTACK_WINDUP = 6, + DARTER_STATE_DIVE_TOWARD_TARGET = 7, + DARTER_STATE_DIVE_ATTACK = 8, + DARTER_STATE_CUBOID_PATROL = 9, + DARTER_STATE_CUBOID_APPROACH_TARGET = 10, + DARTER_STATE_CUBOID_CHARGE_ATTACK = 11, + DARTER_STATE_CUBOID_RETURN_HOME = 12, + DARTER_STATE_DYING = 13 +}; + typedef struct Moby Moby; extern struct Moby *D_L10_0015FFD0_macro[] __asm__("D_L10_0015FFD0") MACRO_ADDR; extern float D_0015ED6C; @@ -98,13 +114,14 @@ typedef struct Vars_2e01a8 { char a270[4]; } Vars_2e01a8; -extern float D_L10_00161DFC __attribute__((sda)); -extern float D_L10_00161E04 __attribute__((sda)); -extern float D_L10_00161E08 __attribute__((sda)); -extern float D_L10_00161E0C __attribute__((sda)); -extern float D_L10_00161E10 __attribute__((sda)); -extern float D_L10_00161E14 __attribute__((sda)); -extern float D_L10_00161E18 __attribute__((sda)); +extern float l10_darter_attack_distance __asm__("D_L10_00161DFC") __attribute__((sda)); +extern float l10_darter_min_wander_height_offset __asm__("D_L10_00161E04") __attribute__((sda)); +extern float l10_darter_max_wander_height_offset __asm__("D_L10_00161E08") __attribute__((sda)); +extern float l10_darter_bob_amplitude __asm__("D_L10_00161E0C") __attribute__((sda)); +extern float l10_darter_bob_period_seconds __asm__("D_L10_00161E10") __attribute__((sda)); +extern float l10_darter_max_height_offset __asm__("D_L10_00161E14") __attribute__((sda)); +extern float l10_darter_height_change_interval_seconds __asm__("D_L10_00161E18") + __attribute__((sda)); extern float D_L10_00161E1C __attribute__((sda)); extern float D_L10_00161E20 __attribute__((sda)); extern int coll_sphere_mobys(float, void *, int, void *, void *) __asm__("FUN_L00_001f2868"); @@ -124,55 +141,61 @@ void darter_update(Moby *moby) __asm__("FUN_L10_002e01a8"); /* Moby class 1199 */ void darter_update(Moby *moby) { - float scratch[20]; - Vars_2e01a8 *vars = (Vars_2e01a8 *)moby->pvars; + enum { + DARTER_SPAWN_HOME_WANDER = 0, + DARTER_SPAWN_REMOVE = 1, + DARTER_SPAWN_CUBOID_PATROL = 2 + }; + float vector_and_collision_scratch[20]; + Vars_2e01a8 *darter_vars = (Vars_2e01a8 *)moby->pvars; Moby *target; update_darter_hit_reactions_and_targeting(moby); - target = vars->target; - func_L00_00264B40_2E0630(2.5f, moby, 1, vars->a270); + target = darter_vars->target; + func_L00_00264B40_2E0630(2.5f, moby, 1, darter_vars->a270); if (moby->visible != 0 && fast_vec_dist(&moby->pos, &D_L10_00167240) < 29.0f) { func_L00_0025B178_2E0630(moby); moby->shadow_range = 0x17; } moby->anim_speed = 1.0f; - if (moby->state != 0 && moby->state != 13) { - moby->pos.z = moby->pos.z - D_L10_00161E0C * fast_cos(vars->bob_angle); + if (moby->state != DARTER_STATE_INITIALIZE && moby->state != DARTER_STATE_DYING) { + moby->pos.z = moby->pos.z - l10_darter_bob_amplitude * fast_cos(darter_vars->bob_angle); } switch (moby->state) { - case 0: - vars->f30 = 0.25f; - vars->f20 = 1.0f; - vars->h24 = 1; - vars->b28 = 0; - vars->b29 = 1; + case DARTER_STATE_INITIALIZE: + darter_vars->f30 = 0.25f; + darter_vars->f20 = 1.0f; + darter_vars->h24 = 1; + darter_vars->b28 = 0; + darter_vars->b29 = 1; moby->flags |= 0x1000; - qcopy(&vars->home, &moby->pos); - qcopy(&vars->goal, &vars->home); - vars->bob_angle = random_angle_radians(); - vars->turn_speed = 0.0f; - vars->b58 = truncate_float_to_s32(D_L10_00161E1C); - vars->b5A = truncate_float_to_s32(D_L10_00161E20 * 8.0f); - switch (vars->spawn_kind) { - case 0: - moby->state = 3; + qcopy(&darter_vars->home, &moby->pos); + qcopy(&darter_vars->goal, &darter_vars->home); + darter_vars->bob_angle = random_angle_radians(); + darter_vars->turn_speed = 0.0f; + darter_vars->b58 = truncate_float_to_s32(D_L10_00161E1C); + darter_vars->b5A = truncate_float_to_s32(D_L10_00161E20 * 8.0f); + switch (darter_vars->spawn_kind) { + case DARTER_SPAWN_HOME_WANDER: + moby->state = DARTER_STATE_WANDER; moby->pos.z = moby->pos.z + 2.0f; if (moby->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); break; - case 1: + case DARTER_SPAWN_REMOVE: mark_moby_for_removal(moby); return; - case 2: - scratch[0] = fast_cos(random_angle_radians()) * 10.0f; - scratch[1] = fast_sin(random_angle_radians()) * 10.0f; - moby->state = 9; - scratch[2] = 0.0f; - moby->pos.z = l10_cuboids[vars->f194].pos.z; - add_vectors(&scratch[4], &moby->pos, scratch); - vars->height_offset = random_float_between(0.0f, D_L10_00161E14); - vars->height_timer = truncate_float_to_s32(scale_time(D_L10_00161E18 * 60.0f) * - random_float_between(0.75f, 1.25f)); + case DARTER_SPAWN_CUBOID_PATROL: + vector_and_collision_scratch[0] = fast_cos(random_angle_radians()) * 10.0f; + vector_and_collision_scratch[1] = fast_sin(random_angle_radians()) * 10.0f; + moby->state = DARTER_STATE_CUBOID_PATROL; + vector_and_collision_scratch[2] = 0.0f; + moby->pos.z = l10_cuboids[darter_vars->f194].pos.z; + add_vectors(&vector_and_collision_scratch[4], &moby->pos, vector_and_collision_scratch); + darter_vars->height_offset = random_float_between(0.0f, l10_darter_max_height_offset); + darter_vars->height_timer = truncate_float_to_s32( + scale_time(l10_darter_height_change_interval_seconds * 60.0f) * + random_float_between(0.75f, 1.25f)); if (moby->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); break; @@ -180,62 +203,63 @@ void darter_update(Moby *moby) { break; case 1: break; - case 2: + case DARTER_STATE_RISE_TO_HOME_HEIGHT: moby->anim_speed = 4.0f; if (advance_accelerated_scalar(&moby->pos.z, - vars->home.z + 2.0f, - &vars->velocity.z, + darter_vars->home.z + 2.0f, + &darter_vars->velocity.z, D_0015ED70 * 18.0f, D_0015ED70 * 18.0f, frame_time * 6.0f) == 0.0f) { - moby->state = 3; + moby->state = DARTER_STATE_WANDER; } break; - case 3: { + case DARTER_STATE_WANDER: { float dist; float travelled; float speed; float zero; moby->anim_speed = 4.0f; - speed = fast_vec_length(&vars->velocity); - dist = fast_vec_dist(&vars->goal, &moby->pos); + speed = fast_vec_length(&darter_vars->velocity); + dist = fast_vec_dist(&darter_vars->goal, &moby->pos); travelled = 0.0f; func_L00_0025CE58_2E0630( &moby->rot.z, - fast_arc_tan(vars->goal.x - moby->pos.x, vars->goal.y - moby->pos.y), - &vars->turn_speed, + fast_arc_tan(darter_vars->goal.x - moby->pos.x, darter_vars->goal.y - moby->pos.y), + &darter_vars->turn_speed, D_0015ED70 * 25.132742f, D_0015ED70 * 25.132742f, frame_time * 50.265484f); if (fast_difference_between_rotations( - fast_arc_tan(vars->goal.x - moby->pos.x, vars->goal.y - moby->pos.y), moby->rot.z) < - 0.78539819f) { + fast_arc_tan(darter_vars->goal.x - moby->pos.x, darter_vars->goal.y - moby->pos.y), + moby->rot.z) < 0.78539819f) { advance_accelerated_scalar(&travelled, dist, &speed, D_0015ED70 * 20.0f, D_0015ED70 * 20.0f, frame_time * 20.0f); - fast_vec_sub(&vars->velocity, &vars->goal, &moby->pos); - func_L00_002607A8_2E0630(&vars->velocity, speed); + fast_vec_sub(&darter_vars->velocity, &darter_vars->goal, &moby->pos); + func_L00_002607A8_2E0630(&darter_vars->velocity, speed); } else { - clear_u64_value(&vars->velocity); + clear_u64_value(&darter_vars->velocity); } zero = 0.0f; - if (func_L00_00259B08_2E0630(moby, &vars->velocity, 0.5f, 0x200, zero, 0) == 1) { + if (func_L00_00259B08_2E0630(moby, &darter_vars->velocity, 0.5f, 0x200, zero, 0) == 1) { float radius = random_float_between(4.0f, 6.0f); float angle = random_angle_radians(); - scratch[0] = fast_cos(angle) * radius; - scratch[1] = fast_sin(angle) * radius; - scratch[2] = zero; - scratch[2] = random_float_between(D_L10_00161E04, D_L10_00161E08); - fast_vec_add(&vars->goal, scratch, &vars->home); + vector_and_collision_scratch[0] = fast_cos(angle) * radius; + vector_and_collision_scratch[1] = fast_sin(angle) * radius; + vector_and_collision_scratch[2] = zero; + vector_and_collision_scratch[2] = random_float_between( + l10_darter_min_wander_height_offset, l10_darter_max_wander_height_offset); + fast_vec_add(&darter_vars->goal, vector_and_collision_scratch, &darter_vars->home); } else if (dist < 0.1f) { - moby->state = 4; - vars->wait = + moby->state = DARTER_STATE_WAIT_BETWEEN_WANDER_GOALS; + darter_vars->wait = scale_game_frames(truncate_float_to_s32(random_float_between(30.0f, 90.0f))); } - if (vars->f104 == 2) + if (darter_vars->f104 == 2) break; if (!(3.0f < vector_distance_xy(&moby->pos, &target->pos))) break; @@ -243,237 +267,250 @@ void darter_update(Moby *moby) { break; if (moby->group != 0xFF) FUN_L10_002e1cb0_2e01a8((unsigned char *)moby); - moby->state = 6; + moby->state = DARTER_STATE_ATTACK_WINDUP; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); break; } - case 4: + case DARTER_STATE_WAIT_BETWEEN_WANDER_GOALS: moby->anim_speed = 4.0f; - if (vars->f104 != 2 && 3.0f < vector_distance_xy(&moby->pos, &target->pos) && + if (darter_vars->f104 != 2 && 3.0f < vector_distance_xy(&moby->pos, &target->pos) && FUN_L00_001fefc8(&moby->command) != 0) { if (moby->group != 0xFF) FUN_L10_002e1cb0_2e01a8((unsigned char *)moby); - moby->state = 6; + moby->state = DARTER_STATE_ATTACK_WINDUP; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); break; } - if (fast_dec_timer(&vars->wait) == 0) + if (fast_dec_timer(&darter_vars->wait) == 0) break; { float radius = random_float_between(4.0f, 6.0f); float angle = random_angle_radians(); - scratch[0] = fast_cos(angle) * radius; - scratch[1] = fast_sin(angle) * radius; - scratch[2] = 0.0f; - scratch[2] = random_float_between(D_L10_00161E04, D_L10_00161E08); - fast_vec_add(&vars->goal, scratch, &vars->home); - moby->state = 3; + vector_and_collision_scratch[0] = fast_cos(angle) * radius; + vector_and_collision_scratch[1] = fast_sin(angle) * radius; + vector_and_collision_scratch[2] = 0.0f; + vector_and_collision_scratch[2] = random_float_between( + l10_darter_min_wander_height_offset, l10_darter_max_wander_height_offset); + fast_vec_add(&darter_vars->goal, vector_and_collision_scratch, &darter_vars->home); + moby->state = DARTER_STATE_WANDER; } break; - case 6: + case DARTER_STATE_ATTACK_WINDUP: approach_w(moby, fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y), - &vars->turn_speed, + &darter_vars->turn_speed, 0.02f, 0.3f, frame_time * 6.2831855f); if ((moby->anim_flags & 2) == 0) break; - moby->state = 7; + moby->state = DARTER_STATE_DIVE_TOWARD_TARGET; if (moby->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); if (random_integer_below(0xFF) & 1) { - vars->side_angle = 0.2617994f; + darter_vars->side_angle = 0.2617994f; } else { - vars->side_angle = -0.2617994f; + darter_vars->side_angle = -0.2617994f; } break; - case 7: { - float lim; + case DARTER_STATE_DIVE_TOWARD_TARGET: { + float ground_height; approach_w(moby, fast_add_rotations( fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y), - vars->side_angle), - &vars->turn_speed, + darter_vars->side_angle), + &darter_vars->turn_speed, 0.02f, 0.3f, frame_time * 6.2831855f); - lim = probe_ground_height(&moby->pos, 0, 0.5f); - qcopy(scratch, &target->pos); - if (scratch[2] < moby->pos.z) { - scratch[2] = scratch[2] - (moby->pos.z - scratch[2]) * 4.0f; + ground_height = probe_ground_height(&moby->pos, 0, 0.5f); + qcopy(vector_and_collision_scratch, &target->pos); + if (vector_and_collision_scratch[2] < moby->pos.z) { + vector_and_collision_scratch[2] = + vector_and_collision_scratch[2] - + (moby->pos.z - vector_and_collision_scratch[2]) * 4.0f; } else { - scratch[2] = moby->pos.z; + vector_and_collision_scratch[2] = moby->pos.z; } - scratch[2] = scratch[2] + 0.5f; - if (scratch[2] < lim) - scratch[2] = lim; - fast_vec_sub(&vars->velocity, scratch, &moby->pos); - fast_vec_normalize(&vars->velocity, &vars->velocity, frame_time * 10.0f); - vars->velocity.x = fast_cos(moby->rot.z) * vector_length_xy(&vars->velocity); - vars->velocity.y = fast_sin(moby->rot.z) * vector_length_xy(&vars->velocity); - func_L00_00259B08_2E0630(moby, &vars->velocity, 0.5f, 0x200, 0.0f, 0); - func_L00_0025CC58_2E0630(&moby->rot.y, - 0, - -fast_arc_tan(vector_length_xy(&vars->velocity), vars->velocity.z), - frame_time * 6.2831855f); - if (vector_distance_xy(&moby->pos, &target->pos) < D_L10_00161DFC) { + vector_and_collision_scratch[2] = vector_and_collision_scratch[2] + 0.5f; + if (vector_and_collision_scratch[2] < ground_height) + vector_and_collision_scratch[2] = ground_height; + fast_vec_sub(&darter_vars->velocity, vector_and_collision_scratch, &moby->pos); + fast_vec_normalize(&darter_vars->velocity, &darter_vars->velocity, frame_time * 10.0f); + darter_vars->velocity.x = fast_cos(moby->rot.z) * vector_length_xy(&darter_vars->velocity); + darter_vars->velocity.y = fast_sin(moby->rot.z) * vector_length_xy(&darter_vars->velocity); + func_L00_00259B08_2E0630(moby, &darter_vars->velocity, 0.5f, 0x200, 0.0f, 0); + func_L00_0025CC58_2E0630( + &moby->rot.y, + 0, + -fast_arc_tan(vector_length_xy(&darter_vars->velocity), darter_vars->velocity.z), + frame_time * 6.2831855f); + if (vector_distance_xy(&moby->pos, &target->pos) < l10_darter_attack_distance) { if (absolute_float(moby->pos.z - ((Hero_2e01a8 *)((char *)&hero))->motion.pos.f[2]) < 2.0f) { allocate_voice_for_target_entry(0, 0, moby); - moby->state = 8; - clear_u64_value(&vars->velocity); + moby->state = DARTER_STATE_DIVE_ATTACK; + clear_u64_value(&darter_vars->velocity); if (moby->prev_seq != 2) blend_moby_animation(moby, 2, 4, scale_game_frames(5)); break; } - } else if (vars->f104 != 2) { + } else if (darter_vars->f104 != 2) { break; } if (moby->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(0x14)); - moby->state = 5; + moby->state = DARTER_STATE_RETURN_HOME; break; } - case 8: + case DARTER_STATE_DIVE_ATTACK: approach_w(moby, fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y), - &vars->turn_speed, + &darter_vars->turn_speed, 0.02f, 0.3f, frame_time * 6.2831855f); - func_L00_0025CC58_2E0630( - &moby->rot.y, - 0, - -fast_arc_tan(vector_distance_xy(&moby->pos, &vars->vE0), vars->vE0.z - moby->pos.z), - frame_time * 12.566371f); + func_L00_0025CC58_2E0630(&moby->rot.y, + 0, + -fast_arc_tan(vector_distance_xy(&moby->pos, &darter_vars->vE0), + darter_vars->vE0.z - moby->pos.z), + frame_time * 12.566371f); if (is_value_within_interpolated_window((char *)moby, 20.0f)) { float one = 1.0f; - *(int *)&scratch[13] = 1; - *(int *)&scratch[16] = 1; - *(Moby **)&scratch[12] = moby; - scratch[15] = one; - scratch[8] = fast_cos(moby->rot.z); - scratch[9] = fast_sin(moby->rot.z); - ((unsigned char *)scratch)[0x39] = 1; - scratch[10] = one; - scratch[11] = 5627.9248f; - *(short *)((char *)scratch + 0x3A) = moby->oclass; - ((unsigned char *)scratch)[0x38] = 0; - FUN_L00_0024f7c8(moby, 0, scratch); - coll_sphere_mobys(0.4f, scratch, 0, moby, &scratch[8]); - collision_line(&moby->pos, scratch, 9, moby, &scratch[8]); + *(int *)&vector_and_collision_scratch[13] = 1; + *(int *)&vector_and_collision_scratch[16] = 1; + *(Moby **)&vector_and_collision_scratch[12] = moby; + vector_and_collision_scratch[15] = one; + vector_and_collision_scratch[8] = fast_cos(moby->rot.z); + vector_and_collision_scratch[9] = fast_sin(moby->rot.z); + ((unsigned char *)vector_and_collision_scratch)[0x39] = 1; + vector_and_collision_scratch[10] = one; + vector_and_collision_scratch[11] = 5627.9248f; + *(short *)((char *)vector_and_collision_scratch + 0x3A) = moby->oclass; + ((unsigned char *)vector_and_collision_scratch)[0x38] = 0; + FUN_L00_0024f7c8(moby, 0, vector_and_collision_scratch); + coll_sphere_mobys( + 0.4f, vector_and_collision_scratch, 0, moby, &vector_and_collision_scratch[8]); + collision_line(&moby->pos, + vector_and_collision_scratch, + 9, + moby, + &vector_and_collision_scratch[8]); } - if (vars->f104 != 2 && (moby->anim_flags & 2) == 0) + if (darter_vars->f104 != 2 && (moby->anim_flags & 2) == 0) break; if (moby->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(0x14)); - moby->state = 5; + moby->state = DARTER_STATE_RETURN_HOME; break; - case 5: { + case DARTER_STATE_RETURN_HOME: { float zero = 0.0f; float climb; func_L00_0025CC58_2E0630(&moby->rot.y, 0, zero, frame_time * 12.566371f); - approach_w(moby, - fast_arc_tan(vars->home.x - moby->pos.x, vars->home.y - moby->pos.y), - &vars->turn_speed, - 0.02f, - 0.3f, - frame_time * 6.2831855f); - vars->velocity.x = fast_cos(moby->rot.z) * (frame_time * 6.0f); - vars->velocity.y = fast_sin(moby->rot.z) * (frame_time * 6.0f); - vars->velocity.z = zero; - climb = vars->home.z + 2.0f - moby->pos.z; + approach_w( + moby, + fast_arc_tan(darter_vars->home.x - moby->pos.x, darter_vars->home.y - moby->pos.y), + &darter_vars->turn_speed, + 0.02f, + 0.3f, + frame_time * 6.2831855f); + darter_vars->velocity.x = fast_cos(moby->rot.z) * (frame_time * 6.0f); + darter_vars->velocity.y = fast_sin(moby->rot.z) * (frame_time * 6.0f); + darter_vars->velocity.z = zero; + climb = darter_vars->home.z + 2.0f - moby->pos.z; if (frame_time * 6.0f < climb) { climb = frame_time * 6.0f; } else if (climb < frame_time * -6.0f) { climb = frame_time * -6.0f; } - vars->velocity.z = climb; - func_L00_00259B08_2E0630(moby, &vars->velocity, 0.5f, 0x200, 0.0f, 0); - if (vector_distance_xy(&moby->pos, &vars->home) < 2.0f) - moby->state = 3; + darter_vars->velocity.z = climb; + func_L00_00259B08_2E0630(moby, &darter_vars->velocity, 0.5f, 0x200, 0.0f, 0); + if (vector_distance_xy(&moby->pos, &darter_vars->home) < 2.0f) + moby->state = DARTER_STATE_WANDER; break; } - case 9: { + case DARTER_STATE_CUBOID_PATROL: { float dist = fast_vec_dist(&moby->pos, &target->pos); float climb; - approach_w(moby, - fast_arc_tan(vars->home.x - moby->pos.x, vars->home.y - moby->pos.y), - &vars->turn_speed, - 0.02f, - 0.3f, - frame_time * 0.78539819f); - vars->velocity.x = fast_cos(moby->rot.z) * (frame_time * 4.0f); - vars->velocity.y = fast_sin(moby->rot.z) * (frame_time * 4.0f); - vars->velocity.z = 0.0f; - if (fast_dec_timer(&vars->height_timer)) { - vars->height_offset = random_float_between(0.0f, D_L10_00161E14); - vars->height_timer = truncate_float_to_s32(scale_time(D_L10_00161E18 * 60.0f) * - random_float_between(0.75f, 1.25f)); + approach_w( + moby, + fast_arc_tan(darter_vars->home.x - moby->pos.x, darter_vars->home.y - moby->pos.y), + &darter_vars->turn_speed, + 0.02f, + 0.3f, + frame_time * 0.78539819f); + darter_vars->velocity.x = fast_cos(moby->rot.z) * (frame_time * 4.0f); + darter_vars->velocity.y = fast_sin(moby->rot.z) * (frame_time * 4.0f); + darter_vars->velocity.z = 0.0f; + if (fast_dec_timer(&darter_vars->height_timer)) { + darter_vars->height_offset = random_float_between(0.0f, l10_darter_max_height_offset); + darter_vars->height_timer = truncate_float_to_s32( + scale_time(l10_darter_height_change_interval_seconds * 60.0f) * + random_float_between(0.75f, 1.25f)); } - climb = l10_cuboids[vars->f194].pos.z - moby->pos.z - vars->height_offset; + climb = l10_cuboids[darter_vars->f194].pos.z - moby->pos.z - darter_vars->height_offset; if (frame_time + frame_time < climb) { climb = frame_time + frame_time; } else if (climb < frame_time * -2.0f) { climb = frame_time * -2.0f; } - vars->velocity.z = climb; - func_L00_00259B08_2E0630(moby, &vars->velocity, 0.5f, 0x200, 0.0f, 0); - if (vars->f104 == 2) + darter_vars->velocity.z = climb; + func_L00_00259B08_2E0630(moby, &darter_vars->velocity, 0.5f, 0x200, 0.0f, 0); + if (darter_vars->f104 == 2) break; if (FUN_L00_001fefc8(&moby->command) == 0) break; - if (!(D_L10_00161DFC < dist)) + if (!(l10_darter_attack_distance < dist)) break; if (moby->group != 0xFF) FUN_L10_002e1cb0_2e01a8((unsigned char *)moby); - moby->state = 10; + moby->state = DARTER_STATE_CUBOID_APPROACH_TARGET; if (moby->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); break; } - case 10: { + case DARTER_STATE_CUBOID_APPROACH_TARGET: { float dist = fast_vec_dist(&moby->pos, &target->pos); float climb; if (moby->group != 0xFF) FUN_L10_002e1cb0_2e01a8((unsigned char *)moby); approach_w(moby, fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y), - &vars->turn_speed, + &darter_vars->turn_speed, 0.02f, 0.3f, frame_time * 1.5707964f); - vars->velocity.x = fast_cos(moby->rot.z) * (frame_time * 4.0f); - vars->velocity.y = fast_sin(moby->rot.z) * (frame_time * 4.0f); - vars->velocity.z = 0.0f; - climb = l10_cuboids[vars->f194].pos.z - moby->pos.z; + darter_vars->velocity.x = fast_cos(moby->rot.z) * (frame_time * 4.0f); + darter_vars->velocity.y = fast_sin(moby->rot.z) * (frame_time * 4.0f); + darter_vars->velocity.z = 0.0f; + climb = l10_cuboids[darter_vars->f194].pos.z - moby->pos.z; if (frame_time * 4.0f < climb) { climb = frame_time * 4.0f; } else if (climb < frame_time * -4.0f) { climb = frame_time * -4.0f; } - vars->velocity.z = climb; - func_L00_00259B08_2E0630(moby, &vars->velocity, 0.5f, 0x200, 0.0f, 0); - if (dist < D_L10_00161DFC && - absolute_float(l10_cuboids[vars->f194].pos.z - moby->pos.z) < 1.0f) { + darter_vars->velocity.z = climb; + func_L00_00259B08_2E0630(moby, &darter_vars->velocity, 0.5f, 0x200, 0.0f, 0); + if (dist < l10_darter_attack_distance && + absolute_float(l10_cuboids[darter_vars->f194].pos.z - moby->pos.z) < 1.0f) { allocate_voice_for_target_entry(0, 0, moby); - moby->state = 11; + moby->state = DARTER_STATE_CUBOID_CHARGE_ATTACK; if (moby->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(2)); break; } - if (vars->f104 != 2) + if (darter_vars->f104 != 2) break; - moby->state = 9; - vars->height_offset = random_float_between(0.0f, D_L10_00161E14); - vars->height_timer = truncate_float_to_s32(scale_time(D_L10_00161E18 * 60.0f) * - random_float_between(0.75f, 1.25f)); + moby->state = DARTER_STATE_CUBOID_PATROL; + darter_vars->height_offset = random_float_between(0.0f, l10_darter_max_height_offset); + darter_vars->height_timer = + truncate_float_to_s32(scale_time(l10_darter_height_change_interval_seconds * 60.0f) * + random_float_between(0.75f, 1.25f)); break; } - case 11: { + case DARTER_STATE_CUBOID_CHARGE_ATTACK: { float climb; float zero; float one; @@ -481,87 +518,92 @@ void darter_update(Moby *moby) { FUN_L10_002e1cb0_2e01a8((unsigned char *)moby); approach_w(moby, fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y), - &vars->turn_speed, + &darter_vars->turn_speed, 0.02f, 0.3f, frame_time * 6.2831855f); - vars->velocity.x = fast_cos(moby->rot.z) * (frame_time * 6.0f); - vars->velocity.y = fast_sin(moby->rot.z) * (frame_time * 6.0f); - vars->velocity.z = 0.0f; - climb = l10_cuboids[vars->f194].pos.z - moby->pos.z; + darter_vars->velocity.x = fast_cos(moby->rot.z) * (frame_time * 6.0f); + darter_vars->velocity.y = fast_sin(moby->rot.z) * (frame_time * 6.0f); + darter_vars->velocity.z = 0.0f; + climb = l10_cuboids[darter_vars->f194].pos.z - moby->pos.z; if (frame_time * 3.0f < climb) { climb = frame_time * 3.0f; } else if (climb < frame_time * -3.0f) { climb = frame_time * -3.0f; } - vars->velocity.z = climb; + darter_vars->velocity.z = climb; zero = 0.0f; - func_L00_00259B08_2E0630(moby, &vars->velocity, 0.5f, 0x200, zero, 0); + func_L00_00259B08_2E0630(moby, &darter_vars->velocity, 0.5f, 0x200, zero, 0); one = 1.0f; - *(int *)&scratch[9] = 0x10001; - *(int *)&scratch[12] = 1; - *(Moby **)&scratch[8] = moby; - scratch[11] = one; - clear_u64_value(&scratch[4]); - FUN_L00_0024f7c8(moby, 0, scratch); - coll_sphere_mobys(0.2f, scratch, 0, moby, &scratch[4]); + *(int *)&vector_and_collision_scratch[9] = 0x10001; + *(int *)&vector_and_collision_scratch[12] = 1; + *(Moby **)&vector_and_collision_scratch[8] = moby; + vector_and_collision_scratch[11] = one; + clear_u64_value(&vector_and_collision_scratch[4]); + FUN_L00_0024f7c8(moby, 0, vector_and_collision_scratch); + coll_sphere_mobys( + 0.2f, vector_and_collision_scratch, 0, moby, &vector_and_collision_scratch[4]); if (fast_vec_dist(&moby->pos, &target->pos) < one || *(int *)(((char *)&hero) + 0x208C) == 7 || (moby->anim_flags & 2)) { - moby->state = 12; + moby->state = DARTER_STATE_CUBOID_RETURN_HOME; if (moby->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(2)); break; } - if (vars->f104 != 2) + if (darter_vars->f104 != 2) break; - moby->state = 9; - vars->height_offset = random_float_between(zero, D_L10_00161E14); - vars->height_timer = truncate_float_to_s32(scale_time(D_L10_00161E18 * 60.0f) * - random_float_between(0.75f, 1.25f)); + moby->state = DARTER_STATE_CUBOID_PATROL; + darter_vars->height_offset = random_float_between(zero, l10_darter_max_height_offset); + darter_vars->height_timer = + truncate_float_to_s32(scale_time(l10_darter_height_change_interval_seconds * 60.0f) * + random_float_between(0.75f, 1.25f)); break; } - case 12: { + case DARTER_STATE_CUBOID_RETURN_HOME: { float climb; - approach_w(moby, - fast_arc_tan(vars->home.x - moby->pos.x, vars->home.y - moby->pos.y), - &vars->turn_speed, - 0.02f, - 0.3f, - frame_time * 1.0471976f); - vars->velocity.x = fast_cos(moby->rot.z) * (frame_time * 4.0f); - vars->velocity.y = fast_sin(moby->rot.z) * (frame_time * 4.0f); - vars->velocity.z = 0.0f; - climb = l10_cuboids[vars->f194].pos.z - moby->pos.z; + approach_w( + moby, + fast_arc_tan(darter_vars->home.x - moby->pos.x, darter_vars->home.y - moby->pos.y), + &darter_vars->turn_speed, + 0.02f, + 0.3f, + frame_time * 1.0471976f); + darter_vars->velocity.x = fast_cos(moby->rot.z) * (frame_time * 4.0f); + darter_vars->velocity.y = fast_sin(moby->rot.z) * (frame_time * 4.0f); + darter_vars->velocity.z = 0.0f; + climb = l10_cuboids[darter_vars->f194].pos.z - moby->pos.z; if (frame_time * 3.0f < climb) { climb = frame_time * 3.0f; } else if (climb < frame_time * -3.0f) { climb = frame_time * -3.0f; } - vars->velocity.z = climb; - add_vectors(scratch, &moby->pos, &vars->velocity); - if (vector_distance_xy(&moby->pos, &vars->home) < 2.0f) { - moby->state = 9; + darter_vars->velocity.z = climb; + add_vectors(vector_and_collision_scratch, &moby->pos, &darter_vars->velocity); + if (vector_distance_xy(&moby->pos, &darter_vars->home) < 2.0f) { + moby->state = DARTER_STATE_CUBOID_PATROL; moby->command = scale_game_frames(0x78); - vars->height_offset = random_float_between(0.0f, D_L10_00161E14); - vars->height_timer = truncate_float_to_s32(scale_time(D_L10_00161E18 * 60.0f) * - random_float_between(0.75f, 1.25f)); + darter_vars->height_offset = random_float_between(0.0f, l10_darter_max_height_offset); + darter_vars->height_timer = truncate_float_to_s32( + scale_time(l10_darter_height_change_interval_seconds * 60.0f) * + random_float_between(0.75f, 1.25f)); } break; } - case 13: - if ((step_moby_motion(moby, vars->a60) & 1) == 0) + case DARTER_STATE_DYING: + if ((step_moby_motion(moby, darter_vars->a60) & 1) == 0) break; mark_moby_for_removal_cf(moby, 0x200, -1); spawn_color_swapped_explosion_burst(moby, &moby->pos, -1, 0.5f, 10.0f); mark_moby_for_removal(moby); return; } - if (moby->state != 0 && moby->state != 13) { - vars->bob_angle = fast_add_rotations( - vars->bob_angle, - 360.0f / (float)truncate_float_to_s32(scale_time(D_L10_00161E10 * 60.0f)) * + if (moby->state != DARTER_STATE_INITIALIZE && moby->state != DARTER_STATE_DYING) { + darter_vars->bob_angle = fast_add_rotations( + darter_vars->bob_angle, + 360.0f / + (float)truncate_float_to_s32(scale_time(l10_darter_bob_period_seconds * 60.0f)) * 0.017453292f); - moby->pos.z = moby->pos.z + D_L10_00161E0C * fast_cos(vars->bob_angle); + moby->pos.z = moby->pos.z + l10_darter_bob_amplitude * fast_cos(darter_vars->bob_angle); } } @@ -626,6 +668,9 @@ extern void trooper_anim_update(void *m, void *p) __asm__("FUN_L00_0025d458"); #include "rnc/data_labels.h" void update_darter_hit_reactions_and_targeting(struct Moby *moby) { + enum { + TARGET_SELECTION_DEFAULT_REJECTED_NO_REPLACEMENT = 2 + }; MobyData *class_1199_vars = ((struct MobyData *)moby->pvars); float vector_scratch[4]; float transformed_offset[4]; @@ -640,7 +685,7 @@ void update_darter_hit_reactions_and_targeting(struct Moby *moby) { class_1199_vars->f38 = 0; } fast_dec_timer(&class_1199_vars->f184); - if (moby->state != 13) { + if (moby->state != DARTER_STATE_DYING) { hit_record = find_moby_hit(moby, 0x330000, 0); resolve_moby_hit_response( moby, hit_record, &class_1199_vars->f20, 5, &hit_processing_status, 0, 0, 4); @@ -650,7 +695,7 @@ void update_darter_hit_reactions_and_targeting(struct Moby *moby) { moby->flags &= 0xEFFF; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); - moby->state = 13; + moby->state = DARTER_STATE_DYING; class_1199_vars->f70 = D_0015ED70 * 26.0f; class_1199_vars->f9D = 3; class_1199_vars->f84 = 9; @@ -692,7 +737,7 @@ void update_darter_hit_reactions_and_targeting(struct Moby *moby) { } if (class_1199_vars->f174 == 2) { target_selection_status = ahead_f(class_1199_vars->f180, moby, class_1199_vars->fC0); - if (target_selection_status != 2) { + if (target_selection_status != TARGET_SELECTION_DEFAULT_REJECTED_NO_REPLACEMENT) { LevelCuboid *bp = &l10_cuboids[class_1199_vars->f194]; fast_vec_sub(vector_scratch, D_0013F3D0, &bp->pos); vector_scratch[3] = 0.0f; @@ -722,7 +767,7 @@ void update_darter_hit_reactions_and_targeting(struct Moby *moby) { } else { target_selection_status = ahead_f(class_1199_vars->f180, moby, class_1199_vars->fC0); } - if (target_selection_status != 2) { + if (target_selection_status != TARGET_SELECTION_DEFAULT_REJECTED_NO_REPLACEMENT) { if (class_1199_vars->f180 < vector_distance_xy(class_1199_vars->f130, class_1199_vars->fC0)) { class_1199_vars->f104 = 2; diff --git a/src/overlays/l10/mobys/data_processor_linked_effect.c b/src/overlays/l10/mobys/data_processor_linked_effect.c index 0864890a6c..c07e787bd4 100644 --- a/src/overlays/l10/mobys/data_processor_linked_effect.c +++ b/src/overlays/l10/mobys/data_processor_linked_effect.c @@ -18,6 +18,12 @@ #include "rnc/overlay/shared/math/quad.h" #include "rnc/audio/voice_pool.h" +enum { + MOBY_STATE_INITIALIZE = 0, + MOBY_STATE_ACTIVE_WITH_SOUND = 1, + MOBY_STATE_ACTIVE_WITHOUT_SOUND = 2 +}; + extern int debug_print() __asm__("FUN_001e93b0"); extern float scale_time(float) __asm__("FUN_001f96b0"); @@ -54,11 +60,6 @@ typedef struct DataProcessorLinkedEffectVars { /* Moby class 1067 */ void data_processor_linked_effect_update(struct Moby *moby) { - enum { - MOBY_STATE_INITIALIZE = 0, - MOBY_STATE_ACTIVE_WITH_SOUND = 1, - MOBY_STATE_ACTIVE_WITHOUT_SOUND = 2 - }; DataProcessorLinkedEffectVars *linked_effect_vars = (DataProcessorLinkedEffectVars *)moby->pvars; union { @@ -100,7 +101,7 @@ void data_processor_linked_effect_update(struct Moby *moby) { float timer; float new_rotation = fast_add_rotations(moby->rot.z, 1.5707964f); moby->update_dist = 0x60; - moby->state = 1; + moby->state = MOBY_STATE_ACTIVE_WITH_SOUND; timer = data_processor_linked_effect_fade_duration_seconds_gp * 60.0f; moby->rot.z = new_rotation; linked_effect_vars->voice = -1; @@ -300,7 +301,7 @@ void render_data_processor_linked_effect(u8 *moby) { (color & 0xffffff) + (truncate_float_to_s32(fade * fade * convert_integer_to_float((int)color >> 24)) << 24); - if (MOBY(moby)->state == 2) { + if (MOBY(moby)->state == MOBY_STATE_ACTIVE_WITHOUT_SOUND) { float alpha = convert_integer_to_float(linked_effect_render_vars->timer_34); float duration = scale_time(data_processor_linked_effect_fade_duration_seconds_gp * 60.0f); diff --git a/src/overlays/l10/mobys/gadgebot_telepot_pad.c b/src/overlays/l10/mobys/gadgebot_telepot_pad.c index 15a6a1ed2e..14c10c5e77 100644 --- a/src/overlays/l10/mobys/gadgebot_telepot_pad.c +++ b/src/overlays/l10/mobys/gadgebot_telepot_pad.c @@ -67,6 +67,10 @@ void gadgebot_telepot_pad_update(char *moby) __asm__("FUN_L10_002be858"); /* Moby classes 351, 1301 */ void gadgebot_telepot_pad_update(char *moby) { + enum { + TELEPOT_PAD_STATE_UNINITIALIZED = 0, + TELEPOT_PAD_STATE_INITIALIZED = 1 + }; int *telepot_pad_vars = ((int *)MOBY(moby)->pvars); float position[4]; float velocity[4]; @@ -76,13 +80,13 @@ void gadgebot_telepot_pad_update(char *moby) { int i; char *hero_bytes; int life; - if (MOBY(moby)->state == 0) { + if (MOBY(moby)->state == TELEPOT_PAD_STATE_UNINITIALIZED) { gadgebot_telepot_camera_effect_remaining_frames = 0; gadgebot_telepot_camera_spring_decay_frames_gp = func_001F9850_2BFBB8(gadgebot_telepot_camera_spring_decay_frames_gp); gadgebot_telepot_camera_effect_duration_frames_gp = func_001F9850_2BFBB8(gadgebot_telepot_camera_effect_duration_frames_gp); - MOBY(moby)->state = 1; + MOBY(moby)->state = TELEPOT_PAD_STATE_INITIALIZED; } hero_bytes = D_0013F350; if ((unsigned char)hero_bytes[0x20A4] == 1 && *telepot_pad_vars != -1 && diff --git a/src/overlays/l10/mobys/gate_1.c b/src/overlays/l10/mobys/gate_1.c index 697109bd36..88ec3260fb 100644 --- a/src/overlays/l10/mobys/gate_1.c +++ b/src/overlays/l10/mobys/gate_1.c @@ -45,15 +45,15 @@ void gate_1_update(struct Moby *moby) { ((D_0014C190_257218[current_level_index][(short)save_id >> 5] >> (save_id & 31)) & 1) == 0) { gate_control->home_yaw = moby->rot.y; - moby->state = 1; + moby->state = GATE_STATE_CLOSED; return; } } moby->rot.y = fast_add_rotations(moby->rot.y, -1.3962634f); - moby->state = 3; + moby->state = GATE_STATE_OPEN; return; case GATE_STATE_CLOSED: - if (hero.vehicle_mode != 0) + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) goto open; save_id = moby->save_id; if (l10_save_state.cleared[(short)save_id] != 0 || @@ -61,7 +61,7 @@ void gate_1_update(struct Moby *moby) { 0) { open: moby->rot.y = fast_add_rotations(moby->rot.y, -1.3962634f); - moby->state = 3; + moby->state = GATE_STATE_OPEN; return; } if (is_point_inside_clip_volume(&hero.motion.pos, gate_control->clip_volume) == 0 && @@ -76,12 +76,12 @@ void gate_1_update(struct Moby *moby) { if (is_point_inside_clip_volume(&hero.motion.pos, gate_control->clip_volume)) activate_descriptor(gate_control->sound); gate_control->timer = truncate_float_to_s32(FUN_L04_001f1978(90.0f)); - moby->state = 2; + moby->state = GATE_STATE_OPENING; return; case GATE_STATE_OPENING: moby->rot.y = fast_add_rotations(moby->rot.y, -1.3962634f / FUN_L04_001f1978(90.0f)); if (fast_dec_timer(&gate_control->timer)) - moby->state = 3; + moby->state = GATE_STATE_OPEN; return; case GATE_STATE_OPEN: if (D_001413F4_e9648[0] != 0) @@ -93,7 +93,7 @@ void gate_1_update(struct Moby *moby) { 1) == 0) return; moby->rot.y = fast_add_rotations(moby->rot.y, 1.3962634f); - moby->state = 0; + moby->state = GATE_STATE_INITIALIZE; return; } } diff --git a/src/overlays/l10/mobys/gate_2.c b/src/overlays/l10/mobys/gate_2.c index 87b98d35b4..e5cb4494ef 100644 --- a/src/overlays/l10/mobys/gate_2.c +++ b/src/overlays/l10/mobys/gate_2.c @@ -75,13 +75,13 @@ void gate_2_update(GateMoby *moby) { opening_offset[1] = fast_sin(fast_add_rotations(moby->rotz, 3.14159265f)) * 1.5f; opening_offset[2] = 0.0f; fast_vec_add(&opening_position, &vars->home, opening_offset); - moby->state = 3; + moby->state = GATE_STATE_OPEN; moby->pos = opening_position; } else { if (vars->door > 0) { (*(GateMoby **)&D_L10_0015FFD8_gp)[vars->door].flags |= 2; } - moby->state = 1; + moby->state = GATE_STATE_CLOSED; } break; case GATE_STATE_CLOSED: { @@ -92,7 +92,7 @@ void gate_2_update(GateMoby *moby) { (moby->uid & 0x1F)) & 1) != 0) { moby->pos = vars->home; - moby->state = 3; + moby->state = GATE_STATE_OPEN; if (vars->door > 0) { (*(GateMoby **)&D_L10_0015FFD8_gp)[vars->door].flags &= 0xFFFD; } @@ -107,7 +107,7 @@ void gate_2_update(GateMoby *moby) { activate_descriptor(vars->sound); } vars->timer = truncate_float_to_s32(FUN_L04_001f1978(90.0f)); - moby->state = 2; + moby->state = GATE_STATE_OPENING; } break; } @@ -124,7 +124,7 @@ void gate_2_update(GateMoby *moby) { fast_vec_add(&opening_position, &vars->home, opening_offset); moby->pos = opening_position; if (fast_dec_timer(&vars->timer)) { - moby->state = 3; + moby->state = GATE_STATE_OPEN; } break; case GATE_STATE_OPEN: @@ -135,7 +135,7 @@ void gate_2_update(GateMoby *moby) { 1) & 1)) { moby->pos = vars->home; - moby->state = 0; + moby->state = GATE_STATE_INITIALIZE; } break; } diff --git a/src/overlays/l10/mobys/gun.c b/src/overlays/l10/mobys/gun.c index ff3b17b62c..fcd317a809 100644 --- a/src/overlays/l10/mobys/gun.c +++ b/src/overlays/l10/mobys/gun.c @@ -36,6 +36,12 @@ void gun_update(struct Moby *moby) __asm__("FUN_L10_002e8ab0"); /* Moby class 1346 */ void gun_update(struct Moby *moby) { + enum { + GUN_STATE_INITIALIZE = 0, + GUN_STATE_INACTIVE = 1, + GUN_STATE_AIM_AND_FIRE = 2, + GUN_STATE_CLEANUP = 3 + }; Vars *gun_control = (Vars *)moby->pvars; int *bits; float rotation[4]; @@ -45,16 +51,16 @@ void gun_update(struct Moby *moby) { int state; state = moby->state; - if (state == 1) + if (state == GUN_STATE_INACTIVE) return; - if (state < 2) { - if (state == 0) + if (state < GUN_STATE_AIM_AND_FIRE) { + if (state == GUN_STATE_INITIALIZE) goto state_zero; return; } - if (state == 2) + if (state == GUN_STATE_AIM_AND_FIRE) goto state_two; - if (state == 3) + if (state == GUN_STATE_CLEANUP) goto state_three; return; state_zero: { @@ -67,7 +73,7 @@ state_zero: { ((signed_save_id >> 5) * 4 + (current_level_index << 8))) >> (save_id & 31)) & 1) != 0) { - moby->state = 3; + moby->state = GUN_STATE_CLEANUP; return; } { @@ -76,7 +82,7 @@ state_zero: { return; } gun_control->turn_velocity = 0.0f; - moby->state = 1; + moby->state = GUN_STATE_INACTIVE; return; } } @@ -92,7 +98,7 @@ state_two: { ((signed_save_id >> 5) * 4 + (current_level_index << 8))) >> (save_id & 31)) & 1) != 0) { - moby->state = 3; + moby->state = GUN_STATE_CLEANUP; return; } { @@ -162,7 +168,7 @@ state_two: { } moby->rot.z = fast_add_rotations(moby->rot.z, 3.1415927f); } else { - moby->state = 3; + moby->state = GUN_STATE_CLEANUP; if (gun_control->wake != -1) { ((struct Moby *)((gun_control->wake << 8) + (int)D_L10_0015FFD8_8ab0))->state = 1; gun_control->wake = -1; diff --git a/src/overlays/l10/mobys/help_hints.c b/src/overlays/l10/mobys/help_hints.c index c1c718e4c7..1e72838a53 100644 --- a/src/overlays/l10/mobys/help_hints.c +++ b/src/overlays/l10/mobys/help_hints.c @@ -94,7 +94,7 @@ void help_hints_update(Moby *moby) { switch (moby->state) { case HELP_MESSAGE_STATE_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = HELP_MESSAGE_STATE_CHECK_CONDITIONS; break; case HELP_MESSAGE_STATE_CHECK_CONDITIONS: if (is_point_inside_clip_volume(D_0013F3D0_r, conditional_help_config->f0) != 0 && diff --git a/src/overlays/l10/mobys/hero_relocation_trigger.c b/src/overlays/l10/mobys/hero_relocation_trigger.c index e634e71274..51619dba05 100644 --- a/src/overlays/l10/mobys/hero_relocation_trigger.c +++ b/src/overlays/l10/mobys/hero_relocation_trigger.c @@ -146,7 +146,7 @@ void hero_relocation_trigger_update(struct Moby *moby) { request_music_track(2, 4); return; } - if (hero.vehicle_mode == 1) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { exit_hero_vehicle_mode(); set_race_camera(&l10_cuboids[relocation_trigger_vars->vehicle_spot].pos, &l10_cuboids[relocation_trigger_vars->vehicle_spot].rot, diff --git a/src/overlays/l10/mobys/jitter_strand_grid.c b/src/overlays/l10/mobys/jitter_strand_grid.c index 16cdc75286..2b3979e08d 100644 --- a/src/overlays/l10/mobys/jitter_strand_grid.c +++ b/src/overlays/l10/mobys/jitter_strand_grid.c @@ -18,9 +18,10 @@ extern s32 D_L10_00161D68; extern int D_L10_00161D64; extern int D_L10_00161D68; -extern float D_L10_00161D54 __attribute__((sda)); -float jitter_strand_row_y_span_gp __asm__("D_L10_00161D58") = 2.5f; -float jitter_strand_phase_advance_rate_gp __asm__("D_L10_00161D5C") = 2.0f; +extern float l10_jitter_strand_random_vector_time_scale __asm__("D_L10_00161D54") + __attribute__((sda)); +float jitter_strand_row_y_span_gp __asm__("D_L10_00161D58") = 2.5f; +float jitter_strand_phase_advance_rate_gp __asm__("D_L10_00161D5C") = 2.0f; typedef struct { Vec4 pos[4][30][20]; @@ -58,7 +59,7 @@ void jitter_strand_grid_update(struct Moby *moby) { jitter_strand_grid_vars->timers[3][i] = start + 34; } } - moby->state = 1; + moby->state = JITTER_STRAND_GRID_STATE_UPDATE; break; case JITTER_STRAND_GRID_STATE_UPDATE: { int group, strand_column, row; @@ -75,8 +76,9 @@ void jitter_strand_grid_update(struct Moby *moby) { row * (jitter_strand_row_y_span_gp / 20.0f) - jitter_strand_row_y_span_gp * 0.5f; jitter_strand_grid_vars->pos[group][row][strand_column].f[3] = 1.0f; - random_vector( - &jitter[row][strand_column], 0.0f, D_L10_00161D54 * frame_time); + random_vector(&jitter[row][strand_column], + 0.0f, + l10_jitter_strand_random_vector_time_scale * frame_time); } for (row = 1; row < 19; row++) { fast_vec_add(&jitter_strand_grid_vars->vel[group][row][strand_column], diff --git a/src/overlays/l10/mobys/linked_moby_hitbox.c b/src/overlays/l10/mobys/linked_moby_hitbox.c index 2f083b66ae..de6a64904a 100644 --- a/src/overlays/l10/mobys/linked_moby_hitbox.c +++ b/src/overlays/l10/mobys/linked_moby_hitbox.c @@ -14,6 +14,11 @@ #include "rnc/overlay/shared/math/quad.h" #include "rnc/overlay/shared/mobys.h" +enum { + MOBY_STATE_REMOVAL_MARKER_BELOW_CUTOFF = 0xFD, + MOBY_STATE_REMOVAL_MARKER_AT_OR_ABOVE_CUTOFF = 0xFE +}; + extern int debug_print() __asm__("FUN_001e93b0"); extern char *D_L10_0015FFD8_p __asm__("D_L10_0015FFD8"); @@ -73,8 +78,9 @@ void spawn_linked_hitbox_contact_effects(struct Moby *moby, HitBox *box) { for (i = 0; i < count; i++) { struct Moby *hitbox_candidate_moby = found[i]; - if (hitbox_candidate_moby == 0 || hitbox_candidate_moby->state == 0xFE || - hitbox_candidate_moby->state == 0xFD) { + if (hitbox_candidate_moby == 0 || + hitbox_candidate_moby->state == MOBY_STATE_REMOVAL_MARKER_AT_OR_ABOVE_CUTOFF || + hitbox_candidate_moby->state == MOBY_STATE_REMOVAL_MARKER_BELOW_CUTOFF) { continue; } fast_vec_sub(&delta, &hitbox_candidate_moby->pos, &moby->pos); @@ -156,7 +162,7 @@ void linked_moby_hitbox_update(struct Moby *moby) { target = &D_L10_0015FFD8[linked_hitbox_vars->unk10]; } if ((moby->mission == 0xff || visited52[moby->mission + (D_0015ED84 << 4)] != 0xff) && - moby->state != 0) { + moby->state != LINKED_HITBOX_STATE_INITIALIZE) { int i; for (i = 0; i < 5; i++) { int *entry = slot + i * 2; @@ -164,7 +170,8 @@ void linked_moby_hitbox_update(struct Moby *moby) { if (index != -1) { struct Moby *linked_moby = &D_L10_0015FFD8[index]; if (linked_moby != 0 && linked_moby->oclass == *(short *)(entry + 1) && - linked_moby->state != 0xfe && linked_moby->state != 0xfd) { + linked_moby->state != MOBY_STATE_REMOVAL_MARKER_AT_OR_ABOVE_CUTOFF && + linked_moby->state != MOBY_STATE_REMOVAL_MARKER_BELOW_CUTOFF) { unsigned short id = linked_moby->save_id; if ((((*(int *)((unsigned char *)D_0014C190_257218 + (((short)id >> 5) * 4) + (D_0015ED84 << 8)) >> @@ -225,7 +232,7 @@ void linked_moby_hitbox_update(struct Moby *moby) { float now = *(float *)linked_hitbox_vars; float scale = moby->pclass->scale; float size = (now < initial ? initial * scale : now * scale); - moby->state = 1; + moby->state = LINKED_HITBOX_STATE_WAIT_FOR_LINKED_MOBIES; moby->scale = size; } break; @@ -234,7 +241,7 @@ void linked_moby_hitbox_update(struct Moby *moby) { if (target != 0 && linked_hitbox_vars->unk16 != -1) target->state = *(unsigned char *)&linked_hitbox_vars->unk16; linked_hitbox_vars->unk40 = linked_hitbox_vars->unkC; - moby->state = 2; + moby->state = LINKED_HITBOX_STATE_WAIT_FOR_TARGET_STATE_OR_TIMER; } spawn_linked_hitbox_contact_effects(moby, (HitBox *)linked_hitbox_vars); return; @@ -248,10 +255,10 @@ void linked_moby_hitbox_update(struct Moby *moby) { } if ((linked_hitbox_vars->unk8 & 4) == 0 && target != 0 && linked_hitbox_vars->unk17 != -1 && target->state == linked_hitbox_vars->unk17) - moby->state = 3; + moby->state = LINKED_HITBOX_STATE_REMOVE; if ((linked_hitbox_vars->unk8 & 8) == 0 && FUN_001f9740_2c9c70(&linked_hitbox_vars->unk40) != 0) - moby->state = 3; + moby->state = LINKED_HITBOX_STATE_REMOVE; spawn_linked_hitbox_contact_effects(moby, (HitBox *)linked_hitbox_vars); return; case LINKED_HITBOX_STATE_REMOVE: diff --git a/src/overlays/l10/mobys/magnetboots.c b/src/overlays/l10/mobys/magnetboots.c index 16505d4552..23831de7ef 100644 --- a/src/overlays/l10/mobys/magnetboots.c +++ b/src/overlays/l10/mobys/magnetboots.c @@ -43,7 +43,7 @@ void magnetboots_update(struct Moby *moby) { mark_moby_for_removal(moby); return; } - moby->state = 1; + moby->state = MAGNETBOOTS_STATE_WAIT_FOR_HERO_PROXIMITY; moby->pos.z = moby->pos.z + 0.5f; moby->scale = moby->scale * 0.667f; break; @@ -55,7 +55,7 @@ void magnetboots_update(struct Moby *moby) { hero_ref->health.hp != 0) { moby->flags |= 0x41; start_scene(2); - moby->state = 2; + moby->state = MAGNETBOOTS_STATE_WAIT_FOR_SCENE_EXIT; } } break; @@ -69,7 +69,7 @@ void magnetboots_update(struct Moby *moby) { jet_reset_camera(linked_moby + 0x10, linked_moby + 0x40); } memcard_save_data(0, -1); - moby->state = 3; + moby->state = MAGNETBOOTS_STATE_REMOVE; } break; case MAGNETBOOTS_STATE_REMOVE: diff --git a/src/overlays/l10/mobys/nanotech_upgrade_vendor.c b/src/overlays/l10/mobys/nanotech_upgrade_vendor.c index e8cce8b313..6f21d883a8 100644 --- a/src/overlays/l10/mobys/nanotech_upgrade_vendor.c +++ b/src/overlays/l10/mobys/nanotech_upgrade_vendor.c @@ -32,6 +32,10 @@ void nanotech_upgrade_vendor_update(struct Moby *moby) __asm__("FUN_L10_002e8358 /* Moby class 1326 */ void nanotech_upgrade_vendor_update(struct Moby *moby) { + enum { + NANOTECH_VENDOR_STATE_READY = 0, + NANOTECH_VENDOR_STATE_FINALIZE_PURCHASE = 1 + }; int *timer; float angle; int purchase; @@ -39,8 +43,8 @@ void nanotech_upgrade_vendor_update(struct Moby *moby) { timer = (int *)moby->pvars; fast_dec_timer(timer + 1); - if (moby->state != 0) { - if (moby->state == 1) + if (moby->state != NANOTECH_VENDOR_STATE_READY) { + if (moby->state == NANOTECH_VENDOR_STATE_FINALIZE_PURCHASE) goto state_one; return; } @@ -64,7 +68,7 @@ void nanotech_upgrade_vendor_update(struct Moby *moby) { current_bolt_count = D_0013ED98 - 4000; purchased_nanotech_health_gp = upgrade_level; start_scene(0); - moby->state = 1; + moby->state = NANOTECH_VENDOR_STATE_FINALIZE_PURCHASE; } else { try_set_help_message(1, 0x2720); return; @@ -84,7 +88,7 @@ void nanotech_upgrade_vendor_update(struct Moby *moby) { current_bolt_count = D_0013ED98 - 30000; purchased_nanotech_health_gp = upgrade_level; start_scene(1); - moby->state = 1; + moby->state = NANOTECH_VENDOR_STATE_FINALIZE_PURCHASE; } else { try_set_help_message(1, 0x2721); return; @@ -110,6 +114,6 @@ void nanotech_upgrade_vendor_update(struct Moby *moby) { queue_dialogue_message(purchase, -1); D_L10_0013F640 = 0xb4; timer[1] = scale_game_frames(0xf0); - moby->state = 0; + moby->state = NANOTECH_VENDOR_STATE_READY; } } diff --git a/src/overlays/l10/mobys/path_spark_effect.c b/src/overlays/l10/mobys/path_spark_effect.c index 903fa5874a..cec39e5e72 100644 --- a/src/overlays/l10/mobys/path_spark_effect.c +++ b/src/overlays/l10/mobys/path_spark_effect.c @@ -12,7 +12,7 @@ #include "rnc/overlay/shared/math/quad.h" #include "rnc/overlay/shared/mobys/test_path_segment_strict_crossing.h" -extern struct Moby *D_L10_00178380[]; +extern struct Moby *nearby_mobys[] __asm__("D_L10_00178380"); extern int collect_mobies_in_sphere(void *, float, int, void *, void *) __asm__("FUN_L00_001f2868"); /* Advances an effect, scales its size over its lifetime and emits hits. */ /* Ported from rac1-decomp (src/overlays/l10_orxon/vendor_00296BD8.c: func_L10_002DE798), where it is exact; names translated to the US level program. */ @@ -75,7 +75,7 @@ void path_spark_effect_update(char *moby) { *(OvlQuad *)blast_hit_position = *(OvlQuad *)&MOBY(moby)->pos; send_blast_hits(effect_data->unk10, blast_hit_position, - D_L10_00178380, + nearby_mobys, count, 0, 0x810001, diff --git a/src/overlays/l10/mobys/path_spark_emitter.c b/src/overlays/l10/mobys/path_spark_emitter.c index 0e83d67911..87d9eef660 100644 --- a/src/overlays/l10/mobys/path_spark_emitter.c +++ b/src/overlays/l10/mobys/path_spark_emitter.c @@ -79,7 +79,7 @@ void path_spark_emitter_update(struct Moby *moby) { } *(int *)(spark_vars + 0x10) = -1; if (func_001F9908_v(spark_vars + 8) != 0) { - moby->state = 1; + moby->state = SPARK_STATE_TRAVERSE_PATH; *(int *)(spark_vars + 4) = 0; } break; @@ -127,7 +127,7 @@ void path_spark_emitter_update(struct Moby *moby) { *(OvlQuad *)spark_path_position; } if (seg == *path - 1) { - moby->state = 0; + moby->state = SPARK_STATE_WAIT_FOR_TIMER; *(int *)(spark_vars + 8) = scale_game_frames(0x78); } break; diff --git a/src/overlays/l10/mobys/screamer.c b/src/overlays/l10/mobys/screamer.c index 56d76e1007..986ff05b07 100644 --- a/src/overlays/l10/mobys/screamer.c +++ b/src/overlays/l10/mobys/screamer.c @@ -23,6 +23,20 @@ /* Update function for moby class 1196 (screamer) on level 10: follows its path, turns to its target, wanders. */ /* Ported from rac1-decomp (src/overlays/l10_orxon/vendor_00296BD8.c: func_L10_002E0630), where it is exact; names translated to the US level program. */ +enum { + SCREAMER_STATE_INITIALIZE = 0, + SCREAMER_STATE_WAIT_FOR_ACTIVATION = 1, + SCREAMER_STATE_WAIT_TO_RISE = 2, + SCREAMER_STATE_RISE_FROM_HOME = 4, + SCREAMER_STATE_FOLLOW_PATH = 5, + SCREAMER_STATE_FACE_LEADER_AT_WAYPOINT = 6, + SCREAMER_STATE_IDLE_AT_HOME = 7, + SCREAMER_STATE_RETURN_HOME = 8, + SCREAMER_STATE_WAIT_TO_WANDER = 9, + SCREAMER_STATE_WANDER = 10, + SCREAMER_STATE_DEATH_KNOCKBACK = 11 +}; + typedef struct Moby Moby; typedef struct D_2E0630 { @@ -89,19 +103,6 @@ extern float fast_vec_dist(void *, void *); /* Moby class 1196 */ void screamer_update(Moby *moby) { - enum { - SCREAMER_STATE_INITIALIZE = 0, - SCREAMER_STATE_WAIT_FOR_ACTIVATION = 1, - SCREAMER_STATE_WAIT_TO_RISE = 2, - SCREAMER_STATE_RISE_FROM_HOME = 4, - SCREAMER_STATE_FOLLOW_PATH = 5, - SCREAMER_STATE_FACE_LEADER_AT_WAYPOINT = 6, - SCREAMER_STATE_IDLE_AT_HOME = 7, - SCREAMER_STATE_RETURN_HOME = 8, - SCREAMER_STATE_WAIT_TO_WANDER = 9, - SCREAMER_STATE_WANDER = 10, - SCREAMER_STATE_DEATH_KNOCKBACK = 11 - }; float waypoint[6]; D_2E0630 *screamer_data = (D_2E0630 *)moby->pvars; Moby *leader; @@ -127,20 +128,20 @@ void screamer_update(Moby *moby) { if (screamer_data->f174 != 1) { mark_moby_for_removal(moby); } else { - moby->state = 1; + moby->state = SCREAMER_STATE_WAIT_FOR_ACTIVATION; } break; case SCREAMER_STATE_WAIT_FOR_ACTIVATION: if (screamer_data->f104 == 2 && screamer_data->f174 != 0) break; - moby->state = 2; + moby->state = SCREAMER_STATE_WAIT_TO_RISE; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); break; case SCREAMER_STATE_WAIT_TO_RISE: if ((moby->anim_flags & 2) == 0) break; - moby->state = 4; + moby->state = SCREAMER_STATE_RISE_FROM_HOME; clear_u64_value(&screamer_data->vel); if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); @@ -155,7 +156,7 @@ void screamer_update(Moby *moby) { D_0015ED70 * 18.0f, D_0015ED70 * 18.0f, D_0015ED6C * 6.0f) == 0.0f) { - moby->state = 5; + moby->state = SCREAMER_STATE_FOLLOW_PATH; } break; case SCREAMER_STATE_FOLLOW_PATH: { @@ -191,13 +192,13 @@ void screamer_update(Moby *moby) { { int node_index = screamer_data->node_index++; if (0.0f < l10_paths[screamer_data->path]->points[node_index].f[3]) { - moby->state = 6; + moby->state = SCREAMER_STATE_FACE_LEADER_AT_WAYPOINT; if (moby->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } else { if (node_index + 1 != l10_paths[screamer_data->path]->count) break; - moby->state = 10; + moby->state = SCREAMER_STATE_WANDER; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); probe_ground_height(&moby->pos, 0, 0.5f); @@ -230,14 +231,14 @@ void screamer_update(Moby *moby) { activate_waiting_moby_group_members(linked); } if (screamer_data->node_index == l10_paths[screamer_data->path]->count) { - moby->state = 10; + moby->state = SCREAMER_STATE_WANDER; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); probe_ground_height(&moby->pos, 0, 0.5f); qcopy(&screamer_data->home, &D_L10_00174360_2E0630); qcopy(&screamer_data->wander_goal, &moby->pos); } else { - moby->state = 5; + moby->state = SCREAMER_STATE_FOLLOW_PATH; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } @@ -267,7 +268,7 @@ void screamer_update(Moby *moby) { screamer_data->vel.z = climb; func_L00_00259B08_2E0630(moby, &screamer_data->vel, 0.5f, 0x200, 0.0f, 0); if (vector_distance_xy(&moby->pos, &screamer_data->home) < 2.0f) - moby->state = 7; + moby->state = SCREAMER_STATE_IDLE_AT_HOME; break; } case SCREAMER_STATE_WAIT_TO_WANDER: { @@ -285,7 +286,7 @@ void screamer_update(Moby *moby) { waypoint[2] = zero; waypoint[2] = random_float_between(5.0f, 7.0f); fast_vec_add(&screamer_data->wander_goal, waypoint, &screamer_data->home); - moby->state = 10; + moby->state = SCREAMER_STATE_WANDER; break; } case SCREAMER_STATE_WANDER: @@ -301,12 +302,12 @@ void screamer_update(Moby *moby) { fast_vec_add(waypoint, &screamer_data->step, &moby->pos); if (func_L00_001F10E0_2E0630(0.4f, waypoint, 0, moby)) { clear_u64_value(&screamer_data->step); - moby->state = 9; + moby->state = SCREAMER_STATE_WAIT_TO_WANDER; } else { qcopy(&moby->pos, waypoint); } if (fast_vec_length(&screamer_data->step) == 0.0f) - moby->state = 9; + moby->state = SCREAMER_STATE_WAIT_TO_WANDER; break; case SCREAMER_STATE_DEATH_KNOCKBACK: if ((step_moby_motion(moby, screamer_data->react) & 1) == 0) @@ -385,6 +386,9 @@ extern void trooper_anim_update(void *m, void *p) __asm__("FUN_L00_0025d458"); #include "rnc/data_labels.h" void update_screamer_hit_reactions_and_targeting(struct Moby *moby) { + enum { + TARGET_SELECTION_DEFAULT_TARGET_EXCLUDED = 2 + }; MobyData_2DFC38 *screamer_vars = (MobyData_2DFC38 *)moby->pvars; Hit_2DFC38 *hit_record; float relative_offset[4]; @@ -399,7 +403,7 @@ void update_screamer_hit_reactions_and_targeting(struct Moby *moby) { screamer_vars->f38 = 0; } fast_dec_timer(&screamer_vars->f184); - if (moby->state != 11) { + if (moby->state != SCREAMER_STATE_DEATH_KNOCKBACK) { hit_record = (Hit_2DFC38 *)find_moby_hit(moby, 0x330000, 0); hit_update_2DFC38( moby, hit_record, &screamer_vars->f20, 5, &hit_processing_status, 0, 0, 4); @@ -414,7 +418,7 @@ void update_screamer_hit_reactions_and_targeting(struct Moby *moby) { moby->flags &= 0xEFFF; if (moby->prev_seq != 5) blend_moby_animation(moby, 5, 0, scale_game_frames(10)); - moby->state = 11; + moby->state = SCREAMER_STATE_DEATH_KNOCKBACK; screamer_vars->f70 = D_0015ED70 * 26.0f; screamer_vars->f9D = 3; screamer_vars->f74 = 0.0005f; @@ -444,14 +448,14 @@ void update_screamer_hit_reactions_and_targeting(struct Moby *moby) { screamer_vars->f180 = 42.0f; else if (screamer_vars->f184 != 0) screamer_vars->f180 = screamer_vars->f178 + 6.0f; - else if (moby->state == 1) + else if (moby->state == SCREAMER_STATE_WAIT_FOR_ACTIVATION) screamer_vars->f180 = screamer_vars->f188; else screamer_vars->f180 = screamer_vars->f178; if (screamer_vars->f174 == 2) { target_selection_status = ahead_f(screamer_vars->f180, moby, screamer_vars->fC0); - if (target_selection_status != 2) { + if (target_selection_status != TARGET_SELECTION_DEFAULT_TARGET_EXCLUDED) { LevelCuboid *bp = &l10_cuboids[screamer_vars->f194]; fast_vec_sub(relative_offset, D_0013F3D0, &bp->pos); relative_offset[3] = 0.0f; @@ -461,18 +465,18 @@ void update_screamer_hit_reactions_and_targeting(struct Moby *moby) { transformed_offset[2] <= -1.0f || 1.0f <= transformed_offset[2]) screamer_vars->f104 = 2; } - } else if (moby->state == 1 && screamer_vars->f18C >= 0) { + } else if (moby->state == SCREAMER_STATE_WAIT_FOR_ACTIVATION && screamer_vars->f18C >= 0) { LevelPath *path = l10_paths[screamer_vars->f18C]; target_selection_status = activate_effect_l08( screamer_vars->f180, moby, screamer_vars->fC0, 0, 0, path->points, path->count); - } else if (moby->state != 1 && screamer_vars->f17C >= 0) { + } else if (moby->state != SCREAMER_STATE_WAIT_FOR_ACTIVATION && screamer_vars->f17C >= 0) { LevelPath *path = l10_paths[screamer_vars->f17C]; target_selection_status = activate_effect_l08( screamer_vars->f180, moby, screamer_vars->fC0, 0, 0, path->points, path->count); } else { target_selection_status = ahead_f(screamer_vars->f180, moby, screamer_vars->fC0); } - if (target_selection_status != 2) { + if (target_selection_status != TARGET_SELECTION_DEFAULT_TARGET_EXCLUDED) { if (screamer_vars->f180 < vector_distance_xy(screamer_vars->f130, screamer_vars->fC0)) screamer_vars->f104 = 2; else if (moby->visible == 0) @@ -488,6 +492,12 @@ void update_screamer_hit_reactions_and_targeting(struct Moby *moby) { extern short *moby_group_member_lists[] __asm__("D_L10_001ABCC0"); void activate_waiting_moby_group_members(struct Moby *moby) { + enum { + MOBY_GROUP_MEMBER_WAITING_FOR_ACTIVATION = 1 + }; + enum { + MOBY_GROUP_MEMBER_ACTIVATE = 2 + }; short *group_entry; if (moby->group != 0xFF) { group_entry = moby_group_member_lists[moby->group]; @@ -497,8 +507,8 @@ void activate_waiting_moby_group_members(struct Moby *moby) { struct Moby *listed_entity = (struct Moby *)((*(unsigned short *)group_entry & 0x7FFF) * 256 + (int)moby_array_base); - if (listed_entity->state == 1) - listed_entity->state = 2; + if (listed_entity->state == MOBY_GROUP_MEMBER_WAITING_FOR_ACTIVATION) + listed_entity->state = MOBY_GROUP_MEMBER_ACTIVATE; } while (*group_entry++ >= 0); } } diff --git a/src/overlays/l10/mobys/shattering_prop.c b/src/overlays/l10/mobys/shattering_prop.c index f865d6bd6b..c9d1c4ed56 100644 --- a/src/overlays/l10/mobys/shattering_prop.c +++ b/src/overlays/l10/mobys/shattering_prop.c @@ -23,13 +23,13 @@ void shattering_prop_update(struct Moby *moby) { char *hit_record = find_moby_hit(moby, 0x10000, 0); switch (moby->state) { case HIT_RESPONSE_STATE_INITIALIZE: - moby->state = 1; + moby->state = HIT_RESPONSE_STATE_WAIT_FOR_HIT; break; case HIT_RESPONSE_STATE_WAIT_FOR_HIT: if (hit_record != 0 && *(float *)(hit_record + 0x2C) > 0.0f) hit = 1; if (hit) - moby->state = 2; + moby->state = HIT_RESPONSE_STATE_RESPOND_AND_REMOVE; break; case HIT_RESPONSE_STATE_RESPOND_AND_REMOVE: allocate_voice_for_target_entry(0, 0, (int)moby); diff --git a/src/overlays/l10/mobys/sinking_platform.c b/src/overlays/l10/mobys/sinking_platform.c index f8043c5af3..bc6d6789b8 100644 --- a/src/overlays/l10/mobys/sinking_platform.c +++ b/src/overlays/l10/mobys/sinking_platform.c @@ -56,7 +56,7 @@ void sinking_platform_update(struct Moby *moby) { float position_delta[4]; *(OvlQuad *)previous_position = *(OvlQuad *)&moby->pos; if (is_hero_on_moby(moby)) - moby->state = 2; + moby->state = PLATFORM_STATE_SINKING_WITH_HERO; fast_dec_timer(&platform_vars->timer_BC); switch (moby->state) { case PLATFORM_STATE_INITIALIZE: @@ -74,7 +74,7 @@ void sinking_platform_update(struct Moby *moby) { platform_vars->unkB0 = frame_time * 1.5707964f + randf_sym(0.0f, bobbing_phase_jitter_limit); } - moby->state = 1; + moby->state = PLATFORM_STATE_BOBBING; case PLATFORM_STATE_BOBBING: *(int *)&platform_vars->unkA4 = 0; update_moby_vertical_oscillation( @@ -94,7 +94,7 @@ void sinking_platform_update(struct Moby *moby) { platform_vars->unkA4 = sinking_step_lower_bound; moby->pos.z += platform_vars->unkA4; if (is_hero_on_moby(moby) == 0) - moby->state = 3; + moby->state = PLATFORM_STATE_RETURN_TO_ORIGINAL_HEIGHT; if (platform_vars->timer_BC <= 0) { allocate_voice_for_target_entry(0, 0, (int)moby); platform_vars->timer_BC = random_int_between(0x28, 0x3C); @@ -124,7 +124,7 @@ void sinking_platform_update(struct Moby *moby) { moby->pos.z += platform_vars->unkA4; if (platform_vars->unkA0 <= moby->pos.z) { moby->pos.z = platform_vars->unkA0; - moby->state = 1; + moby->state = PLATFORM_STATE_BOBBING; } break; } diff --git a/src/overlays/l10/mobys/timed_effect_emitter.c b/src/overlays/l10/mobys/timed_effect_emitter.c index 6266864e9f..f2fa4925e1 100644 --- a/src/overlays/l10/mobys/timed_effect_emitter.c +++ b/src/overlays/l10/mobys/timed_effect_emitter.c @@ -47,7 +47,7 @@ void timed_effect_emitter_update(struct Moby *moby) { emitter_vars->voice = -1; if (fast_dec_timer(&emitter_vars->timer_C)) { emitter_vars->timer_C = emitter_vars->unk4; - moby->state = 1; + moby->state = MOBY_STATE_ACTIVE_WITH_SOUND; } break; case MOBY_STATE_ACTIVE_WITH_SOUND: @@ -71,7 +71,7 @@ void timed_effect_emitter_update(struct Moby *moby) { if (fast_dec_timer(&emitter_vars->timer_C)) { int k; emitter_vars->timer_C = emitter_vars->unk8; - moby->state = 0; + moby->state = MOBY_STATE_WAIT_FOR_ACTIVATION; k = emitter_vars->voice; if (k != -1) { unsigned char *voice_entry = (unsigned char *)&voice_pool + k * 0x70; diff --git a/src/overlays/l10/mobys/toxic_crab.c b/src/overlays/l10/mobys/toxic_crab.c index bddbea3c42..e511c16312 100644 --- a/src/overlays/l10/mobys/toxic_crab.c +++ b/src/overlays/l10/mobys/toxic_crab.c @@ -31,6 +31,22 @@ #include "rnc/mobys/resolve_moby_hit_response.h" #include "rnc/audio/voices/allocate_voice_for_bank_entry.h" +enum { + TOXIC_CRAB_STATE_INITIALIZE = 0, + TOXIC_CRAB_STATE_WAIT_FOR_ACTIVATION = 1, + TOXIC_CRAB_STATE_ACTIVATE = 2, + TOXIC_CRAB_STATE_FACE_TRACKED_POSITION = 3, + TOXIC_CRAB_STATE_WAIT_TO_PURSUE = 4, + TOXIC_CRAB_STATE_PURSUE_TARGET = 5, + TOXIC_CRAB_STATE_PAUSE_PURSUIT = 6, + TOXIC_CRAB_STATE_MELEE_ATTACK = 7, + TOXIC_CRAB_STATE_RETURN_HOME = 8, + TOXIC_CRAB_STATE_BACK_AWAY_FROM_TARGET = 9, + TOXIC_CRAB_STATE_HIT_KNOCKBACK = 10, + TOXIC_CRAB_STATE_DEATH_EFFECTS = 11, + TOXIC_CRAB_STATE_FALL_TO_DEATH = 12 +}; + typedef struct Moby Moby; extern struct Moby *D_L10_0015FFD0_macro[] __asm__("D_L10_0015FFD0") MACRO_ADDR; extern float D_0015ED6C; @@ -219,19 +235,10 @@ extern float fast_vec_dist(void *, void *); /* Moby class 1202 */ void toxic_crab_update(Moby2E30F8 *m) { enum { - TOXIC_CRAB_STATE_INITIALIZE = 0, - TOXIC_CRAB_STATE_WAIT_FOR_ACTIVATION = 1, - TOXIC_CRAB_STATE_ACTIVATE = 2, - TOXIC_CRAB_STATE_FACE_TRACKED_POSITION = 3, - TOXIC_CRAB_STATE_WAIT_TO_PURSUE = 4, - TOXIC_CRAB_STATE_PURSUE_TARGET = 5, - TOXIC_CRAB_STATE_PAUSE_PURSUIT = 6, - TOXIC_CRAB_STATE_MELEE_ATTACK = 7, - TOXIC_CRAB_STATE_RETURN_HOME = 8, - TOXIC_CRAB_STATE_BACK_AWAY_FROM_TARGET = 9, - TOXIC_CRAB_STATE_HIT_KNOCKBACK = 10, - TOXIC_CRAB_STATE_DEATH_EFFECTS = 11, - TOXIC_CRAB_STATE_FALL_TO_DEATH = 12 + MOBY_STATE_MARKED_FOR_REMOVAL = 0xFE + }; + enum { + MOBY_STATE_ALTERNATE_REMOVAL_MARKER = 0xFD }; int see = 0; Crab2E30F8 *crab_data = m->data; @@ -293,7 +300,8 @@ void toxic_crab_update(Moby2E30F8 *m) { int k = crab_data->i1BC; if (k != -1) { Moby2E30F8 *p = (Moby2E30F8 *)((char *)D_L10_0015FFD0_macro[2] + (k << 8)); - if (p == 0 || p->state == 0xFE || p->state == 0xFD || + if (p == 0 || p->state == MOBY_STATE_MARKED_FOR_REMOVAL || + p->state == MOBY_STATE_ALTERNATE_REMOVAL_MARKER || (((*(int *)(((char *)&D_0014C190) + (((short)p->id >> 5) * 4 + (current_level_index << 8))) >> (p->id & 0x1F)) & @@ -303,7 +311,7 @@ void toxic_crab_update(Moby2E30F8 *m) { } } } - m->state = 1; + m->state = TOXIC_CRAB_STATE_WAIT_FOR_ACTIVATION; if (m->anim != 0) { blend_moby_animation(m, 0, 0, 0); } @@ -315,12 +323,13 @@ void toxic_crab_update(Moby2E30F8 *m) { if (crab_data->i1BC != -1) { char *moby_instance_array_base = D_L10_0015FFD8; Moby2E30F8 *p = (Moby2E30F8 *)(moby_instance_array_base + (crab_data->i1BC << 8)); - if (p == 0 || p->state == 0xFE || p->state == 0xFD || + if (p == 0 || p->state == MOBY_STATE_MARKED_FOR_REMOVAL || + p->state == MOBY_STATE_ALTERNATE_REMOVAL_MARKER || ((*(int *)(((char *)&D_0014C190) + (((short)p->id >> 5) * 4 + (current_level_index << 8))) >> (p->id & 0x1F)) & 1)) { - m->state = 2; + m->state = TOXIC_CRAB_STATE_ACTIVATE; crab_data->i1A8 = scale_game_frames(1); if (m->b21 != 0xFF) { activate_waiting_moby_group_members((struct Moby *)m); @@ -328,7 +337,7 @@ void toxic_crab_update(Moby2E30F8 *m) { } } if (crab_data->i164 != 2 || crab_data->i1B4 != 0) { - m->state = 2; + m->state = TOXIC_CRAB_STATE_ACTIVATE; crab_data->i1A8 = scale_game_frames(1); if (m->b21 != 0xFF) { activate_waiting_moby_group_members((struct Moby *)m); @@ -354,7 +363,7 @@ void toxic_crab_update(Moby2E30F8 *m) { } else if (m->b70 & 2) { if (vector_distance_xy(m->pos, &hero.motion.pos) < *(float *)&D_L10_00161E40_gp) { float x; - m->state = 5; + m->state = TOXIC_CRAB_STATE_PURSUE_TARGET; crab_data->i1D8 = 0; qcopy(crab_data->v1C0, m->pos); crab_data->fF4 = 0.0f; @@ -364,7 +373,7 @@ void toxic_crab_update(Moby2E30F8 *m) { blend_moby_animation(m, 3, 0, scale_game_frames(5)); } } else { - m->state = 3; + m->state = TOXIC_CRAB_STATE_FACE_TRACKED_POSITION; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(10)); } @@ -375,7 +384,7 @@ void toxic_crab_update(Moby2E30F8 *m) { float ang = fast_arc_tan(crab_data->f120 - m->pos[0], crab_data->f124 - m->pos[1]); FUN_L00_00258278((char *)m, &crab_data->f190, ang, 0.02f, 0.3f, frame_time * 6.2831855f); if (crab_data->i164 != 2) { - m->state = 4; + m->state = TOXIC_CRAB_STATE_WAIT_TO_PURSUE; crab_data->i1A8 = truncate_float_to_s32(random_float_between(0.0f, (float)crab_data->i1B8)); } @@ -384,7 +393,7 @@ void toxic_crab_update(Moby2E30F8 *m) { case TOXIC_CRAB_STATE_WAIT_TO_PURSUE: if (fast_dec_timer(&crab_data->i1A8)) { float x; - m->state = 5; + m->state = TOXIC_CRAB_STATE_PURSUE_TARGET; crab_data->i1D8 = 0; qcopy(crab_data->v1C0, m->pos); crab_data->fF4 = 0.0f; @@ -440,7 +449,7 @@ void toxic_crab_update(Moby2E30F8 *m) { v[1] = fast_sin(aim) * (MOBY(target_moby)->oclass == 0x359 ? 2.0f : 3.57f); v[2] = 0.0f; fast_vec_add(v, v, target_moby + 0x10); - if (hero.vehicle_mode != 1) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_CLANK) { float rot = m->f48; int r; m->f48 = fast_arc_tan(v[0] - m->pos[0], v[1] - m->pos[1]); @@ -461,7 +470,7 @@ void toxic_crab_update(Moby2E30F8 *m) { *(short *)(*(char **)(h + 0x18) + 0xA6) != 0x31A) && fast_vec_dist(from2, h + 0x20) < toxic_crab_obstacle_pause_distance_gp) { - m->state = 6; + m->state = TOXIC_CRAB_STATE_PAUSE_PURSUIT; crab_data->i1A8 = scale_game_frames(0x3C); if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(7)); @@ -481,7 +490,7 @@ void toxic_crab_update(Moby2E30F8 *m) { if (D_L10_0015F5CC % 7 == 0 && crab_data->i1A8 == 0) { if (vector_distance_xy(crab_data->v1C0, m->pos) < crab_data->fF4 && diff <= toxic_crab_pursuit_heading_threshold_degrees_gp * DEG_TO_RAD) { - m->state = 6; + m->state = TOXIC_CRAB_STATE_PAUSE_PURSUIT; crab_data->i1A8 = scale_game_frames(0x3C); if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(7)); @@ -494,7 +503,8 @@ void toxic_crab_update(Moby2E30F8 *m) { } else { crab_data->i1D8 = 0; } - if (m->state == 5 && fast_dec_timer(&crab_data->i1A8) && 0.0f < crab_data->fF4 && + if (m->state == TOXIC_CRAB_STATE_PURSUE_TARGET && + fast_dec_timer(&crab_data->i1A8) && 0.0f < crab_data->fF4 && crab_data->i1D8 == 0 && m->anim == 1) { blend_moby_animation(m, 3, 0, scale_game_frames(7)); } @@ -512,8 +522,9 @@ void toxic_crab_update(Moby2E30F8 *m) { m->f58 = 1.2f; { float home = fast_vec_dist(m->pos, crab_data->v170); - if ((hero.vehicle_mode == 1 ? 1.0f : 30.0f) < home || crab_data->i164 == 2) { - m->state = 8; + if ((hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK ? 1.0f : 30.0f) < home || + crab_data->i164 == 2) { + m->state = TOXIC_CRAB_STATE_RETURN_HOME; blend_moby_animation(m, 4, 0, scale_game_frames(0xC)); } else if (vector_distance_xy(m->pos, target_moby + 0x10) < (MOBY(target_moby)->oclass == 0x359 ? 2.45f : 4.02f)) { @@ -523,7 +534,7 @@ void toxic_crab_update(Moby2E30F8 *m) { if (random_integer_below(100) & 1) { anim = 6; } - m->state = 7; + m->state = TOXIC_CRAB_STATE_MELEE_ATTACK; blend_moby_animation(m, anim, 0, scale_game_frames(7)); } } @@ -561,7 +572,7 @@ void toxic_crab_update(Moby2E30F8 *m) { } } if (ok) { - m->state = 5; + m->state = TOXIC_CRAB_STATE_PURSUE_TARGET; crab_data->i1D8 = 0; qcopy(crab_data->v1C0, m->pos); crab_data->fF4 = 0.0f; @@ -570,8 +581,9 @@ void toxic_crab_update(Moby2E30F8 *m) { } { float home = fast_vec_dist(m->pos, crab_data->v170); - if ((hero.vehicle_mode == 1 ? 1.0f : 30.0f) < home || crab_data->i164 == 2) { - m->state = 8; + if ((hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK ? 1.0f : 30.0f) < home || + crab_data->i164 == 2) { + m->state = TOXIC_CRAB_STATE_RETURN_HOME; blend_moby_animation(m, 4, 0, scale_game_frames(0xC)); } else if (vector_distance_xy(m->pos, target_moby + 0x10) < (MOBY(target_moby)->oclass == 0x359 ? 2.45f : 4.02f)) { @@ -581,7 +593,7 @@ void toxic_crab_update(Moby2E30F8 *m) { if (random_integer_below(100) & 1) { anim = 6; } - m->state = 7; + m->state = TOXIC_CRAB_STATE_MELEE_ATTACK; blend_moby_animation(m, anim, 0, scale_game_frames(7)); } } @@ -629,10 +641,10 @@ void toxic_crab_update(Moby2E30F8 *m) { float home = fast_vec_dist(m->pos, crab_data->v170); if ((((unsigned char *)&D_0013E533)[0x2EC1] == 1 ? 1.0f : 30.0f) < home || crab_data->i164 == 2) { - m->state = 8; + m->state = TOXIC_CRAB_STATE_RETURN_HOME; blend_moby_animation(m, 4, 0, scale_game_frames(0xC)); } else { - m->state = 5; + m->state = TOXIC_CRAB_STATE_PURSUE_TARGET; crab_data->i1D8 = 0; qcopy(crab_data->v1C0, m->pos); crab_data->fF4 = 0.0f; @@ -670,7 +682,7 @@ void toxic_crab_update(Moby2E30F8 *m) { toxic_crab_back_away_distance_limit_gp < fast_vec_dist(m->pos, target_moby + 0x10)) { int anim; - m->state = 7; + m->state = TOXIC_CRAB_STATE_MELEE_ATTACK; crab_data->fF4 = frame_time * 5.0f; anim = 7; if (random_integer_below(100) & 1) { @@ -703,12 +715,12 @@ void toxic_crab_update(Moby2E30F8 *m) { dir[2] = 0.0f; FUN_L00_00258b50(m, &crab_data->iD0, dir, out, 1.0f); if (fast_vec_dist(m->pos, crab_data->v170) < 1.0f) { - m->state = 3; + m->state = TOXIC_CRAB_STATE_FACE_TRACKED_POSITION; if (m->anim != 1) { blend_moby_animation(m, 1, 0, scale_game_frames(0x14)); } } else if (crab_data->i164 != 2) { - m->state = 5; + m->state = TOXIC_CRAB_STATE_PURSUE_TARGET; crab_data->i1D8 = 0; qcopy(crab_data->v1C0, m->pos); crab_data->fF4 = 0.0f; @@ -722,7 +734,7 @@ void toxic_crab_update(Moby2E30F8 *m) { case TOXIC_CRAB_STATE_HIT_KNOCKBACK: if (step_moby_motion(m, crab_data->v70) & 0x41) { int anim; - m->state = 7; + m->state = TOXIC_CRAB_STATE_MELEE_ATTACK; crab_data->fF4 = frame_time * 5.0f; anim = 7; if (random_integer_below(100) & 1) { @@ -733,7 +745,7 @@ void toxic_crab_update(Moby2E30F8 *m) { if (m->anim != 0xE) { blend_moby_animation(m, 0xE, 0, scale_game_frames(6)); } - m->state = 0xC; + m->state = TOXIC_CRAB_STATE_FALL_TO_DEATH; crab_data->f78 = crab_data->f78 / 3.0f; } break; @@ -754,7 +766,7 @@ void toxic_crab_update(Moby2E30F8 *m) { return; } m->s34 &= 0xEFFF; - m->state = 0xB; + m->state = TOXIC_CRAB_STATE_DEATH_EFFECTS; knockback_collision_radius_fixed = truncate_float_to_s32(768.0f); x = toxic_crab_death_knockback_gravity_gp * frame_time_sq; crab_data->bAD = 0; @@ -806,7 +818,9 @@ void toxic_crab_update(Moby2E30F8 *m) { } } } - if (m->state == 3 || m->state == 5 || m->state == 7 || m->state == 8) { + if (m->state == TOXIC_CRAB_STATE_FACE_TRACKED_POSITION || + m->state == TOXIC_CRAB_STATE_PURSUE_TARGET || m->state == TOXIC_CRAB_STATE_MELEE_ATTACK || + m->state == TOXIC_CRAB_STATE_RETURN_HOME) { float ground_height = probe_ground_height(m->pos, 0, 0.5f); if (ground_height < m->pos[2]) { crab_data->f78 = crab_data->f78 - crab_data->f80; @@ -821,7 +835,7 @@ void toxic_crab_update(Moby2E30F8 *m) { if (m->anim != 0xE) { blend_moby_animation(m, 0xE, 0, scale_game_frames(6)); } - m->state = 0xC; + m->state = TOXIC_CRAB_STATE_FALL_TO_DEATH; } } } @@ -833,39 +847,47 @@ void toxic_crab_update(Moby2E30F8 *m) { } } -extern int D_L10_00161E74 __attribute__((sda)); -extern int D_L10_00161E78 __attribute__((sda)); -extern float D_L10_00161E7C __attribute__((sda)); -extern float D_L10_00161E80 __attribute__((sda)); -extern float D_L10_00161E84 __attribute__((sda)); -extern float D_L10_00161E88 __attribute__((sda)); -extern float D_L10_00161E8C __attribute__((sda)); -extern float D_L10_00161E90 __attribute__((sda)); -extern float D_L10_00161E94 __attribute__((sda)); -extern float D_L10_00161E98 __attribute__((sda)); +extern int l10_toxic_crab_particle_group_count __asm__("D_L10_00161E74") __attribute__((sda)); +extern int l10_toxic_crab_particles_per_group __asm__("D_L10_00161E78") __attribute__((sda)); +extern float l10_toxic_crab_particle_group_position_jitter __asm__("D_L10_00161E7C") + __attribute__((sda)); +extern float l10_toxic_crab_particle_position_jitter __asm__("D_L10_00161E80") __attribute__((sda)); +extern float l10_toxic_crab_particle_adjusted_velocity_jitter __asm__("D_L10_00161E84") + __attribute__((sda)); +extern float l10_toxic_crab_particle_speed_lower_bound __asm__("D_L10_00161E88") + __attribute__((sda)); +extern float l10_toxic_crab_particle_speed_upper_bound __asm__("D_L10_00161E8C") + __attribute__((sda)); +extern float l10_toxic_crab_particle_rise_lower_bound __asm__("D_L10_00161E90") + __attribute__((sda)); +extern float l10_toxic_crab_particle_rise_upper_bound __asm__("D_L10_00161E94") + __attribute__((sda)); +extern float l10_toxic_crab_particle_vertical_velocity_drop_scale __asm__("D_L10_00161E98") + __attribute__((sda)); extern float D_L10_00161E9C __attribute__((sda)); extern float D_L10_00161EA0 __attribute__((sda)); -extern int D_L10_00161EA4 __attribute__((sda)); -extern int D_L10_00161EA8 __attribute__((sda)); -extern int D_L10_00161EAC __attribute__((sda)); -extern int D_L10_00161EB0 __attribute__((sda)); -extern int D_L10_00161EB4 __attribute__((sda)); -extern int D_L10_00161EB8 __attribute__((sda)); -extern int D_L10_00161EBC __attribute__((sda)); -extern void add_random_offset_to_vector_xyz(void *, float) __asm__("FUN_L00_0025f8e0"); -extern int fast_tween_color_3a90(int, int, float) __asm__("FUN_001fa6e0"); +extern int l10_toxic_crab_particle_start_color_a __asm__("D_L10_00161EA4") __attribute__((sda)); +extern int l10_toxic_crab_particle_end_color_a __asm__("D_L10_00161EA8") __attribute__((sda)); +extern int l10_toxic_crab_particle_start_color_b __asm__("D_L10_00161EAC") __attribute__((sda)); +extern int l10_toxic_crab_particle_end_color_b __asm__("D_L10_00161EB0") __attribute__((sda)); +extern int l10_toxic_crab_particle_life_frames __asm__("D_L10_00161EB4") __attribute__((sda)); +extern int l10_toxic_crab_particle_fade_frames __asm__("D_L10_00161EB8") __attribute__((sda)); +extern int l10_toxic_crab_particle_random_duration_base __asm__("D_L10_00161EBC") + __attribute__((sda)); +extern void add_random_offset_to_vector_xyz(void *, float) __asm__("FUN_L00_0025f8e0"); +extern int fast_tween_color_3a90(int, int, float) __asm__("FUN_001fa6e0"); void emit_moby_particles(struct Moby *moby) __asm__("FUN_L10_002e3a90"); void emit_moby_particles(struct Moby *moby) { float pos[4]; - float vel[4]; - float accel[4]; + float particle_velocity[4]; + float adjusted_particle_velocity[4]; float push[4]; - char *vars; + char *particle_moby_data; int count; float *pos_ptr; - void *src; + void *moby_position_source; int i; int j; float angle; @@ -878,46 +900,54 @@ void emit_moby_particles(struct Moby *moby) { int life; int fade; - count = D_L10_00161E74; - vars = (char *)moby->pvars; + count = l10_toxic_crab_particle_group_count; + particle_moby_data = (char *)moby->pvars; for (i = 0; i < count; i++) { pos_ptr = pos; - src = &moby->pos; - qcopy_nc(pos, src); - add_random_offset_to_vector_xyz(pos_ptr, D_L10_00161E7C); + moby_position_source = &moby->pos; + qcopy_nc(pos, moby_position_source); + add_random_offset_to_vector_xyz(pos_ptr, l10_toxic_crab_particle_group_position_jitter); pos[2] += 0.55f; angle = random_angle_radians(); - speed = random_float_between(D_L10_00161E88, D_L10_00161E8C); - rise = random_float_between(D_L10_00161E90, D_L10_00161E94); + speed = random_float_between(l10_toxic_crab_particle_speed_lower_bound, + l10_toxic_crab_particle_speed_upper_bound); + rise = random_float_between(l10_toxic_crab_particle_rise_lower_bound, + l10_toxic_crab_particle_rise_upper_bound); if (*((u8 *)moby + 0x20) == 11) { speed *= 0.55f; rise *= 0.55f; pos[2] -= 0.2f; } - vel[0] = fast_cos(angle) * (speed * D_0015ED6C); - vel[1] = fast_sin(angle) * (speed * D_0015ED6C); - vel[2] = 0.0f + rise * D_0015ED6C; - fast_vec_scale(push, vars + 0x70, 0.5f); + particle_velocity[0] = fast_cos(angle) * (speed * D_0015ED6C); + particle_velocity[1] = fast_sin(angle) * (speed * D_0015ED6C); + particle_velocity[2] = 0.0f + rise * D_0015ED6C; + fast_vec_scale(push, particle_moby_data + 0x70, 0.5f); push[2] = 0.0f; - fast_vec_add(vel, vel, push); - qcopy(accel, vel); - accel[2] -= D_L10_00161E98 * D_0015ED70 * (float)scale_game_frames(D_L10_00161EB8); - for (j = 0; j < D_L10_00161E78; j++) { + fast_vec_add(particle_velocity, particle_velocity, push); + qcopy(adjusted_particle_velocity, particle_velocity); + adjusted_particle_velocity[2] -= + l10_toxic_crab_particle_vertical_velocity_drop_scale * D_0015ED70 * + (float)scale_game_frames(l10_toxic_crab_particle_fade_frames); + for (j = 0; j < l10_toxic_crab_particles_per_group; j++) { size = random_float_between(0.5f, 1.5f); - vel[3] = size * D_L10_00161E9C; - accel[3] = size * D_L10_00161EA0; - add_random_offset_to_vector_xyz(pos, D_L10_00161E80); - add_random_offset_to_vector_xyz(accel, D_L10_00161E84 * D_0015ED6C); - start_color = fast_tween_color_3a90( - D_L10_00161EA4, D_L10_00161EAC, random_float_between(0.0f, 1.0f)); - end_color = fast_tween_color_3a90( - D_L10_00161EA8, D_L10_00161EB0, random_float_between(0.0f, 1.0f)); - life = scale_game_frames(D_L10_00161EB4); - fade = scale_game_frames(D_L10_00161EB8); - time_base = (float)D_L10_00161EBC; + particle_velocity[3] = size * D_L10_00161E9C; + adjusted_particle_velocity[3] = size * D_L10_00161EA0; + add_random_offset_to_vector_xyz(pos, l10_toxic_crab_particle_position_jitter); + add_random_offset_to_vector_xyz(adjusted_particle_velocity, + l10_toxic_crab_particle_adjusted_velocity_jitter * + D_0015ED6C); + start_color = fast_tween_color_3a90(l10_toxic_crab_particle_start_color_a, + l10_toxic_crab_particle_start_color_b, + random_float_between(0.0f, 1.0f)); + end_color = fast_tween_color_3a90(l10_toxic_crab_particle_end_color_a, + l10_toxic_crab_particle_end_color_b, + random_float_between(0.0f, 1.0f)); + life = scale_game_frames(l10_toxic_crab_particle_life_frames); + fade = scale_game_frames(l10_toxic_crab_particle_fade_frames); + time_base = (float)l10_toxic_crab_particle_random_duration_base; spawn_spark(pos, - vel, - accel, + particle_velocity, + adjusted_particle_velocity, start_color, end_color, life, @@ -1029,8 +1059,8 @@ void update_toxic_crab_hit_reactions_and_targeting(void *mv) { if (((Hero *)(((char *)&hero)))->items[0].item_id == 0x15) { if (((D_2E52B0 *)((Hero *)(((char *)&hero)))->items[0].moby->pvars)->f10 == moby) { func_L10_002E14F8_2E52B0(moby); - if (moby->state == 1) - moby->state = 2; + if (moby->state == TOXIC_CRAB_STATE_WAIT_FOR_ACTIVATION) + moby->state = TOXIC_CRAB_STATE_ACTIVATE; } } if (moby_data->f38 != 0) { @@ -1046,7 +1076,8 @@ void update_toxic_crab_hit_reactions_and_targeting(void *mv) { hit_response_code = resolve_moby_hit_response(moby, hit_record, &moby_data->f20, 0, &A, &B, 0, 4); fast_dec_timer_s16(&moby_data->h26); - if ((unsigned int)A >= 2 && moby->state != 0xB && moby->state != 0xC) { + if ((unsigned int)A >= 2 && moby->state != TOXIC_CRAB_STATE_DEATH_EFFECTS && + moby->state != TOXIC_CRAB_STATE_FALL_TO_DEATH) { if (current_level_index == 10 && hit_record != 0 && hit_record->f20 != 0 && hit_record->f20->oclass == 0x31A) { if (moby_data->f1AC != 0 && item_unlocked[0x11] == 0) { @@ -1119,7 +1150,7 @@ void update_toxic_crab_hit_reactions_and_targeting(void *mv) { case ANIMATED_KNOCKBACK_HIT_RESPONSE: case HIT_DIRECTED_KNOCKBACK_HIT_RESPONSE: case ARC_ADJUSTED_KNOCKBACK_HIT_RESPONSE: - moby->state = 10; + moby->state = TOXIC_CRAB_STATE_HIT_KNOCKBACK; moby_data->h26 = scale_game_frames(60); moby_data->f80 = toxic_crab_hit_knockback_gravity_gp * D_0015ED70; trooper_set_knockback(moby_data->a70, 0.5f, 0.5f); @@ -1134,7 +1165,7 @@ void update_toxic_crab_hit_reactions_and_targeting(void *mv) { case VEHICLE_SCALED_KNOCKBACK_HIT_RESPONSE: case VEHICLE_DEPENDENT_KNOCKBACK_HIT_RESPONSE: { float knockback_strength; - moby->state = 10; + moby->state = TOXIC_CRAB_STATE_HIT_KNOCKBACK; moby_data->h26 = scale_game_frames(60); moby_data->f80 = toxic_crab_hit_knockback_gravity_gp * D_0015ED70; knockback_strength = ((Hero *)(((char *)&hero)))->vehicle_mode == 1 ? 1.0f : 3.0f; @@ -1151,7 +1182,7 @@ void update_toxic_crab_hit_reactions_and_targeting(void *mv) { } case LETHAL_HIT_RESPONSE: case DEATH_HIT_RESPONSE: - moby->state = 11; + moby->state = TOXIC_CRAB_STATE_DEATH_EFFECTS; moby->flags &= 0xEFFF; break; case NO_STATE_TRANSITION_HIT_RESPONSE: @@ -1167,7 +1198,7 @@ void update_toxic_crab_hit_reactions_and_targeting(void *mv) { } if (moby_data->f1AC != 0) { moby_data->f1A0 = D_L10_00161E40_gp + 6.0f; - } else if (moby->state == 1) { + } else if (moby->state == TOXIC_CRAB_STATE_WAIT_FOR_ACTIVATION) { if (moby == ((Moby *)((Hero *)(((char *)&hero)))->unk240) || moby == ((Moby *)((Hero *)(((char *)&hero)))->coll_hit_moby)) { moby_data->f1A0 = 6.0f; @@ -1198,15 +1229,15 @@ void update_toxic_crab_hit_reactions_and_targeting(void *mv) { l10_paths[moby_data->f1B0]->points, l10_paths[moby_data->f1B0]->count); } - if (moby->state != 1 && moby_data->f164 == 2) { + if (moby->state != TOXIC_CRAB_STATE_WAIT_FOR_ACTIVATION && moby_data->f164 == 2) { moby_data->f1D4++; if (scale_game_frames(300) < moby_data->f1D4) { if (1.0f < fast_vec_dist(&moby->pos, &moby_data->a170)) { - moby->state = 8; + moby->state = TOXIC_CRAB_STATE_RETURN_HOME; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(12)); } else if (((Hero *)(((char *)&hero)))->vehicle_mode != 1) { - moby->state = 1; + moby->state = TOXIC_CRAB_STATE_WAIT_FOR_ACTIVATION; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(20)); } diff --git a/src/overlays/l11/hero/hero_set_state.c b/src/overlays/l11/hero/hero_set_state.c index dc0aab7422..81dc5552f8 100644 --- a/src/overlays/l11/hero/hero_set_state.c +++ b/src/overlays/l11/hero/hero_set_state.c @@ -65,13 +65,14 @@ extern int hero_set_state(int, int) __asm__("FUN_L11_0024db50"); extern char level_11_water_surface_jump_velocity_keys[] __asm__("D_L11_0017C960"); extern char level_11_trail_jump_velocity_keys[] __asm__("D_L11_0017C920"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int b) { int previous_state_step; char *moby; int old20A7; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || b != 2)) return 0; } if ((D_L11_0015F5C4 == 2 || D_L11_0015F5C4 == 6) && b != 2) @@ -79,8 +80,16 @@ int hero_set_state(int a, int b) { { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -93,11 +102,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -118,14 +127,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); return 1; } @@ -573,14 +582,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); if (b) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L11_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -854,7 +863,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -939,7 +948,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; diff --git a/src/overlays/l11/hero/update_hero_motion_by_state.c b/src/overlays/l11/hero/update_hero_motion_by_state.c index d69a98d8a0..57d5b67c3b 100644 --- a/src/overlays/l11/hero/update_hero_motion_by_state.c +++ b/src/overlays/l11/hero/update_hero_motion_by_state.c @@ -34,6 +34,10 @@ float absolute_float(float input) __asm__("func_001F99C0"); void update_hero_surface_condition_flags(void) __asm__("FUN_L11_0023c7a0"); void update_hero_surface_condition_flags(void) { + enum { + HERO_GROUND_TYPE_WATER = 0, + HERO_GROUND_TYPE_MAGNETIC = 2 + }; struct Hero *hero_object_ptr = &hero; unsigned char saved; int state; @@ -46,10 +50,10 @@ void update_hero_surface_condition_flags(void) { hero_object_ptr->unk308 = 0; if (state == -1) return; - if (state == 2) { + if (state == HERO_GROUND_TYPE_MAGNETIC) { if (hero_object_ptr->frames_off_ground.s == 0 || hero_object_ptr->ground_distance < 0.3f) { hero_object_ptr->on_magnet_ground = 1; - if (hero_object_ptr->vehicle_mode == 0) { + if (hero_object_ptr->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (((int)hero_object_ptr->items[1].moby) != 0 && *(short *)(((int)hero_object_ptr->items[1].moby) + 0xA6) == 0xAD) hero_object_ptr->unk308 = 1; @@ -62,7 +66,7 @@ void update_hero_surface_condition_flags(void) { hero_ptr->water_depth = 0.2f; hero_ptr->water_surface_z = hero_ptr->ground_z.f + 0.2f; } - if (state == 0) { + if (state == HERO_GROUND_TYPE_WATER) { struct Hero *hero_ptr = &hero; struct Hero *base_condition_hero_ptr; float water_surface_to_ground_z_difference = @@ -242,7 +246,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void clip_hero_horizontal_velocity(s32) __asm__("FUN_L01_00232978"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -273,7 +277,7 @@ extern void moby_point_position(struct MobyView *, s32, void *) __asm__("FUN_L00 extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L11_0023b050(f32, f32); @@ -324,7 +328,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L11_0017C7B8; extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); extern s32 is_moby_in_class_range_500_to_540(s32) __asm__("FUN_L00_0025e3b8"); @@ -490,10 +494,10 @@ void update_hero_motion_by_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -504,11 +508,11 @@ void update_hero_motion_by_state(void) { } else { clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -820,8 +824,8 @@ void update_hero_motion_by_state(void) { build_spherical_offset( &hero.motion.velocity, hero.ground_speed, hero.motion.rot.f[2], yaw); } else if (hero.state.current == 0x33) { - f32 sp = - hero.ground_speed * FUN_L00_00209018(swim_animation_speed_factors, 0x1E) * 5.0f; + f32 sp = hero.ground_speed * + vector_length_xyz_cf(swim_animation_speed_factors, 0x1E) * 5.0f; if (hero.state.prev == 0x35 && scale_game_frames(15) > hero.state_timer) { if (sp < frame_time * 4.5f) { sp = frame_time * 4.5f; @@ -951,8 +955,8 @@ void update_hero_motion_by_state(void) { } speed_step(frame_time_sq * 4.0f, frame_time_sq * 5.0f); { - f32 sp = - hero.ground_speed * FUN_L00_00209018(swim_animation_speed_factors, 0x1E) * 5.5f; + f32 sp = hero.ground_speed * + vector_length_xyz_cf(swim_animation_speed_factors, 0x1E) * 5.5f; hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[2] = 0.0f; @@ -1007,11 +1011,12 @@ void update_hero_motion_by_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && MV(hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -1029,11 +1034,12 @@ void update_hero_motion_by_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (MV(hero.grapple_target) != NULL) { hero.motion.move_yaw = @@ -1200,13 +1206,13 @@ void update_hero_motion_by_state(void) { if (vector_distance_xy(&hero.motion.pos, &MV(hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&motion_vector_scratch, &hero.motion.pos, &MV(hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1319,7 +1325,8 @@ void update_hero_motion_by_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1403,7 +1410,8 @@ void update_hero_motion_by_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1449,7 +1457,7 @@ void update_hero_motion_by_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1465,10 +1473,11 @@ void update_hero_motion_by_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1488,11 +1497,11 @@ void update_hero_motion_by_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { attack_spacing_offset = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { attack_spacing_offset = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1537,7 +1546,7 @@ void update_hero_motion_by_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || MV(hero.melee_target) != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1547,7 +1556,8 @@ void update_hero_motion_by_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1561,10 +1571,11 @@ void update_hero_motion_by_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -1675,11 +1686,12 @@ void update_hero_motion_by_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1790,11 +1802,12 @@ void update_hero_motion_by_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1868,7 +1881,7 @@ void update_hero_motion_by_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -1905,7 +1918,8 @@ void update_hero_motion_by_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -1922,7 +1936,8 @@ void update_hero_motion_by_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -1966,7 +1981,7 @@ void update_hero_motion_by_state(void) { clip_hero_horizontal_velocity(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2011,7 +2026,7 @@ void update_hero_motion_by_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2115,9 +2130,9 @@ void update_hero_motion_by_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&vector_and_hit_descriptor_head_scratch, &hero.motion.pos); - FUN_L00_00233810(&vector_and_hit_descriptor_head_scratch, - &vector_and_hit_descriptor_head_scratch, - 0.5f); + add_hero_up_offset(&vector_and_hit_descriptor_head_scratch, + &vector_and_hit_descriptor_head_scratch, + 0.5f); qcopy(&v10, &vector_and_hit_descriptor_head_scratch); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; v10.f[1] += fast_sin(hero.motion.rot.f[2]) * 0.85f; @@ -2152,7 +2167,7 @@ void update_hero_motion_by_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2199,7 +2214,7 @@ void update_hero_motion_by_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -2221,7 +2236,7 @@ void update_hero_motion_by_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = frame_time * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = frame_time * 0.9f; } } else { @@ -2232,29 +2247,30 @@ void update_hero_motion_by_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { clip_hero_horizontal_velocity(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2267,11 +2283,12 @@ void update_hero_motion_by_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -2289,18 +2306,19 @@ void update_hero_motion_by_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -2308,7 +2326,8 @@ void update_hero_motion_by_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -2337,11 +2356,12 @@ void update_hero_motion_by_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2356,10 +2376,10 @@ void update_hero_motion_by_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l11/hero/update_hero_state_transitions.c b/src/overlays/l11/hero/update_hero_state_transitions.c index 58d546c099..2bf942585d 100644 --- a/src/overlays/l11/hero/update_hero_state_transitions.c +++ b/src/overlays/l11/hero/update_hero_state_transitions.c @@ -156,9 +156,11 @@ void update_hero_state_transitions(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && D_L11_0015F594_gp == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -221,7 +223,7 @@ void update_hero_state_transitions(void) { } } if (hero_fatal_fall_entry_z_threshold > hero.motion.pos.f[2] && - hero.ground_distance > 2.0f && hero.vehicle_mode != 2 && + hero.ground_distance > 2.0f && hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { @@ -629,7 +631,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (hero.moby->prev_seq != 0xD) { @@ -656,7 +658,7 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); break; } @@ -912,7 +914,8 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -1984,7 +1987,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (hero.moby->prev_seq != 0xD) { diff --git a/src/overlays/l11/level_class_tables.c b/src/overlays/l11/level_class_tables.c index 16889999bd..b9aa616272 100644 --- a/src/overlays/l11/level_class_tables.c +++ b/src/overlays/l11/level_class_tables.c @@ -6,7 +6,7 @@ #include "rnc/camera/update_cam.h" #include "rnc/mobys/moby_class_tables.h" -void FUN_L00_002caf40(); +void get_morphoray_chicken_slot_record() __asm__("FUN_L00_002caf40"); void FUN_L00_002ea7a0(); void FUN_L00_002ed230(); void ammocrate_update() __asm__("FUN_L11_0030f728"); @@ -152,7 +152,7 @@ void *D_L11_0021BFF0[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L11_0021C008[6] diff --git a/src/overlays/l11/mobys/ammocrate.c b/src/overlays/l11/mobys/ammocrate.c index f0c6ebff7c..4afb0778e9 100644 --- a/src/overlays/l11/mobys/ammocrate.c +++ b/src/overlays/l11/mobys/ammocrate.c @@ -137,10 +137,10 @@ void ammocrate_update(struct Moby *pickup) { 1, -1, 0); - pickup->state = 5; + pickup->state = AMMOCRATE_STATE_REMOVE; } } - if (pickup->state < 4) { + if (pickup->state < AMMOCRATE_STATE_COLLECTED) { if (hero.state.current == 0x32 && ship != 0 && ship->state != 0xFE && ship->state != 0xFD && (ship->oclass == 0x4DA || ship->oclass == 0x45 || ship->oclass == 0x563)) { ship_pickup_distance_metric = fast_vec_dist(&ship->pos, &pickup->pos); @@ -164,7 +164,7 @@ void ammocrate_update(struct Moby *pickup) { if (hero.ship_ammo_max < hero.ship_ammo) { hero.ship_ammo = hero.ship_ammo_max; } - pickup->state = 4; + pickup->state = AMMOCRATE_STATE_COLLECTED; break; case OCLASS_SHIP_HEALTH_PICKUP: hero.ship_hp += hero.ship_hp_max * 0.25f; @@ -175,10 +175,10 @@ void ammocrate_update(struct Moby *pickup) { if (hero.ship_hp_max < hero.ship_hp) { hero.ship_hp = hero.ship_hp_max; } - pickup->state = 4; + pickup->state = AMMOCRATE_STATE_COLLECTED; break; default: - pickup->state = 4; + pickup->state = AMMOCRATE_STATE_COLLECTED; break; } } @@ -188,7 +188,7 @@ void ammocrate_update(struct Moby *pickup) { pickup_vars->unk34 = 0; sync_ship_pickup_child_pose(pickup, pickup_vars); pickup_vars->unk30 = 0.0f; - pickup->state = 1; + pickup->state = AMMOCRATE_STATE_DAMPED_FALL; break; case AMMOCRATE_STATE_DAMPED_FALL: fast_vec_scale(&pickup_vars->unk10, &pickup_vars->unk10, 0.9f); @@ -198,7 +198,7 @@ void ammocrate_update(struct Moby *pickup) { if (sync_ship_pickup_child_pose(pickup, pickup_vars)) { if (pickup_vars->unk34->seq == 1) { fast_vec_scale(&pickup_vars->unk10, &pickup_vars->unk10, 0.8f); - pickup->state = 2; + pickup->state = AMMOCRATE_STATE_ATTRACT_TO_SHIP; } } break; @@ -229,7 +229,7 @@ void ammocrate_update(struct Moby *pickup) { fast_vec_add(&pickup->pos, &pickup->pos, &pickup_vars->unk10); break; case AMMOCRATE_STATE_COLLECTED: - pickup->state = 5; + pickup->state = AMMOCRATE_STATE_REMOVE; break; case AMMOCRATE_STATE_REMOVE: mark_moby_for_removal(pickup); diff --git a/src/overlays/l11/mobys/blarg_ship.c b/src/overlays/l11/mobys/blarg_ship.c index fcda90841e..106f72591f 100644 --- a/src/overlays/l11/mobys/blarg_ship.c +++ b/src/overlays/l11/mobys/blarg_ship.c @@ -141,13 +141,13 @@ void blarg_ship_update(struct Moby *moby) { moby->draw_dist = 0xFF; moby->update_dist = 0xFF; if (moby_vars->unk88 == 0) { - moby->state = 1; + moby->state = BLARG_SHIP_FOLLOW_PATH; moby_vars->unk6C = randf_sym(0.3f, 0.5f); moby_vars->unk70 = random_angle_radians(); moby_vars->unk74 = randf_sym(60.0f, 120.0f) * DEG_TO_RAD * frame_scale_inv_macro[1]; moby_vars->unk78 = random_float_between(8.0f, 12.0f); } else { - moby->state = 4; + moby->state = BLARG_SHIP_INACTIVE; moby->collision = 0; moby->flags |= 1; } @@ -166,7 +166,7 @@ void blarg_ship_update(struct Moby *moby) { } fast_add_rotations(moby_vars->unk70, moby_vars->unk74); update_moby_path_transform(moby); - if (moby->state == 2) { + if (moby->state == BLARG_SHIP_BURST_AND_WAIT_TO_REACTIVATE) { cart_burst(moby, &moby->pos, -1, 2.0f, 13.0f); if (random_integer_below(2)) { spawn_moby_with_random_yaw(&moby->pos, D_L11_0015F580, 0x4C4); @@ -175,12 +175,12 @@ void blarg_ship_update(struct Moby *moby) { } allocate_voice_for_target_entry(1, 0, (int)moby); *(unsigned short *)(D_00141C18) = 0xFFFF; - moby->state = 3; + moby->state = BLARG_SHIP_WAIT_TO_REACTIVATE; moby->collision = 0; moby->flags |= 1; } else if (moby->visible == 0) { if (fast_vec_dist(&moby->pos, &hero.motion.pos) < 32.0f) { - moby->state = 3; + moby->state = BLARG_SHIP_WAIT_TO_REACTIVATE; moby->collision = 0; moby->flags |= 1; } @@ -193,7 +193,7 @@ void blarg_ship_update(struct Moby *moby) { if (fast_vec_dist(&moby->pos, &hero.motion.pos) > 32.0f) { moby_vars->unk84 += 1; if (scale_game_frames(60) < moby_vars->unk84) { - moby->state = 1; + moby->state = BLARG_SHIP_FOLLOW_PATH; if (moby->prev_seq) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -314,7 +314,7 @@ void blarg_ship_update(struct Moby *moby) { } } if (moby->visible == 0) { - moby->state = 4; + moby->state = BLARG_SHIP_INACTIVE; moby->collision = 0; moby->flags |= 1; } @@ -332,7 +332,7 @@ void blarg_ship_update(struct Moby *moby) { spawn_moby_with_random_yaw(&moby->pos, D_L11_0015F580, 0x4C2); } allocate_voice_for_target_entry(1, 0, (int)moby); - moby->state = 4; + moby->state = BLARG_SHIP_INACTIVE; moby->collision = 0; moby->flags |= 1; break; diff --git a/src/overlays/l11/mobys/bob.c b/src/overlays/l11/mobys/bob.c index 072b1b86aa..7451524f82 100644 --- a/src/overlays/l11/mobys/bob.c +++ b/src/overlays/l11/mobys/bob.c @@ -74,7 +74,7 @@ void bob_update(WatcherMoby *moby) { if (D_0013D4C3) { moby->state = 3; } else { - moby->state = 1; + moby->state = BOB_CHECK_DIALOGUE; } initialize_npc_dialogue(moby, moby_vars); moby_vars->f0C = 3.7f; @@ -83,13 +83,13 @@ void bob_update(WatcherMoby *moby) { if (is_point_inside_clip_volume(hero.motion.pos.f, moby_vars->region)) { if (update_npc_dialogue(moby, moby_vars)) { begin_dialogue_camera_transition(moby, 2.7f); - moby->state = 2; + moby->state = BOB_WAIT_FOR_DIALOGUE_END; } } break; case BOB_WAIT_FOR_DIALOGUE_END: if (D_L11_0015F5C4 != 2) { - moby->state = 1; + moby->state = BOB_CHECK_DIALOGUE; if (moby_vars->h04 == 2) { grant_inventory_item(3, 1); jet_reset_camera(hero.motion.pos.f, hero.motion.pos.f + 4); diff --git a/src/overlays/l11/mobys/bubble.c b/src/overlays/l11/mobys/bubble.c index 3609ad208d..1d19daa810 100644 --- a/src/overlays/l11/mobys/bubble.c +++ b/src/overlays/l11/mobys/bubble.c @@ -46,7 +46,8 @@ extern short bubble_horizontal_deceleration_gp __asm__("D_L11_00162408") __attri extern short bubble_surface_crossing_velocity_scale_gp __asm__("D_L11_0016240C") __attribute__((sda)); extern short bubble_spark_spawn_random_limit_gp __asm__("D_L11_00162410") __attribute__((sda)); -extern short D_L11_00162414 __attribute__((sda)); +extern short l11_bubble_shrink_effect_randomization_scale __asm__("D_L11_00162414") + __attribute__((sda)); extern short bubble_shrink_effect_color_range_start_gp __asm__("D_L11_00162418") __attribute__((sda)); extern short bubble_shrink_effect_color_range_end_gp __asm__("D_L11_0016241C") __attribute__((sda)); @@ -90,7 +91,7 @@ void bubble_update(struct Moby *bubble_moby) { if (bubble_moby->pos.z < *bubble_vars->unk24) { fast_vec_scale( bubble_vars, bubble_vars, *(float *)&bubble_surface_crossing_velocity_scale_gp); - bubble_moby->state = 2; + bubble_moby->state = BUBBLE_SHRINK_TO_REMOVAL; spawn_bubble_surface_effects((struct Moby *)bubble_moby, bubble_vars->unk24, 8, 4); } break; @@ -101,10 +102,11 @@ void bubble_update(struct Moby *bubble_moby) { spawn_bubble_surface_effects((struct Moby *)bubble_moby, bubble_vars->unk24, 0, 1); random_vector(randomized_effect_vector, 0.0f, frame_scale_inv_macro[1]); randomized_effect_vector[2] = absolute_float(randomized_effect_vector[2]); - spawned_effect = func_L00_0026FF20_p(&bubble_moby->pos, - randomized_effect_vector, - *(float *)&D_L11_00162414, - *bubble_vars->unk24); + spawned_effect = + func_L00_0026FF20_p(&bubble_moby->pos, + randomized_effect_vector, + *(float *)&l11_bubble_shrink_effect_randomization_scale, + *bubble_vars->unk24); if (spawned_effect != 0) { *(int *)(spawned_effect + 4) = fast_tween_color(*(int *)&bubble_shrink_effect_color_range_start_gp, diff --git a/src/overlays/l11/mobys/child_grid_controller.c b/src/overlays/l11/mobys/child_grid_controller.c index 229e49e8a3..b6c234b274 100644 --- a/src/overlays/l11/mobys/child_grid_controller.c +++ b/src/overlays/l11/mobys/child_grid_controller.c @@ -83,19 +83,19 @@ void child_grid_controller_update(struct Moby *grid_controller) { } } grid_controller_vars->t = 0.0f; - grid_controller->state = 1; + grid_controller->state = CHILD_GRID_STATE_WAIT_LINK_COMMAND; break; case CHILD_GRID_STATE_WAIT_LINK_COMMAND: { struct Moby *link = (struct Moby *)((grid_controller_vars->link << 8) + D_L11_0015FFD8_d800); if (link->command == 1) { - grid_controller->state = 2; + grid_controller->state = CHILD_GRID_STATE_FADE_TO_POINT_POSE; grid_controller_vars->fade = -1.0f; D_L11_00161F54 = 0; allocate_voice_for_target_entry(0, 0, grid_controller); } else if (link->command == 2) { grid_controller_vars->t = 1.0f; - grid_controller->state = 5; + grid_controller->state = CHILD_GRID_STATE_IDLE; } break; } @@ -111,7 +111,7 @@ void child_grid_controller_update(struct Moby *grid_controller) { source_pose_point = (char *)((int)l11_cuboids + (grid_controller_vars->from << 7)); jet_mount(source_pose_point + 0x30, source_pose_point + 0x70, 1, 0, 0); } else if (1.0f <= grid_controller_vars->fade) { - grid_controller->state = 3; + grid_controller->state = CHILD_GRID_STATE_BLEND_POINT_POSES; } break; case CHILD_GRID_STATE_BLEND_POINT_POSES: @@ -148,7 +148,7 @@ void child_grid_controller_update(struct Moby *grid_controller) { set_camera_position(&pos); set_camera_rotation(&rot); if (1.0f <= grid_controller_vars->t) { - grid_controller->state = 4; + grid_controller->state = CHILD_GRID_STATE_FADE_TO_HERO_POSE; grid_controller_vars->fade = -1.0f; } break; @@ -160,7 +160,7 @@ void child_grid_controller_update(struct Moby *grid_controller) { set_race_camera(&hero.motion.pos, &hero.motion.rot, 0, 1); jet_end_mount(3); } else if (1.0f <= grid_controller_vars->fade) { - grid_controller->state = 5; + grid_controller->state = CHILD_GRID_STATE_IDLE; } break; case CHILD_GRID_STATE_IDLE: diff --git a/src/overlays/l11/mobys/child_sets_controller.c b/src/overlays/l11/mobys/child_sets_controller.c index d47330641f..5fd7163bdf 100644 --- a/src/overlays/l11/mobys/child_sets_controller.c +++ b/src/overlays/l11/mobys/child_sets_controller.c @@ -72,6 +72,9 @@ void child_sets_controller_update(struct Moby *child_sets_controller) { CHILD_SETS_STATE_UNFOLD_AND_BLEND_POSES = 3, CHILD_SETS_STATE_FADE_AFTER_HERO_HANDOFF = 4 }; + enum { + CHILD_SETS_STATE_COMPLETE = 5 + }; CamVars_c788 *child_sets_controller_vars = (CamVars_c788 *)child_sets_controller->pvars; Vec4f pos; Vec4f rot; @@ -140,13 +143,13 @@ void child_sets_controller_update(struct Moby *child_sets_controller) { D_L11_00161F10[i]->collision = 0; } update_child_set_poses(child_sets_controller); - child_sets_controller->state = 1; + child_sets_controller->state = CHILD_SETS_STATE_WAIT_FOR_LINK_TRIGGER; break; case CHILD_SETS_STATE_WAIT_FOR_LINK_TRIGGER: if (child_sets_controller_vars->link != -1 && test_linked_moby_turn_trigger( (void *)(D_L11_0015FFD8_c788 + (child_sets_controller_vars->link << 8)))) { - child_sets_controller->state = 2; + child_sets_controller->state = CHILD_SETS_STATE_FADE_BEFORE_ACTIVATION; } break; case CHILD_SETS_STATE_FADE_BEFORE_ACTIVATION: @@ -154,7 +157,7 @@ void child_sets_controller_update(struct Moby *child_sets_controller) { D_L11_0015F3FC = child_sets_controller_vars->fade; if (1.0f <= child_sets_controller_vars->fade) { int j; - child_sets_controller->state = 3; + child_sets_controller->state = CHILD_SETS_STATE_UNFOLD_AND_BLEND_POSES; qcopy(&pos, &((struct Moby *)(D_L11_0015FFD8_c788 + (child_sets_controller_vars->link << 8))) ->pos); @@ -278,7 +281,7 @@ void child_sets_controller_update(struct Moby *child_sets_controller) { D_L11_00161ED4 = 1.0f; D_L11_00161ED8 = 1.0f; update_child_set_poses(child_sets_controller); - child_sets_controller->state = 4; + child_sets_controller->state = CHILD_SETS_STATE_FADE_AFTER_HERO_HANDOFF; jet_end_mount(3); set_race_camera(&hero.motion.pos, &hero.motion.rot, 0, 1); alternate_item_available[0x56] = 1; @@ -288,7 +291,7 @@ void child_sets_controller_update(struct Moby *child_sets_controller) { approach_value(&child_sets_controller_vars->fade, 0.0f, frame_time * 4.0f); D_L11_0015F3FC = child_sets_controller_vars->fade; if (child_sets_controller_vars->fade == 0.0f) { - child_sets_controller->state = 5; + child_sets_controller->state = CHILD_SETS_STATE_COMPLETE; } break; } diff --git a/src/overlays/l11/mobys/distance_faded_scroll_effect.c b/src/overlays/l11/mobys/distance_faded_scroll_effect.c index aa598bc67c..4986f4dc81 100644 --- a/src/overlays/l11/mobys/distance_faded_scroll_effect.c +++ b/src/overlays/l11/mobys/distance_faded_scroll_effect.c @@ -29,7 +29,7 @@ typedef struct { int a, b; } PairB; -extern PairB D_L11_00217758[]; +extern PairB l11_distance_faded_effect_uv_offsets[] __asm__("D_L11_00217758"); extern PairB D_L11_00162618[] MACRO_ADDR; /* The 17-batch set (emit_render_batches_with_pair_offset, loop of 0x11) and the 9-batch @@ -5887,7 +5887,7 @@ void emit_render_batches_with_pair_offset(int pair_index) { FUN_L08_00258090(D_L11_00217770, render_batch_pair_sources[i], distance_faded_effect_batch_vertex_counts[i], - &D_L11_00217758[pair_index]); + &l11_distance_faded_effect_uv_offsets[pair_index]); FUN_L00_001fde98(distance_faded_effect_batch_vertex_counts[i], render_batch_triplet_sources[i], distance_faded_effect_batch_color_tables[i], @@ -6044,10 +6044,10 @@ void distance_faded_effect_update(struct Moby *moby) { 1); distance_faded_effect_color_tables_initialized_gp = 1; } - moby->state = 1; + moby->state = EFFECT_UPDATE_AND_QUEUE_DRAW; for (i = 0; i < 3; i++) { - D_L11_00217758[i].a = 0; - D_L11_00217758[i].b = 0; + l11_distance_faded_effect_uv_offsets[i].a = 0; + l11_distance_faded_effect_uv_offsets[i].b = 0; distance_faded_effect_sine_phases[0] = 0; distance_faded_effect_sine_phases[1] = 0; } diff --git a/src/overlays/l11/mobys/energy_sphere.c b/src/overlays/l11/mobys/energy_sphere.c index b3fadbe410..daae5c2d69 100644 --- a/src/overlays/l11/mobys/energy_sphere.c +++ b/src/overlays/l11/mobys/energy_sphere.c @@ -14,6 +14,11 @@ #include "rnc/rendering/effects/spawn_spark.h" #include "rnc/world/collision/collision_line.h" +enum { + ENERGY_SPHERE_APPROACH_SCALE_AND_REMOVE = 1, + ENERGY_SPHERE_MOVE_AND_DETONATE = 2 +}; + extern float frame_scale_inv_macro[] __asm__("D_0015ED68") MACRO_ADDR; extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); /* Ported from rac1-decomp (src/overlays/l11_pokitaru/vendor_00312BD8.c: func_L11_00319FA0), where it is exact; names translated to the US level program. */ @@ -47,10 +52,6 @@ extern int scale_game_frames(int); /* Moby class 1297 */ void energy_sphere_update(unsigned char *moby) { - enum { - ENERGY_SPHERE_APPROACH_SCALE_AND_REMOVE = 1, - ENERGY_SPHERE_MOVE_AND_DETONATE = 2 - }; char *energy_sphere_private_vars = ((char *)MOBY(moby)->pvars); float previous_position[4]; float *vp; @@ -170,7 +171,7 @@ void set_moby_state_two_data_and_timer(struct Moby *moby, void *src) __asm__("FU void set_moby_state_two_data_and_timer(struct Moby *moby, void *movement_step) { char *moby_vars; - moby->state = 2; + moby->state = ENERGY_SPHERE_MOVE_AND_DETONATE; moby_vars = (char *)moby->pvars; qcopy(moby_vars, movement_step); *(int *)(moby_vars + 0x20) = scale_game_frames(0x3C); @@ -225,14 +226,14 @@ void spawn_moby_radial_spark(struct Moby *source_moby) { extern float D_L11_001677C0_lui[] __asm__("D_L11_001677C0") NOT_SDA; extern int FUN_001fa6e0_q(int, int, float) __asm__("FUN_001fa6e0"); -extern unsigned char *FUN_L00_00272f68_q(float f, - void *pos, - int a1, - unsigned char a2, - int idx, - int flag, - int s, - int mode) __asm__("FUN_L00_00272f68"); +extern unsigned char *spawn_timed_hero_relative_particle(float f, + void *pos, + int a1, + unsigned char a2, + int idx, + int flag, + int s, + int mode) __asm__("FUN_L00_00272f68"); extern short energy_sphere_particle_color_end_gp __asm__("D_L11_00162384") __attribute__((sda)); extern short energy_sphere_particle_color_start_gp __asm__("D_L11_00162380") __attribute__((sda)); @@ -257,15 +258,16 @@ void spawn_energy_sphere_particles(struct Moby *moby) { unsigned char updated_effect_byte; effect_byte_cursor[0] += effect_byte_cursor[4]; updated_effect_byte = truncate_float_to_s32((float)effect_byte_cursor[0]); - FUN_L00_00272f68_q(*(float *)(energy_sphere_vars + 0x1C) * - convert_integer_to_float(effect_byte_cursor[8]) * 0.025f, - effect_position, - a, - updated_effect_byte, - 0x35, - 1, - 2, - 0); + spawn_timed_hero_relative_particle(*(float *)(energy_sphere_vars + 0x1C) * + convert_integer_to_float(effect_byte_cursor[8]) * + 0.025f, + effect_position, + a, + updated_effect_byte, + 0x35, + 1, + 2, + 0); effect_byte_cursor++; fast_vec_add(effect_position, effect_position, position_step); } diff --git a/src/overlays/l11/mobys/fred_pokitaru.c b/src/overlays/l11/mobys/fred_pokitaru.c index 74be6846c2..837730e27d 100644 --- a/src/overlays/l11/mobys/fred_pokitaru.c +++ b/src/overlays/l11/mobys/fred_pokitaru.c @@ -86,7 +86,7 @@ void fred_pokitaru_update(struct Moby *moby) { } switch (moby->state) { case FRED_POKITARU_INITIALIZE: - moby->state = 1; + moby->state = FRED_POKITARU_CHECK_DIALOGUE; if (moby->prev_seq != 1) FUN_00212f90(moby, 1, 0, scale_game_frames(20)); if (D_0013D50B) { @@ -99,7 +99,7 @@ void fred_pokitaru_update(struct Moby *moby) { case FRED_POKITARU_CHECK_DIALOGUE: if (update_npc_dialogue(moby, moby_vars)) { begin_dialogue_camera_transition(moby, 3.0f); - moby->state = 2; + moby->state = FRED_POKITARU_WAIT_FOR_DIALOGUE_END; } if (alternate_item_available[1] == 0 && discount_purchase_pricing[0] == 0) { if (fast_vec_dist(&moby->pos, hero.motion.pos.f) < 4.0f) { @@ -125,7 +125,7 @@ void fred_pokitaru_update(struct Moby *moby) { break; case FRED_POKITARU_WAIT_FOR_DIALOGUE_END: if (D_L11_0015F5C4 != 2) { - moby->state = 1; + moby->state = FRED_POKITARU_CHECK_DIALOGUE; if (moby_vars->h04 == 2) { alternate_item_available[1] = 0; discount_purchase_pricing[0] = 1; diff --git a/src/overlays/l11/mobys/hero_path_constraint_trigger.c b/src/overlays/l11/mobys/hero_path_constraint_trigger.c index 9824aaa05d..89f7803aa2 100644 --- a/src/overlays/l11/mobys/hero_path_constraint_trigger.c +++ b/src/overlays/l11/mobys/hero_path_constraint_trigger.c @@ -19,7 +19,7 @@ void hero_path_constraint_trigger_update(struct Moby *moby) { switch (moby->state) { case MOBY_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = MOBY_COPY_PVAR_TO_HERO; if (*(int *)state == -1) mark_moby_for_removal(moby); break; diff --git a/src/overlays/l11/mobys/jet_fighter.c b/src/overlays/l11/mobys/jet_fighter.c index 767554bc3d..6c50ddd2f2 100644 --- a/src/overlays/l11/mobys/jet_fighter.c +++ b/src/overlays/l11/mobys/jet_fighter.c @@ -26,6 +26,17 @@ #include "rnc/rendering/view/update_view_context.h" #include "rnc/ui/help/try_set_help_message.h" +enum { + JET_FIGHTER_STATE_INITIALIZE = 0, + JET_FIGHTER_STATE_WAIT_FOR_BOARDING = 1, + JET_FIGHTER_STATE_BOARD = 2, + JET_FIGHTER_STATE_FLIGHT = 4, + JET_FIGHTER_STATE_DISMOUNT = 5, + JET_FIGHTER_STATE_WAIT_FOR_RESPAWN = 7, + JET_FIGHTER_STATE_DELAYED_EXIT = 8, + JET_FIGHTER_STATE_INACTIVE = 9 +}; + extern float D_L11_0015F580[] MACRO_ADDR; extern float D_L11_0015F3FC; @@ -62,7 +73,7 @@ typedef struct { extern IconEC5D0 l11_ship_radar_icon_definitions[] __asm__("D_L11_001F1058"); extern s64 get_effect_texture(s32) __asm__("func_001F44B8"); extern unsigned char frame_size[] __asm__("D_0013E504"); -extern unsigned char D_0015EDB4[4]; +extern unsigned char draw_map51[4] __asm__("D_0015EDB4"); extern void draw_textured_quad(s32, s32, s32, s32, s32, s32, s32, s32, s64, s64) __asm__("func_001F5450"); @@ -99,7 +110,7 @@ void draw_ship_radar_moby_icon( fast_vec_scale(radar_offset, radar_offset, 0.142857149f); radar_distance = fast_vec_length(radar_offset); side = 1.0f; - if (D_0015EDB4[0] != 0) { + if (draw_map51[0] != 0) { side = -1.0f; } x = truncate_float_to_s32(side * radar_offset[0]); @@ -564,7 +575,7 @@ void draw_ship_hud(struct Moby *moby) { help_request(0x2AFD, 0x56); } - if (moby->state == 8) { + if (moby->state == JET_FIGHTER_STATE_DELAYED_EXIT) { font_print_center_large(0x100, 0xC8, 0x80005080, get_help_message_text(0x523E), 0x11); } @@ -771,13 +782,18 @@ extern float D_L11_0016204C __attribute__((sda)); extern float D_L11_0016207C __attribute__((sda)); extern float D_L11_00162080 __attribute__((sda)); extern float D_L11_0016208C __attribute__((sda)); -extern float D_L11_0016209C __attribute__((sda)); -extern float D_L11_001620A0 __attribute__((sda)); +extern float l11_jet_fighter_horizontal_steering_spring_error_gain __asm__("D_L11_0016209C") + __attribute__((sda)); +extern float + l11_jet_fighter_horizontal_steering_spring_damping_coefficient __asm__("D_L11_001620A0") + __attribute__((sda)); #include "rnc/overlay/l11/mobys/jet_fighter_data/update_player_ship_flight_10.h" -extern float D_L11_001620AC __attribute__((sda)); -extern float D_L11_001620B0 __attribute__((sda)); +extern float l11_jet_fighter_vertical_steering_spring_error_gain __asm__("D_L11_001620AC") + __attribute__((sda)); +extern float l11_jet_fighter_vertical_steering_spring_damping_coefficient __asm__("D_L11_001620B0") + __attribute__((sda)); #include "rnc/overlay/l11/mobys/jet_fighter_data/update_player_ship_flight_9.h" @@ -801,18 +817,24 @@ extern float D_L11_001620FC __attribute__((sda)); #include "rnc/overlay/l11/mobys/jet_fighter_data/update_player_ship_flight_5.h" -extern float D_L11_00162104 __attribute__((sda)); -extern float D_L11_00162108 __attribute__((sda)); +extern float l11_jet_fighter_camera_local_x_spring_error_gain __asm__("D_L11_00162104") + __attribute__((sda)); +extern float l11_jet_fighter_camera_local_x_spring_damping_coefficient __asm__("D_L11_00162108") + __attribute__((sda)); #include "rnc/overlay/l11/mobys/jet_fighter_data/update_player_ship_flight_4.h" -extern float D_L11_00162110 __attribute__((sda)); -extern float D_L11_00162114 __attribute__((sda)); +extern float l11_jet_fighter_camera_local_y_spring_error_gain __asm__("D_L11_00162110") + __attribute__((sda)); +extern float l11_jet_fighter_camera_local_y_spring_damping_coefficient __asm__("D_L11_00162114") + __attribute__((sda)); #include "rnc/overlay/l11/mobys/jet_fighter_data/update_player_ship_flight_3.h" -extern float D_L11_0016211C __attribute__((sda)); -extern float D_L11_00162120 __attribute__((sda)); +extern float l11_jet_fighter_camera_local_z_spring_error_gain __asm__("D_L11_0016211C") + __attribute__((sda)); +extern float l11_jet_fighter_camera_local_z_spring_damping_coefficient __asm__("D_L11_00162120") + __attribute__((sda)); #include "rnc/overlay/l11/mobys/jet_fighter_data/update_player_ship_flight_2.h" @@ -951,14 +973,14 @@ void update_player_ship_flight(struct Moby *ship_moby, ShipVars_2838 *ship_vars) vendor_spring(&ship_vars->f6C, &ship_vars->f90, horizontal_steering_input, - D_L11_0016209C, - D_L11_001620A0, + l11_jet_fighter_horizontal_steering_spring_error_gain, + l11_jet_fighter_horizontal_steering_spring_damping_coefficient, ka); vendor_spring(&ship_vars->f70, &ship_vars->f94, vertical_steering_input, - D_L11_001620AC, - D_L11_001620B0, + l11_jet_fighter_vertical_steering_spring_error_gain, + l11_jet_fighter_vertical_steering_spring_damping_coefficient, kb); spring_angle(&ship_vars->f30, &ship_vars->f98, @@ -1011,20 +1033,20 @@ void update_player_ship_flight(struct Moby *ship_moby, ShipVars_2838 *ship_vars) vendor_spring(&ship_vars->fB4, &ship_vars->fC8, camera_offset_targets.e[ship_vars->sel].v[0], - D_L11_00162104, - D_L11_00162108, + l11_jet_fighter_camera_local_x_spring_error_gain, + l11_jet_fighter_camera_local_x_spring_damping_coefficient, jet_fighter_camera_local_x_snap_threshold_scale_gp); vendor_spring(&ship_vars->fB8, &ship_vars->fCC, camera_offset_targets.e[ship_vars->sel].v[1], - D_L11_00162110, - D_L11_00162114, + l11_jet_fighter_camera_local_y_spring_error_gain, + l11_jet_fighter_camera_local_y_spring_damping_coefficient, jet_fighter_camera_local_y_snap_threshold_scale_gp); vendor_spring(&ship_vars->fBC, &ship_vars->fD0, camera_offset_targets.e[ship_vars->sel].v[2], - D_L11_0016211C, - D_L11_00162120, + l11_jet_fighter_camera_local_z_spring_error_gain, + l11_jet_fighter_camera_local_z_spring_damping_coefficient, jet_fighter_camera_local_z_snap_threshold_scale_gp); camera_local_offset[0] = ship_vars->fB4; camera_local_offset[1] = ship_vars->fB8; @@ -1106,7 +1128,7 @@ void update_player_ship_flight(struct Moby *ship_moby, ShipVars_2838 *ship_vars) -1, 0); ship_moby->visible = 0; - ship_moby->state = 7; + ship_moby->state = JET_FIGHTER_STATE_WAIT_FOR_RESPAWN; ship_moby->flags |= 1; ship_vars->iF8 = scale_game_frames(0x5A); } else { @@ -1159,7 +1181,7 @@ void update_player_ship_flight(struct Moby *ship_moby, ShipVars_2838 *ship_vars) 1, -1, 0); - ship_moby->state = 7; + ship_moby->state = JET_FIGHTER_STATE_WAIT_FOR_RESPAWN; } ship_vars->iDC = D_L11_0016214C; } @@ -1231,16 +1253,6 @@ void jet_fighter_update(struct Moby *moby) __asm__("FUN_L11_00313290"); /* Moby class 1242 */ void jet_fighter_update(struct Moby *moby) { - enum { - JET_FIGHTER_STATE_INITIALIZE = 0, - JET_FIGHTER_STATE_WAIT_FOR_BOARDING = 1, - JET_FIGHTER_STATE_BOARD = 2, - JET_FIGHTER_STATE_FLIGHT = 4, - JET_FIGHTER_STATE_DISMOUNT = 5, - JET_FIGHTER_STATE_WAIT_FOR_RESPAWN = 7, - JET_FIGHTER_STATE_DELAYED_EXIT = 8, - JET_FIGHTER_STATE_INACTIVE = 9 - }; ShipVars_2838 *ship_vars; ShipHit_3290 *hit; W4_2838 ship_velocity_scratch; @@ -1253,9 +1265,11 @@ void jet_fighter_update(struct Moby *moby) { if (moby != 0) { ship_vars = (ShipVars_2838 *)moby->pvars; fast_dec_timer(&ship_vars->iDC); - if (moby->state != 7 && moby->state != 1 && moby->state != 2) { + if (moby->state != JET_FIGHTER_STATE_WAIT_FOR_RESPAWN && + moby->state != JET_FIGHTER_STATE_WAIT_FOR_BOARDING && + moby->state != JET_FIGHTER_STATE_BOARD) { hit = find_moby_hit(moby, 0x30001, 0); - if (hit != 0 && moby->state == 4) { + if (hit != 0 && moby->state == JET_FIGHTER_STATE_FLIGHT) { struct Hero *g = &hero; if (hit->damage < g->ship_hp) { g->ship_hp -= hit->damage; @@ -1285,7 +1299,7 @@ void jet_fighter_update(struct Moby *moby) { build_spherical_offset( ship_velocity_scratch, ship_vars->speed, ship_vars->f38, -ship_vars->f34); g->ship_hp = 0.0f; - moby->state = 7; + moby->state = JET_FIGHTER_STATE_WAIT_FOR_RESPAWN; ship_vars->s62 = 0xB4; g->motion.pos.f[2] += 0.2f; g->moby->collision_disable = 0; @@ -1323,7 +1337,7 @@ void jet_fighter_update(struct Moby *moby) { } switch (moby->state) { case JET_FIGHTER_STATE_INITIALIZE: - moby->state = 1; + moby->state = JET_FIGHTER_STATE_WAIT_FOR_BOARDING; ship_vars->sel = 0; moby->scale = moby->pclass->scale; ship_vars->f20 = ship_vars->f30; @@ -1345,7 +1359,7 @@ void jet_fighter_update(struct Moby *moby) { ship_vars->sE8 = 1; ship_vars->fade = 0.0f; if (moby->mission != 0xFF && D_0014C050[current_level_index][moby->mission] == 0xFF) { - moby->state = 9; + moby->state = JET_FIGHTER_STATE_INACTIVE; moby->collision = 0; moby->flags |= 1; moby->visible = 0; @@ -1369,7 +1383,7 @@ void jet_fighter_update(struct Moby *moby) { } } if (item_available[7] != 0 && (((u32)pad_pressed_lui) & 0x10)) { - moby->state = 2; + moby->state = JET_FIGHTER_STATE_BOARD; ship_vars->i118 = -1; } } else { @@ -1397,7 +1411,7 @@ void jet_fighter_update(struct Moby *moby) { help_request(0x2AFC, 0x55); } g = &hero; - moby->state = 4; + moby->state = JET_FIGHTER_STATE_FLIGHT; g->ship_moby = moby; g->ship_oclass = moby->oclass; g->ship_ammo = l11_jet_fighter_initial_ammo; @@ -1449,10 +1463,10 @@ void jet_fighter_update(struct Moby *moby) { } if (ship_vars->sE8 <= 0) { ship_vars->iF8 = D_L11_00162168; - moby->state = 8; + moby->state = JET_FIGHTER_STATE_DELAYED_EXIT; } if (hero.ship_flags & 1) { - moby->state = 5; + moby->state = JET_FIGHTER_STATE_DISMOUNT; } break; case JET_FIGHTER_STATE_DISMOUNT: { @@ -1488,7 +1502,7 @@ void jet_fighter_update(struct Moby *moby) { } } ship_vars->voice2 = -1; - moby->state = 1; + moby->state = JET_FIGHTER_STATE_WAIT_FOR_BOARDING; ship_vars->fade = 0.99f; D_L11_0015F3FC = 0.99f; break; @@ -1536,7 +1550,7 @@ void jet_fighter_update(struct Moby *moby) { if (moby->mission != 0xFF) { jet_clear_persistent(moby->mission); } - moby->state = 9; + moby->state = JET_FIGHTER_STATE_INACTIVE; } } break; @@ -1567,11 +1581,11 @@ void jet_fighter_update(struct Moby *moby) { if (moby->pos.z > 1008.0f) { moby->pos.z = 1008.0f; } - if (moby->state == 4) { + if (moby->state == JET_FIGHTER_STATE_FLIGHT) { qcopy_nc(&hero.motion.pos, &moby->pos); qcopy_nc(&hero.motion.rot, &ship_vars->f30); } - if (moby->state == 3 || moby->state == 4) { + if (moby->state == 3 || moby->state == JET_FIGHTER_STATE_FLIGHT) { emit_type_74_particles_from_moby_joints(moby, ship_vars); if (voice_is_playing(moby, ship_vars->voice) == 0) { ship_vars->voice = allocate_voice_for_target_entry(0, 4, moby); diff --git a/src/overlays/l11/mobys/lamp.c b/src/overlays/l11/mobys/lamp.c index 4a53295af6..fc31cecff9 100644 --- a/src/overlays/l11/mobys/lamp.c +++ b/src/overlays/l11/mobys/lamp.c @@ -24,13 +24,13 @@ void lamp_update(struct Moby *lamp_moby) { char *hit_result = find_moby_hit(lamp_moby, 0x10000, 0); switch (lamp_moby->state) { case LAMP_STATE_INITIALIZE: - lamp_moby->state = 1; + lamp_moby->state = LAMP_STATE_WAIT_FOR_HIT; break; case LAMP_STATE_WAIT_FOR_HIT: if (hit_result != 0 && *(float *)(hit_result + 0x2C) > 0.0f) hit = 1; if (hit) - lamp_moby->state = 2; + lamp_moby->state = LAMP_STATE_REMOVE; break; case LAMP_STATE_REMOVE: allocate_voice_for_target_entry(0, 0, (int)lamp_moby); diff --git a/src/overlays/l11/mobys/layered_scroll_effect.c b/src/overlays/l11/mobys/layered_scroll_effect.c index 0c68fd89af..0814bc3189 100644 --- a/src/overlays/l11/mobys/layered_scroll_effect.c +++ b/src/overlays/l11/mobys/layered_scroll_effect.c @@ -997,7 +997,7 @@ void layered_scroll_effect_update(struct Moby *moby) { 1); layered_effect_color_tables_initialized_gp = 1; } - moby->state = 1; + moby->state = EFFECT_UPDATE_AND_QUEUE_DRAW; for (i = 0; i < 3; i++) { D_L11_001FF750[i].a = 0; D_L11_001FF750[i].b = 0; diff --git a/src/overlays/l11/mobys/link_triggered_moby_motion.c b/src/overlays/l11/mobys/link_triggered_moby_motion.c index 5fef2a6ccb..83de84ea61 100644 --- a/src/overlays/l11/mobys/link_triggered_moby_motion.c +++ b/src/overlays/l11/mobys/link_triggered_moby_motion.c @@ -69,7 +69,7 @@ void link_triggered_moby_motion_update(struct Moby *moving_moby) { moving_moby->scale = source_moby_class->scale * private_data->unkC; spawned_moby->scale = source_moby_class->scale * private_data->unkC; spawned_moby->state = 1; - moving_moby->state = 1; + moving_moby->state = LINKED_MOTION_STATE_WAIT_FOR_LINK_TRIGGER; break; case LINKED_MOTION_STATE_WAIT_FOR_LINK_TRIGGER: linked_moby = (struct Moby *)((private_data->unk8 << 8) + (int)D_L11_0015FFD8); @@ -78,7 +78,7 @@ void link_triggered_moby_motion_update(struct Moby *moving_moby) { } if (linked_moby->oclass == 0x33E && linked_moby->command != 0) { go: - moving_moby->state = 2; + moving_moby->state = LINKED_MOTION_STATE_MOVE_ALONG_LOCAL_AXIS; ((Rec57 *)(private_data->unk14 + (int)(alternate_item_available)))->f57 = 1; allocate_voice_for_target_entry(0, 0, moving_moby); } diff --git a/src/overlays/l11/mobys/link_triggered_moby_turn.c b/src/overlays/l11/mobys/link_triggered_moby_turn.c index 1f25bb6d1e..939c29019a 100644 --- a/src/overlays/l11/mobys/link_triggered_moby_turn.c +++ b/src/overlays/l11/mobys/link_triggered_moby_turn.c @@ -28,6 +28,9 @@ void link_triggered_moby_turn_update(struct Moby *turning_moby) { LINKED_TURN_STATE_WAIT_FOR_LINK = 1, LINKED_TURN_STATE_ROTATE_TO_TARGET = 2 }; + enum { + LINKED_TURN_STATE_COMPLETE = 3 + }; int entry_state = turning_moby->state; float *private_data = (float *)turning_moby->pvars; float target_angle; @@ -35,17 +38,17 @@ void link_triggered_moby_turn_update(struct Moby *turning_moby) { switch (entry_state) { case LINKED_TURN_STATE_INITIALIZE: turning_moby->update_dist = 0xFF; - turning_moby->state = 1; + turning_moby->state = LINKED_TURN_STATE_WAIT_FOR_LINK; private_data[2] = turning_moby->rot.z; break; case LINKED_TURN_STATE_WAIT_FOR_LINK: if (test_linked_moby_turn_trigger(D_L11_0015FFD8_t + (*(int *)private_data << 8))) { if (level_frame >= 11) { D_0013D3E3_t[0] = entry_state; - turning_moby->state = 2; + turning_moby->state = LINKED_TURN_STATE_ROTATE_TO_TARGET; allocate_voice_for_target_entry(0, 0, turning_moby); } else { - turning_moby->state = 3; + turning_moby->state = LINKED_TURN_STATE_COMPLETE; turning_moby->rot.z = fast_add_rotations(private_data[2], 1.0471976f); } } @@ -59,7 +62,7 @@ void link_triggered_moby_turn_update(struct Moby *turning_moby) { turn_acceleration_step, turn_acceleration_step, frame_time * 0.7853982f) == 0.0f) { - turning_moby->state = 3; + turning_moby->state = LINKED_TURN_STATE_COMPLETE; } break; } diff --git a/src/overlays/l11/mobys/oil_tanker_front.c b/src/overlays/l11/mobys/oil_tanker_front.c index 77c5e146bf..5bd6c11a68 100644 --- a/src/overlays/l11/mobys/oil_tanker_front.c +++ b/src/overlays/l11/mobys/oil_tanker_front.c @@ -95,7 +95,7 @@ void oil_tanker_front_update(struct Moby *moby) { chain_vars->sound = -1; chain_vars->point = 0; chain_vars->t = 0.0f; - moby->state = 1; + moby->state = OIL_TANKER_WAIT_FOR_CAMERA_MODE; for (i = 0; i < 8; i++) { struct Moby *link; chain_vars->links[i] = create_moby(0x4F1); @@ -117,7 +117,7 @@ void oil_tanker_front_update(struct Moby *moby) { if (camera_secondary_mode[0] == 0x32) { int i; - moby->state = 2; + moby->state = OIL_TANKER_FOLLOW_PATH_WITH_DAMAGE; chain_vars->path = (char *)l11_paths[chain_vars->path_index]; chain_vars->point = 0; for (i = 0; i < 8; i++) { @@ -143,7 +143,7 @@ void oil_tanker_front_update(struct Moby *moby) { } update_oil_tanker_front_path_pose(moby); update_oil_tanker_link_path_poses(moby); - if (moby->state == 2) { + if (moby->state == OIL_TANKER_FOLLOW_PATH_WITH_DAMAGE) { process_oil_tanker_damage_and_destruction(moby); } if (voice_is_playing(moby, chain_vars->sound) == 0) { @@ -472,8 +472,11 @@ void distribute_group_blarg_ships_along_path(struct Moby *moby, int table_index) /* Ported from rac1-decomp (src/overlays/l11_pokitaru/vendor_00312BD8.c: func_L11_003198F8), where it is exact; names translated to the US level program. */ void start_oil_tanker_link_destruction(struct Moby *link_moby) { + enum { + OIL_TANKER_LINK_DESTRUCTION = 1 + }; char *link_vars = (char *)link_moby->pvars; - link_moby->state = 1; + link_moby->state = OIL_TANKER_LINK_DESTRUCTION; link_moby->collision = 0; fast_vec_sub(link_vars + 0x10, &link_moby->pos, link_vars); *(float *)(link_vars + 0x20) = diff --git a/src/overlays/l11/mobys/oil_tanker_link.c b/src/overlays/l11/mobys/oil_tanker_link.c index fb885ebe65..28fbbd104b 100644 --- a/src/overlays/l11/mobys/oil_tanker_link.c +++ b/src/overlays/l11/mobys/oil_tanker_link.c @@ -60,6 +60,9 @@ void oil_tanker_link_update(struct Moby *moby) { TANKER_LINK_EMIT_EFFECT_AND_SAVE_POSITION = 0, TANKER_LINK_BURST_AND_HIDE = 1 }; + enum { + TANKER_LINK_HIDDEN_AFTER_BURST = 2 + }; char *link_vars = (char *)moby->pvars; float effect_scratch_vector[4]; float effect_motion_vector[4]; @@ -131,7 +134,7 @@ void oil_tanker_link_update(struct Moby *moby) { dv, frame_time_sq * 12.0f, dv); - moby->state = 2; + moby->state = TANKER_LINK_HIDDEN_AFTER_BURST; moby->visible = 0; moby->flags |= 1; break; diff --git a/src/overlays/l11/mobys/owner_linked_moby.c b/src/overlays/l11/mobys/owner_linked_moby.c index 44e08b6c0d..7ab4c9ce38 100644 --- a/src/overlays/l11/mobys/owner_linked_moby.c +++ b/src/overlays/l11/mobys/owner_linked_moby.c @@ -10,6 +10,14 @@ #include "rnc/mobys/animation/blend_moby_animation.h" /* Runs the moby's hit timer: on a hit it either finishes the stun or counts it down and plays the hurt animation. */ +enum { + LINKED_MOBY_STATE_START_ANIMATION = 0, + LINKED_MOBY_STATE_WAIT_FOR_ANIMATION_FLAG = 1, + LINKED_MOBY_STATE_HANDLE_HITS = 2, + LINKED_MOBY_STATE_FADE_OUT = 3, + LINKED_MOBY_STATE_REMOVE = 4 +}; + extern char *find_moby_hit(void *, int, int) __asm__("FUN_L00_0025a420"); extern int fptodp(float) __asm__("FUN_00120478"); extern void print_fe50(char *, int, int) __asm__("FUN_001e93b0"); @@ -36,9 +44,12 @@ void handle_owner_linked_moby_hits(struct Moby *moby, unsigned char *private_dat HIT_REACTION_KNOCKBACK_AND_CANCEL_PROJECTILE = 4, HIT_REACTION_NO_RESPONSE = 11 }; + enum { + HIT_STATUS_DAMAGE_PROCESSING_THRESHOLD = 2 + }; int hit_status; char *hit_record; - if (moby->state != 4) { + if (moby->state != LINKED_MOBY_STATE_REMOVE) { hit_record = find_moby_hit(moby, 0x330000, 0); if (hit_record != 0) { print_fe50(D_L11_0021B530, moby->oclass, fptodp(*(float *)(hit_record + 0x2C))); @@ -54,7 +65,7 @@ void handle_owner_linked_moby_hits(struct Moby *moby, unsigned char *private_dat case HIT_REACTION_NO_RESPONSE: break; } - if (hit_status >= 2) { + if (hit_status >= HIT_STATUS_DAMAGE_PROCESSING_THRESHOLD) { if (*health <= *(float *)(hit_record + 0x2C)) { unsigned char *owner_moby; *health = 0.0f; @@ -68,7 +79,7 @@ void handle_owner_linked_moby_hits(struct Moby *moby, unsigned char *private_dat if (owner_moby != 0 && owner_moby[0x20] != 0xFE && owner_moby[0x20] != 0xFD) { owner_moby[0x20] = 3; } - moby->state = 3; + moby->state = LINKED_MOBY_STATE_FADE_OUT; } else { *health -= *(float *)(hit_record + 0x2C); private_data[0x67] = 0xFA; @@ -96,18 +107,15 @@ typedef struct OwnerLinkedMobyVars { /* Moby class 1219 */ void owner_linked_moby_update(struct Moby *moby) { enum { - LINKED_MOBY_STATE_START_ANIMATION = 0, - LINKED_MOBY_STATE_WAIT_FOR_ANIMATION_FLAG = 1, - LINKED_MOBY_STATE_HANDLE_HITS = 2, - LINKED_MOBY_STATE_FADE_OUT = 3, - LINKED_MOBY_STATE_REMOVE = 4 + MOBY_STATE_MARKED_FOR_REMOVAL = 0xFE }; OwnerLinkedMobyVars *owner_linked_moby_vars = (OwnerLinkedMobyVars *)moby->pvars; char *health_ptr = &owner_linked_moby_vars->unk20; struct Moby *owner_moby = owner_linked_moby_vars->unk70; - if (owner_moby == 0 || owner_moby->state == 0xFE || owner_moby->state == 0xFD) { - if (moby->state < 3) { - moby->state = 4; + if (owner_moby == 0 || owner_moby->state == MOBY_STATE_MARKED_FOR_REMOVAL || + owner_moby->state == 0xFD) { + if (moby->state < LINKED_MOBY_STATE_FADE_OUT) { + moby->state = LINKED_MOBY_STATE_REMOVE; } } switch (moby->state) { @@ -115,12 +123,12 @@ void owner_linked_moby_update(struct Moby *moby) { if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, 0xF); } - moby->state = 1; + moby->state = LINKED_MOBY_STATE_WAIT_FOR_ANIMATION_FLAG; break; case LINKED_MOBY_STATE_WAIT_FOR_ANIMATION_FLAG: if (moby->anim_flags & 2) { moby->hit_slot = 0xFF; - moby->state = 2; + moby->state = LINKED_MOBY_STATE_HANDLE_HITS; } break; case LINKED_MOBY_STATE_HANDLE_HITS: @@ -134,7 +142,7 @@ void owner_linked_moby_update(struct Moby *moby) { moby->alpha--; } if (compute_interpolated_record_value(moby) > 13.5f) { - moby->state = 4; + moby->state = LINKED_MOBY_STATE_REMOVE; } break; case LINKED_MOBY_STATE_REMOVE: diff --git a/src/overlays/l11/mobys/pokitaru_boat.c b/src/overlays/l11/mobys/pokitaru_boat.c index cc06c2e0cc..c70c48642a 100644 --- a/src/overlays/l11/mobys/pokitaru_boat.c +++ b/src/overlays/l11/mobys/pokitaru_boat.c @@ -23,6 +23,15 @@ #include "rnc/camera/follow_cam.h" #include "rnc/math/random.h" +enum { + POKITARU_BOAT_INITIALIZE = 0, + POKITARU_BOAT_WAIT_FOR_ACTIVATION = 1, + POKITARU_BOAT_FOLLOW_PATH = 2, + POKITARU_BOAT_WAIT_FOR_GROUP_CLEAR = 3, + POKITARU_BOAT_RISE_ABOVE_PATH = 4, + POKITARU_BOAT_ADJUST_HEIGHT_FOR_HERO = 5 +}; + extern float approach_angle(float *p, float a, float *v, float b, float c, float d) __asm__("FUN_L00_0025be00"); extern float random_float_between(float, float) __asm__("FUN_002132a8"); @@ -90,14 +99,6 @@ void pokitaru_boat_update(struct Moby *moby) __asm__("FUN_L11_00309ac0"); /* Moby class 1075 */ void pokitaru_boat_update(struct Moby *moby) { - enum { - POKITARU_BOAT_INITIALIZE = 0, - POKITARU_BOAT_WAIT_FOR_ACTIVATION = 1, - POKITARU_BOAT_FOLLOW_PATH = 2, - POKITARU_BOAT_WAIT_FOR_GROUP_CLEAR = 3, - POKITARU_BOAT_RISE_ABOVE_PATH = 4, - POKITARU_BOAT_ADJUST_HEIGHT_FOR_HERO = 5 - }; struct PokPv *boat_vars = (struct PokPv *)moby->pvars; float start_pos[4]; float start_rot[4]; @@ -110,7 +111,7 @@ void pokitaru_boat_update(struct Moby *moby) { qcopy(start_pos, &moby->pos); qcopy(start_rot, &moby->rot); - if (moby->state != 0) { + if (moby->state != POKITARU_BOAT_INITIALIZE) { moby->pos.z = boat_vars->height_e4; } update_pokitaru_boat_joint_effects(moby); @@ -138,7 +139,7 @@ void pokitaru_boat_update(struct Moby *moby) { boat_vars->path_c4 = path; qcopy(&moby->pos, (char *)path + 0x10); boat_vars->seg_d4 = 1; - moby->state = 1; + moby->state = POKITARU_BOAT_WAIT_FOR_ACTIVATION; for (part_angle_index = 0; part_angle_index < 4; part_angle_index++) { boat_vars->wobble_f0[part_angle_index] = random_angle_radians(); } @@ -158,7 +159,7 @@ void pokitaru_boat_update(struct Moby *moby) { qcopy(&moby->pos, (char *)path + n * 16 - 16); last = (float *)((char *)path + (n - 1) * 16); moby->rot.z = fast_arc_tan(last[4] - moby->pos.x, last[5] - moby->pos.y); - moby->state = 5; + moby->state = POKITARU_BOAT_ADJUST_HEIGHT_FOR_HERO; } break; case POKITARU_BOAT_FOLLOW_PATH: { @@ -229,7 +230,7 @@ void pokitaru_boat_update(struct Moby *moby) { } boat_vars->slot_c8 = -1; } - moby->state = 3; + moby->state = POKITARU_BOAT_WAIT_FOR_GROUP_CLEAR; } approach_angle(&moby->rot.z, fast_arc_tan(target[0] - moby->pos.x, target[1] - moby->pos.y), @@ -255,9 +256,9 @@ void pokitaru_boat_update(struct Moby *moby) { if (is_pokitaru_boat_target_group_clear(moby) != 0) { if (boat_vars->flag_b0 != 0) { boat_vars->approach_d0 = 0.0f; - moby->state = 4; + moby->state = POKITARU_BOAT_RISE_ABOVE_PATH; } else { - moby->state = 5; + moby->state = POKITARU_BOAT_ADJUST_HEIGHT_FOR_HERO; } } break; @@ -270,7 +271,7 @@ void pokitaru_boat_update(struct Moby *moby) { frame_time_sq, frame_time); if (target[2] + 5.9f <= moby->pos.z) { - moby->state = 5; + moby->state = POKITARU_BOAT_ADJUST_HEIGHT_FOR_HERO; } break; case POKITARU_BOAT_ADJUST_HEIGHT_FOR_HERO: @@ -313,7 +314,7 @@ void pokitaru_boat_update(struct Moby *moby) { update_entity_matrix(boat_vars->ctl60, delta, start_rot, &moby->rot); } -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern void FUN_L00_0026f080(float *, float *, float, float); struct PartA500 { @@ -347,29 +348,29 @@ void update_pokitaru_boat_joint_effects(struct Moby *moby) { if (!((u8 *)moby_vars)[i * 0x40 + 0x101]) attach_manipulator(moby, i, &moby_vars->parts[i]); step = frame_time * 12.217304f; - if (moby->state == 1) + if (moby->state == POKITARU_BOAT_WAIT_FOR_ACTIVATION) step = frame_time * 2.6179938f; if (((u8 *)moby_vars)[i * 0x40 + 0x101]) { moby_vars->angle[i] = fast_add_rotations(moby_vars->angle[i], step); - FUN_L00_001fff28(moby_vars->parts[i].joint, 0, moby_vars->angle[i]); + build_axis_rotation_quaternion(moby_vars->parts[i].joint, 0, moby_vars->angle[i]); } } if (vector_distance_xy(&moby->pos, camera_pos_b358) > 38.0f) return; - if (moby->state == 1 && (level_frame & 1)) + if (moby->state == POKITARU_BOAT_WAIT_FOR_ACTIVATION && (level_frame & 1)) return; if (!(moby->pos.z < 224.5f)) return; for (j = 0; j < 4; j++) { moby_point_position(moby, j, joint_world_position); - iterations_per_joint = moby->state == 1 ? 1 : 2; + iterations_per_joint = moby->state == POKITARU_BOAT_WAIT_FOR_ACTIVATION ? 1 : 2; for (k = 0; k < iterations_per_joint; k++) { pos[0] = joint_world_position[0] + randf_sym(0.0f, 0.3f); pos[1] = joint_world_position[1] + randf_sym(0.0f, 0.3f); pos[2] = joint_world_position[2] + randf_sym(0.0f, 0.3f); heading = fast_add_rotations(moby->rot.z, randf_sym(0.0f, 0.122173049f) + 3.1415927f); speed = random_float_between(2.0f, 5.0f) * frame_time; - if (moby->state == 1) + if (moby->state == POKITARU_BOAT_WAIT_FOR_ACTIVATION) speed *= 0.4f; initial_velocity[0] = fast_cos(heading) * speed; initial_velocity[1] = fast_sin(heading) * speed; diff --git a/src/overlays/l11/mobys/pokitaru_paired_rotation.c b/src/overlays/l11/mobys/pokitaru_paired_rotation.c index dfe5ab5f3c..000b1b636b 100644 --- a/src/overlays/l11/mobys/pokitaru_paired_rotation.c +++ b/src/overlays/l11/mobys/pokitaru_paired_rotation.c @@ -24,11 +24,14 @@ void pokitaru_paired_rotation_update(struct Moby *moby) { ROTATION_WAIT_FOR_TRIGGER = 1, ROTATION_APPROACH_OFFSET = 2 }; + enum { + ROTATION_OFFSET_REACHED = 3 + }; char *paired_rotation_vars = (char *)moby->pvars; int state = (unsigned char)MOBY(moby)->state; switch (state) { case ROTATION_INITIALIZE: - MOBY(moby)->state = 1; + MOBY(moby)->state = ROTATION_WAIT_FOR_TRIGGER; *(float *)(paired_rotation_vars + 4) = moby->rot.z; if ((moby->flags & 0x8000) == 0) { char *partner_moby = create_moby(0x41); @@ -56,7 +59,7 @@ void pokitaru_paired_rotation_update(struct Moby *moby) { frame_time_sq * 0.34906584f, frame_time_sq * 0.34906584f, frame_time * 0.7853982f) == 0.0f) - MOBY(moby)->state = 3; + MOBY(moby)->state = ROTATION_OFFSET_REACHED; break; } } diff --git a/src/overlays/l11/mobys/pokitaru_pickup.c b/src/overlays/l11/mobys/pokitaru_pickup.c index 6eac5d3371..99bcf8ffd1 100644 --- a/src/overlays/l11/mobys/pokitaru_pickup.c +++ b/src/overlays/l11/mobys/pokitaru_pickup.c @@ -32,7 +32,7 @@ void pokitaru_pickup_update(struct Moby *moby) { } else { moby->pos.z += 0.75f; moby->flags |= 1; - moby->state = 1; + moby->state = PICKUP_IDLE; } break; case PICKUP_IDLE: diff --git a/src/overlays/l11/mobys/psytcopus.c b/src/overlays/l11/mobys/psytcopus.c index 8ab387ffe7..928b42357c 100644 --- a/src/overlays/l11/mobys/psytcopus.c +++ b/src/overlays/l11/mobys/psytcopus.c @@ -11,6 +11,16 @@ #include "rnc/mobys/moby_spawn.h" #include "rnc/mobys/animation/blend_moby_animation.h" +enum { + PSYTCOPUS_STATE_INITIALIZE = 0, + PSYTCOPUS_STATE_FACE_PLAYER = 3, + PSYTCOPUS_STATE_CREATE_PROJECTILE = 4, + PSYTCOPUS_STATE_FIRE_PROJECTILE = 5, + PSYTCOPUS_STATE_ATTACK_RECOVERY = 6, + PSYTCOPUS_STATE_KNOCKBACK = 7, + PSYTCOPUS_STATE_DEATH_KNOCKBACK = 8 +}; + extern float approach_angle(float *p, float a, float *v, float b, float c, float d) __asm__("FUN_L00_0025be00"); extern char *find_moby_hit(void *, int, int) __asm__("FUN_L00_0025a420"); @@ -109,15 +119,6 @@ void psytcopus_update(struct Moby *m) __asm__("FUN_L11_00310180"); /* Moby class 1231 */ void psytcopus_update(struct Moby *psytcopus) { - enum { - PSYTCOPUS_STATE_INITIALIZE = 0, - PSYTCOPUS_STATE_FACE_PLAYER = 3, - PSYTCOPUS_STATE_CREATE_PROJECTILE = 4, - PSYTCOPUS_STATE_FIRE_PROJECTILE = 5, - PSYTCOPUS_STATE_ATTACK_RECOVERY = 6, - PSYTCOPUS_STATE_KNOCKBACK = 7, - PSYTCOPUS_STATE_DEATH_KNOCKBACK = 8 - }; struct PokiPathVars *psytcopus_vars = (struct PokiPathVars *)psytcopus->pvars; struct Moby *target; Vec4f projectile_vector_scratch; @@ -140,7 +141,7 @@ void psytcopus_update(struct Moby *psytcopus) { psytcopus_vars->unk2A = 6; psytcopus_vars->unk58 = truncate_float_to_s32(8.0f); psytcopus_vars->unk5A = truncate_float_to_s32(8.0f); - psytcopus->state = 3; + psytcopus->state = PSYTCOPUS_STATE_FACE_PLAYER; if (psytcopus->prev_seq != 0) { blend_moby_animation(psytcopus, 0, 0, scale_game_frames(10)); } @@ -149,7 +150,7 @@ void psytcopus_update(struct Moby *psytcopus) { qcopy(&psytcopus->pos, (char *)(s32 *)l11_paths[psytcopus_vars->unk134] + 0x10); break; } - psytcopus->state = 3; + psytcopus->state = PSYTCOPUS_STATE_FACE_PLAYER; if (psytcopus->prev_seq != 0) { blend_moby_animation(psytcopus, 0, 0, scale_game_frames(10)); } @@ -166,7 +167,7 @@ void psytcopus_update(struct Moby *psytcopus) { frame_time * 6.2831855f); } if (psytcopus_vars->unk114 != 2) { - psytcopus->state = 4; + psytcopus->state = PSYTCOPUS_STATE_CREATE_PROJECTILE; if (psytcopus->prev_seq != 2) { blend_moby_animation(psytcopus, 2, 0, scale_game_frames(10)); } @@ -193,7 +194,7 @@ void psytcopus_update(struct Moby *psytcopus) { break; } if (psytcopus->anim_flags & 2) { - psytcopus->state = 5; + psytcopus->state = PSYTCOPUS_STATE_FIRE_PROJECTILE; if (psytcopus->prev_seq != 3) { blend_moby_animation(psytcopus, 3, 0, scale_game_frames(10)); } @@ -217,7 +218,7 @@ void psytcopus_update(struct Moby *psytcopus) { psytcopus_vars->unk160 = 0; } if (psytcopus->anim_flags & 2) { - psytcopus->state = 6; + psytcopus->state = PSYTCOPUS_STATE_ATTACK_RECOVERY; if (psytcopus->prev_seq != 4) { blend_moby_animation(psytcopus, 4, 0, scale_game_frames(10)); } @@ -225,7 +226,7 @@ void psytcopus_update(struct Moby *psytcopus) { break; case PSYTCOPUS_STATE_ATTACK_RECOVERY: if (psytcopus->anim_flags & 2) { - psytcopus->state = 3; + psytcopus->state = PSYTCOPUS_STATE_FACE_PLAYER; if (psytcopus->prev_seq != 0) { blend_moby_animation(psytcopus, 0, 0, scale_game_frames(10)); } @@ -236,7 +237,7 @@ void psytcopus_update(struct Moby *psytcopus) { if (knockback_result_flags & 0x41) { path = (s32 *)l11_paths[psytcopus_vars->unk13C]; if (FUN_L00_00259740_p(&psytcopus->pos, path + 4, *path) != 0) { - psytcopus->state = 3; + psytcopus->state = PSYTCOPUS_STATE_FACE_PLAYER; if (psytcopus->prev_seq != 0) { blend_moby_animation(psytcopus, 0, 0, scale_game_frames(10)); } @@ -304,7 +305,7 @@ void handle_psytcopus_hits(struct Moby *psytcopus) { psytcopus_hit_record = find_moby_hit(psytcopus, 0x330000, 0); hit_reaction = resolve_moby_hit_response( psytcopus, psytcopus_hit_record, &psytcopus_vars->health, 0, &hits, &damage, 0, 4); - if (hits != 1 && psytcopus->state != 8) { + if (hits != 1 && psytcopus->state != PSYTCOPUS_STATE_DEATH_KNOCKBACK) { psytcopus_vars->health -= damage; if (psytcopus_vars->health <= 0.0f) { hit_reaction = 1; @@ -343,7 +344,7 @@ void handle_psytcopus_hits(struct Moby *psytcopus) { &psytcopus_vars->unk88, &psytcopus_vars->unk8C); FUN_L00_0025c558_p(psytcopus, psytcopus_vars->unk70, 5, 1, 0, angle1); - psytcopus->state = 7; + psytcopus->state = PSYTCOPUS_STATE_KNOCKBACK; psytcopus_vars->unk67 = 0x78; if (psytcopus_vars->unk160 != 0) { FUN_L00_002371e0_p(psytcopus_vars->unk160); @@ -369,7 +370,7 @@ void handle_psytcopus_hits(struct Moby *psytcopus) { &psytcopus_vars->unk88, &psytcopus_vars->unk8C); FUN_L00_0025c558_p(psytcopus, psytcopus_vars->unk70, 6, 1, 0, angle2); - psytcopus->state = 8; + psytcopus->state = PSYTCOPUS_STATE_DEATH_KNOCKBACK; psytcopus_vars->unk67 = 0xF0; if (psytcopus_vars->unk160 != 0) { FUN_L00_002371e0_p(psytcopus_vars->unk160); diff --git a/src/overlays/l11/mobys/puffoid.c b/src/overlays/l11/mobys/puffoid.c index d28af0c774..d1a715d5e2 100644 --- a/src/overlays/l11/mobys/puffoid.c +++ b/src/overlays/l11/mobys/puffoid.c @@ -22,6 +22,30 @@ #include "rnc/overlay/shared/math/interpolation/compute_directed_angle_delta.h" /* pvars of the class 0x4DE creature run by puffoid_update. */ +enum { + PUFFOID_STATE_INITIALIZE = 0, + PUFFOID_STATE_WAIT_FOR_HOME_JUMP = 1, + PUFFOID_STATE_IDLE = 2, + PUFFOID_STATE_WANDER_NEAR_HOME = 3, + PUFFOID_STATE_CHASE_TARGET = 4, + PUFFOID_STATE_SPRAY_ATTACK = 5, + PUFFOID_STATE_RETURN_HOME = 6, + PUFFOID_STATE_JUMP_HOME = 7, + PUFFOID_STATE_JUMP_THEN_WAIT_FOR_HOME_JUMP = 8, + PUFFOID_STATE_KNOCKBACK = 9, + PUFFOID_STATE_REPOSITION_AND_FACE_TARGET = 10, + PUFFOID_STATE_DEATH_KNOCKBACK = 11, + PUFFOID_STATE_WAIT_FOR_CARRIER_JUMP = 12, + PUFFOID_STATE_CARRIER_JUMP = 13, + PUFFOID_STATE_CARRIER_IDLE = 14, + PUFFOID_STATE_CARRIER_CHASE_TARGET = 15, + PUFFOID_STATE_CARRIER_SPRAY_ATTACK = 16, + PUFFOID_STATE_CARRIER_KNOCKBACK = 17, + PUFFOID_STATE_CARRIER_DEATH_KNOCKBACK = 18, + PUFFOID_STATE_FOLLOW_PATH = 19, + PUFFOID_STATE_WAIT_TO_RESUME_COMMAND = 20 +}; + typedef struct { u8 pad00[0x20]; f32 unk20; /* 0x20 */ @@ -81,7 +105,7 @@ extern float D_L11_001622CC __attribute__((sda)); #include "rnc/overlay/l11/mobys/puffoid_data/puffoid_update.h" -extern float D_L11_001622F0 __attribute__((sda)); +extern float l11_puffoid_jump_gravity __asm__("D_L11_001622F0") __attribute__((sda)); extern void update_puffoid_damage_and_path_goal(struct Moby *) __asm__("FUN_L11_00315968"); extern void update_moby_target_heading_and_conditional_movement( char *moby, float *target_position) __asm__("FUN_L11_00315f58"); @@ -108,41 +132,22 @@ void puffoid_update(struct Moby *moby) __asm__("FUN_L11_00314318"); /* Moby class 1246 */ void puffoid_update(struct Moby *moby) { - enum { - PUFFOID_STATE_INITIALIZE = 0, - PUFFOID_STATE_WAIT_FOR_HOME_JUMP = 1, - PUFFOID_STATE_IDLE = 2, - PUFFOID_STATE_WANDER_NEAR_HOME = 3, - PUFFOID_STATE_CHASE_TARGET = 4, - PUFFOID_STATE_SPRAY_ATTACK = 5, - PUFFOID_STATE_RETURN_HOME = 6, - PUFFOID_STATE_JUMP_HOME = 7, - PUFFOID_STATE_JUMP_THEN_WAIT_FOR_HOME_JUMP = 8, - PUFFOID_STATE_KNOCKBACK = 9, - PUFFOID_STATE_REPOSITION_AND_FACE_TARGET = 10, - PUFFOID_STATE_DEATH_KNOCKBACK = 11, - PUFFOID_STATE_WAIT_FOR_CARRIER_JUMP = 12, - PUFFOID_STATE_CARRIER_JUMP = 13, - PUFFOID_STATE_CARRIER_IDLE = 14, - PUFFOID_STATE_CARRIER_CHASE_TARGET = 15, - PUFFOID_STATE_CARRIER_SPRAY_ATTACK = 16, - PUFFOID_STATE_CARRIER_KNOCKBACK = 17, - PUFFOID_STATE_CARRIER_DEATH_KNOCKBACK = 18, - PUFFOID_STATE_FOLLOW_PATH = 19, - PUFFOID_STATE_WAIT_TO_RESUME_COMMAND = 20 - }; enum { PUFFOID_PATH_ANIM_TRAVEL = 4, PUFFOID_PATH_ANIM_ENTER_SPRAY_ATTACK = 5, PUFFOID_PATH_ANIM_SPRAY_ATTACK = 6, PUFFOID_PATH_ANIM_EXIT_SPRAY_ATTACK = 7 }; + enum { + PUFFOID_START_MODE_WAIT_FOR_HOME_JUMP = 1, + PUFFOID_START_MODE_FOLLOW_PATH = 2 + }; CreatureVars_4318 *puffoid_vars = (CreatureVars_4318 *)moby->pvars; struct Moby *target; float pos[4]; int i; - if (moby->state != 0x14) { + if (moby->state != PUFFOID_STATE_WAIT_TO_RESUME_COMMAND) { puffoid_vars->unkC8 = 0; update_puffoid_damage_and_path_goal(moby); } @@ -171,27 +176,27 @@ void puffoid_update(struct Moby *moby) { if (rand() & 1) { moby->flags |= 0x8000; } - if (puffoid_vars->mode == 2) { - moby->state = 0x13; + if (puffoid_vars->mode == PUFFOID_START_MODE_FOLLOW_PATH) { + moby->state = PUFFOID_STATE_FOLLOW_PATH; if (moby->prev_seq != 4) { blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } qcopy(&moby->pos, (char *)l11_paths[puffoid_vars->path] + 0x10); puffoid_vars->point = 1; - } else if (puffoid_vars->mode == 1) { - moby->state = 1; + } else if (puffoid_vars->mode == PUFFOID_START_MODE_WAIT_FOR_HOME_JUMP) { + moby->state = PUFFOID_STATE_WAIT_FOR_HOME_JUMP; qcopy(&moby->pos, (char *)l11_paths[puffoid_vars->path] + 0x10); moby->pos.z -= 1.0f; qcopy(puffoid_vars->home, (char *)l11_paths[puffoid_vars->path] + 0x20); } else if (puffoid_vars->carrier >= 0) { - moby->state = 0xC; + moby->state = PUFFOID_STATE_WAIT_FOR_CARRIER_JUMP; puffoid_vars->unk258 = random_float_between(-3.0f, 3.0f); moby->visible = 0; moby->collision = 0; moby->flags |= 1; } else { moby->pos.z = FUN_L00_00259710(&moby->pos); - moby->state = 2; + moby->state = PUFFOID_STATE_IDLE; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 5); } @@ -200,16 +205,16 @@ void puffoid_update(struct Moby *moby) { break; case PUFFOID_STATE_WAIT_FOR_HOME_JUMP: { char *path = (char *)l11_paths[puffoid_vars->path]; - float ang = fast_arc_tan(*(float *)(path + 0x20) - moby->pos.x, - *(float *)(path + 0x24) - moby->pos.y); + float home_jump_heading = fast_arc_tan(*(float *)(path + 0x20) - moby->pos.x, + *(float *)(path + 0x24) - moby->pos.y); approach_angle(&moby->rot.z, &puffoid_vars->unk250, - ang, + home_jump_heading, frame_time_sq * 8.726646f, frame_time_sq * 8.726646f, frame_time * 12.566371f); if (puffoid_vars->unk214 != 2 && random_integer_below(9) == 0) { - moby->state = 7; + moby->state = PUFFOID_STATE_JUMP_HOME; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 5); } @@ -222,25 +227,25 @@ void puffoid_update(struct Moby *moby) { (char *)l11_paths[puffoid_vars->path] + 0x20, 0, puffoid_jump_horizontal_speed_gp * frame_time, - -(D_L11_001622F0 * frame_time_sq)); + -(l11_puffoid_jump_gravity * frame_time_sq)); } break; } case PUFFOID_STATE_JUMP_HOME: case PUFFOID_STATE_JUMP_THEN_WAIT_FOR_HOME_JUMP: fast_vec_add(&moby->pos, &moby->pos, puffoid_vars->vel); - puffoid_vars->vel[2] -= D_L11_001622F0 * frame_time_sq; + puffoid_vars->vel[2] -= l11_puffoid_jump_gravity * frame_time_sq; if (puffoid_vars->vel[2] < 0.0f) { float h; qcopy(pos, &moby->pos); pos[2] += 1.0f; h = probe_ground_height(pos, 0, 0.5f); if (moby->pos.z < h) { - if (moby->state == 7) { + if (moby->state == PUFFOID_STATE_JUMP_HOME) { moby->pos.z = h; - moby->state = 2; + moby->state = PUFFOID_STATE_IDLE; } else { - moby->state = 1; + moby->state = PUFFOID_STATE_WAIT_FOR_HOME_JUMP; moby->pos.z = h - 1.0f; } } @@ -252,7 +257,7 @@ void puffoid_update(struct Moby *moby) { random_float_between(-puffoid_chase_heading_offset_limit_degrees_gp, puffoid_chase_heading_offset_limit_degrees_gp) * 0.017453292f; - moby->state = 4; + moby->state = PUFFOID_STATE_CHASE_TARGET; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -264,7 +269,7 @@ void puffoid_update(struct Moby *moby) { puffoid_vars->unk260[1] = fast_sin(a) * wander_radius; puffoid_vars->unk260[2] = 0.0f; fast_vec_add(puffoid_vars->unk260, puffoid_vars->unk260, puffoid_vars->home); - moby->state = 3; + moby->state = PUFFOID_STATE_WANDER_NEAR_HOME; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -277,12 +282,12 @@ void puffoid_update(struct Moby *moby) { random_float_between(-puffoid_chase_heading_offset_limit_degrees_gp, puffoid_chase_heading_offset_limit_degrees_gp) * 0.017453292f; - moby->state = 4; + moby->state = PUFFOID_STATE_CHASE_TARGET; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } } else if ((moby->anim_flags & 2) && random_integer_below(3) == 0) { - moby->state = 2; + moby->state = PUFFOID_STATE_IDLE; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -291,7 +296,7 @@ void puffoid_update(struct Moby *moby) { case PUFFOID_STATE_CHASE_TARGET: if ((moby->anim_flags & 2) && vector_distance_xy(&moby->pos, &target->pos) < puffoid_spray_target_distance_metric_threshold_gp) { - moby->state = 5; + moby->state = PUFFOID_STATE_SPRAY_ATTACK; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } @@ -300,7 +305,7 @@ void puffoid_update(struct Moby *moby) { (float *)&target->pos); } if (puffoid_vars->unk214 == 2) { - moby->state = 6; + moby->state = PUFFOID_STATE_RETURN_HOME; } break; case PUFFOID_STATE_REPOSITION_AND_FACE_TARGET: @@ -310,11 +315,11 @@ void puffoid_update(struct Moby *moby) { fast_vec_add(pos, pos, &moby->pos); if (test_path_segment_strict_crossing(puffoid_vars->unk230, &moby->pos, pos)) { float *rz = &moby->rot.z; - float ang = fast_arc_tan(puffoid_vars->target->pos.x - moby->pos.x, - puffoid_vars->target->pos.y - moby->pos.y); + float target_facing_heading = fast_arc_tan(puffoid_vars->target->pos.x - moby->pos.x, + puffoid_vars->target->pos.y - moby->pos.y); approach_angle(rz, &puffoid_vars->unk250, - ang, + target_facing_heading, frame_time_sq * 12.566371f, frame_time_sq * 12.566371f, frame_time * 12.566371f); @@ -323,9 +328,9 @@ void puffoid_update(struct Moby *moby) { } if (moby->anim_flags & 2) { if (puffoid_vars->unk214 != 2) { - moby->state = 4; + moby->state = PUFFOID_STATE_CHASE_TARGET; } else if (puffoid_vars->unk244 == 0) { - moby->state = 6; + moby->state = PUFFOID_STATE_RETURN_HOME; } } break; @@ -333,12 +338,12 @@ void puffoid_update(struct Moby *moby) { update_moby_target_heading_and_conditional_movement((char *)moby, (float *)&target->pos); if ((moby->anim_flags & 2) && puffoid_spray_target_distance_metric_threshold_gp < vector_distance_xy(&moby->pos, &target->pos)) { - moby->state = 4; + moby->state = PUFFOID_STATE_CHASE_TARGET; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } } else if (puffoid_vars->unk214 == 2) { - moby->state = 6; + moby->state = PUFFOID_STATE_RETURN_HOME; } qcopy(pos, &moby->pos); pos[2] += 0.333f; @@ -346,7 +351,7 @@ void puffoid_update(struct Moby *moby) { break; case PUFFOID_STATE_RETURN_HOME: if (vector_distance_xy(&moby->pos, puffoid_vars->home) < 1.0f) { - moby->state = 2; + moby->state = PUFFOID_STATE_IDLE; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -355,7 +360,7 @@ void puffoid_update(struct Moby *moby) { random_float_between(-puffoid_chase_heading_offset_limit_degrees_gp, puffoid_chase_heading_offset_limit_degrees_gp) * 0.017453292f; - moby->state = 4; + moby->state = PUFFOID_STATE_CHASE_TARGET; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -379,7 +384,7 @@ void puffoid_update(struct Moby *moby) { mark_moby_for_removal(moby); return; } - moby->state = 2; + moby->state = PUFFOID_STATE_IDLE; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -421,7 +426,7 @@ void puffoid_update(struct Moby *moby) { dest[2] = 1.0f; transform_vector_by_basis(dest, dest, &carrier_moby->rot_row0); fast_vec_add(dest, dest, &carrier_moby->pos); - moby->state = 0xD; + moby->state = PUFFOID_STATE_CARRIER_JUMP; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, 5); } @@ -438,7 +443,7 @@ void puffoid_update(struct Moby *moby) { dest, 0, puffoid_jump_horizontal_speed_gp * frame_time, - -(D_L11_001622F0 * frame_time_sq)); + -(l11_puffoid_jump_gravity * frame_time_sq)); moby->rot.z = fast_arc_tan(puffoid_vars->vel[0], puffoid_vars->vel[1]); } } @@ -449,13 +454,13 @@ void puffoid_update(struct Moby *moby) { (char *)((struct Moby *)(D_L11_0015FFD8_4318 + (puffoid_vars->carrier << 8)))->pvars; fast_vec_add(&moby->pos, &moby->pos, puffoid_vars->vel); fast_vec_add(&moby->pos, &moby->pos, cv + 0x70); - puffoid_vars->vel[2] -= D_L11_001622F0 * frame_time_sq; + puffoid_vars->vel[2] -= l11_puffoid_jump_gravity * frame_time_sq; if (puffoid_vars->vel[2] < 0.0f) { qcopy(pos, &moby->pos); pos[2] += 1.0f; if (moby->pos.z < probe_ground_height(pos, 0, 0.5f)) { moby->anim_speed = 1.0f; - moby->state = 0xE; + moby->state = PUFFOID_STATE_CARRIER_IDLE; } } break; @@ -472,7 +477,7 @@ void puffoid_update(struct Moby *moby) { random_float_between(-puffoid_chase_heading_offset_limit_degrees_gp, puffoid_chase_heading_offset_limit_degrees_gp) * 0.017453292f; - moby->state = 0xF; + moby->state = PUFFOID_STATE_CARRIER_CHASE_TARGET; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -488,13 +493,13 @@ void puffoid_update(struct Moby *moby) { update_moby_target_heading_and_conditional_movement((char *)moby, (float *)&target->pos); if ((moby->anim_flags & 2) && vector_distance_xy(&moby->pos, &target->pos) < puffoid_spray_target_distance_metric_threshold_gp) { - moby->state = 0x10; + moby->state = PUFFOID_STATE_CARRIER_SPRAY_ATTACK; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } } if (puffoid_vars->unk214 == 2) { - moby->state = 0xE; + moby->state = PUFFOID_STATE_CARRIER_IDLE; } break; case PUFFOID_STATE_CARRIER_SPRAY_ATTACK: @@ -507,12 +512,12 @@ void puffoid_update(struct Moby *moby) { update_moby_target_heading_and_conditional_movement((char *)moby, (float *)&target->pos); if ((moby->anim_flags & 2) && puffoid_spray_target_distance_metric_threshold_gp < vector_distance_xy(&moby->pos, &target->pos)) { - moby->state = 0xF; + moby->state = PUFFOID_STATE_CARRIER_CHASE_TARGET; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } } else if (puffoid_vars->unk214 == 2) { - moby->state = 0xE; + moby->state = PUFFOID_STATE_CARRIER_IDLE; } qcopy(pos, &moby->pos); pos[2] += 0.333f; @@ -538,7 +543,7 @@ void puffoid_update(struct Moby *moby) { mark_moby_for_removal(moby); return; } - moby->state = 0xE; + moby->state = PUFFOID_STATE_CARRIER_IDLE; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -577,10 +582,10 @@ void puffoid_update(struct Moby *moby) { } { float *rz = &moby->rot.z; - float ang = fast_arc_tan(pos[0] - moby->pos.x, pos[1] - moby->pos.y); + float path_point_heading = fast_arc_tan(pos[0] - moby->pos.x, pos[1] - moby->pos.y); approach_angle(rz, &puffoid_vars->unk250, - ang, + path_point_heading, frame_time_sq * 12.566371f, frame_time_sq * 12.566371f, frame_time * 12.566371f); @@ -636,7 +641,10 @@ void puffoid_update(struct Moby *moby) { break; } if (puffoid_vars->smoke != 0.0f) { - if (moby->state == 9 || moby->state == 0xB || moby->state == 0x11 || moby->state == 0x12) { + if (moby->state == PUFFOID_STATE_KNOCKBACK || + moby->state == PUFFOID_STATE_DEATH_KNOCKBACK || + moby->state == PUFFOID_STATE_CARRIER_KNOCKBACK || + moby->state == PUFFOID_STATE_CARRIER_DEATH_KNOCKBACK) { for (i = 0; i < 3; i++) { float vel[4]; float a; @@ -673,7 +681,7 @@ extern float puffoid_death_knockback_vertical_scale_gp __asm__("D_L11_001622DC") #include "rnc/overlay/l11/mobys/puffoid_data/update_puffoid_damage_and_path_goal.h" -extern float D_L11_001622FC_gp __asm__("D_L11_001622FC") __attribute__((sda)); +extern float l11_puffoid_horizontal_speed_limit __asm__("D_L11_001622FC") __attribute__((sda)); /* Private variables of the moby FUN_L11_00315968 updates (only the fields it uses). */ struct L11PatrolVars { @@ -753,6 +761,9 @@ void update_puffoid_damage_and_path_goal(struct Moby *moby) { HIT_RESPONSE_NON_KNOCKBACK_REACTION_ALTERNATE = 10, HIT_RESPONSE_COOLDOWN_NO_KNOCKBACK = 11 }; + enum { + HIT_PROCESSING_SKIP_DAMAGE_AND_REACTION = 1 + }; struct L11PatrolVars *patrol_vars = (struct L11PatrolVars *)moby->pvars; Vec4 position_scratch; s32 hit_processing_status; @@ -761,16 +772,19 @@ void update_puffoid_damage_and_path_goal(struct Moby *moby) { char *path; moby->scale = moby->pclass->scale * D_L11_001622CC; - patrol_vars->unk1A4 = D_L11_001622FC_gp * frame_time; - if (patrol_vars->carrier != -1 && moby->state != 0xB && moby->state != 9 && - moby->state != 0x12 && moby->state != 0x11 && moby->state != 0 && moby->state != 0xC && - moby->state != 0xD) { + patrol_vars->unk1A4 = l11_puffoid_horizontal_speed_limit * frame_time; + if (patrol_vars->carrier != -1 && moby->state != PUFFOID_STATE_DEATH_KNOCKBACK && + moby->state != PUFFOID_STATE_KNOCKBACK && + moby->state != PUFFOID_STATE_CARRIER_DEATH_KNOCKBACK && + moby->state != PUFFOID_STATE_CARRIER_KNOCKBACK && moby->state != PUFFOID_STATE_INITIALIZE && + moby->state != PUFFOID_STATE_WAIT_FOR_CARRIER_JUMP && + moby->state != PUFFOID_STATE_CARRIER_JUMP) { if (moby->pos.z < ((struct Moby *)D_L11_0015FFD8)[patrol_vars->carrier].pos.z + 0.5f) { spawn_color_swapped_explosion_burst(moby, &moby->pos, -1, 0.5f, 10.0f); mark_moby_for_removal(moby); } } - if (moby->state == 0xC && patrol_vars->carrier != -1) { + if (moby->state == PUFFOID_STATE_WAIT_FOR_CARRIER_JUMP && patrol_vars->carrier != -1) { if (is_moby_in_state_five(&((struct Moby *)D_L11_0015FFD8)[patrol_vars->carrier]) != 0 && moby->visible == 0) { mark_moby_for_removal(moby); @@ -787,13 +801,14 @@ void update_puffoid_damage_and_path_goal(struct Moby *moby) { { s32 kind = resolve_moby_hit_response( moby, hit, &patrol_vars->hp, 0, &hit_processing_status, &dmg, 0, 4); - if (hit_processing_status != 1 && moby->state != 0xB) { + if (hit_processing_status != HIT_PROCESSING_SKIP_DAMAGE_AND_REACTION && + moby->state != PUFFOID_STATE_DEATH_KNOCKBACK) { patrol_vars->hp -= dmg; if (hit->moby->oclass == 0x47) { - kind = 3; + kind = HIT_RESPONSE_KNOCKBACK; } if (patrol_vars->hp <= 0.0f) { - kind = 1; + kind = HIT_RESPONSE_DEATH; } patrol_vars->unk140 = truncate_float_to_s32(512.0f); patrol_vars->unk148 = 0.2f; @@ -824,10 +839,10 @@ void update_puffoid_damage_and_path_goal(struct Moby *moby) { trooper_knockback_arc( &position_scratch, &yaw, &patrol_vars->unk138, &patrol_vars->unk13C); trooper_start_knockback(moby, patrol_vars->unk120, 3, 1, 0, yaw); - if (moby->state < 0xC) { - moby->state = 9; + if (moby->state < PUFFOID_STATE_WAIT_FOR_CARRIER_JUMP) { + moby->state = PUFFOID_STATE_KNOCKBACK; } else { - moby->state = 0x11; + moby->state = PUFFOID_STATE_CARRIER_KNOCKBACK; } patrol_vars->unk117 = 0x78; break; @@ -846,10 +861,10 @@ void update_puffoid_damage_and_path_goal(struct Moby *moby) { trooper_knockback_arc( &position_scratch, &yaw, &patrol_vars->unk138, &patrol_vars->unk13C); trooper_start_knockback(moby, patrol_vars->unk120, 3, 1, 0, yaw); - if (moby->state < 0xC) { - moby->state = 0xB; + if (moby->state < PUFFOID_STATE_WAIT_FOR_CARRIER_JUMP) { + moby->state = PUFFOID_STATE_DEATH_KNOCKBACK; } else { - moby->state = 0x12; + moby->state = PUFFOID_STATE_CARRIER_DEATH_KNOCKBACK; } patrol_vars->unk117 = 0xF0; FUN_L00_00257470(moby, 0, -1); @@ -864,8 +879,9 @@ void update_puffoid_damage_and_path_goal(struct Moby *moby) { moby->hit_slot = 0xFF; trooper_anim_finish(moby, patrol_vars->move); if (patrol_vars->timer != 0) { - if (moby->state == 2 || (moby->state == 3 && (moby->anim_flags & 2))) { - moby->state = 0xA; + if (moby->state == PUFFOID_STATE_IDLE || + (moby->state == PUFFOID_STATE_WANDER_NEAR_HOME && (moby->anim_flags & 2))) { + moby->state = PUFFOID_STATE_REPOSITION_AND_FACE_TARGET; if (moby->prev_seq != 2) { FUN_00212f90(moby, 2, 0, scale_game_frames(10)); } @@ -886,7 +902,7 @@ void update_puffoid_damage_and_path_goal(struct Moby *moby) { if (FUN_L00_0025ff38( moby, &patrol_vars->goal, 0, 0, path + 0x10, *(s32 *)path, patrol_vars->reach) != 2) { Vec4f *goal_check_position; - if (moby->state == 1) { + if (moby->state == PUFFOID_STATE_WAIT_FOR_HOME_JUMP) { goal_check_position = (Vec4f *)((char *)l11_paths[patrol_vars->path2_index] + 0x20); } else { goal_check_position = &moby->pos; @@ -927,7 +943,7 @@ void update_moby_target_heading_and_conditional_movement(char *moby, float *targ target_heading_or_record_value = compute_interpolated_record_value(moby); if (MOBY(moby)->seq == MOBY(moby)->prev_seq && 8.0f < target_heading_or_record_value && target_heading_or_record_value < 22.0f) { - *(float *)(moby_vars + 0x1A4) = D_L11_001622FC_gp * frame_time; + *(float *)(moby_vars + 0x1A4) = l11_puffoid_horizontal_speed_limit * frame_time; planar_heading_vector[0] = fast_cos(MOBY(moby)->rot.z) * 2.0f; planar_heading_vector[1] = fast_sin(MOBY(moby)->rot.z) * 2.0f; *(int *)&planar_heading_vector[2] = 0; @@ -957,8 +973,8 @@ short count_group_puffoids_in_states_13_to_17(struct Moby *group_source_moby) { struct Moby *moby = (struct Moby *)(level_moby_array_base + ((*moby_list_entry & 0x7FFF) << 8)); if (moby->oclass == 0x4DE) { - if (moby->state >= 13) { - if (moby->state < 18) + if (moby->state >= PUFFOID_STATE_CARRIER_JUMP) { + if (moby->state < PUFFOID_STATE_CARRIER_DEATH_KNOCKBACK) matching_moby_count++; } } @@ -972,7 +988,10 @@ s32 is_moby_in_bob_target_exclusion_state(const u8 *moby) __asm__("FUN_L11_00316 s32 is_moby_in_bob_target_exclusion_state(const u8 *moby) { u32 moby_state = moby[0x20]; - if (moby_state == 0x14 || moby_state == 0xB || moby_state == 0x12 || moby_state == 0xC) { + if (moby_state == PUFFOID_STATE_WAIT_TO_RESUME_COMMAND || + moby_state == PUFFOID_STATE_DEATH_KNOCKBACK || + moby_state == PUFFOID_STATE_CARRIER_DEATH_KNOCKBACK || + moby_state == PUFFOID_STATE_WAIT_FOR_CARRIER_JUMP) { return 1; } return 0; @@ -986,17 +1005,20 @@ int process_puffoid_suck_cannon_suction(struct Moby *moby) __asm__("FUN_L11_0031 int process_puffoid_suck_cannon_suction(struct Moby *moby) { int grab_check_result = process_moby_suck_cannon_suction(moby); if (grab_check_result != 0) { - if (moby->state == 2 || moby->state == 4 || moby->state == 5 || moby->state == 6 || - moby->state == 0xE || moby->state == 0xF || moby->state == 0x10 || - moby->state == 0x14) { - if (moby->state != 0x14) { + if (moby->state == PUFFOID_STATE_IDLE || moby->state == PUFFOID_STATE_CHASE_TARGET || + moby->state == PUFFOID_STATE_SPRAY_ATTACK || moby->state == PUFFOID_STATE_RETURN_HOME || + moby->state == PUFFOID_STATE_CARRIER_IDLE || + moby->state == PUFFOID_STATE_CARRIER_CHASE_TARGET || + moby->state == PUFFOID_STATE_CARRIER_SPRAY_ATTACK || + moby->state == PUFFOID_STATE_WAIT_TO_RESUME_COMMAND) { + if (moby->state != PUFFOID_STATE_WAIT_TO_RESUME_COMMAND) { moby->command = moby->state; - moby->state = 0x14; + moby->state = PUFFOID_STATE_WAIT_TO_RESUME_COMMAND; } } else { grab_check_result = 0; } - } else if (moby->state == 0x14) { + } else if (moby->state == PUFFOID_STATE_WAIT_TO_RESUME_COMMAND) { moby->state = moby->command; } return grab_check_result; @@ -1012,11 +1034,11 @@ void *moby_park_state_on_find(struct Moby *suction_moby) { void *found = store_moby_in_suck_cannon(suction_moby); if (found != 0) { unsigned char state = suction_moby->state; - if (state != 0x14) { + if (state != PUFFOID_STATE_WAIT_TO_RESUME_COMMAND) { suction_moby->command = state; - suction_moby->state = 0x14; + suction_moby->state = PUFFOID_STATE_WAIT_TO_RESUME_COMMAND; } - } else if (suction_moby->state == 0x14) { + } else if (suction_moby->state == PUFFOID_STATE_WAIT_TO_RESUME_COMMAND) { suction_moby->state = suction_moby->command; } return found; diff --git a/src/overlays/l11/mobys/resort_owner.c b/src/overlays/l11/mobys/resort_owner.c index 9932f8e638..840939c00c 100644 --- a/src/overlays/l11/mobys/resort_owner.c +++ b/src/overlays/l11/mobys/resort_owner.c @@ -92,11 +92,15 @@ typedef struct ResortOwnerVars { } ResortOwnerVars; void trigger_pokitaru_paired_rotation(struct Moby *moby) { + enum { + POKITARU_PAIRED_ROTATION_WAITING = 1, + POKITARU_PAIRED_ROTATION_ROTATING = 2 + }; ResortOwnerVars *state = (ResortOwnerVars *)moby->pvars; - if (moby->oclass == 0x41 && moby->state == 1) { + if (moby->oclass == 0x41 && moby->state == POKITARU_PAIRED_ROTATION_WAITING) { char *child; D_0013D3E2[0] = moby->state; - moby->state = 2; + moby->state = POKITARU_PAIRED_ROTATION_ROTATING; child = state->unk8; if (child) child[0x20] = 2; @@ -263,8 +267,9 @@ void apply_resort_owner_movement(void *mp) { qcopy(A, moby + 0x10); qcopy(B, moby_vars->unk130); FUN_L00_00258830((int)moby, (int)B, 0.5f, 0.3f, 0.0f, 0x10); - if ((MOBY(moby)->state >= 4 && MOBY(moby)->state <= 6) || - (MOBY(moby)->state == 7 && moby_vars->unk15C == 3)) { + if ((MOBY(moby)->state >= RESORT_OWNER_FOLLOW_HERO && + MOBY(moby)->state <= RESORT_OWNER_MOVE_TO_PATH_POINT) || + (MOBY(moby)->state == RESORT_OWNER_JUMP_TO_TARGET && moby_vars->unk15C == 3)) { resolve_point_path_segment_xy_clearance( 0.3f, *(void **)((u8 *)moby_vars + 0x60 - -(*(int *)&moby_vars->unk158 * 4)), @@ -365,17 +370,18 @@ void update_resort_owner_state_transitions(void *resort_owner_moby) { float position_scratch[4]; float dialogue_rotation[4]; - if (moby->state >= 3 && moby->state <= 5 && proximity == 0) { + if (moby->state >= RESORT_OWNER_WAIT_TO_FOLLOW_HERO && + moby->state <= RESORT_OWNER_FOLLOW_DISTANT_HERO && proximity == 0) { FUN_L11_002d2088_c(moby, 6); return; } - if (moby->state >= 4 && moby->state <= 6) { + if (moby->state >= RESORT_OWNER_FOLLOW_HERO && moby->state <= RESORT_OWNER_MOVE_TO_PATH_POINT) { fast_vec_normalize(position_scratch, &moby->rot_row0, 3.0f); fast_vec_add(position_scratch, position_scratch, &moby->pos); if (try_find_resort_owner_jump_target(moby, position_scratch)) { qcopy(&moby_vars->target, position_scratch); moby_vars->target.z = ground_height_14b0(&moby_vars->target); - moby_vars->next_state = 3; + moby_vars->next_state = RESORT_OWNER_WAIT_TO_FOLLOW_HERO; FUN_L11_002d2088_c(moby, 7); } } @@ -480,7 +486,7 @@ void update_resort_owner_state_transitions(void *resort_owner_moby) { &o->rot_row2, resort_owner_gate_jump_target_local_z_offset_gp); fast_vec_add(&moby_vars->target, &moby_vars->target, position_scratch); - moby_vars->next_state = 8; + moby_vars->next_state = RESORT_OWNER_MOVE_TO_GATE_TARGET; FUN_L11_002d2088_c(moby, 7); break; } @@ -500,7 +506,7 @@ void update_resort_owner_state_transitions(void *resort_owner_moby) { resort_owner_gate_jump_target_local_z_offset_gp); fast_vec_add(&moby_vars->target, &moby_vars->target, position_scratch); l11_cuboids[moby_vars->unk110].pos.z += 500.0f; - moby_vars->next_state = 8; + moby_vars->next_state = RESORT_OWNER_MOVE_TO_GATE_TARGET; FUN_L11_002d2088_c(moby, 7); break; } @@ -558,7 +564,7 @@ void update_resort_owner_state_transitions(void *resort_owner_moby) { if (vector_distance_xy(&moby->pos, &moby_vars->target) < 0.5f) { int next_leg_index = ++moby_vars->leg; qcopy(&moby_vars->target, &l11_cuboids[moby_vars->unkD0[next_leg_index]].pos); - moby_vars->next_state = 4; + moby_vars->next_state = RESORT_OWNER_FOLLOW_HERO; FUN_L11_002d2088_c(moby, 7); } break; @@ -606,10 +612,10 @@ void set_resort_owner_state(struct Moby *moby, unsigned char state) { case RESORT_OWNER_CHECK_POST_PATH_DIALOGUE: if (moby->prev_seq != 0) FUN_00212f90(moby, 0, 0, scale_game_frames(0x14)); - if (moby->state == 14) + if (moby->state == RESORT_OWNER_CHECK_POST_PATH_DIALOGUE) moby_vars->unk2C = 10.0f; clear_u64_value(moby_vars->unk130); - if (moby->state == 14) + if (moby->state == RESORT_OWNER_CHECK_POST_PATH_DIALOGUE) moby_vars->unk56 = 2; break; case RESORT_OWNER_FOLLOW_HERO: @@ -740,6 +746,9 @@ extern s32 D_L11_0015FFF4; /* 2 when a live moby of the current target groups is within 10 units, 1 when one is alive, else 0. */ int classify_resort_owner_target_proximity(struct Moby *moby) { + enum { + RESORT_OWNER_TARGET_MIN_LIVE_STATE = 0 + }; struct TargetSets *target_sets = (struct TargetSets *)moby->pvars; int found = 0; int i; @@ -756,7 +765,7 @@ int classify_resort_owner_target_proximity(struct Moby *moby) { do { int offset = (*group_moby_entry & 0x7fff) << 8; struct Moby *target_group_moby = (struct Moby *)(offset + D_L11_0015FFD8); - if ((signed char)target_group_moby->state >= 0) { + if ((signed char)target_group_moby->state >= RESORT_OWNER_TARGET_MIN_LIVE_STATE) { if (target_group_moby->oclass != 0x4de || is_moby_in_bob_target_exclusion_state((const u8 *)target_group_moby) == 0) { found = 1; @@ -893,8 +902,11 @@ void update_resort_owner_look_tracking(WatcherMoby *moby) { /* Ported from rac1-decomp (src/overlays/l11_pokitaru/vendor_002CC828.c: func_L11_0030B850), where it is exact; names translated to the US level program. */ int try_activate_pokitaru_gate(struct Moby *moby) { + enum { + POKITARU_GATE_READY_FOR_ACTIVATION = 1 + }; char *current; - if (moby->state != 1) + if (moby->state != POKITARU_GATE_READY_FOR_ACTIVATION) return 0; current = (char *)hero.ground_moby; if (current != (char *)moby || hero.air_frames.s) diff --git a/src/overlays/l11/mobys/teleporter.c b/src/overlays/l11/mobys/teleporter.c index 7a71543b50..f64717a4e6 100644 --- a/src/overlays/l11/mobys/teleporter.c +++ b/src/overlays/l11/mobys/teleporter.c @@ -72,6 +72,9 @@ void teleporter_update(struct Moby *moby) { TELEPORTER_CONTRACT_RING = 3, TELEPORTER_RESET = 4 }; + enum { + HERO_TARGET_POSE_INACTIVE = 0 + }; TeleporterVars *teleporter_instance_vars = (TeleporterVars *)moby->pvars; switch (moby->state) { @@ -79,7 +82,7 @@ void teleporter_update(struct Moby *moby) { char **slots = &teleporter_instance_vars->unk14; int i; int j; - moby->state = 1; + moby->state = TELEPORTER_WAIT_FOR_ACTIVATION; for (i = 0; i < 3; i++) { struct Hero *g = &hero; char *child_moby; @@ -126,7 +129,7 @@ void teleporter_update(struct Moby *moby) { if (D_L11_0015F594 != 0xB) break; allocate_voice_for_target_entry(0, 0, (void *)moby); - moby->state = 2; + moby->state = TELEPORTER_OPEN_PARTS; teleporter_instance_vars->unk28 = 0; teleporter_instance_vars->unk2C = 0; request_hero_target_pose(&moby->pos.x, 0, moby->rot.z); @@ -152,9 +155,9 @@ void teleporter_update(struct Moby *moby) { } else if (D_L11_0015F594 != 0xB || !(teleporter_instance_vars->unk20 > 0.25f)) { if (teleport_transition_status == 2) { teleporter_instance_vars->unk3C = 1.95f; - moby->state = 3; - } else if (teleport_transition_status == 0) { - moby->state = 4; + moby->state = TELEPORTER_CONTRACT_RING; + } else if (teleport_transition_status == HERO_TARGET_POSE_INACTIVE) { + moby->state = TELEPORTER_RESET; } } update_teleporter_child_transforms(moby); @@ -181,14 +184,14 @@ void teleporter_update(struct Moby *moby) { teleporter_instance_vars->unk34); } FUN_L11_002f3040_2518(destination_moby); - MOBY(destination_moby)->state = 4; + MOBY(destination_moby)->state = TELEPORTER_RESET; *(float *)(td + 0x3C) = 0.0f; *(float *)(td + 0x28) = 0.0f; *(float *)(td + 0x2C) = 0.0f; *(float *)(td + 0x20) = 1.0f; *(float *)(td + 0x24) = 1.0f; allocate_voice_for_target_entry(1, 0, (void *)destination_moby); - moby->state = 1; + moby->state = TELEPORTER_WAIT_FOR_ACTIVATION; teleporter_instance_vars->unk20 = 0.0f; teleporter_instance_vars->unk24 = 0.0f; *(float *)&teleporter_instance_vars->unk28 = 0.0f; @@ -218,7 +221,7 @@ void teleporter_update(struct Moby *moby) { teleporter_parts_deceleration_gp * frame_time_sq, teleporter_parts_max_speed_gp * frame_time); } else { - moby->state = 1; + moby->state = TELEPORTER_WAIT_FOR_ACTIVATION; } update_teleporter_child_transforms(moby); break; diff --git a/src/overlays/l11/mobys/two_door_gate.c b/src/overlays/l11/mobys/two_door_gate.c index 4690efb2e8..350bdce39d 100644 --- a/src/overlays/l11/mobys/two_door_gate.c +++ b/src/overlays/l11/mobys/two_door_gate.c @@ -83,14 +83,14 @@ void two_door_gate_update(struct Moby *moby) { door_vars = gate_vars->right->pvars; *(u8 **)(door_vars + 8) = door_vars + 0x20; *(u32 *)(door_vars + 0x5C) |= 1; - moby->state = 1; + moby->state = GATE_WAIT_FOR_HERO_TRIGGER; break; } case GATE_WAIT_FOR_HERO_TRIGGER: if (vector_distance_xy(&moby->pos.x, &hero.motion.pos.f[0]) < 12.0f && is_point_inside_clip_volume(&hero.motion.pos, gate_vars->unk10) != 0) { gate_vars->t = 0.0f; - moby->state = 2; + moby->state = GATE_RAISE_DOORS; FUN_0022da68(0, 4, gate_vars->left); } break; @@ -110,7 +110,7 @@ void two_door_gate_update(struct Moby *moby) { update_entity(gate_vars->right); if (gate_vars->t >= 1.0f) { gate_vars->t = 0.0f; - moby->state = 3; + moby->state = GATE_ZERO_DOOR_Y_ROTATION; } break; case GATE_ZERO_DOOR_Y_ROTATION: { @@ -128,7 +128,7 @@ void two_door_gate_update(struct Moby *moby) { update_entity(gate_vars->right); if (gate_vars->t >= 1.0f) { gate_vars->t = 0.0f; - moby->state = 4; + moby->state = GATE_TILT_DOORS_APART; } break; } @@ -149,7 +149,7 @@ void two_door_gate_update(struct Moby *moby) { update_entity(gate_vars->right); if (gate_vars->t >= 1.0f) { gate_vars->t = 0.0f; - moby->state = 5; + moby->state = GATE_OPEN_IDLE; } break; } diff --git a/src/overlays/l11/mobys/water_tile.c b/src/overlays/l11/mobys/water_tile.c index 38a7476e4f..66e4e09138 100644 --- a/src/overlays/l11/mobys/water_tile.c +++ b/src/overlays/l11/mobys/water_tile.c @@ -138,12 +138,12 @@ void water_tile_update(struct Moby *water_tile_moby) { l11_water_grids[water_tile_vars[1]].visible_subtiles = 0xFFFF; pool_bind_tile(&l11_water_grids[water_tile_vars[1]], water_tile_binding_records[water_tile_vars[1]]); - water_tile_moby->state = 1; + water_tile_moby->state = WATER_TILE_STATE_FIND_NEIGHBORS; break; case WATER_TILE_STATE_FIND_NEIGHBORS: D_L11_00161F64 = 0; populate_water_tile_neighbor_indices(water_tile_vars[1]); - water_tile_moby->state = 2; + water_tile_moby->state = WATER_TILE_STATE_APPROACH_UPPER_HEIGHT; break; case WATER_TILE_STATE_APPROACH_LOWER_HEIGHT: if (water_tile_moby->command & 4) { diff --git a/src/overlays/l12/hero/hero_set_state.c b/src/overlays/l12/hero/hero_set_state.c index 6b2cfbf87e..154ecb7be9 100644 --- a/src/overlays/l12/hero/hero_set_state.c +++ b/src/overlays/l12/hero/hero_set_state.c @@ -66,13 +66,14 @@ extern int hero_set_state(int, int) __asm__("FUN_L12_002400d0"); extern char level12_transform_trail_jump_velocity_key_profile[] __asm__("D_L12_0017C3A0"); extern char level12_water_surface_jump_velocity_key_profile[] __asm__("D_L12_0017C3E0"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int b) { int previous_state_step; char *moby; int old20A7; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || b != 2)) return 0; } if ((D_L12_0015F5C4 == 2 || D_L12_0015F5C4 == 6) && b != 2) @@ -80,8 +81,16 @@ int hero_set_state(int a, int b) { { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -94,11 +103,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -119,14 +128,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); return 1; } @@ -604,14 +613,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); if (b) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L12_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -888,7 +897,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -973,7 +982,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; diff --git a/src/overlays/l12/hero/update_hero_motion_for_current_state.c b/src/overlays/l12/hero/update_hero_motion_for_current_state.c index a35baf4dc3..d7fbdc307c 100644 --- a/src/overlays/l12/hero/update_hero_motion_for_current_state.c +++ b/src/overlays/l12/hero/update_hero_motion_for_current_state.c @@ -24,6 +24,13 @@ #include "rnc/world/collision/collision_hit_material.h" /* Per-frame update of the player state flags from the current state; same source as FUN_L11_0023c7a0 with states 2 and 7 and without the water check. */ +enum { + GROUND_MATERIAL_WATER = 0, + GROUND_MATERIAL_MAGNET = 2, + GROUND_MATERIAL_ICE = 7, + GROUND_MATERIAL_SINK_TRIGGER = 0xD +}; + extern void exit_hero_vehicle_mode_if_mode_three(void) __asm__("FUN_L00_0020b930"); extern int hero_set_state(int, int) __asm__("FUN_L12_002400d0"); float absolute_float(float input) __asm__("func_001F99C0"); @@ -43,11 +50,11 @@ void update_hero_ground_material_flags(void) { hero_for_ground_flags_update->unk308 = 0; if (state == -1) return; - if (state == 2) { + if (state == GROUND_MATERIAL_MAGNET) { if (hero_for_ground_flags_update->frames_off_ground.s == 0 || hero_for_ground_flags_update->ground_distance < 0.3f) { hero_for_ground_flags_update->on_magnet_ground = 1; - if (hero_for_ground_flags_update->vehicle_mode == 0) { + if (hero_for_ground_flags_update->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if ((s32)hero_for_ground_flags_update->items[1].moby != 0 && *(short *)((s32)hero_for_ground_flags_update->items[1].moby + 0xA6) == 0xAD) hero_for_ground_flags_update->unk308 = 1; @@ -60,7 +67,7 @@ void update_hero_ground_material_flags(void) { hero_for_surface_update->water_depth = 0.2f; hero_for_surface_update->water_surface_z = hero_for_surface_update->ground_z.f + 0.2f; } - if (state == 0) { + if (state == GROUND_MATERIAL_WATER) { struct Hero *hero_for_water_height_check = &hero; struct Hero *hero_for_base_condition_update; float water_surface_ground_z_delta = @@ -71,15 +78,15 @@ void update_hero_ground_material_flags(void) { hero_for_base_condition_update = &hero; hero_for_base_condition_update->base_condition = 1; } - if (state == 2) { + if (state == GROUND_MATERIAL_MAGNET) { struct Hero *d = &hero; d->on_magnet_ground = 1; } - if (state == 7) { + if (state == GROUND_MATERIAL_ICE) { struct Hero *d = &hero; d->on_ice_ground = 1; } - if (state == 0xD) { + if (state == GROUND_MATERIAL_SINK_TRIGGER) { struct Hero *d = &hero; d->selector_13 = 1; } @@ -256,7 +263,7 @@ void update_hero_ground_contact_and_gravity(void) { } hero.ground_sound_class = collision_sound_class; hero.ground_type = collision_hit_material(); - if (hero.ground_type == 0) { + if (hero.ground_type == GROUND_MATERIAL_WATER) { hero.water_surface_z = resolve_camera_surface_height(D_L12_001742E0, (u8 *)&hero.water_surface_normal); if (hero.motion.pos.f[2] < hero.water_surface_z && hero.in_water_frames <= 0) { @@ -275,7 +282,7 @@ void update_hero_ground_contact_and_gravity(void) { } hero.ground_sound_class = collision_sound_class; } - if (hero.ground_type == 0xD) { + if (hero.ground_type == GROUND_MATERIAL_SINK_TRIGGER) { hero.water_surface_z = D_L12_001742C0_lui.point.f[2]; ground_ray_first_endpoint.f[2] = D_L12_001742C0_lui.point.f[2] - 0.01f; if (FUN_001efa68_u( @@ -308,7 +315,8 @@ void update_hero_ground_contact_and_gravity(void) { } if (hero.ground_distance < 0.02f) { hero.frames_off_ground.s = 0; - if (hero.ground_slope.f <= 0.87266463f || hero.gravity_mode == 1 || + if (hero.ground_slope.f <= 0.87266463f || + hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.state.control_mode == 0x16) { hero.air_frames.s = 0; hero.last_landed_moby = D_L12_001742C0_lui.moby; @@ -519,7 +527,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void clip_hero_horizontal_velocity(s32) __asm__("FUN_L01_00232978"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -553,7 +561,7 @@ extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); extern void build_spherical_offset(void *, f32, f32, f32) __asm__("FUN_00214db0"); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L12_0022c6e0(f32, f32); @@ -604,7 +612,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L12_0017C238; extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern s32 D_0013CB14[]; extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); @@ -779,10 +787,10 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -793,11 +801,11 @@ void update_hero_motion_for_current_state(void) { } else { clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -1110,7 +1118,7 @@ void update_hero_motion_for_current_state(void) { &hero.motion.velocity, hero.ground_speed, hero.motion.rot.f[2], yaw); } else if (hero.state.current == 0x33) { f32 sp = hero.ground_speed * - FUN_L00_00209018(hero_swim_speed_animation_curve, 0x1E) * 5.0f; + vector_length_xyz_cf(hero_swim_speed_animation_curve, 0x1E) * 5.0f; if (hero.state.prev == 0x35 && scale_game_frames(15) > hero.state_timer) { if (sp < frame_time * 4.5f) { sp = frame_time * 4.5f; @@ -1241,7 +1249,7 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 4.0f, frame_time_sq * 5.0f); { f32 sp = hero.ground_speed * - FUN_L00_00209018(hero_swim_speed_animation_curve, 0x1E) * 5.5f; + vector_length_xyz_cf(hero_swim_speed_animation_curve, 0x1E) * 5.5f; hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[2] = 0.0f; @@ -1296,11 +1304,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && MV(hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -1318,11 +1327,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (MV(hero.grapple_target) != NULL) { hero.motion.move_yaw = @@ -1492,13 +1502,13 @@ void update_hero_motion_for_current_state(void) { if (vector_distance_xy(&hero.motion.pos, &MV(hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&movement_vector_scratch, &hero.motion.pos, &MV(hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1612,7 +1622,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1713,7 +1724,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1759,7 +1771,7 @@ void update_hero_motion_for_current_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1788,10 +1800,10 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -1817,11 +1829,11 @@ void update_hero_motion_for_current_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { combo_target_distance_offset = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { combo_target_distance_offset = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1866,7 +1878,7 @@ void update_hero_motion_for_current_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || MV(hero.melee_target) != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1876,7 +1888,8 @@ void update_hero_motion_for_current_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1890,10 +1903,11 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -2018,11 +2032,12 @@ void update_hero_motion_for_current_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2080,10 +2095,11 @@ void update_hero_motion_for_current_state(void) { hero.air_frames.s = 0; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2177,11 +2193,12 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2223,11 +2240,12 @@ void update_hero_motion_for_current_state(void) { AN.f110 = s * m; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); } else { hero.motion.velocity.f[2] = 0.0f; - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 150.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 150.0f); } break; } @@ -2305,7 +2323,7 @@ void update_hero_motion_for_current_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; steer_hero_planar_velocity(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2342,7 +2360,8 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2359,7 +2378,8 @@ void update_hero_motion_for_current_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2409,7 +2429,7 @@ void update_hero_motion_for_current_state(void) { clip_hero_horizontal_velocity(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2454,7 +2474,7 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2570,9 +2590,9 @@ void update_hero_motion_for_current_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&geometry_and_hit_descriptor_scratch, &hero.motion.pos); - FUN_L00_00233810(&geometry_and_hit_descriptor_scratch, - &geometry_and_hit_descriptor_scratch, - 0.5f); + add_hero_up_offset(&geometry_and_hit_descriptor_scratch, + &geometry_and_hit_descriptor_scratch, + 0.5f); qcopy(&v10, &geometry_and_hit_descriptor_scratch); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; v10.f[1] += fast_sin(hero.motion.rot.f[2]) * 0.85f; @@ -2608,7 +2628,7 @@ void update_hero_motion_for_current_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2655,7 +2675,7 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -2677,7 +2697,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = D_0015ED6C_a * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = D_0015ED6C_a * 0.9f; } } else { @@ -2688,29 +2708,30 @@ void update_hero_motion_for_current_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { clip_hero_horizontal_velocity(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2723,11 +2744,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -2745,18 +2767,19 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; steer_hero_planar_velocity(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -2764,7 +2787,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_movement(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -2793,11 +2817,12 @@ void update_hero_motion_for_current_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2814,10 +2839,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l12/hero/update_hero_state_transitions.c b/src/overlays/l12/hero/update_hero_state_transitions.c index d6281997c6..384550da16 100644 --- a/src/overlays/l12/hero/update_hero_state_transitions.c +++ b/src/overlays/l12/hero/update_hero_state_transitions.c @@ -157,9 +157,11 @@ void update_hero_state_transitions(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && item_selector_hud_activation_blocked == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -222,7 +224,7 @@ void update_hero_state_transitions(void) { } } if (fatal_fall_entry_z > hero.motion.pos.f[2] && hero.ground_distance > 2.0f && - hero.vehicle_mode != 2 && hero.state.current != 0x77) { + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { switch (hero.state.current) { @@ -633,7 +635,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (hero.moby->prev_seq != 0xD) { @@ -660,7 +662,7 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); break; } @@ -972,7 +974,8 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -2096,7 +2099,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (hero.moby->prev_seq != 0xD) { diff --git a/src/overlays/l12/level_class_tables.c b/src/overlays/l12/level_class_tables.c index de3335d2bf..78e256f817 100644 --- a/src/overlays/l12/level_class_tables.c +++ b/src/overlays/l12/level_class_tables.c @@ -19,6 +19,9 @@ #include "rnc/overlay/shared/ui/hud/hud_keep_visible.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -61,7 +64,7 @@ void *D_L12_0020D240[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; struct MobyClassUpdate moby_classes[140] __asm__("D_L12_0020CB80") diff --git a/src/overlays/l12/mobys/blarg_helicopter.c b/src/overlays/l12/mobys/blarg_helicopter.c index 3f1cab2666..ed649869ab 100644 --- a/src/overlays/l12/mobys/blarg_helicopter.c +++ b/src/overlays/l12/mobys/blarg_helicopter.c @@ -12,6 +12,16 @@ #include "rnc/math/random.h" #include "rnc/mobys/moby_spawn.h" +enum { + BLARG_HELICOPTER_INITIALIZE = 0, + BLARG_HELICOPTER_WAIT_FOR_ACTIVATION = 1, + BLARG_HELICOPTER_FOLLOW_INITIAL_PATH = 2, + BLARG_HELICOPTER_AIM_AND_FIRE = 3, + BLARG_HELICOPTER_MOVE_BETWEEN_PATH_ENDPOINTS = 4, + BLARG_HELICOPTER_KNOCKBACK = 5, + BLARG_HELICOPTER_EXPLODE_AND_REMOVE_OR_RESET = 6 +}; + extern char D_L12_00167240[]; #include "rnc/overlay/shared/world/level_path.h" @@ -161,15 +171,6 @@ typedef struct BlargHelicopterVars { /* Moby class 326 */ void blarg_helicopter_update(struct Moby *moby) { - enum { - BLARG_HELICOPTER_INITIALIZE = 0, - BLARG_HELICOPTER_WAIT_FOR_ACTIVATION = 1, - BLARG_HELICOPTER_FOLLOW_INITIAL_PATH = 2, - BLARG_HELICOPTER_AIM_AND_FIRE = 3, - BLARG_HELICOPTER_MOVE_BETWEEN_PATH_ENDPOINTS = 4, - BLARG_HELICOPTER_KNOCKBACK = 5, - BLARG_HELICOPTER_EXPLODE_AND_REMOVE_OR_RESET = 6 - }; BlargHelicopterVars *blarg_helicopter_vars = (BlargHelicopterVars *)moby->pvars; struct Moby *child; float target[20] __attribute__((aligned(16))); @@ -288,7 +289,7 @@ void blarg_helicopter_update(struct Moby *moby) { } } blarg_helicopter_vars->unkB4 = 0; - moby->state = 1; + moby->state = BLARG_HELICOPTER_WAIT_FOR_ACTIVATION; break; } case BLARG_HELICOPTER_WAIT_FOR_ACTIVATION: { @@ -310,7 +311,7 @@ void blarg_helicopter_update(struct Moby *moby) { child->flags &= 0xffbe; moby->flags |= 0x1000; a = moby->pclass->collision; - moby->state = 2; + moby->state = BLARG_HELICOPTER_FOLLOW_INITIAL_PATH; moby->collision = a; } break; @@ -331,7 +332,7 @@ void blarg_helicopter_update(struct Moby *moby) { blarg_helicopter_vars->unk8C = limit * scale_game_frames(15); } if (follow_blarg_helicopter_path(moby, blarg_helicopter_vars->unkA0)) - moby->state = 3; + moby->state = BLARG_HELICOPTER_AIM_AND_FIRE; break; case BLARG_HELICOPTER_AIM_AND_FIRE: { int count, limit, a, b, color, life, size; @@ -410,7 +411,7 @@ void blarg_helicopter_update(struct Moby *moby) { } if (blarg_helicopter_vars->unkBC >= limit && blarg_helicopter_vars->unkA4 != -1) { blarg_helicopter_vars->unkBC = 0; - moby->state = 4; + moby->state = BLARG_HELICOPTER_MOVE_BETWEEN_PATH_ENDPOINTS; } else blarg_helicopter_vars->unk8C = scale_game_frames(40); } @@ -438,7 +439,7 @@ void blarg_helicopter_update(struct Moby *moby) { if (blarg_helicopter_vars->unk94 == 0.0f) { blarg_helicopter_vars->unk8C = scale_game_frames(50); blarg_helicopter_vars->unkBE = blarg_helicopter_vars->unkBE == 0; - moby->state = 3; + moby->state = BLARG_HELICOPTER_AIM_AND_FIRE; break; } } else @@ -506,7 +507,7 @@ void blarg_helicopter_update(struct Moby *moby) { b = scale_game_frames(400); blarg_helicopter_vars->unkC4 = FUN_L00_00257b90(a, b); moby->collision = 0; - moby->state = 0; + moby->state = BLARG_HELICOPTER_INITIALIZE; moby->flags = (moby->flags | 0x41) & 0xefff; break; } @@ -527,8 +528,8 @@ void blarg_helicopter_update(struct Moby *moby) { (*(struct Moby **)(&blarg_helicopter_vars->unkAC))->flags |= 6; } } - if (blarg_helicopter_vars->unkC0 == 0 && moby->state > 1 && moby->visible && - fast_vec_dist(&moby->pos, D_L12_00167240) < 30.0f) { + if (blarg_helicopter_vars->unkC0 == 0 && moby->state > BLARG_HELICOPTER_WAIT_FOR_ACTIVATION && + moby->visible && fast_vec_dist(&moby->pos, D_L12_00167240) < 30.0f) { FUN_L00_0025a120((char *)moby); moby->shadow_range = 24; } @@ -634,6 +635,9 @@ extern void trooper_anim_update(void *m, short *p) __asm__("FUN_L00_0025d458"); extern void trooper_anim_finish(void *, void *) __asm__("FUN_L00_0025d538"); void process_blarg_helicopter_hits(struct Moby *moby) { + enum { + HIT_PROCESSING_SKIP_HIT = 1 + }; int hit_processing_status; float fv; int hit_reaction_code; @@ -645,7 +649,8 @@ void process_blarg_helicopter_hits(struct Moby *moby) { hit_record = find_moby_hit(moby, 0x330000, 0); hit_reaction_code = hit_reaction( moby, hit_record, &blarg_helicopter_hit_vars->health, 0, &hit_processing_status, &fv, 0, 4); - if (hit_processing_status != 1 && moby->state != 6 && + if (hit_processing_status != HIT_PROCESSING_SKIP_HIT && + moby->state != BLARG_HELICOPTER_EXPLODE_AND_REMOVE_OR_RESET && *(short *)(*(char **)(hit_record + 0x20) + 0xA6) != 0xB8 && *(short *)(*(char **)(hit_record + 0x20) + 0xA6) != 0x199) { float remaining_health; @@ -655,11 +660,12 @@ void process_blarg_helicopter_hits(struct Moby *moby) { blarg_helicopter_hit_vars->health = remaining_health; if (hit_reaction_code == 1 || remaining_health <= 0.0f) { allocate_voice_for_target_entry(2, 0, moby); - moby->state = 6; + moby->state = BLARG_HELICOPTER_EXPLODE_AND_REMOVE_OR_RESET; } else if (hit_reaction_code != 0xB) { blarg_helicopter_hit_vars->unk67 = 0xB4; trooper_anim_update(moby, (short *)&blarg_helicopter_hit_vars->anim_state); - if (*(float *)(hit_record + 0x1C) == 5627.925f && moby->state != 5) { + if (*(float *)(hit_record + 0x1C) == 5627.925f && + moby->state != BLARG_HELICOPTER_KNOCKBACK) { hit_to_moby_angle = fast_arc_tan(moby->pos.x - *(float *)(hit_record + 0), moby->pos.y - *(float *)(hit_record + 4)); hit_yaw_offset = fast_subtract_rotations(hit_to_moby_angle, moby->rot.z); @@ -676,7 +682,7 @@ void process_blarg_helicopter_hits(struct Moby *moby) { blarg_helicopter_hit_vars->unk94 = frame_time * 4.0f; blarg_helicopter_hit_vars->unk8E = scale_game_frames(0x3C); moby->command = moby->state; - moby->state = 5; + moby->state = BLARG_HELICOPTER_KNOCKBACK; allocate_voice_for_target_entry(1, 0, moby); } } diff --git a/src/overlays/l12/mobys/blarg_trooper.c b/src/overlays/l12/mobys/blarg_trooper.c index 5fd192f84e..02ed23f2d0 100644 --- a/src/overlays/l12/mobys/blarg_trooper.c +++ b/src/overlays/l12/mobys/blarg_trooper.c @@ -16,6 +16,19 @@ #include "rnc/overlay/l12/mobys/miner.h" #include "rnc/mobys/resolve_moby_hit_response.h" +enum { + BLARG_TROOPER_INITIALIZE = 0, + BLARG_TROOPER_FOLLOW_WAYPOINTS = 1, + BLARG_TROOPER_WAIT_FOR_ACTIVATION = 2, + BLARG_TROOPER_APPROACH_TARGET = 3, + BLARG_TROOPER_KNOCKBACK_RECOVERY = 4, + BLARG_TROOPER_PREPARE_SHOT = 5, + BLARG_TROOPER_FIRE_PROJECTILE = 6, + BLARG_TROOPER_WAIT_BETWEEN_SHOTS = 7, + BLARG_TROOPER_RETURN_HOME = 8, + BLARG_TROOPER_DEATH_FALL = 9 +}; + extern char D_L12_00167240[]; #include "rnc/overlay/shared/world/level_path.h" @@ -162,18 +175,6 @@ extern s32 is_point_inside_clip_volume(void *, s32) __asm__("FUN_00214720"); /* Moby classes 294, 427 */ void blarg_trooper_update(struct Moby *moby) { - enum { - BLARG_TROOPER_INITIALIZE = 0, - BLARG_TROOPER_FOLLOW_WAYPOINTS = 1, - BLARG_TROOPER_WAIT_FOR_ACTIVATION = 2, - BLARG_TROOPER_APPROACH_TARGET = 3, - BLARG_TROOPER_KNOCKBACK_RECOVERY = 4, - BLARG_TROOPER_PREPARE_SHOT = 5, - BLARG_TROOPER_FIRE_PROJECTILE = 6, - BLARG_TROOPER_WAIT_BETWEEN_SHOTS = 7, - BLARG_TROOPER_RETURN_HOME = 8, - BLARG_TROOPER_DEATH_FALL = 9 - }; TargetReport combat_target_report; Vec4 query_position_or_projectile_origin; Vec4 delta; @@ -183,7 +184,7 @@ void blarg_trooper_update(struct Moby *moby) { manipulator_set_scale(trooper_update_vars + 0x120, 3.0f); if (D_L12_0015F5C4 == 2) goto hide; - if (moby->state >= 3) { + if (moby->state >= BLARG_TROOPER_APPROACH_TARGET) { moby->flags &= 0xffbe; if (TROOPER_CHILD__blarg_trooper_update) TROOPER_CHILD__blarg_trooper_update->flags &= 0xffbe; @@ -268,7 +269,7 @@ void blarg_trooper_update(struct Moby *moby) { if (TROOPER_CHILD__blarg_trooper_update) TROOPER_CHILD__blarg_trooper_update->flags |= 0x41; } - moby->state = 2; + moby->state = BLARG_TROOPER_WAIT_FOR_ACTIVATION; break; } case BLARG_TROOPER_WAIT_FOR_ACTIVATION: { @@ -305,7 +306,7 @@ void blarg_trooper_update(struct Moby *moby) { else { TROOPER_I__blarg_trooper_update(0x260) = select_point_index_by_distance( &moby->pos, ((char *)l12_paths[TROOPER_I__blarg_trooper_update(0x254)]), 0.0f); - moby->state = 1; + moby->state = BLARG_TROOPER_FOLLOW_WAYPOINTS; } break; } @@ -330,7 +331,7 @@ void blarg_trooper_update(struct Moby *moby) { goto state3; else if (vector_distance_xy(&moby->pos, &target->pos) < TROOPER_F__blarg_trooper_update(0x264)) - moby->state = 3; + moby->state = BLARG_TROOPER_APPROACH_TARGET; break; } case BLARG_TROOPER_APPROACH_TARGET: { @@ -387,7 +388,7 @@ void blarg_trooper_update(struct Moby *moby) { if (moby->anim_flags & 2) { if (moby->prev_seq != 10 && moby->seq == moby->prev_seq) blend_moby_animation_ex(moby, 10, 0, scale_game_frames(5), 5); - moby->state = 6; + moby->state = BLARG_TROOPER_FIRE_PROJECTILE; } break; } @@ -417,7 +418,7 @@ void blarg_trooper_update(struct Moby *moby) { if (moby->anim_flags & 2) { if (moby->prev_seq != 5 && moby->seq == moby->prev_seq) blend_moby_animation_ex(moby, 5, 0, scale_game_frames(8), 5); - moby->state = 7; + moby->state = BLARG_TROOPER_WAIT_BETWEEN_SHOTS; } break; } @@ -435,7 +436,7 @@ void blarg_trooper_update(struct Moby *moby) { goto state3; angle = fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y); if (fast_difference_between_rotations(moby->rot.z, angle) > 0.4886922f) - moby->state = 3; + moby->state = BLARG_TROOPER_APPROACH_TARGET; break; } case BLARG_TROOPER_RETURN_HOME: { @@ -449,7 +450,7 @@ void blarg_trooper_update(struct Moby *moby) { TROOPER_F__blarg_trooper_update(0x188) = angle * 0.7f; TROOPER_F__blarg_trooper_update(0x208) = angle * 0.4f; if (vector_distance_xy(&moby->pos, trooper_update_vars + 0x220) < 1.0f) - moby->state = 2; + moby->state = BLARG_TROOPER_WAIT_FOR_ACTIVATION; break; } case BLARG_TROOPER_KNOCKBACK_RECOVERY: { @@ -461,12 +462,12 @@ void blarg_trooper_update(struct Moby *moby) { angle = fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y); if (fast_difference_between_rotations(moby->rot.z, angle) < 0.12217305f) { state5: - moby->state = 5; + moby->state = BLARG_TROOPER_PREPARE_SHOT; break; } } state3: - moby->state = 3; + moby->state = BLARG_TROOPER_APPROACH_TARGET; break; } if (!(moby->pos.z < 2.0f)) @@ -580,13 +581,14 @@ void process_blarg_trooper_damage_and_alerts(struct Moby *moby) { trooper_damage_alert_vars->reset_alert = 0; trooper_damage_alert_vars->alert_timer = scale_game_frames(0xF0); } - if (moby->state != 0) { + if (moby->state != BLARG_TROOPER_INITIALIZE) { trooper_damage_alert_vars->speed = fast_dec_timer_s16(&trooper_damage_alert_vars->alert_timer) ? trooper_damage_alert_vars->alert_speed : 20.0f; } - if (trooper_damage_alert_vars->call_enabled != 0 && moby->state != 2) { + if (trooper_damage_alert_vars->call_enabled != 0 && + moby->state != BLARG_TROOPER_WAIT_FOR_ACTIVATION) { trooper_damage_alert_vars->call_timer++; if (scale_game_frames(0x3C) * 17 < trooper_damage_alert_vars->call_timer) { s32 count = 0; @@ -622,7 +624,7 @@ void process_blarg_trooper_damage_and_alerts(struct Moby *moby) { dmg = 0.0f; resolve_moby_hit_response(moby, coll, &trooper_damage_alert_vars->health, 0, &hit, &dmg, 0, 4); if (coll != 0 && coll->moby->oclass != moby->oclass && coll->moby->oclass != 0xB8 && - moby->state != 9 && dmg != 0.0f) { + moby->state != BLARG_TROOPER_DEATH_FALL && dmg != 0.0f) { if (moby->group != 0xFF) { alert_group_e81e0(moby->group, 1); } @@ -645,7 +647,7 @@ void process_blarg_trooper_damage_and_alerts(struct Moby *moby) { start_fall_e81e0(moby, trooper_damage_alert_vars->fall, 9, 1, 0, angle); trooper_damage_alert_vars->unkC0 = 10.0f; trooper_damage_alert_vars->unkC4 = 19.0f; - moby->state = 9; + moby->state = BLARG_TROOPER_DEATH_FALL; trooper_damage_alert_vars->unk67 = 0x78; anim_reset_e81e0(moby, trooper_damage_alert_vars->anim); } else { @@ -659,7 +661,7 @@ void process_blarg_trooper_damage_and_alerts(struct Moby *moby) { start_fall_e81e0(moby, trooper_damage_alert_vars->fall, 6, 1, 0, unused); trooper_damage_alert_vars->unkC0 = 4.0f; trooper_damage_alert_vars->unkC4 = 8.0f; - moby->state = 4; + moby->state = BLARG_TROOPER_KNOCKBACK_RECOVERY; trooper_damage_alert_vars->unk67 = 0xFA; trooper_damage_alert_vars->stun_timer = scale_game_frames(0x3C); anim_reset_e81e0(moby, trooper_damage_alert_vars->anim); diff --git a/src/overlays/l12/mobys/crane_arm.c b/src/overlays/l12/mobys/crane_arm.c index e3a64ad288..50561b84c0 100644 --- a/src/overlays/l12/mobys/crane_arm.c +++ b/src/overlays/l12/mobys/crane_arm.c @@ -40,7 +40,7 @@ void crane_arm_update(unsigned char *moby) { case CRANE_ARM_INITIALIZE: if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, 0); - MOBY(moby)->state = 1; + MOBY(moby)->state = CRANE_ARM_WAIT_DELAY; MOBY(moby)->command = random_integer_below(scale_game_frames(0xB4)); break; case CRANE_ARM_WAIT_DELAY: @@ -69,7 +69,7 @@ void crane_arm_update(unsigned char *moby) { blend_moby_animation(moby, 6, 0, 0); break; } - MOBY(moby)->state = 2; + MOBY(moby)->state = CRANE_ARM_WAIT_ANIMATION_FLAG; } break; case CRANE_ARM_WAIT_ANIMATION_FLAG: @@ -89,7 +89,7 @@ void crane_arm_update(unsigned char *moby) { blend_moby_animation(moby, 2, 0, 0); break; } - MOBY(moby)->state = 1; + MOBY(moby)->state = CRANE_ARM_WAIT_DELAY; MOBY(moby)->command = random_integer_below(scale_game_frames(0xB4)); } break; diff --git a/src/overlays/l12/mobys/cutscene_camera_target.c b/src/overlays/l12/mobys/cutscene_camera_target.c index b4adeee019..95b65a1fab 100644 --- a/src/overlays/l12/mobys/cutscene_camera_target.c +++ b/src/overlays/l12/mobys/cutscene_camera_target.c @@ -46,7 +46,7 @@ void cutscene_camera_target_update(struct Moby *moby) { switch (moby->state) { case INITIALIZE_UPDATE_DISTANCE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = DISPATCH_PHASE_SELECTED_MOBY; break; case DISPATCH_PHASE_SELECTED_MOBY: if (D_L12_0015F5C4 == 2) { diff --git a/src/overlays/l12/mobys/edwina.c b/src/overlays/l12/mobys/edwina.c index 752bedeb7a..f6f51b3d8e 100644 --- a/src/overlays/l12/mobys/edwina.c +++ b/src/overlays/l12/mobys/edwina.c @@ -91,7 +91,7 @@ void edwina_update(L16WatchMoby *moby) { } switch (moby->state) { case EDWINA_INITIALIZE: - moby->state = 1; + moby->state = EDWINA_UPDATE_DIALOGUE; initialize_npc_dialogue(moby, &moby_data->activation); moby_data->activation.radius = 1.7f; initialize_moby_grounding(moby); @@ -103,7 +103,7 @@ void edwina_update(L16WatchMoby *moby) { update_npc_dialogue(moby, &moby_data->activation)) { begin_dialogue_camera_transition(moby, 2.52f); *(int *)((char *)moby + 0x58) = 0; - moby->state = 2; + moby->state = EDWINA_APPLY_DIALOGUE_COMPLETION; } break; case EDWINA_APPLY_DIALOGUE_COMPLETION: @@ -114,7 +114,7 @@ void edwina_update(L16WatchMoby *moby) { char *p = D_L12_001600EC + (moby_data->region << 7); jet_reset_camera(p + 0x30, p + 0x70); } - moby->state = 1; + moby->state = EDWINA_UPDATE_DIALOGUE; if (*(short *)((char *)moby_data + 0x24) == 2) { grant_inventory_item(4, 0); queue_dialogue_message(0x2EE6, -1); diff --git a/src/overlays/l12/mobys/effects_draw_trigger.c b/src/overlays/l12/mobys/effects_draw_trigger.c index 406f8e8fd9..815f091d41 100644 --- a/src/overlays/l12/mobys/effects_draw_trigger.c +++ b/src/overlays/l12/mobys/effects_draw_trigger.c @@ -27,7 +27,7 @@ void effects_draw_trigger_update(struct Moby *moby) { char *draw_callback_vars = (char *)moby->pvars; switch (moby->state) { case DRAW_CALLBACK_INITIALIZE: - moby->state = 1; + moby->state = DRAW_CALLBACK_CHECK_VOLUME_AND_REGISTER; moby->update_dist = 0xFF; break; case DRAW_CALLBACK_CHECK_VOLUME_AND_REGISTER: { diff --git a/src/overlays/l12/mobys/helicopter.c b/src/overlays/l12/mobys/helicopter.c index 8bdc927790..d907221a7d 100644 --- a/src/overlays/l12/mobys/helicopter.c +++ b/src/overlays/l12/mobys/helicopter.c @@ -171,7 +171,7 @@ void helicopter_update(char *moby) { moby_vars->unk30 = 1.4f; moby_vars->unk2B = 1; moby_vars->unk60 = initial_node_index; - MOBY(moby)->state = 1; + MOBY(moby)->state = HELICOPTER_FOLLOW_PATH; MOBY(moby)->draw_dist = 0xAA; MOBY(moby)->flags |= 0x1000; } diff --git a/src/overlays/l12/mobys/homing_mine.c b/src/overlays/l12/mobys/homing_mine.c index 3a4185b0b2..b902c769fe 100644 --- a/src/overlays/l12/mobys/homing_mine.c +++ b/src/overlays/l12/mobys/homing_mine.c @@ -116,7 +116,7 @@ void homing_mine_update(struct Moby *moby) { case HOMING_MINE_STATE_INITIALIZE: moby->flags |= 0x1000; qcopy(&homing_mine_state->start, &moby->pos); - moby->state = 1; + moby->state = HOMING_MINE_STATE_HOMING; homing_mine_state->turn = 0.6981317f; if (moby->parent != NULL && ((struct Moby *)moby->parent)->command != 0) homing_mine_state->turn = -homing_mine_state->turn; @@ -179,9 +179,9 @@ void homing_mine_update(struct Moby *moby) { qcopy(&probe, &moby->pos); probe.f[2] += 0.35f; if (coll_sphere(&probe, 0, moby, 0.35f)) - moby->state = 2; + moby->state = HOMING_MINE_STATE_DETONATE; } else { - moby->state = 2; + moby->state = HOMING_MINE_STATE_DETONATE; } } break; diff --git a/src/overlays/l12/mobys/homing_mine_spawner.c b/src/overlays/l12/mobys/homing_mine_spawner.c index 9e4aae5bd7..fb7c63d285 100644 --- a/src/overlays/l12/mobys/homing_mine_spawner.c +++ b/src/overlays/l12/mobys/homing_mine_spawner.c @@ -17,6 +17,15 @@ #include "rnc/overlay/shared/mobys/evaluate_moby_animation_pose.h" #include "rnc/overlay/shared/rendering/effects/update_three_phase_effect_particle.h" +enum { + HOMING_MINE_SPAWNER_CLEAR_LINKED_MOBYS = 0, + HOMING_MINE_SPAWNER_WAIT_FOR_PROXIMITY = 1, + HOMING_MINE_SPAWNER_WAIT_FOR_PRESPAWN_ANIMATION = 2, + HOMING_MINE_SPAWNER_SPAWN_LINKED_MOBYS = 3, + HOMING_MINE_SPAWNER_WAIT_FOR_POSTSPAWN_ANIMATION = 4, + HOMING_MINE_SPAWNER_SPAWN_SEQUENCE_COMPLETE = 5 +}; + typedef struct Moby Moby; /* Spawns the next linked moby at this one's spot, sets it up and gives it a random spin. */ @@ -92,14 +101,6 @@ void homing_mine_spawner_update(struct Moby *m) __asm__("FUN_L12_00307840"); /* Moby class 1281 */ void homing_mine_spawner_update(struct Moby *spawner) { - enum { - HOMING_MINE_SPAWNER_CLEAR_LINKED_MOBYS = 0, - HOMING_MINE_SPAWNER_WAIT_FOR_PROXIMITY = 1, - HOMING_MINE_SPAWNER_WAIT_FOR_PRESPAWN_ANIMATION = 2, - HOMING_MINE_SPAWNER_SPAWN_LINKED_MOBYS = 3, - HOMING_MINE_SPAWNER_WAIT_FOR_POSTSPAWN_ANIMATION = 4, - HOMING_MINE_SPAWNER_SPAWN_SEQUENCE_COMPLETE = 5 - }; HomingMineSpawnerVars *spawner_data = (HomingMineSpawnerVars *)spawner->pvars; int *slots; int i; @@ -116,12 +117,12 @@ void homing_mine_spawner_update(struct Moby *spawner) { } } } - spawner->state = 1; + spawner->state = HOMING_MINE_SPAWNER_WAIT_FOR_PROXIMITY; break; case HOMING_MINE_SPAWNER_WAIT_FOR_PROXIMITY: if (spawner_data->unkB4 != 2) { if (vector_distance_xy(&spawner->pos, &spawner_data->unk70) < spawner_data->unkF8) { - spawner->state = 2; + spawner->state = HOMING_MINE_SPAWNER_WAIT_FOR_PRESPAWN_ANIMATION; } } break; @@ -133,7 +134,7 @@ void homing_mine_spawner_update(struct Moby *spawner) { if (spawner->prev_seq != 2) { blend_moby_animation(spawner, 2, 0, scale_game_frames(2)); } - spawner->state = 3; + spawner->state = HOMING_MINE_SPAWNER_SPAWN_LINKED_MOBYS; } break; case HOMING_MINE_SPAWNER_SPAWN_LINKED_MOBYS: @@ -146,7 +147,7 @@ void homing_mine_spawner_update(struct Moby *spawner) { spawner_data->unkF0 += 1; } if (spawner_data->unkF0 == 12 || slots[spawner_data->unkF0] == -1) { - spawner->state = 4; + spawner->state = HOMING_MINE_SPAWNER_WAIT_FOR_POSTSPAWN_ANIMATION; } break; case HOMING_MINE_SPAWNER_WAIT_FOR_POSTSPAWN_ANIMATION: @@ -158,7 +159,7 @@ void homing_mine_spawner_update(struct Moby *spawner) { if (spawner->prev_seq != 0) { blend_moby_animation(spawner, 0, 0, scale_game_frames(2)); } - spawner->state = 5; + spawner->state = HOMING_MINE_SPAWNER_SPAWN_SEQUENCE_COMPLETE; } break; case HOMING_MINE_SPAWNER_SPAWN_SEQUENCE_COMPLETE: @@ -175,7 +176,7 @@ extern int select_moby_combat_target(char *, char *, float) __asm__("FUN_L00_00 void update_homing_mine_spawner_target(struct Moby *spawner) { HomingMineSpawnerVars *spawner_data = (HomingMineSpawnerVars *)spawner->pvars; char *pad; - if (spawner->state != 0) { + if (spawner->state != HOMING_MINE_SPAWNER_CLEAR_LINKED_MOBYS) { if (spawner_data->unk38 != 0) { spawner_data->timer_FE = scale_game_frames(0xB4); } diff --git a/src/overlays/l12/mobys/hoven_anklebiter.c b/src/overlays/l12/mobys/hoven_anklebiter.c index 493f9aa0ec..f8eaec66c5 100644 --- a/src/overlays/l12/mobys/hoven_anklebiter.c +++ b/src/overlays/l12/mobys/hoven_anklebiter.c @@ -26,21 +26,41 @@ /* Suck cannon suction method: state 8 while sucked (alerting its group), back to 1 when released; no suction in states 9, 11 and 13. */ /* Ported from rac1-decomp (src/overlays/l12_hoven/vendor_002C0310.c: func_L12_002E29C8), where it is exact; names translated to the US level program. */ +enum { + ANKLEBITER_INITIALIZE = 0, + ANKLEBITER_IDLE = 1, + ANKLEBITER_FACE_TARGET_BEFORE_PURSUIT = 3, + ANKLEBITER_PURSUE_TARGET = 4, + ANKLEBITER_MELEE_ATTACK = 5, + ANKLEBITER_RETURN_HOME = 6, + ANKLEBITER_KNOCKBACK_FALL = 7, + ANKLEBITER_CONTROLLED_MOTION_UNTIL_RETURN_HOME = 8, + ANKLEBITER_DORMANT = 9, + ANKLEBITER_RECOVER_AFTER_KNOCKBACK = 10, + ANKLEBITER_WAIT_FOR_LEAP_TRIGGER = 11, + ANKLEBITER_LEAP_TO_HOME = 12, + ANKLEBITER_ACTIVATE_FROM_DORMANCY = 13, + ANKLEBITER_LAND_AFTER_LEAP = 14, + ANKLEBITER_DEATH_EFFECTS_AND_REMOVE = 15, + ANKLEBITER_DEATH_FALL = 99 +}; + extern int process_moby_suck_cannon_suction(void *) __asm__("FUN_L00_002db8f8"); int process_hoven_anklebiter_suck_cannon_suction(struct Moby *moby) __asm__("FUN_L12_002e16b8"); int process_hoven_anklebiter_suck_cannon_suction(struct Moby *moby) { int active; - if (moby->state == 9 || moby->state == 11 || moby->state == 13) + if (moby->state == ANKLEBITER_DORMANT || moby->state == ANKLEBITER_WAIT_FOR_LEAP_TRIGGER || + moby->state == ANKLEBITER_ACTIVATE_FROM_DORMANCY) return 0; active = process_moby_suck_cannon_suction(moby); if (active) { if (moby->group != 0xFF) FUN_L01_0026e090(moby->group, 1); - moby->state = 8; - } else if (moby->state == 8) { - moby->state = 1; + moby->state = ANKLEBITER_CONTROLLED_MOTION_UNTIL_RETURN_HOME; + } else if (moby->state == ANKLEBITER_CONTROLLED_MOTION_UNTIL_RETURN_HOME) { + moby->state = ANKLEBITER_IDLE; } return active; } @@ -53,10 +73,10 @@ int store_hoven_anklebiter_in_suck_cannon(struct Moby *a) __asm__("FUN_L12_002e1 int store_hoven_anklebiter_in_suck_cannon(struct Moby *carried_moby) { int suck_cannon_store_result = store_moby_in_suck_cannon(carried_moby); if (suck_cannon_store_result == 0) { - if (carried_moby->state == 0x8) - carried_moby->state = 1; + if (carried_moby->state == ANKLEBITER_CONTROLLED_MOTION_UNTIL_RETURN_HOME) + carried_moby->state = ANKLEBITER_IDLE; } else { - carried_moby->state = 0x8; + carried_moby->state = ANKLEBITER_CONTROLLED_MOTION_UNTIL_RETURN_HOME; } return suck_cannon_store_result; } @@ -68,10 +88,10 @@ int cancel_hoven_anklebiter_suck_cannon_suction(struct Moby *moby) __asm__("FUN_ int cancel_hoven_anklebiter_suck_cannon_suction(struct Moby *moby) { int was_stored_in_suck_cannon = cancel_suck_cannon_suction(moby); - if (moby->state == 9 || moby->state == 11) { + if (moby->state == ANKLEBITER_DORMANT || moby->state == ANKLEBITER_WAIT_FOR_LEAP_TRIGGER) { return 0; } - moby->state = 8; + moby->state = ANKLEBITER_CONTROLLED_MOTION_UNTIL_RETURN_HOME; return was_stored_in_suck_cannon; } @@ -273,22 +293,7 @@ extern float fast_subtract_rotations(float, float); /* Moby class 238 */ void hoven_anklebiter_update(AnklebiterMoby *moby) { enum { - ANKLEBITER_INITIALIZE = 0, - ANKLEBITER_IDLE = 1, - ANKLEBITER_FACE_TARGET_BEFORE_PURSUIT = 3, - ANKLEBITER_PURSUE_TARGET = 4, - ANKLEBITER_MELEE_ATTACK = 5, - ANKLEBITER_RETURN_HOME = 6, - ANKLEBITER_KNOCKBACK_FALL = 7, - ANKLEBITER_CONTROLLED_MOTION_UNTIL_RETURN_HOME = 8, - ANKLEBITER_DORMANT = 9, - ANKLEBITER_RECOVER_AFTER_KNOCKBACK = 10, - ANKLEBITER_WAIT_FOR_LEAP_TRIGGER = 11, - ANKLEBITER_LEAP_TO_HOME = 12, - ANKLEBITER_ACTIVATE_FROM_DORMANCY = 13, - ANKLEBITER_LAND_AFTER_LEAP = 14, - ANKLEBITER_DEATH_EFFECTS_AND_REMOVE = 15, - ANKLEBITER_DEATH_FALL = 99 + ANKLEBITER_LEAP_TO_HOME_MOTION_FLAGS = 5 }; TargetReport target_report_or_vector_scratch; AnklebiterMoby *iterator; @@ -311,19 +316,19 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { case ANKLEBITER_INITIALIZE: if (data->sleep) { qcopy(data->home, moby->pos); - moby->state = 9; + moby->state = ANKLEBITER_DORMANT; if (moby->anim != 12) blend_moby_animation(moby, 12, 0, 3); moby->collision = 0; moby->flags = (moby->flags | 0x41) & 0xEFFF; } else if (data->home[3] != 0.0f) { - moby->state = 11; + moby->state = ANKLEBITER_WAIT_FOR_LEAP_TRIGGER; moby->joints = 0; moby->flags &= 0xEFFF; moby->collision = 0; } else { qcopy(data->home, moby->pos); - moby->state = 1; + moby->state = ANKLEBITER_IDLE; if (moby->anim != 0) blend_moby_animation(moby, 0, 0, 3); } @@ -366,7 +371,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { idle_angle = fast_arc_tan(target->pos[0] - moby->pos[0], target->pos[1] - moby->pos[1]); idle_difference = fast_difference_between_rotations(moby->rot[2], idle_angle); if (idle_distance < data->range && absolute_float(moby->pos[2] - target->pos[2]) < 4.0f) { - moby->state = 3; + moby->state = ANKLEBITER_FACE_TARGET_BEFORE_PURSUIT; if (idle_difference < 0.9599311f) { if (moby->anim != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(5)); @@ -379,7 +384,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { data->circle_rate = -data->circle_rate; data->circle_angle = data->circle_rate * 0.017453292f; data->circle_timer = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - moby->state = 3; + moby->state = ANKLEBITER_FACE_TARGET_BEFORE_PURSUIT; if (moby->anim != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(7)); moby->proximity = 0; @@ -405,7 +410,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { count = 0; func_L00_0025A208_2E2EF0((int *)&iterator, moby->group, 0, 0); while (iterator) { - if ((signed char)iterator->state >= 0 && iterator->state != 9) + if ((signed char)iterator->state >= 0 && iterator->state != ANKLEBITER_DORMANT) count++; func_L00_0025A2F0_2E2EF0((int *)&iterator, (int)iterator, 0, 0); } @@ -422,7 +427,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { } else if (!((moby->proximity & 1) && fast_dec_timer_s16(&data->group_timer)) && moby->proximity != 7) break; - moby->state = 13; + moby->state = ANKLEBITER_ACTIVATE_FROM_DORMANCY; if (moby->anim != 7) blend_moby_animation(moby, 7, 0, 1); moby->flags |= 0x1000; @@ -440,7 +445,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { data->circle_rate = -data->circle_rate; data->circle_angle = data->circle_rate * 0.017453292f; data->circle_timer = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - moby->state = 4; + moby->state = ANKLEBITER_PURSUE_TARGET; data->blocked = 0; select_hoven_anklebiter_pursuit_animation((struct Moby *)moby); moby->proximity = 0; @@ -465,19 +470,19 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { &trajectory, data->launch_speed, -hoven_anklebiter_leap_gravity_gp); - data->fall_mode = 5; + data->fall_mode = ANKLEBITER_LEAP_TO_HOME_MOTION_FLAGS; data->falling = 0; setup_fall54(moby->rot[2], (char *)moby, data->fall, 8, 1, 0); data->fall_a = 5.0f; data->fall_b = 10.0f; - moby->state = 12; + moby->state = ANKLEBITER_LEAP_TO_HOME; moby->flags |= 0x1000; moby->collision = *(int *)(moby->model + 0x10); } break; case ANKLEBITER_LEAP_TO_HOME: if (step_moby_motion(moby, data->fall) & 1) { - moby->state = 14; + moby->state = ANKLEBITER_LAND_AFTER_LEAP; if (moby->anim != 9) blend_moby_animation(moby, 9, 8, scale_game_frames(7)); return; @@ -489,7 +494,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { break; case ANKLEBITER_LAND_AFTER_LEAP: if (moby->anim_flags & 2) { - moby->state = 4; + moby->state = ANKLEBITER_PURSUE_TARGET; data->blocked = 0; if (random_integer_below(256) & 1) data->circle_rate = -data->circle_rate; @@ -502,7 +507,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { angle = fast_arc_tan(target->pos[0] - moby->pos[0], target->pos[1] - moby->pos[1]); approach_w((char *)moby, &data->turn_velocity, angle, 0.03f, 0.3f, D_0015ED6C * 6.2831855f); if (moby->anim_flags & 2) { - moby->state = 4; + moby->state = ANKLEBITER_PURSUE_TARGET; data->blocked = 0; select_hoven_anklebiter_pursuit_animation((struct Moby *)moby); } @@ -517,7 +522,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { data->look_angle = look_difference; if (move_hoven_anklebiter_toward_heading( (struct Moby *)moby, fast_add_rotations(chase_angle, data->circle_angle)) == 2) { - moby->state = 6; + moby->state = ANKLEBITER_RETURN_HOME; data->return_timer = 0; } else { if (fast_dec_timer(&data->circle_timer)) { @@ -526,7 +531,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { } fast_vec_sub(target_report_or_vector_scratch.v0, target->pos, data->home); if (vector_distance_xy(moby->pos, target->pos) < 1.5f) { - moby->state = 5; + moby->state = ANKLEBITER_MELEE_ATTACK; if (moby->anim != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(5)); } else if (fast_vec_length(target_report_or_vector_scratch.v0) < data->range + 5.5f && @@ -534,7 +539,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { if (moby->group != 255) FUN_L01_0026e090(moby->group, 1); } else if (moby->proximity != 1 && random_integer_below(9) == 0) { - moby->state = 6; + moby->state = ANKLEBITER_RETURN_HOME; data->return_timer = 0; } } @@ -565,7 +570,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { 1.0f); } if ((moby->anim_flags & 2) && vector_distance_xy(moby->pos, target->pos) >= 2.0f) { - moby->state = 4; + moby->state = ANKLEBITER_PURSUE_TARGET; data->blocked = 0; select_hoven_anklebiter_pursuit_animation((struct Moby *)moby); } @@ -576,7 +581,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { (struct Moby *)moby, fast_arc_tan(data->home[0] - moby->pos[0], data->home[1] - moby->pos[1])); if (vector_distance_xy(moby->pos, data->home) < 2.0f) { - moby->state = 1; + moby->state = ANKLEBITER_IDLE; if (moby->anim != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(7)); } @@ -592,12 +597,12 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { if (data->return_timer > scale_game_frames(70)) { if (moby->group != 255) FUN_L01_0026e090(moby->group, 1); - moby->state = 4; + moby->state = ANKLEBITER_PURSUE_TARGET; data->blocked = 0; select_hoven_anklebiter_pursuit_animation((struct Moby *)moby); } } else if (moby->proximity == 1) { - moby->state = 4; + moby->state = ANKLEBITER_PURSUE_TARGET; data->blocked = 0; select_hoven_anklebiter_pursuit_animation((struct Moby *)moby); } @@ -609,7 +614,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { if (moby->group != 255) FUN_L01_0026e090(moby->group, 1); if (step_moby_motion(moby, data->fall) & 1) { - moby->state = 10; + moby->state = ANKLEBITER_RECOVER_AFTER_KNOCKBACK; if (moby->anim != 13) blend_moby_animation(moby, 13, 8, scale_game_frames(8)); return; @@ -621,14 +626,14 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { break; case ANKLEBITER_CONTROLLED_MOTION_UNTIL_RETURN_HOME: if (func_L00_002DDEA0_2E2EF0(moby, data->fall)) { - moby->state = 6; + moby->state = ANKLEBITER_RETURN_HOME; data->return_timer = 0; data->stuck = 0; } break; case ANKLEBITER_RECOVER_AFTER_KNOCKBACK: if (compute_interpolated_record_value(moby) > 29.0f) { - moby->state = 4; + moby->state = ANKLEBITER_PURSUE_TARGET; data->blocked = 0; select_hoven_anklebiter_pursuit_animation((struct Moby *)moby); return; @@ -640,7 +645,7 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { (compute_interpolated_record_value(moby) > 37.0f && moby->anim_end == moby->anim)) { moby->anim_rate = 0.0f; mark_moby_for_removal_cf(moby, 0, -1); - moby->state = 15; + moby->state = ANKLEBITER_DEATH_EFFECTS_AND_REMOVE; moby->flags |= 8; } else if (moby->pos[2] < 10.0f) { mark_moby_for_removal_cf(moby, 0, -1); @@ -660,7 +665,8 @@ void hoven_anklebiter_update(AnklebiterMoby *moby) { return; } } - if (moby->enabled && moby->state != 9 && moby->state != 8) { + if (moby->enabled && moby->state != ANKLEBITER_DORMANT && + moby->state != ANKLEBITER_CONTROLLED_MOTION_UNTIL_RETURN_HOME) { func_L00_00263950_2E2EF0( (char *)moby, data->collision_data, 0, D_0015ED64 * 0.018f, D_0015ED64 * 0.3f); if (moby->enabled && fast_vec_dist(moby->pos, D_L12_00167240) < 28.0f) { @@ -717,14 +723,21 @@ int move_hoven_anklebiter_toward_heading(struct Moby *moby, float speed) { int D_L12_0016183C = 0xa; int D_L12_00161840 = 8; -extern float D_L12_00161844 __attribute__((sda)); -extern float D_L12_00161848 __attribute__((sda)); -extern float D_L12_0016184C __attribute__((sda)); -extern float D_L12_00161850 __attribute__((sda)); -extern float D_L12_00161854 __attribute__((sda)); -extern float D_L12_00161858 __attribute__((sda)); -extern float D_L12_0016185C __attribute__((sda)); -extern float D_L12_00161860 __attribute__((sda)); +extern float l12_anklebiter_spark_burst_origin_jitter __asm__("D_L12_00161844") + __attribute__((sda)); +extern float l12_anklebiter_spark_position_jitter __asm__("D_L12_00161848") __attribute__((sda)); +extern float l12_anklebiter_spark_velocity_jitter_scale __asm__("D_L12_0016184C") + __attribute__((sda)); +extern float l12_anklebiter_spark_horizontal_speed_range_start __asm__("D_L12_00161850") + __attribute__((sda)); +extern float l12_anklebiter_spark_horizontal_speed_range_end __asm__("D_L12_00161854") + __attribute__((sda)); +extern float l12_anklebiter_spark_vertical_speed_range_start __asm__("D_L12_00161858") + __attribute__((sda)); +extern float l12_anklebiter_spark_vertical_speed_range_end __asm__("D_L12_0016185C") + __attribute__((sda)); +extern float l12_anklebiter_spark_downward_velocity_scale __asm__("D_L12_00161860") + __attribute__((sda)); extern float D_L12_00161864 __attribute__((sda)); extern float D_L12_00161868 __attribute__((sda)); int D_L12_0016186C = 0x8000eeee; @@ -733,7 +746,7 @@ int D_L12_00161874 = 0x8000ff90; int D_L12_00161878 = 0xffee; int D_L12_0016187C = 0xa; int D_L12_00161880 = 0x1e; -extern int D_L12_00161884 __attribute__((sda)); +extern int l12_anklebiter_spark_random_time_base __asm__("D_L12_00161884") __attribute__((sda)); extern void add_random_offset_to_vector_xyz(void *, float) __asm__("FUN_L00_0025f8e0"); extern float scale_time(float) __asm__("FUN_001f96b0"); extern int fast_tween_color(int, int, float) __asm__("FUN_001fa6e0"); @@ -743,13 +756,13 @@ void spawn_hoven_anklebiter_death_sparks(struct Moby *moby) __asm__("FUN_L12_002 void spawn_hoven_anklebiter_death_sparks(struct Moby *moby) { float pos[4]; - float vel[4]; - float accel[4]; + float spark_launch_velocity[4]; + float gravity_adjusted_spark_velocity[4]; float push[4]; - char *vars; + char *spark_moby_vars; int count; float *pos_ptr; - void *src; + void *moby_position_source; int i; int j; float angle; @@ -763,47 +776,52 @@ void spawn_hoven_anklebiter_death_sparks(struct Moby *moby) { int fade; count = D_L12_0016183C; - vars = (char *)moby->pvars; - if (moby->state == 15) + spark_moby_vars = (char *)moby->pvars; + if (moby->state == ANKLEBITER_DEATH_EFFECTS_AND_REMOVE) count = truncate_float_to_s32((float)count * 1.5f); for (i = 0; i < count; i++) { pos_ptr = pos; - src = &moby->pos; - qcopy_nc(pos, src); - add_random_offset_to_vector_xyz(pos_ptr, D_L12_00161844); + moby_position_source = &moby->pos; + qcopy_nc(pos, moby_position_source); + add_random_offset_to_vector_xyz(pos_ptr, l12_anklebiter_spark_burst_origin_jitter); pos[2] += 0.55f; angle = random_angle_radians(); - speed = random_float_between(D_L12_00161850, D_L12_00161854); - rise = random_float_between(D_L12_00161858, D_L12_0016185C); - if (moby->state == 15) { + speed = random_float_between(l12_anklebiter_spark_horizontal_speed_range_start, + l12_anklebiter_spark_horizontal_speed_range_end); + rise = random_float_between(l12_anklebiter_spark_vertical_speed_range_start, + l12_anklebiter_spark_vertical_speed_range_end); + if (moby->state == ANKLEBITER_DEATH_EFFECTS_AND_REMOVE) { speed *= 0.55f; rise *= 0.55f; pos[2] -= 0.2f; } - vel[0] = fast_cos(angle) * (speed * D_0015ED6C); - vel[1] = fast_sin(angle) * (speed * D_0015ED6C); - vel[2] = 0.0f + rise * D_0015ED6C; - fast_vec_scale(push, vars + 0x120, 0.5f); + spark_launch_velocity[0] = fast_cos(angle) * (speed * D_0015ED6C); + spark_launch_velocity[1] = fast_sin(angle) * (speed * D_0015ED6C); + spark_launch_velocity[2] = 0.0f + rise * D_0015ED6C; + fast_vec_scale(push, spark_moby_vars + 0x120, 0.5f); push[2] = 0.0f; - fast_vec_add(vel, vel, push); - qcopy(accel, vel); - accel[2] -= D_L12_00161860 * D_0015ED70 * (float)scale_game_frames(D_L12_00161880); + fast_vec_add(spark_launch_velocity, spark_launch_velocity, push); + qcopy(gravity_adjusted_spark_velocity, spark_launch_velocity); + gravity_adjusted_spark_velocity[2] -= l12_anklebiter_spark_downward_velocity_scale * + D_0015ED70 * (float)scale_game_frames(D_L12_00161880); for (j = 0; j < D_L12_00161840; j++) { size = random_float_between(0.5f, 1.5f); - vel[3] = size * D_L12_00161864; - accel[3] = size * D_L12_00161868; - add_random_offset_to_vector_xyz(pos, D_L12_00161848); - add_random_offset_to_vector_xyz(accel, D_L12_0016184C * D_0015ED6C); + spark_launch_velocity[3] = size * D_L12_00161864; + gravity_adjusted_spark_velocity[3] = size * D_L12_00161868; + add_random_offset_to_vector_xyz(pos, l12_anklebiter_spark_position_jitter); + add_random_offset_to_vector_xyz(gravity_adjusted_spark_velocity, + l12_anklebiter_spark_velocity_jitter_scale * + D_0015ED6C); start_color = fast_tween_color(D_L12_0016186C, D_L12_00161874, random_float_between(0.0f, 1.0f)); end_color = fast_tween_color(D_L12_00161870, D_L12_00161878, random_float_between(0.0f, 1.0f)); life = scale_game_frames(D_L12_0016187C); fade = scale_game_frames(D_L12_00161880); - time_base = (float)D_L12_00161884; + time_base = (float)l12_anklebiter_spark_random_time_base; spawn_spark(pos, - vel, - accel, + spark_launch_velocity, + gravity_adjusted_spark_velocity, start_color, end_color, life, @@ -889,14 +907,15 @@ void process_hoven_anklebiter_damage_and_alerts(struct Moby *moby) { anklebiter_vars->reset_alert = 0; anklebiter_vars->alert_timer = scale_game_frames(0xF0); } - if (moby->state != 9 && moby->state != 0xB && moby->state != 0) { + if (moby->state != ANKLEBITER_DORMANT && moby->state != ANKLEBITER_WAIT_FOR_LEAP_TRIGGER && + moby->state != ANKLEBITER_INITIALIZE) { if (fast_dec_timer(&anklebiter_vars->alert_timer)) { anklebiter_vars->speed = 12.0f; } else { anklebiter_vars->speed = 20.0f; } } - if (anklebiter_vars->call_enabled != 0 && moby->state != 9) { + if (anklebiter_vars->call_enabled != 0 && moby->state != ANKLEBITER_DORMANT) { s16 updated_call_timer = ++anklebiter_vars->call_timer; if (scale_game_frames(0x3C) * 15 < updated_call_timer && moby->visible == 0 && moby->group < 0xFF && count_active_moby_group_members(moby->group, -1) >= 4 && @@ -913,7 +932,8 @@ void process_hoven_anklebiter_damage_and_alerts(struct Moby *moby) { coll = find_hit_e3528(moby, 0x330000, 0); dmg = 0.0f; resolve_moby_hit_response(moby, coll, &anklebiter_vars->health, 0, &hit, &dmg, 0, 4); - if (coll != 0 && moby->state != 0x63 && moby->state != 8) { + if (coll != 0 && moby->state != ANKLEBITER_DEATH_FALL && + moby->state != ANKLEBITER_CONTROLLED_MOTION_UNTIL_RETURN_HOME) { if (moby->group != 0xFF) { FUN_L01_0026e090(moby->group, 7); } @@ -940,7 +960,7 @@ void process_hoven_anklebiter_damage_and_alerts(struct Moby *moby) { start_fall_e3528(moby, anklebiter_vars->fall, 6, 1, 0, angle); anklebiter_vars->unk170 = 11.0f; anklebiter_vars->unk174 = 18.0f; - moby->state = 0x63; + moby->state = ANKLEBITER_DEATH_FALL; anklebiter_vars->unk117 = 0x78; anim_reset_e3528(moby, anklebiter_vars->anim); } else { @@ -951,7 +971,7 @@ void process_hoven_anklebiter_damage_and_alerts(struct Moby *moby) { &anklebiter_vars->unk13C); start_fall_e3528(moby, anklebiter_vars->fall, 0xE, 1, 0, unused); anklebiter_vars->unk174 = anklebiter_vars->unk170 = -1.0f; - moby->state = 7; + moby->state = ANKLEBITER_KNOCKBACK_FALL; anklebiter_vars->unk117 = 0xFA; anklebiter_vars->stun_timer = scale_game_frames(0x3C); anim_reset_e3528(moby, anklebiter_vars->anim); diff --git a/src/overlays/l12/mobys/hoven_turret.c b/src/overlays/l12/mobys/hoven_turret.c index 250a5fa55a..9e6ed614c5 100644 --- a/src/overlays/l12/mobys/hoven_turret.c +++ b/src/overlays/l12/mobys/hoven_turret.c @@ -159,32 +159,32 @@ extern int D_L12_00161F20 MACRO_ADDR; extern int D_L12_00161F24 MACRO_ADDR; extern int random_int_between(int, int) __asm__("FUN_L00_00257b90"); extern int hero_set_state(int, int) __asm__("FUN_L12_002400d0"); -extern void FUN_L00_001fff28(void *, int, float); -extern void hero_respawn(void) __asm__("FUN_L00_00211250"); -extern void set_race_camera(void *, void *, int, int) __asm__("FUN_L00_00216f90"); -extern void moby_point_position(void *, int, void *) __asm__("FUN_L00_0024f7c8"); -extern void jet_clear_persistent(int) __asm__("FUN_L00_002502a0"); -extern void spawn_explosion(void *, - void *, - void *, - float, - float, - int, - int, - int, - float, - float, - float, - int, - float, - float, - int, - int, - int, - int) __asm__("FUN_L00_0025e450"); -extern void FUN_L00_00262cf0(void *, void *, float, float, float); -extern void start_scene(int) __asm__("FUN_L00_00298840"); -extern void queue_scene_movie_with_game_language(int) __asm__("FUN_L00_00299460"); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); +extern void hero_respawn(void) __asm__("FUN_L00_00211250"); +extern void set_race_camera(void *, void *, int, int) __asm__("FUN_L00_00216f90"); +extern void moby_point_position(void *, int, void *) __asm__("FUN_L00_0024f7c8"); +extern void jet_clear_persistent(int) __asm__("FUN_L00_002502a0"); +extern void spawn_explosion(void *, + void *, + void *, + float, + float, + int, + int, + int, + float, + float, + float, + int, + float, + float, + int, + int, + int, + int) __asm__("FUN_L00_0025e450"); +extern void FUN_L00_00262cf0(void *, void *, float, float, float); +extern void start_scene(int) __asm__("FUN_L00_00298840"); +extern void queue_scene_movie_with_game_language(int) __asm__("FUN_L00_00299460"); extern void spawn_turret_rocket(void *, void *, void *, int) __asm__("FUN_L08_002e7eb0"); extern void update_hoven_turret_target_alignment_timer(void *) __asm__("FUN_L12_00303370"); extern void draw_hoven_turret_hud() __asm__("FUN_L12_00304218"); @@ -222,10 +222,10 @@ void hoven_turret_update(struct Moby *moby) { D_L12_00161F00 = 0; D_L12_00161F04 = 0; if (visited52[moby->mission + (current_level_index << 4)] == 0xFF) { - moby->state = 6; + moby->state = HOVEN_TURRET_STATE_INACTIVE; } else { attach_manipulator(moby, 0, hoven_turret_state); - moby->state = 3; + moby->state = HOVEN_TURRET_STATE_WAIT_FOR_BOARDING; hoven_turret_state->f84 = 0xC8; moby->rot.y = 0.0f; hoven_turret_state->f70 = scale_game_frames(0x1E); @@ -284,7 +284,7 @@ void hoven_turret_update(struct Moby *moby) { hoven_turret_state->f8C = 200.0f; moby->hit_slot = 0xFF; D_L12_00161F20++; - moby->state = 4; + moby->state = HOVEN_TURRET_STATE_MANNED; } } break; @@ -317,7 +317,7 @@ void hoven_turret_update(struct Moby *moby) { if (hoven_turret_state->f8C <= 0.0f) { D_L12_00161F04 = 1; hoven_turret_state->fAC = scale_game_frames(0x78); - moby->state = 7; + moby->state = HOVEN_TURRET_STATE_DESTRUCTION_EFFECTS; break; } } @@ -352,7 +352,7 @@ void hoven_turret_update(struct Moby *moby) { D_L12_00161F00 = 0; set_race_camera(cpos, crot, 0, 1); } - moby->state = 5; + moby->state = HOVEN_TURRET_STATE_START_SCENE; break; } } @@ -406,7 +406,7 @@ void hoven_turret_update(struct Moby *moby) { if (hoven_turret_state->f74 < hoven_turret_pitch_min) { hoven_turret_state->f74 = hoven_turret_pitch_min; } - FUN_L00_001fff28(hoven_turret_state->f10, 1, -hoven_turret_state->f74); + build_axis_rotation_quaternion(hoven_turret_state->f10, 1, -hoven_turret_state->f74); if (moby->anim_flags & 2) { blend_moby_animation(moby, 5, 0, 1); } @@ -527,13 +527,13 @@ void hoven_turret_update(struct Moby *moby) { case HOVEN_TURRET_STATE_START_SCENE: if (D_L12_0015F5C4_macro != 2) { start_scene(1); - moby->state = 8; + moby->state = HOVEN_TURRET_STATE_SAVE_DATA; } break; case HOVEN_TURRET_STATE_SAVE_DATA: if (D_L12_0015F5C4_macro != 2) { func_0020BFC8_304920(0, -1); - moby->state = 6; + moby->state = HOVEN_TURRET_STATE_INACTIVE; } break; case HOVEN_TURRET_STATE_INACTIVE: diff --git a/src/overlays/l12/mobys/jittered_quad_layers.c b/src/overlays/l12/mobys/jittered_quad_layers.c index f012d2a14f..10004151a3 100644 --- a/src/overlays/l12/mobys/jittered_quad_layers.c +++ b/src/overlays/l12/mobys/jittered_quad_layers.c @@ -35,6 +35,9 @@ void jittered_quad_layers_update(struct Moby *moby) { CHECK_PERSISTENT_REMOVAL = 0, QUEUE_DRAW_AND_MONITOR_LINKED_MOBY = 1 }; + enum { + DRAW_AND_MONITOR_DISABLED = 2 + }; int moby_state_snapshot = moby->state; int vis; int *moby_data = (int *)moby->pvars; @@ -45,7 +48,7 @@ void jittered_quad_layers_update(struct Moby *moby) { mark_moby_for_removal(moby); break; } - moby->state = 1; + moby->state = QUEUE_DRAW_AND_MONITOR_LINKED_MOBY; break; case QUEUE_DRAW_AND_MONITOR_LINKED_MOBY: vis = 1; @@ -74,7 +77,7 @@ void jittered_quad_layers_update(struct Moby *moby) { } FUN_0022da68(1, 0, moby); moby->collision = 0; - moby->state = 2; + moby->state = DRAW_AND_MONITOR_DISABLED; } } break; diff --git a/src/overlays/l12/mobys/lamp.c b/src/overlays/l12/mobys/lamp.c index 0c4560da7a..a1ca40c953 100644 --- a/src/overlays/l12/mobys/lamp.c +++ b/src/overlays/l12/mobys/lamp.c @@ -25,13 +25,13 @@ void lamp_update(struct Moby *lamp_moby) { struct Moby *hit_moby = find_moby_hit(lamp_moby, 0x10000, 0); switch (lamp_moby->state) { case LAMP_STATE_INITIALIZE: - lamp_moby->state = 1; + lamp_moby->state = LAMP_STATE_WAIT_FOR_HIT; break; case LAMP_STATE_WAIT_FOR_HIT: if (hit_moby != 0 && hit_moby->scale > 0.0f) hit = 1; if (hit) - lamp_moby->state = 2; + lamp_moby->state = LAMP_STATE_REMOVE; break; case LAMP_STATE_REMOVE: allocate_voice_for_target_entry(0, 0, (int)lamp_moby); diff --git a/src/overlays/l12/mobys/miner.c b/src/overlays/l12/mobys/miner.c index c41fb8a0a9..af82c7e908 100644 --- a/src/overlays/l12/mobys/miner.c +++ b/src/overlays/l12/mobys/miner.c @@ -90,7 +90,7 @@ void miner_update(L16WatchMoby *moby) { mark_moby_for_removal(moby); return; } - moby->state = 1; + moby->state = MINER_UPDATE_DIALOGUE; initialize_npc_dialogue(moby, &moby_data->activation); initialize_moby_grounding(moby); break; @@ -98,7 +98,7 @@ void miner_update(L16WatchMoby *moby) { if (alternate_item_available[1] == 0 && update_npc_dialogue(moby, &moby_data->activation)) { begin_dialogue_camera_transition(moby, 2.5f); *(int *)((char *)moby + 0x58) = 0; - moby->state = 2; + moby->state = MINER_APPLY_DIALOGUE_COMPLETION; } break; case MINER_APPLY_DIALOGUE_COMPLETION: @@ -113,7 +113,7 @@ void miner_update(L16WatchMoby *moby) { jet_reset_camera(p + 0x30, p + 0x70); } memcard_save_data(0, -1); - moby->state = 1; + moby->state = MINER_UPDATE_DIALOGUE; } } rate = 0.02f; diff --git a/src/overlays/l12/mobys/oscillating_target_link.c b/src/overlays/l12/mobys/oscillating_target_link.c index 421b0e2748..0869768f61 100644 --- a/src/overlays/l12/mobys/oscillating_target_link.c +++ b/src/overlays/l12/mobys/oscillating_target_link.c @@ -289,7 +289,7 @@ void oscillating_target_link_update(Moby *moby) { oscillating_target_link_state->f2308 = 0x17; oscillating_target_link_state->f230C = 0x22; oscillating_target_link_state->f2300 = 0; - moby->state = 1; + moby->state = TARGET_TRACKING_STATE_ACTIVE; break; case TARGET_TRACKING_STATE_ACTIVE: moby->rot.z = diff --git a/src/overlays/l12/mobys/planetbuster_maximus_part.c b/src/overlays/l12/mobys/planetbuster_maximus_part.c index 5fb63c50c9..09a8430e07 100644 --- a/src/overlays/l12/mobys/planetbuster_maximus_part.c +++ b/src/overlays/l12/mobys/planetbuster_maximus_part.c @@ -26,6 +26,14 @@ #include "rnc/overlay/shared/mobys/capture_linked_moby_relative_transforms.h" #include "rnc/overlay/shared/world/level_path.h" +enum { + PLANETBUSTER_INITIALIZE_LINKED_PARTS = 0, + PLANETBUSTER_WAIT_FOR_PATH_TRIGGER = 1, + PLANETBUSTER_FOLLOW_PATH = 2, + PLANETBUSTER_POST_PATH_GUN_UPDATE = 3, + PLANETBUSTER_DROP_PARTS_AND_TRANSITION = 4 +}; + typedef struct Moby Moby; extern float D_0015ED6C; @@ -63,10 +71,11 @@ extern float spring_angle(void *, float, void *, int, float, float, float) __asm__("FUN_L00_0025bc98"); extern int D_L12_00161F20 MACRO_ADDR; extern int D_L12_00161F24 MACRO_ADDR; -extern int D_L12_00161F34 __attribute__((sda)); -extern int planetbuster_maximus_gun_part_slots[] __asm__("D_L12_001FB670"); -extern int D_L12_001FB688[]; -extern int FUN_L00_001fefc8(void *); +extern int l12_planetbuster_maximus_proximity_fire_counter __asm__("D_L12_00161F34") + __attribute__((sda)); +extern int planetbuster_maximus_gun_part_slots[] __asm__("D_L12_001FB670"); +extern int D_L12_001FB688[]; +extern int FUN_L00_001fefc8(void *); extern void * spawn_blarg_trooper_projectile(void *, void *, void *, int) __asm__("FUN_L04_002aee30"); extern void spawn_effect(void *, void *, int, int, int, int, int, int) __asm__("FUN_L00_00269958"); @@ -157,13 +166,13 @@ void update_planetbuster_maximus_guns(char *moby) { hp = (float *)(((char *)&hero) + 0x80); owner_to_hero_distance_xy = vector_distance_xy(moby + 0x10, hp); dz = absolute_float(hp[2] - MOBY(moby)->pos.z); - if (scale_game_frames(0x4B0) < D_L12_00161F34) { + if (scale_game_frames(0x4B0) < l12_planetbuster_maximus_proximity_fire_counter) { if (owner_to_hero_distance_xy < 80.0f && dz < 4.0f) { flag = 1; } } if (owner_to_hero_distance_xy > 90.0f || dz > 7.0f) { - D_L12_00161F34 = 0; + l12_planetbuster_maximus_proximity_fire_counter = 0; } if ((D_L12_00161F00_gp != 0 || flag) && md->f80 > 0.0f) { fast_dec_timer_s16(&md->h98); @@ -280,7 +289,7 @@ void update_planetbuster_maximus_guns(char *moby) { } } if (D_L12_00161F00_gp == 0) { - D_L12_00161F34 = scale_game_frames(0xFA0); + l12_planetbuster_maximus_proximity_fire_counter = scale_game_frames(0xFA0); goto done; } md->w84 = scale_game_frames(0x14); @@ -396,7 +405,7 @@ void update_planetbuster_maximus_guns(char *moby) { update_planetbuster_maximus_detached_parts(moby); if (*(short *)(owner_data + 0x5FC) <= 0 && D_L12_00161F04_gp == 0) { D_L12_00161F24 = 1; - MOBY(moby)->state = 4; + MOBY(moby)->state = PLANETBUSTER_DROP_PARTS_AND_TRANSITION; MOBY(moby)->command = 0; } } @@ -680,13 +689,6 @@ typedef struct PlanetbusterMaximusVars { /* Moby class 1274 */ void planetbuster_maximus_part_update(char *moby) { - enum { - PLANETBUSTER_INITIALIZE_LINKED_PARTS = 0, - PLANETBUSTER_WAIT_FOR_PATH_TRIGGER = 1, - PLANETBUSTER_FOLLOW_PATH = 2, - PLANETBUSTER_POST_PATH_GUN_UPDATE = 3, - PLANETBUSTER_DROP_PARTS_AND_TRANSITION = 4 - }; enum { PLANETBUSTER_TRANSITION_SETUP = 0, PLANETBUSTER_TRANSITION_INTERPOLATE = 1, @@ -736,7 +738,7 @@ void planetbuster_maximus_part_update(char *moby) { D_L12_001FB688[j] = 0; moby_data->unk604 = -1; moby_data->unk5FC = 100; - MOBY(moby)->state = 1; + MOBY(moby)->state = PLANETBUSTER_WAIT_FOR_PATH_TRIGGER; } break; case PLANETBUSTER_WAIT_FOR_PATH_TRIGGER: { @@ -802,7 +804,7 @@ void planetbuster_maximus_part_update(char *moby) { ((unsigned char *)D_L12_0015FFD8_gp + (*(int *)((u8 *)moby_data + k * 0x30 + 0x20) << 8))[0xA4] = 0xFF; } - MOBY(moby)->state = 2; + MOBY(moby)->state = PLANETBUSTER_FOLLOW_PATH; } break; } @@ -827,7 +829,7 @@ void planetbuster_maximus_part_update(char *moby) { } else { approach_value(&moby_data->unk5F0, 0.0f, frame_time_sq_macro * 8.0f); if (moby_data->unk5F0 == 0.0f) { - MOBY(moby)->state = 3; + MOBY(moby)->state = PLANETBUSTER_POST_PATH_GUN_UPDATE; break; } } @@ -862,7 +864,7 @@ void planetbuster_maximus_part_update(char *moby) { break; } case PLANETBUSTER_POST_PATH_GUN_UPDATE: - D_L12_00161F34++; + l12_planetbuster_maximus_proximity_fire_counter++; spring_angle(moby + 0x48, 3.0543261f, &moby_data->unk5F4, @@ -977,7 +979,8 @@ void planetbuster_maximus_part_update(char *moby) { break; } update_planetbuster_maximus_glow_color(moby); - if ((unsigned char)MOBY(moby)->state >= 1 && (unsigned char)MOBY(moby)->state <= 3) { + if ((unsigned char)MOBY(moby)->state >= PLANETBUSTER_WAIT_FOR_PATH_TRIGGER && + (unsigned char)MOBY(moby)->state <= PLANETBUSTER_POST_PATH_GUN_UPDATE) { if (moby_data->unk604 == -1) moby_data->unk604 = allocate_voice_for_target_entry(0, 4, moby); } else { diff --git a/src/overlays/l12/mobys/platform.c b/src/overlays/l12/mobys/platform.c index 60e3b06794..436bb60782 100644 --- a/src/overlays/l12/mobys/platform.c +++ b/src/overlays/l12/mobys/platform.c @@ -284,6 +284,9 @@ void platform_update(Moby *moby) { PLATFORM_KIND_DISABLE_DRAWING_AND_COLLISION = 3, PLATFORM_KIND_TRACK_REFERENCED_MOBY_HEIGHT = 4 }; + enum { + PLATFORM_DRAWING_AND_COLLISION_DISABLED = 1 + }; float oldPos[4]; float oldRot[4]; float delta[4]; @@ -295,12 +298,12 @@ void platform_update(Moby *moby) { platform_vars = (*(Data_2E51E8 **)&moby->pvars); qcopy(oldPos, (*(float(*)[4]) & moby->pos)); qcopy(oldRot, (*(float(*)[4]) & moby->rot)); - if (moby->state != 0 && platform_vars->fFC != -1 && + if (moby->state != PLATFORM_INITIALIZE && platform_vars->fFC != -1 && (signed char)(*(Moby **)&D_L12_0015FFD8_p)[platform_vars->fFC].state >= 0) { emit_platform_exhaust_effects((char *)moby); return; } - if (moby->state != 0 && platform_vars->fDC != -1 && + if (moby->state != PLATFORM_INITIALIZE && platform_vars->fDC != -1 && count_active_moby_group_members(platform_vars->fDC, -1) != 0) { emit_platform_exhaust_effects((char *)moby); return; @@ -319,7 +322,7 @@ void platform_update(Moby *moby) { platform_vars->fD4 = 6.0f; platform_vars->f3E |= 9; clear_u64_value(platform_vars->vel); - moby->state = 7; + moby->state = PLATFORM_FOLLOW_WAYPOINTS; break; case PLATFORM_KIND_OSCILLATE_BETWEEN_PATH_ENDPOINTS: (*(int *)&moby->collision) = (*(Class_2E51E8 **)&moby->pclass)->f10; @@ -333,7 +336,7 @@ void platform_update(Moby *moby) { platform_vars->fD8 = random_angle_radians(); platform_vars->f3E |= 9; clear_u64_value(platform_vars->vel); - moby->state = 2; + moby->state = PLATFORM_OSCILLATE_BETWEEN_PATH_ENDPOINTS; break; case PLATFORM_KIND_OSCILLATE_BETWEEN_PATH_ENDPOINTS_FIXED_PITCH: (*(int *)&moby->collision) = (*(Class_2E51E8 **)&moby->pclass)->f10; @@ -347,15 +350,15 @@ void platform_update(Moby *moby) { if (platform_vars->fD0 == 0.0f) platform_vars->fD0 = 8.0f; clear_u64_value(platform_vars->vel); - moby->state = 4; + moby->state = PLATFORM_OSCILLATE_BETWEEN_PATH_ENDPOINTS_FIXED_PITCH; break; case PLATFORM_KIND_DISABLE_DRAWING_AND_COLLISION: moby->draw_dist = 0; - moby->state = 1; + moby->state = PLATFORM_DRAWING_AND_COLLISION_DISABLED; (*(int *)&moby->collision) = 0; break; case PLATFORM_KIND_TRACK_REFERENCED_MOBY_HEIGHT: - moby->state = 9; + moby->state = PLATFORM_TRACK_REFERENCED_MOBY_HEIGHT; platform_vars->fD4 = 4.0f; platform_vars->fD0 = 4.0f; platform_vars->f3E &= 0xFFFE; @@ -443,7 +446,7 @@ void platform_update(Moby *moby) { } else { platform_vars->walk.dir = 1; } - moby->state = 2; + moby->state = PLATFORM_OSCILLATE_BETWEEN_PATH_ENDPOINTS; } if (is_hero_on_moby(moby)) { compute_platform_target_tilt((char *)moby, angles, 1); @@ -460,7 +463,7 @@ void platform_update(Moby *moby) { } else { platform_vars->walk.dir = 1; } - moby->state = 4; + moby->state = PLATFORM_OSCILLATE_BETWEEN_PATH_ENDPOINTS_FIXED_PITCH; } if (platform_vars->walk.dir == 2) { emit_platform_exhaust_effects((char *)moby); @@ -512,7 +515,7 @@ void platform_update(Moby *moby) { if (platform_vars->walk.path != 0 && vector_distance_xy((*(float(*)[4]) & moby->pos), &platform_vars->walk.path->nodes[0]) < 0.5f) { - moby->state = 0; + moby->state = PLATFORM_INITIALIZE; } if ((*(float(*)[4]) & moby->pos)[2] < 0.0f) { mark_moby_for_removal(moby); diff --git a/src/overlays/l12/mobys/rocket.c b/src/overlays/l12/mobys/rocket.c index 83113a4f48..d298ad6154 100644 --- a/src/overlays/l12/mobys/rocket.c +++ b/src/overlays/l12/mobys/rocket.c @@ -19,6 +19,11 @@ #include "qcopy.h" +enum { + ROCKET_STATE_FLYING = 1, + ROCKET_STATE_DETONATE = 2 +}; + extern float fast_cos(float); extern float fast_sin(float); @@ -50,7 +55,7 @@ char *spawn_rocket(char *initial_velocity, moby->update_dist = 0xFF; moby->draw_dist = 0x7E; moby->visible = 1; - moby->state = 1; + moby->state = ROCKET_STATE_FLYING; qcopy(&moby->pos, pos); qcopy(rocket_vars, initial_velocity); moby->rot.z = fast_arc_tan(*(float *)rocket_vars, *(float *)(rocket_vars + 4)); @@ -115,10 +120,6 @@ void rocket_update(struct Moby *moby) __asm__("FUN_L12_002ece00"); /* Moby classes 409, 435 */ void rocket_update(struct Moby *moby) { - enum { - ROCKET_STATE_FLYING = 1, - ROCKET_STATE_DETONATE = 2 - }; ShotVars *rocket_state = (ShotVars *)moby->pvars; float old_pos[4]; float side[4]; @@ -130,7 +131,7 @@ void rocket_update(struct Moby *moby) { char *touch = find_moby_hit(moby, 0x230000, 0); int damage; if (touch != 0 && *(struct Moby **)(touch + 0x20) != rocket_state->owner) { - moby->state = 2; + moby->state = ROCKET_STATE_DETONATE; break; } if (current_level_index == 12 && camera_secondary_mode[0] == 50 && @@ -140,7 +141,7 @@ void rocket_update(struct Moby *moby) { return; } if (rocket_state->owner->state < 2) { - moby->state = 2; + moby->state = ROCKET_STATE_DETONATE; break; } } @@ -185,10 +186,10 @@ void rocket_update(struct Moby *moby) { hit.oclass = moby->oclass; record_moby_hit(D_L12_001742C0_lui.moby, &hit); } - moby->state = 2; + moby->state = ROCKET_STATE_DETONATE; } if (fast_dec_timer(&rocket_state->timer)) { - moby->state = 2; + moby->state = ROCKET_STATE_DETONATE; } break; } diff --git a/src/overlays/l12/mobys/scrolling_texture_layers.c b/src/overlays/l12/mobys/scrolling_texture_layers.c index 3f9f585487..e73cbfda21 100644 --- a/src/overlays/l12/mobys/scrolling_texture_layers.c +++ b/src/overlays/l12/mobys/scrolling_texture_layers.c @@ -2601,7 +2601,7 @@ void scrolling_texture_layers_update(M_bff0 *moby) { 1); hoven_scrolling_color_tables_initialized_gp = 1; } - moby->state = 1; + moby->state = UPDATE_SCROLL_PHASES_AND_QUEUE_DRAW; moby->b30 = 0xFF; moby->h32 = 0xFF; for (i = 0; i < 2; i++) { diff --git a/src/overlays/l12/mobys/water_reservoir.c b/src/overlays/l12/mobys/water_reservoir.c index 75833ce057..78af1fb49c 100644 --- a/src/overlays/l12/mobys/water_reservoir.c +++ b/src/overlays/l12/mobys/water_reservoir.c @@ -45,18 +45,22 @@ void water_reservoir_update(struct Moby *moby) __asm__("FUN_L12_002ec720"); /* Moby class 384 */ void water_reservoir_update(struct Moby *moby) { + enum { + WATER_RESERVOIR_STATE_INITIALIZE = 0, + WATER_RESERVOIR_STATE_ACTIVE = 1 + }; float *reservoir_state = (float *)moby->pvars; float pos[4], offset0[4], offset1[4], pos_offset_delta[4], offset_pair_delta[4]; float fraction, frame_scale; int scaled; - if (moby->state != 0) { + if (moby->state != WATER_RESERVOIR_STATE_INITIALIZE) { extern float D_L12_0015F3FC __attribute__((sda)); frame_scale = D_L12_0015F3FC; - if (moby->state == 1) + if (moby->state == WATER_RESERVOIR_STATE_ACTIVE) goto active; goto update; } - moby->state = 1; + moby->state = WATER_RESERVOIR_STATE_ACTIVE; moby->command = 2; reservoir_state[0] = random_angle_radians(); reservoir_state[2] = 5.0f; diff --git a/src/overlays/l12/mobys/water_tile.c b/src/overlays/l12/mobys/water_tile.c index 9271750606..a6f47af78e 100644 --- a/src/overlays/l12/mobys/water_tile.c +++ b/src/overlays/l12/mobys/water_tile.c @@ -124,12 +124,12 @@ void level_12_water_tile_update(struct Moby *moby) { ((L12Slot *)D_L12_001CBF40_c)[water_tile_vars[3]].visibility = 0xffff; pool_bind_tile(D_L12_001CBF40_c + water_tile_vars[3] * 0x1190, D_L12_001CBE00_c + water_tile_vars[3] * 16); - moby->state = 1; + moby->state = SLOT_INITIALIZE_NEIGHBORS_AND_HEIGHT; break; case SLOT_INITIALIZE_NEIGHBORS_AND_HEIGHT: next_water_tile_index_gp = 0; initialize_level_12_slot_grid_neighbors(water_tile_vars[3]); - moby->state = 2; + moby->state = SLOT_UPDATE_HEIGHT_AND_MOTION; *(float *)(water_tile_vars + 4) = moby->pos.z; break; case SLOT_UPDATE_HEIGHT_AND_MOTION: diff --git a/src/overlays/l13/level_class_tables.c b/src/overlays/l13/level_class_tables.c index a85e0ff10a..e7c1c63663 100644 --- a/src/overlays/l13/level_class_tables.c +++ b/src/overlays/l13/level_class_tables.c @@ -6,9 +6,9 @@ #include "rnc/camera/update_cam.h" #include "rnc/mobys/moby_class_tables.h" -void FUN_L00_002caf40(); +void get_morphoray_chicken_slot_record() __asm__("FUN_L00_002caf40"); void FUN_L00_002ea7a0(); -void FUN_L10_002f5f18(); +void update_path_flythrough_camera() __asm__("FUN_L10_002f5f18"); void ammocrate_update() __asm__("FUN_L13_002e1cc8"); void asteroid_update() __asm__("FUN_L13_002e1638"); void attached_rocket_update() __asm__("FUN_L13_00305a58"); @@ -172,7 +172,7 @@ void *D_L13_001F618C[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; struct MobyClassUpdate moby_classes[189] __asm__("D_L13_001F5880") @@ -383,7 +383,7 @@ struct CameraType level_camera_types[8] __asm__("D_L13_001F6200") __attribute__( update_target_tracking_camera, conditionally_set_camera_state_three }, {19, evaluate_descriptor_eligibility, initialize_path_camera, - FUN_L10_002f5f18, noop_main_callback }, + update_path_flythrough_camera, noop_main_callback }, {23, volume_camera_check, noop_main_callback, noop_main_callback, noop_main_callback}, {-1, 0, 0, 0, 0}, }; diff --git a/src/overlays/l13/mobys/asteroid.c b/src/overlays/l13/mobys/asteroid.c index 6245b8e3ba..e545a2317e 100644 --- a/src/overlays/l13/mobys/asteroid.c +++ b/src/overlays/l13/mobys/asteroid.c @@ -17,6 +17,14 @@ #include "rnc/overlay/shared/math/random/random_int_between.h" #include "rnc/sdk/libc/stdlib.h" +enum { + ASTEROID_INITIALIZE = 0, + ASTEROID_WAIT_TO_LAUNCH = 1, + ASTEROID_MOVE_AND_COLLIDE = 2, + ASTEROID_RESET_AT_HOME = 3, + ASTEROID_WAIT_TO_RESPAWN = 4 +}; + enum AsteroidSpinAxis { SPIN_AXIS_X = 0x0, SPIN_AXIS_Y = 0x1, @@ -198,7 +206,7 @@ void process_asteroid_hit(struct Moby *moby, char *blob_data, float scale_ratio) moby->collision = 0; *(short *)(blob_data + 0x4C) = scale_game_frames(0x1E); } else if (*(int *)(blob_data + 0x40) == 0) { - moby->state = 4; + moby->state = ASTEROID_WAIT_TO_RESPAWN; moby->flags |= 1; moby->collision = 0; moby->visible = 0; @@ -238,13 +246,6 @@ void asteroid_update(struct Moby *moby) __asm__("FUN_L13_002e1638"); /* Moby classes 212, 1412 */ void asteroid_update(struct Moby *moby) { - enum { - ASTEROID_INITIALIZE = 0, - ASTEROID_WAIT_TO_LAUNCH = 1, - ASTEROID_MOVE_AND_COLLIDE = 2, - ASTEROID_RESET_AT_HOME = 3, - ASTEROID_WAIT_TO_RESPAWN = 4 - }; struct BlobVars *asteroid_vars = (struct BlobVars *)moby->pvars; f32 distance = fast_vec_dist(&moby->pos, &hero_pos); f32 size; @@ -261,14 +262,14 @@ void asteroid_update(struct Moby *moby) { if (moby->scale < moby->pclass->scale) { moby->unk72 = 0; } - moby->state = 3; + moby->state = ASTEROID_RESET_AT_HOME; break; case ASTEROID_WAIT_TO_LAUNCH: if (hero.state.current == 0x32 && hero.ship_moby != 0 && hero.ship_moby->oclass == 0x45 && (moby->visible != 0 || distance < 40.0f)) { fast_vec_normalize( asteroid_vars, asteroid_vars->dir, random_float_between(1.0f, 10.0f) * frame_time); - moby->state = 2; + moby->state = ASTEROID_MOVE_AND_COLLIDE; } break; case ASTEROID_MOVE_AND_COLLIDE: @@ -311,7 +312,7 @@ void asteroid_update(struct Moby *moby) { mark_moby_for_removal(moby); return; } - moby->state = 4; + moby->state = ASTEROID_WAIT_TO_RESPAWN; moby->collision = 0; moby->flags |= 1; moby->visible = 0; @@ -353,7 +354,7 @@ void asteroid_update(struct Moby *moby) { if (moby->pclass->scale < moby->scale) { moby->unk72 = 100; } - moby->state = 1; + moby->state = ASTEROID_WAIT_TO_LAUNCH; break; case ASTEROID_WAIT_TO_RESPAWN: if (fast_bsphere_check(&asteroid_vars->home, moby->draw_dist) < 0) { @@ -361,7 +362,7 @@ void asteroid_update(struct Moby *moby) { moby->collision = moby->pclass->collision; moby->visible = 1; moby->flags &= ~1; - moby->state = 3; + moby->state = ASTEROID_RESET_AT_HOME; } break; } diff --git a/src/overlays/l13/mobys/attached_rocket.c b/src/overlays/l13/mobys/attached_rocket.c index a8cd8c8964..85a31c5df0 100644 --- a/src/overlays/l13/mobys/attached_rocket.c +++ b/src/overlays/l13/mobys/attached_rocket.c @@ -64,6 +64,9 @@ void launch_attached_rocket(struct Moby *moby, int distance_reference_moby, float max_travel_distance) { + enum { + ATTACHED_ROCKET_STATE_FLIGHT = 0 + }; AttachedRocketVars *moby_vars = (AttachedRocketVars *)moby->pvars; char *source_moby = (char *)moby_vars->unk20; char *mp; @@ -77,7 +80,7 @@ void launch_attached_rocket(struct Moby *moby, qcopy(&moby_vars->unk10, mp); qcopy(moby_vars, pos); moby_vars->unk2C = distance_reference_moby; - moby->state = 0; + moby->state = ATTACHED_ROCKET_STATE_FLIGHT; moby->flags &= 0xFFFE; moby->collision = moby->pclass->collision; update_entity(moby); @@ -113,6 +116,13 @@ void spawn_attached_rocket_explosion(struct Moby *moby) __asm__("FUN_L13_003060b /* Moby class 1233 */ void attached_rocket_update(struct Moby *moby) { + enum { + ATTACHED_ROCKET_STATE_ATTACHED = 1 + }; + enum { + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xfd, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xfe + }; AttachedRocketVars *attached_rocket_vars = (AttachedRocketVars *)moby->pvars; struct Moby *source; struct Moby *target; @@ -130,9 +140,11 @@ void attached_rocket_update(struct Moby *moby) { float other_distance; qcopy(&work.old_pos, &moby->pos); - if (moby->state == 1) { + if (moby->state == ATTACHED_ROCKET_STATE_ATTACHED) { source = attached_rocket_vars->unk20; - if (source == 0 || source->oclass != 0x65 || source->state == 0xfe || source->state == 0xfd) + if (source == 0 || source->oclass != 0x65 || + source->state == MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END || + source->state == MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) goto remove; qcopy(&moby->rot, &source->rot); *(OvlQuad *)&moby->rot_row0 = *(OvlQuad *)&source->rot_row0; @@ -142,8 +154,8 @@ void attached_rocket_update(struct Moby *moby) { qcopy(&attached_rocket_vars->unk10, &moby->pos); { struct Moby *source = attached_rocket_vars->unk20; - if (source != 0 && source->state != 0xfe && source->state != 0xfd && - (source->flags & 1)) + if (source != 0 && source->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + source->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END && (source->flags & 1)) moby->flags |= 1; else moby->flags &= 0xfffe; diff --git a/src/overlays/l13/mobys/blarg_gunner.c b/src/overlays/l13/mobys/blarg_gunner.c index 3bab8a52dd..3334794589 100644 --- a/src/overlays/l13/mobys/blarg_gunner.c +++ b/src/overlays/l13/mobys/blarg_gunner.c @@ -9,6 +9,12 @@ #include "rnc/overlay/shared/mobys/find_moby_hit.h" #include "rnc/overlay/shared/mobys/moby_point_position.h" +enum { + BLARG_GUNNER_STATE_INITIALIZE = 0, + BLARG_GUNNER_STATE_ACTIVE = 1, + BLARG_GUNNER_STATE_DESTROY = 2 +}; + #ifndef NOT_SDA #define NOT_SDA __attribute__((section(".data"))) #endif @@ -77,7 +83,7 @@ struct Moby *spawn_blarg_turret_child(struct Moby *parent) { child_moby->draw_dist = child_vars->parent->draw_dist; child_moby->visible = 1; child_moby->flags |= 0x20; - child_moby->state = 0; + child_moby->state = BLARG_GUNNER_STATE_INITIALIZE; child_moby->command = 0; qcopy(&child_moby->pos, &child_vars->parent->pos); child_moby->scale = child_moby->pclass->scale * parent->scale / parent->pclass->scale; @@ -112,7 +118,7 @@ void process_blarg_gunner_hits(struct Moby *moby, char *moby_vars) { char *hit_record; int k; int hit_reaction_result; - if (moby->state != 2) { + if (moby->state != BLARG_GUNNER_STATE_DESTROY) { hit_record = find_moby_hit(moby, 0x330000, 0); hit_reaction_result = hit_reaction(moby, hit_record, tm, 0, &k, 0, 0, 4); if (hit_record != 0) { @@ -172,7 +178,7 @@ void process_blarg_gunner_hits(struct Moby *moby, char *moby_vars) { trooper_anim_update(moby, (short *)(moby_vars + 0x60)); if (moby->prev_seq != 3) blend_moby_animation(moby, 3, 1, 0); - moby->state = 2; + moby->state = BLARG_GUNNER_STATE_DESTROY; } else { *tm = current_health - hit_damage; *(unsigned char *)(moby_vars + 0x67) = 0xFA; @@ -212,18 +218,13 @@ void blarg_gunner_update(struct Moby *moby) __asm__("FUN_L13_002b4c80"); /* Moby class 36 */ void blarg_gunner_update(struct Moby *moby) { - enum { - BLARG_GUNNER_STATE_INITIALIZE = 0, - BLARG_GUNNER_STATE_ACTIVE = 1, - BLARG_GUNNER_STATE_DESTROY = 2 - }; unsigned char *moby_vars = moby->pvars; float explosion_offset[4]; float explosion_spawn_position[4]; switch (moby->state) { case BLARG_GUNNER_STATE_INITIALIZE: moby_vars[0x29] = 1; - moby->state = 1; + moby->state = BLARG_GUNNER_STATE_ACTIVE; moby_vars[0x5A] = 6; moby_vars[0x58] = 8; break; diff --git a/src/overlays/l13/mobys/blarg_ship.c b/src/overlays/l13/mobys/blarg_ship.c index 29b703b5cb..9fec650888 100644 --- a/src/overlays/l13/mobys/blarg_ship.c +++ b/src/overlays/l13/mobys/blarg_ship.c @@ -73,13 +73,13 @@ void blarg_ship_update(struct Moby *moby) { resolve_moby_hit_response(moby, hit, blarg_ship_vars + 0x20, 0, hit_buffer, 0, 0, 4); switch (moby->state) { case BLARG_SHIP_ENTER_DAMAGE_HANDLING: - moby->state = 1; + moby->state = BLARG_SHIP_HANDLE_DAMAGE; break; case BLARG_SHIP_HANDLE_DAMAGE: if (hit != 0) { float cost = *(float *)((char *)hit + 0x2c); if (*(float *)(blarg_ship_vars + 0x20) < cost) { - moby->state = 2; + moby->state = BLARG_SHIP_EXPLODE; } else { ((unsigned char *)blarg_ship_vars)[0x67] = 0xfa; *(float *)(blarg_ship_vars + 0x20) -= cost; diff --git a/src/overlays/l13/mobys/blarg_space_commando.c b/src/overlays/l13/mobys/blarg_space_commando.c index f7a065a698..d4e1dcb889 100644 --- a/src/overlays/l13/mobys/blarg_space_commando.c +++ b/src/overlays/l13/mobys/blarg_space_commando.c @@ -23,6 +23,26 @@ #include "rnc/rendering/vu1_registers.h" #include "rnc/rendering/effect_texture.h" +enum { + BLARG_SPACE_COMMANDO_INITIALIZE = 0, + BLARG_SPACE_COMMANDO_FACE_TARGET_AND_SELECT_ACTION = 1, + BLARG_SPACE_COMMANDO_ENTER_ACTION_SELECTION_AFTER_ANIMATION = 2, + BLARG_SPACE_COMMANDO_SELECT_ACTION_AFTER_ANIMATION = 3, + BLARG_SPACE_COMMANDO_FACE_TARGET_AND_WAIT_FOR_TIMER = 4, + BLARG_SPACE_COMMANDO_FACE_TARGET_AND_PROBE_DURING_ANIMATION = 5, + BLARG_SPACE_COMMANDO_RESUME_SAVED_STATE_AFTER_ANIMATION = 6, + BLARG_SPACE_COMMANDO_APPROACH_TARGET_WITH_TURN_OFFSET = 7, + BLARG_SPACE_COMMANDO_APPROACH_TARGET_UNTIL_BLOCKED_OR_NEAR = 11, + BLARG_SPACE_COMMANDO_PROBE_DURING_ANIMATION_THEN_RESUME_APPROACH = 12, + BLARG_SPACE_COMMANDO_RETURN_HOME = 13, + BLARG_SPACE_COMMANDO_KNOCKBACK = 15, + BLARG_SPACE_COMMANDO_DYING = 16 +}; + +enum { + HIT_STATUS_SKIP_DAMAGE_PROCESSING = 1 +}; + extern void mark_moby_for_removal(void *) __asm__("FUN_0020c828"); extern CollisionHit coll_hit_1638 __asm__("D_L13_00174140"); @@ -171,21 +191,6 @@ void blarg_space_commando_update(struct Moby *moby) __asm__("FUN_L13_00307e98"); /* Moby class 1262 */ void blarg_space_commando_update(struct Moby *moby) { - enum { - BLARG_SPACE_COMMANDO_INITIALIZE = 0, - BLARG_SPACE_COMMANDO_FACE_TARGET_AND_SELECT_ACTION = 1, - BLARG_SPACE_COMMANDO_ENTER_ACTION_SELECTION_AFTER_ANIMATION = 2, - BLARG_SPACE_COMMANDO_SELECT_ACTION_AFTER_ANIMATION = 3, - BLARG_SPACE_COMMANDO_FACE_TARGET_AND_WAIT_FOR_TIMER = 4, - BLARG_SPACE_COMMANDO_FACE_TARGET_AND_PROBE_DURING_ANIMATION = 5, - BLARG_SPACE_COMMANDO_RESUME_SAVED_STATE_AFTER_ANIMATION = 6, - BLARG_SPACE_COMMANDO_APPROACH_TARGET_WITH_TURN_OFFSET = 7, - BLARG_SPACE_COMMANDO_APPROACH_TARGET_UNTIL_BLOCKED_OR_NEAR = 11, - BLARG_SPACE_COMMANDO_PROBE_DURING_ANIMATION_THEN_RESUME_APPROACH = 12, - BLARG_SPACE_COMMANDO_RETURN_HOME = 13, - BLARG_SPACE_COMMANDO_KNOCKBACK = 15, - BLARG_SPACE_COMMANDO_DYING = 16 - }; Vars_309330 *blarg_space_commando_vars = (Vars_309330 *)moby->pvars; struct Moby *target; Vec4 point; @@ -221,7 +226,7 @@ void blarg_space_commando_update(struct Moby *moby) { random_float_between(0.95f, 1.05f); qcopy(&blarg_space_commando_vars->home, &moby->pos); moby_point_position(moby, 0, &blarg_space_commando_vars->unk1E0); - moby->state = 1; + moby->state = BLARG_SPACE_COMMANDO_FACE_TARGET_AND_SELECT_ACTION; break; case BLARG_SPACE_COMMANDO_FACE_TARGET_AND_SELECT_ACTION: approach_angle(&moby->rot.z, @@ -237,24 +242,24 @@ void blarg_space_commando_update(struct Moby *moby) { moby->rot.z, fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y)) < 0.2617994f) { - moby->state = 2; + moby->state = BLARG_SPACE_COMMANDO_ENTER_ACTION_SELECTION_AFTER_ANIMATION; if (moby->prev_seq != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } } else { - moby->state = 7; + moby->state = BLARG_SPACE_COMMANDO_APPROACH_TARGET_WITH_TURN_OFFSET; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(20)); } } } else { - moby->state = 5; + moby->state = BLARG_SPACE_COMMANDO_FACE_TARGET_AND_PROBE_DURING_ANIMATION; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } } } else if (blarg_space_commando_vars->unk184 != 0) { - moby->state = 11; + moby->state = BLARG_SPACE_COMMANDO_APPROACH_TARGET_UNTIL_BLOCKED_OR_NEAR; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(20)); } @@ -262,7 +267,7 @@ void blarg_space_commando_update(struct Moby *moby) { break; case BLARG_SPACE_COMMANDO_ENTER_ACTION_SELECTION_AFTER_ANIMATION: if (moby->anim_flags & 2) { - moby->state = 3; + moby->state = BLARG_SPACE_COMMANDO_SELECT_ACTION_AFTER_ANIMATION; FUN_L13_00309370_c((char *)moby); if (moby->prev_seq != 5) { blend_moby_animation(moby, 5, 0, scale_game_frames(10)); @@ -273,14 +278,14 @@ void blarg_space_commando_update(struct Moby *moby) { if (moby->anim_flags & 2) { f32 dist = vector_distance_xy(&moby->pos, &target->pos); if (blarg_space_commando_vars->unk164 != 2 && dist < 15.0f) { - moby->state = 4; + moby->state = BLARG_SPACE_COMMANDO_FACE_TARGET_AND_WAIT_FOR_TIMER; if (moby->prev_seq != 4) { blend_moby_animation(moby, 4, 0, scale_game_frames(20)); } blarg_space_commando_vars->timer = scale_game_frames(blarg_space_commando_face_target_wait_frames); } else { - moby->state = 1; + moby->state = BLARG_SPACE_COMMANDO_FACE_TARGET_AND_SELECT_ACTION; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(20)); } @@ -295,7 +300,7 @@ void blarg_space_commando_update(struct Moby *moby) { frame_time_sq * 6.2831855f, frame_time * 3.1415927f); if (fast_dec_timer(&blarg_space_commando_vars->timer) != 0) { - moby->state = 3; + moby->state = BLARG_SPACE_COMMANDO_SELECT_ACTION_AFTER_ANIMATION; FUN_L13_00309370_c((char *)moby); if (moby->prev_seq != 5) { blend_moby_animation(moby, 5, 0, scale_game_frames(5)); @@ -303,12 +308,12 @@ void blarg_space_commando_update(struct Moby *moby) { } else if (vector_distance_xy(&moby->pos, &target->pos) < l13_blarg_space_commando_probe_trigger_distance_xy) { moby_point_position(moby, 0, &blarg_space_commando_vars->unk1E0); - moby->state = 5; + moby->state = BLARG_SPACE_COMMANDO_FACE_TARGET_AND_PROBE_DURING_ANIMATION; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } } else if (blarg_space_commando_vars->unk184 != 0) { - moby->state = 11; + moby->state = BLARG_SPACE_COMMANDO_APPROACH_TARGET_UNTIL_BLOCKED_OR_NEAR; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(20)); } @@ -341,7 +346,7 @@ void blarg_space_commando_update(struct Moby *moby) { } qcopy(&blarg_space_commando_vars->unk1E0, &point); if (moby->anim_flags & 2) { - moby->state = 6; + moby->state = BLARG_SPACE_COMMANDO_RESUME_SAVED_STATE_AFTER_ANIMATION; moby->command = 1; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(10)); @@ -385,17 +390,17 @@ void blarg_space_commando_update(struct Moby *moby) { { f32 dist = vector_distance_xy(&moby->pos, &target->pos); if (dist < 15.0f) { - moby->state = 2; + moby->state = BLARG_SPACE_COMMANDO_ENTER_ACTION_SELECTION_AFTER_ANIMATION; if (moby->prev_seq != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } } else if (path_blocked != 0) { - moby->state = 2; + moby->state = BLARG_SPACE_COMMANDO_ENTER_ACTION_SELECTION_AFTER_ANIMATION; if (moby->prev_seq != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } } else if (dist < l13_blarg_space_commando_probe_trigger_distance_xy) { - moby->state = 5; + moby->state = BLARG_SPACE_COMMANDO_FACE_TARGET_AND_PROBE_DURING_ANIMATION; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } @@ -423,16 +428,16 @@ void blarg_space_commando_update(struct Moby *moby) { blocked = 1; } if (blarg_space_commando_vars->unk184 == 0) { - moby->state = 13; + moby->state = BLARG_SPACE_COMMANDO_RETURN_HOME; } else if (blocked != 0) { - moby->state = 12; + moby->state = BLARG_SPACE_COMMANDO_PROBE_DURING_ANIMATION_THEN_RESUME_APPROACH; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } } else if (vector_distance_xy(&moby->pos, &target->pos) < l13_blarg_space_commando_probe_trigger_distance_xy) { moby_point_position(moby, 0, &blarg_space_commando_vars->unk1E0); - moby->state = 12; + moby->state = BLARG_SPACE_COMMANDO_PROBE_DURING_ANIMATION_THEN_RESUME_APPROACH; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } @@ -459,7 +464,7 @@ void blarg_space_commando_update(struct Moby *moby) { } qcopy(&blarg_space_commando_vars->unk1E0, &point); if (moby->anim_flags & 2) { - moby->state = 11; + moby->state = BLARG_SPACE_COMMANDO_APPROACH_TARGET_UNTIL_BLOCKED_OR_NEAR; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(20)); } @@ -485,7 +490,7 @@ void blarg_space_commando_update(struct Moby *moby) { blarg_space_commando_vars->path, &moby->pos, &moby->pos, 0.75f); } if (fast_vec_dist(&blarg_space_commando_vars->home, &moby->pos) < 1.0f) { - moby->state = 1; + moby->state = BLARG_SPACE_COMMANDO_FACE_TARGET_AND_SELECT_ACTION; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(20)); } @@ -495,7 +500,7 @@ void blarg_space_commando_update(struct Moby *moby) { hit = step_moby_motion(moby, &blarg_space_commando_vars->vel); if (hit & 0x40) { qzero(&blarg_space_commando_vars->vel); - moby->state = 1; + moby->state = BLARG_SPACE_COMMANDO_FACE_TARGET_AND_SELECT_ACTION; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -609,6 +614,9 @@ void update_blarg_space_commando_damage_targeting_and_ground_motion(struct Moby GROUND_MATERIAL_KILLS_WALKER_WITH_EXPLOSION = 11, GROUND_MATERIAL_EXPLODES_WALKER = 13 }; + enum { + TARGET_MODE_NO_ELIGIBLE_TARGET = 2 + }; struct WalkerVars_8d10 *blarg_space_commando_private_data = (struct WalkerVars_8d10 *)moby->pvars; char *hit; @@ -631,7 +639,7 @@ void update_blarg_space_commando_damage_targeting_and_ground_motion(struct Moby hit = find_moby_hit(moby, 0x330000, 0); code = resolve_moby_hit_response( moby, hit, &blarg_space_commando_private_data->health, 0, &kind, &damage, 0, 4); - if (kind != 1 && moby->state != 0x10) { + if (kind != HIT_STATUS_SKIP_DAMAGE_PROCESSING && moby->state != BLARG_SPACE_COMMANDO_DYING) { if (hit != 0 && *(struct Moby **)(hit + 0x20) != 0 && (*(struct Moby **)(hit + 0x20))->oclass == 0x4EE) { damage = 0.0f; @@ -654,7 +662,7 @@ void update_blarg_space_commando_damage_targeting_and_ground_motion(struct Moby case 8: case 9: case 10: - moby->state = 0xF; + moby->state = BLARG_SPACE_COMMANDO_KNOCKBACK; blarg_space_commando_private_data->stun_timer = scale_game_frames(0x3C); blarg_space_commando_private_data->knock_up = blarg_space_commando_stun_horizontal_knockback_speed * frame_time; @@ -672,7 +680,7 @@ void update_blarg_space_commando_damage_targeting_and_ground_motion(struct Moby break; case HIT_RESULT_DEATH: case HIT_RESULT_DYING_KNOCKBACK: - moby->state = 0x10; + moby->state = BLARG_SPACE_COMMANDO_DYING; moby->flags &= ~0x1000; blarg_space_commando_private_data->knock_up = blarg_space_commando_dying_horizontal_knockback_speed * frame_time; @@ -711,12 +719,12 @@ void update_blarg_space_commando_damage_targeting_and_ground_motion(struct Moby vector_distance_xy(&blarg_space_commando_private_data->home, &blarg_space_commando_private_data->target) || absolute_float(moby->pos.z - blarg_space_commando_private_data->target.z) > 3.0f) { - blarg_space_commando_private_data->mode = 2; + blarg_space_commando_private_data->mode = TARGET_MODE_NO_ELIGIBLE_TARGET; } if (blarg_space_commando_private_data->target_moby != -1 && is_point_inside_clip_volume(&blarg_space_commando_private_data->target, blarg_space_commando_private_data->target_moby) == 0) { - blarg_space_commando_private_data->mode = 2; + blarg_space_commando_private_data->mode = TARGET_MODE_NO_ELIGIBLE_TARGET; } else { blarg_space_commando_private_data->target_moby = -1; } @@ -756,7 +764,7 @@ void update_blarg_space_commando_damage_targeting_and_ground_motion(struct Moby mark_moby_for_removal(moby); return; default: - if (moby->state < 0xF) { + if (moby->state < BLARG_SPACE_COMMANDO_KNOCKBACK) { if (fast_arc_tan(coll_hit_1638.normal_z, vector_length_xy(&coll_hit_1638.normal_x)) > 0.6981317f) { fast_vec_normalize(&push, &coll_hit_1638.normal_x, 0.05f); @@ -776,7 +784,7 @@ void update_blarg_space_commando_damage_targeting_and_ground_motion(struct Moby break; } } else { - if (moby->state < 0xF) { + if (moby->state < BLARG_SPACE_COMMANDO_KNOCKBACK) { blarg_space_commando_private_data->fall_speed -= frame_time_sq * 9.8f; moby->pos.z += blarg_space_commando_private_data->fall_speed; } diff --git a/src/overlays/l13/mobys/blarg_space_fighter.c b/src/overlays/l13/mobys/blarg_space_fighter.c index 8b9f1d0727..e22358b057 100644 --- a/src/overlays/l13/mobys/blarg_space_fighter.c +++ b/src/overlays/l13/mobys/blarg_space_fighter.c @@ -14,6 +14,18 @@ #include "rnc/overlay/shared/rendering/effects/spawn_explosion.h" #include "rnc/sdk/libc/stdlib.h" +enum { + FIGHTER_INITIALIZE = 0, + FIGHTER_WAIT_TO_JOIN_PATH = 1, + FIGHTER_FOLLOW_PATH_AND_ATTACK = 2, + FIGHTER_EMIT_DESTRUCTION_EFFECTS = 3, + FIGHTER_WAIT_TO_REINITIALIZE = 4 +}; + +enum { + HIT_PROCESSING_DAMAGE_THRESHOLD = 2 +}; + extern char *find_moby_hit(void *, int, int) __asm__("FUN_L00_0025a420"); extern char D_0013F350[]; @@ -83,7 +95,7 @@ void process_blarg_space_fighter_damage(struct Moby *moby, unsigned char *moby_d HIT_REACTION_HIGH_INTERPOLATION_TARGET_ALTERNATE = 10, HIT_REACTION_NO_HIT = 11 }; - if (moby->state != 3) { + if (moby->state != FIGHTER_EMIT_DESTRUCTION_EFFECTS) { int hit_processing_status; float hit_position_offset[4]; char *hit_record = find_moby_hit(moby, 0x330000, 0); @@ -104,13 +116,13 @@ void process_blarg_space_fighter_damage(struct Moby *moby, unsigned char *moby_d case HIT_REACTION_NO_HIT: break; } - if (hit_processing_status >= 2) { + if (hit_processing_status >= HIT_PROCESSING_DAMAGE_THRESHOLD) { if (*fp <= *(float *)(hit_record + 0x2C)) { *fp = 0; moby->flags &= 0xEFFF; moby_data[0x67] = 0x78; trooper_anim_update(moby, (short *)(moby_data + 0x60)); - moby->state = 3; + moby->state = FIGHTER_EMIT_DESTRUCTION_EFFECTS; } else { *fp = *fp - *(float *)(hit_record + 0x2C); moby_data[0x67] = 0xFA; @@ -523,13 +535,6 @@ void blarg_space_fighter_update(Moby_2C56B0 *moby) __asm__("FUN_L13_002c4428"); /* Moby class 111 */ void blarg_space_fighter_update(Moby_2C56B0 *moby) { - enum { - FIGHTER_INITIALIZE = 0, - FIGHTER_WAIT_TO_JOIN_PATH = 1, - FIGHTER_FOLLOW_PATH_AND_ATTACK = 2, - FIGHTER_EMIT_DESTRUCTION_EFFECTS = 3, - FIGHTER_WAIT_TO_REINITIALIZE = 4 - }; enum { FIGHTER_ATTACK_WAIT_TO_FIRE = 0, FIGHTER_ATTACK_FIRE = 1, @@ -547,6 +552,10 @@ void blarg_space_fighter_update(Moby_2C56B0 *moby) { FIGHTER_DESTRUCTION_SKIP_SPAWN_ALTERNATE = 8, FIGHTER_DESTRUCTION_SKIP_SPAWN_SECOND_ALTERNATE = 9 }; + enum { + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xFD, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xFE + }; Data_2C56B0 *fighter_data; Moby_2C56B0 *veh; Veh *vehd = 0; @@ -585,7 +594,7 @@ void blarg_space_fighter_update(Moby_2C56B0 *moby) { fighter_data->fA8 = scale_game_frames(0x14) + 5; moby->b30 = 0xFF; moby->h32 = 0xFF; - moby->state = 1; + moby->state = FIGHTER_WAIT_TO_JOIN_PATH; moby->bBC = 0; moby->flags = (moby->flags | 1) & 0xEFFF; moby->f94 = 0; @@ -596,7 +605,8 @@ void blarg_space_fighter_update(Moby_2C56B0 *moby) { Moby_2C56B0 *p; if (fighter_data->fBC == -1 || (p = (Moby_2C56B0 *)(D_L13_0015FFD8 + (fighter_data->fBC << 8))) == 0 || - p->state == 0xFE || p->state == 0xFD || p->bBC == 4) { + p->state == MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END || + p->state == MOBY_STATE_REMOVAL_BELOW_INSTANCE_END || p->bBC == 4) { fast_vec_normalize(scratch_vector, D_L13_001670C0 + 0x84, 40.0f); fast_vec_sub(scratch_vector, D_L13_001670C0, scratch_vector); fighter_data->hB6 = fighter_data->hB4 = @@ -606,7 +616,7 @@ void blarg_space_fighter_update(Moby_2C56B0 *moby) { moby->f94 = moby->cls->f10; moby->b31 = 1; moby->flags = (moby->flags & 0xFFFE) | 0x1000; - moby->state = 2; + moby->state = FIGHTER_FOLLOW_PATH_AND_ATTACK; } break; } @@ -617,7 +627,8 @@ void blarg_space_fighter_update(Moby_2C56B0 *moby) { FUN_L13_002c37e0_c( (unsigned char *)moby, (unsigned char *)fighter_data, &fighter_data->f20); - if (veh != 0 && veh->state != 0xFE && veh->state != 0xFD) { + if (veh != 0 && veh->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + veh->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { vehd = veh->data; qcopy(hpos, &((Hero_2C56B0 *)(((char *)&D_0013F350)))->veh->pos); close = 0; @@ -640,13 +651,15 @@ void blarg_space_fighter_update(Moby_2C56B0 *moby) { bossd = 0; if (fighter_data->fBC != -1) { Moby_2C56B0 *p = (Moby_2C56B0 *)(D_L13_0015FFD8 + (fighter_data->fBC << 8)); - if (p != 0 && p->state != 0xFE && p->state != 0xFD) { + if (p != 0 && p->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + p->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { boss = p; bossd = p->data; } } - if (boss == 0 || boss->state == 0xFE || boss->state == 0xFD || boss->state == 1) { - moby->state = 4; + if (boss == 0 || boss->state == MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END || + boss->state == MOBY_STATE_REMOVAL_BELOW_INSTANCE_END || boss->state == 1) { + moby->state = FIGHTER_WAIT_TO_REINITIALIZE; moby->f94 = 0; moby->flags = (moby->flags | 0x41) & 0xEFFF; return; @@ -804,7 +817,8 @@ void blarg_space_fighter_update(Moby_2C56B0 *moby) { bossd = 0; if (fighter_data->fBC != -1) { Moby_2C56B0 *p = (Moby_2C56B0 *)(D_L13_0015FFD8 + (fighter_data->fBC << 8)); - if (p != 0 && p->state != 0xFE && p->state != 0xFD) { + if (p != 0 && p->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + p->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { boss = p; bossd = p->data; } @@ -814,7 +828,7 @@ void blarg_space_fighter_update(Moby_2C56B0 *moby) { bossd->b10E--; } } - moby->state = 4; + moby->state = FIGHTER_WAIT_TO_REINITIALIZE; moby->f94 = 0; moby->flags = (moby->flags | 0x41) & 0xEFFF; break; @@ -823,9 +837,10 @@ void blarg_space_fighter_update(Moby_2C56B0 *moby) { Moby_2C56B0 *p; if (fighter_data->fBC != -1 && (p = (Moby_2C56B0 *)(D_L13_0015FFD8 + (fighter_data->fBC << 8))) != 0 && - p->state != 0xFE && p->state != 0xFD && p->bBC != 4) { + p->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + p->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END && p->bBC != 4) { fighter_data->f20 = fighter_data->h24; - moby->state = 0; + moby->state = FIGHTER_INITIALIZE; } break; } diff --git a/src/overlays/l13/mobys/blarg_turret.c b/src/overlays/l13/mobys/blarg_turret.c index f43486cd17..13bdcc705c 100644 --- a/src/overlays/l13/mobys/blarg_turret.c +++ b/src/overlays/l13/mobys/blarg_turret.c @@ -16,6 +16,14 @@ #include "rnc/overlay/shared/math/random/random_vector.h" #include "rnc/overlay/l13/mobys/blarg_turret_globals.h" +enum { + BLARG_TURRET_STATE_INITIALIZE = 0, + BLARG_TURRET_STATE_WAIT_FOR_TARGET = 1, + BLARG_TURRET_STATE_TRACK_TARGET = 3, + BLARG_TURRET_STATE_DESTROY = 4, + BLARG_TURRET_STATE_DESTRUCTION_DELAY = 5 +}; + #ifndef NOT_SDA #define NOT_SDA __attribute__((section(".data"))) #endif @@ -108,13 +116,6 @@ void blarg_turret_update(Moby_2B5368 *m) __asm__("FUN_L13_002b41b8"); /* Moby class 29 */ void blarg_turret_update(Moby_2B5368 *turret_moby) { - enum { - BLARG_TURRET_STATE_INITIALIZE = 0, - BLARG_TURRET_STATE_WAIT_FOR_TARGET = 1, - BLARG_TURRET_STATE_TRACK_TARGET = 3, - BLARG_TURRET_STATE_DESTROY = 4, - BLARG_TURRET_STATE_DESTRUCTION_DELAY = 5 - }; Data *data = turret_moby->data; Moby_2B5368 *target_moby; Moby_2B5368 *gun; @@ -133,7 +134,7 @@ void blarg_turret_update(Moby_2B5368 *turret_moby) { if (turret_moby->b53 != 0) { blend_moby_animation(turret_moby, 0, 0, 10); } - turret_moby->state = 1; + turret_moby->state = BLARG_TURRET_STATE_WAIT_FOR_TARGET; break; case BLARG_TURRET_STATE_WAIT_FOR_TARGET: target_yaw_scratch = @@ -150,7 +151,7 @@ void blarg_turret_update(Moby_2B5368 *turret_moby) { blend_moby_animation( turret_moby, 1, animation_start_frame, random_int_between(7, 13)); } - turret_moby->state = 3; + turret_moby->state = BLARG_TURRET_STATE_TRACK_TARGET; } approach_angle(&turret_moby->rot.z, data->f54, @@ -165,7 +166,7 @@ void blarg_turret_update(Moby_2B5368 *turret_moby) { blend_moby_animation(turret_moby, 0, 0, random_int_between(7, 13)); } data->f64 = 1.0f; - turret_moby->state = 5; + turret_moby->state = BLARG_TURRET_STATE_DESTRUCTION_DELAY; } break; case BLARG_TURRET_STATE_TRACK_TARGET: @@ -180,7 +181,7 @@ void blarg_turret_update(Moby_2B5368 *turret_moby) { if (turret_moby->b53 != 0) { blend_moby_animation(turret_moby, 0, 0, random_int_between(7, 13)); } - turret_moby->state = 1; + turret_moby->state = BLARG_TURRET_STATE_WAIT_FOR_TARGET; } else { float yaw_offset_limit_radians; approach_value(&data->f68, 20.0f, frame_time * 6.0f); @@ -209,7 +210,7 @@ void blarg_turret_update(Moby_2B5368 *turret_moby) { blend_moby_animation(turret_moby, 0, 0, random_int_between(7, 13)); } data->f64 = 1.0f; - turret_moby->state = 5; + turret_moby->state = BLARG_TURRET_STATE_DESTRUCTION_DELAY; } } break; @@ -247,7 +248,7 @@ void blarg_turret_update(Moby_2B5368 *turret_moby) { frame_time * 25.132742f); data->f64 -= 1.0f; if (data->f64 <= 0.0f) { - turret_moby->state = 4; + turret_moby->state = BLARG_TURRET_STATE_DESTROY; } break; } @@ -302,7 +303,7 @@ void update_blarg_turret_target_and_state(struct Moby *moby) __asm__("FUN_L13_00 void update_blarg_turret_target_and_state(struct Moby *moby) { char *turret_vars = (char *)moby->pvars; float distance; - if (moby->state == 3) + if (moby->state == BLARG_TURRET_STATE_TRACK_TARGET) distance = 22.0f; else distance = 20.0f; diff --git a/src/overlays/l13/mobys/controller_linked_gate.c b/src/overlays/l13/mobys/controller_linked_gate.c index fb9a9477ec..25c160f14f 100644 --- a/src/overlays/l13/mobys/controller_linked_gate.c +++ b/src/overlays/l13/mobys/controller_linked_gate.c @@ -70,12 +70,12 @@ void controller_linked_gate_update(struct Moby *moby) { moby->flags |= 0xA08; if (gate_data->unk18 == 0) { gate_data->unk10 = 1.0f; - moby->state = 1; + moby->state = GATE_STATE_OPEN; moby->collision = moby->pclass->collision; moby->alpha = 0x14; } else { gate_data->unk10 = 0.0f; - moby->state = 3; + moby->state = GATE_STATE_CLOSED; moby->collision = 0; moby->alpha = 0; } @@ -83,18 +83,18 @@ void controller_linked_gate_update(struct Moby *moby) { case GATE_STATE_OPEN: if (close) { moby->collision = 0; - moby->state = 2; + moby->state = GATE_STATE_CLOSING; } break; case GATE_STATE_CLOSING: if (open) { - moby->state = 4; + moby->state = GATE_STATE_OPENING; moby->collision = moby->pclass->collision; } gate_data->unk10 -= frame_scale * 0.05f; if (gate_data->unk10 < 0.0f) { gate_data->unk10 = 0.0f; - moby->state = 3; + moby->state = GATE_STATE_CLOSED; moby->collision = 0; moby->visible = 0; moby->flags |= 1; @@ -102,7 +102,7 @@ void controller_linked_gate_update(struct Moby *moby) { break; case GATE_STATE_CLOSED: if (open) { - moby->state = 4; + moby->state = GATE_STATE_OPENING; moby->collision = moby->pclass->collision; moby->visible = 1; moby->flags &= 0xFFFE; @@ -111,12 +111,12 @@ void controller_linked_gate_update(struct Moby *moby) { case GATE_STATE_OPENING: if (close) { moby->collision = 0; - moby->state = 2; + moby->state = GATE_STATE_CLOSING; } gate_data->unk10 += frame_scale * 0.05f; if (1.0f < gate_data->unk10) { gate_data->unk10 = 1.0f; - moby->state = 1; + moby->state = GATE_STATE_OPEN; moby->collision = moby->pclass->collision; } break; diff --git a/src/overlays/l13/mobys/cutscene_camera_target.c b/src/overlays/l13/mobys/cutscene_camera_target.c index af99719429..d4e2f47ad2 100644 --- a/src/overlays/l13/mobys/cutscene_camera_target.c +++ b/src/overlays/l13/mobys/cutscene_camera_target.c @@ -26,7 +26,7 @@ void cutscene_camera_target_update(struct Moby *moby) { switch (moby->state) { case INITIALIZE_UPDATE_DISTANCE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = UPDATE_CUTSCENE_CAMERA_TARGET; break; case UPDATE_CUTSCENE_CAMERA_TARGET: if (D_L13_0015F5C4 == 2 && l13_cutscene_target_effect_controller.state == 2) { diff --git a/src/overlays/l13/mobys/elevator.c b/src/overlays/l13/mobys/elevator.c index 26bd3148ff..a9acf8ffe7 100644 --- a/src/overlays/l13/mobys/elevator.c +++ b/src/overlays/l13/mobys/elevator.c @@ -10,6 +10,17 @@ #include "rnc/overlay/shared/audio/voices/voice_is_playing.h" #include "rnc/overlay/shared/hero/hero_set_state.h" +enum { + ELEVATOR_STATE_INITIALIZE = 0, + ELEVATOR_STATE_BLEND_CAMERA = 1, + ELEVATOR_STATE_MOVE_TO_TOP = 2, + ELEVATOR_STATE_MOVE_TO_BOTTOM = 3, + ELEVATOR_STATE_WAIT_AT_TOP = 4, + ELEVATOR_STATE_WAIT_AT_BOTTOM = 5, + ELEVATOR_STATE_WAIT_FOR_HERO_EXIT_AT_TOP = 6, + ELEVATOR_STATE_WAIT_FOR_HERO_EXIT_AT_BOTTOM = 7 +}; + #ifndef NOT_SDA #define NOT_SDA __attribute__((section(".data"))) #endif @@ -56,16 +67,6 @@ void elevator_update(struct Moby *moby) __asm__("FUN_L13_002b39e0"); /* Moby classes 21, 244 */ void elevator_update(struct Moby *moby) { - enum { - ELEVATOR_STATE_INITIALIZE = 0, - ELEVATOR_STATE_BLEND_CAMERA = 1, - ELEVATOR_STATE_MOVE_TO_TOP = 2, - ELEVATOR_STATE_MOVE_TO_BOTTOM = 3, - ELEVATOR_STATE_WAIT_AT_TOP = 4, - ELEVATOR_STATE_WAIT_AT_BOTTOM = 5, - ELEVATOR_STATE_WAIT_FOR_HERO_EXIT_AT_TOP = 6, - ELEVATOR_STATE_WAIT_FOR_HERO_EXIT_AT_BOTTOM = 7 - }; LiftVars *elevator_vars = (LiftVars *)moby->pvars; float delta[4]; float rot[4]; @@ -79,7 +80,7 @@ void elevator_update(struct Moby *moby) { case ELEVATOR_STATE_INITIALIZE: elevator_vars->pulse = random_angle_radians(); elevator_vars->voice = -1; - moby->state = 3; + moby->state = ELEVATOR_STATE_MOVE_TO_BOTTOM; break; case ELEVATOR_STATE_BLEND_CAMERA: { float previous_camera_blend = elevator_vars->blend; @@ -127,7 +128,7 @@ void elevator_update(struct Moby *moby) { set_camera_position(camera_position_scratch); set_camera_rotation(camera_pose_scratch); } - if (moby->state == 2) { + if (moby->state == ELEVATOR_STATE_MOVE_TO_TOP) { target = elevator_vars->top; } else { target = elevator_vars->bottom; @@ -139,10 +140,10 @@ void elevator_update(struct Moby *moby) { D_0015ED70_2b39e0 * 8.0f, frame_time * 40.0f); if (absolute_float(moby->pos.z - target) == 0.0f) { - if (moby->state == 2) { - moby->state = 6; + if (moby->state == ELEVATOR_STATE_MOVE_TO_TOP) { + moby->state = ELEVATOR_STATE_WAIT_FOR_HERO_EXIT_AT_TOP; } else { - moby->state = 7; + moby->state = ELEVATOR_STATE_WAIT_FOR_HERO_EXIT_AT_BOTTOM; } if (moby->command != 0) { hero_set_state(HERO_STATE_IDLE, 0); @@ -162,9 +163,9 @@ void elevator_update(struct Moby *moby) { u8 s = moby->state; elevator_vars->armed = 0; if (s == 7) { - moby->state = 5; + moby->state = ELEVATOR_STATE_WAIT_AT_BOTTOM; } else { - moby->state = 4; + moby->state = ELEVATOR_STATE_WAIT_AT_TOP; } } break; @@ -189,31 +190,31 @@ void elevator_update(struct Moby *moby) { if (elevator_vars->armed != 0 && hero.ground_moby == moby && hero.air_frames.s == 0 && vector_distance_xy(&hero.motion.pos, &moby->pos) < 0.5f) { moby->glow_color = 0x80208020; - if (moby->state == 5) { + if (moby->state == ELEVATOR_STATE_WAIT_AT_BOTTOM) { moby->command = 2; } else { moby->command = 3; } - moby->state = 1; + moby->state = ELEVATOR_STATE_BLEND_CAMERA; hero_set_state(0x72, 1); jet_mount(D_L13_001670C0_2b39e0, D_L13_001670C0_2b39e0 + 0x10, 1, 0, 0); elevator_vars->blend = 0.0f; - } else if (moby->state == 4) { + } else if (moby->state == ELEVATOR_STATE_WAIT_AT_TOP) { char *p = (char *)&hero.motion.pos; float d = vector_distance_xy(&moby->pos, p); if (absolute_float(*(float *)(p + 0x258) - elevator_vars->bottom) < 2.0f && d < 32.0f && d > 5.0f) { moby->command = 0; - moby->state = 3; + moby->state = ELEVATOR_STATE_MOVE_TO_BOTTOM; elevator_vars->speed = -(frame_time * 5.0f); } - } else if (moby->state == 5) { + } else if (moby->state == ELEVATOR_STATE_WAIT_AT_BOTTOM) { char *p = (char *)&hero.motion.pos; float d = vector_distance_xy(&moby->pos, p); if (absolute_float(*(float *)(p + 0x258) - elevator_vars->top) < 2.0f && d < 32.0f && d > 5.0f) { moby->command = 0; - moby->state = 2; + moby->state = ELEVATOR_STATE_MOVE_TO_TOP; elevator_vars->speed = frame_time * 5.0f; } } @@ -238,7 +239,8 @@ void compute_elevator_camera_pose(struct Moby *moby, float horizontal_offset_radius = 2.5f; float z = 1.5f; unsigned char *x; - if ((moby->command >= 2 && (moby->command & 1)) || (moby->state >= 2 && (moby->state & 1))) { + if ((moby->command >= 2 && (moby->command & 1)) || + (moby->state >= ELEVATOR_STATE_MOVE_TO_TOP && (moby->state & 1))) { camera_offset_azimuth = fast_subtract_rotations(camera_offset_azimuth, 1.5707964f); } else { camera_offset_azimuth = fast_add_rotations(camera_offset_azimuth, 1.5707964f); diff --git a/src/overlays/l13/mobys/fighter_jet.c b/src/overlays/l13/mobys/fighter_jet.c index 4e0baed8f2..853d0bb33b 100644 --- a/src/overlays/l13/mobys/fighter_jet.c +++ b/src/overlays/l13/mobys/fighter_jet.c @@ -21,6 +21,18 @@ #include "rnc/audio/voice_pool.h" #include "rnc/rendering/effect_texture.h" +enum { + FIGHTER_JET_STATE_INITIALIZE = 0, + FIGHTER_JET_STATE_WAIT_FOR_ENTRY = 1, + FIGHTER_JET_STATE_MOUNT_PLAYER = 2, + FIGHTER_JET_STATE_FLIGHT = 4, + FIGHTER_JET_STATE_EXIT_PLAYER = 5, + FIGHTER_JET_STATE_STOP_DEATH_SOUNDS = 6, + FIGHTER_JET_STATE_WAIT_FOR_DEATH_RESET = 7, + FIGHTER_JET_STATE_FORCED_EXIT = 8, + FIGHTER_JET_STATE_DELETE = 9 +}; + #ifndef NOT_SDA #define NOT_SDA __attribute__((section(".data"))) #endif @@ -113,20 +125,20 @@ short D_L13_00161418 = 0x7f00; /* Sets the state of every live moby of class id whose state is not negative. */ /* Ported from rac1-decomp (src/overlays/l13_gemlik/mobyutil_00266128.c: func_L13_00266128), where it is exact; names translated to the US level program. */ -extern char *D_L13_0015FFE0; +extern char *l13_moby_scan_inclusive_end __asm__("D_L13_0015FFE0"); void jet_group_flag(int id, int state) __asm__("FUN_L13_00265170"); void jet_group_flag(int id, int state) { char *moby = (char *)moby_base; - if ((unsigned long)D_L13_0015FFE0 >= (unsigned long)moby) { + if ((unsigned long)l13_moby_scan_inclusive_end >= (unsigned long)moby) { do { if (MOBY(moby)->oclass == id) { if (moby[0x20] >= 0) moby[0x20] = state; } moby += 0x100; - } while ((unsigned long)D_L13_0015FFE0 >= (unsigned long)moby); + } while ((unsigned long)l13_moby_scan_inclusive_end >= (unsigned long)moby); } } @@ -141,7 +153,7 @@ void jet_group_switch(short *ids, int copy_data_pointer) { char *moby; - for (moby = (char *)moby_base; moby <= D_L13_0015FFE0; moby += 0x100) { + for (moby = (char *)moby_base; moby <= l13_moby_scan_inclusive_end; moby += 0x100) { int id_index; for (id_index = 0; ids[id_index] != 0 && ids[id_index] < 0x800 && id_index < 0xE0; id_index++) { @@ -1441,7 +1453,7 @@ void update_fighter_jet_flight(void *moby_arg, void *data_arg) { camera.v.rot[2] = 0.65f; *(u128 *)camera_offsets[0] = *(u128 *)camera.v.pos; *(u128 *)camera_offsets[1] = *(u128 *)camera.v.rot; - if (moby->state == 2) { + if (moby->state == FIGHTER_JET_STATE_MOUNT_PLAYER) { jet_flight_state->camera_offset_x = camera_offsets[jet_flight_state->camera_mode][0]; jet_flight_state->camera_offset_y = camera_offsets[jet_flight_state->camera_mode][1]; jet_flight_state->camera_offset_z = camera_offsets[jet_flight_state->camera_mode][2]; @@ -1479,7 +1491,7 @@ void update_fighter_jet_flight(void *moby_arg, void *data_arg) { fast_subtract_rotations(fast_add_rotations(jet_flight_state->pitch, 0.09817477f), jet_flight_state->steer_y * (frame_scale_gp * 0.012271847f)); camera.v.rot[2] = jet_flight_state->yaw; - if (moby->state == 2) { + if (moby->state == FIGHTER_JET_STATE_MOUNT_PLAYER) { qcopy(&jet_flight_state->camera_roll, camera.v.rot); } else { spring_angle((char *)&jet_flight_state->camera_roll, @@ -1574,7 +1586,7 @@ void update_fighter_jet_flight(void *moby_arg, void *data_arg) { -1, 0); jet_flight_state->death_timer = scale_game_frames(240); - moby->state = 6; + moby->state = FIGHTER_JET_STATE_STOP_DEATH_SOUNDS; } jet_flight_state->hit_cooldown = scale_game_frames(10); } @@ -1600,7 +1612,7 @@ void update_fighter_jet_flight(void *moby_arg, void *data_arg) { 0); moby->flags |= 0x41; jet_flight_state->death_timer = scale_game_frames(240); - moby->state = 6; + moby->state = FIGHTER_JET_STATE_STOP_DEATH_SOUNDS; } } } @@ -1762,17 +1774,6 @@ void fighter_jet_update(Jet *m) __asm__("FUN_L13_002bb068"); /* Moby class 69 */ void fighter_jet_update(Jet *jet_moby) { - enum { - FIGHTER_JET_STATE_INITIALIZE = 0, - FIGHTER_JET_STATE_WAIT_FOR_ENTRY = 1, - FIGHTER_JET_STATE_MOUNT_PLAYER = 2, - FIGHTER_JET_STATE_FLIGHT = 4, - FIGHTER_JET_STATE_EXIT_PLAYER = 5, - FIGHTER_JET_STATE_STOP_DEATH_SOUNDS = 6, - FIGHTER_JET_STATE_WAIT_FOR_DEATH_RESET = 7, - FIGHTER_JET_STATE_FORCED_EXIT = 8, - FIGHTER_JET_STATE_DELETE = 9 - }; JetData *jet_data; JetVec impulse; int state, initial_state; @@ -1782,10 +1783,11 @@ void fighter_jet_update(Jet *jet_moby) { jet_data->hit_class = 0; fast_dec_timer((int *)&jet_data->timer); initial_state = jet_moby->state; - if ((unsigned int)(initial_state - 6) >= 2 && (unsigned char)initial_state != 1 && - (unsigned char)initial_state != 2) { + if ((unsigned int)(initial_state - 6) >= 2 && + (unsigned char)initial_state != FIGHTER_JET_STATE_WAIT_FOR_ENTRY && + (unsigned char)initial_state != FIGHTER_JET_STATE_MOUNT_PLAYER) { JetHit *hit = (JetHit *)find_moby_hit(jet_moby, 0x30001, 0); - if (hit && jet_moby->state == 4) { + if (hit && jet_moby->state == FIGHTER_JET_STATE_FLIGHT) { if (((JetPlayer *)(&hero))->health > hit->damage) { ((JetPlayer *)(&hero))->health -= hit->damage; if (hit->source && (unsigned int)(hit->source->class_id - 0x52) < 2) @@ -1839,7 +1841,7 @@ void fighter_jet_update(Jet *jet_moby) { 0); jet_moby->animation = 0; jet_data->death_timer = scale_game_frames(240); - jet_moby->state = 6; + jet_moby->state = FIGHTER_JET_STATE_STOP_DEATH_SOUNDS; } } } @@ -1854,7 +1856,7 @@ void fighter_jet_update(Jet *jet_moby) { JetTexture *texture_table; unsigned int palette_data; int texture_index, initialized; - jet_moby->state = 1; + jet_moby->state = FIGHTER_JET_STATE_WAIT_FOR_ENTRY; jet_data->animation_frame = 0; jet_moby->scale = jet_moby->model->scale; *(float *)((char *)jet_data + 0x20) = jet_data->angles[0]; @@ -1883,7 +1885,7 @@ void fighter_jet_update(Jet *jet_moby) { jet_data->energy = 1; if (jet_moby->persistent != 0xFF && (visited52)[jet_moby->persistent + (persistence_table_row_index << 4)] == 0xFF) - jet_moby->state = 9; + jet_moby->state = FIGHTER_JET_STATE_DELETE; if (jet_data->group_a > 0) jet_group_state(jet_data->group_a, 0, 0, 0); if (jet_data->group_b > 0) @@ -1899,7 +1901,7 @@ void fighter_jet_update(Jet *jet_moby) { short enter = 0; if (jet_moby->persistent != 0xFF && (visited52)[jet_moby->persistent + (persistence_table_row_index << 4)] == 0xFF) - jet_moby->state = 9; + jet_moby->state = FIGHTER_JET_STATE_DELETE; else if (jet_data->trigger != -1 && is_point_inside_clip_volume(D_0013F3D0, jet_data->trigger)) { jet_data->blend = 0.99f; @@ -1924,7 +1926,7 @@ void fighter_jet_update(Jet *jet_moby) { qcopy(jet_data->angles, jet_moby->rotation); jet_data->wait_timer = 1; jet_data->energy = 1; - jet_moby->state = 2; + jet_moby->state = FIGHTER_JET_STATE_MOUNT_PLAYER; jet_data->lock_index = -1; } else if (jet_data->blend != 0.0f) { approach_value(&jet_data->blend, 0.0f, frame_time * 4.0f); @@ -2002,7 +2004,7 @@ void fighter_jet_update(Jet *jet_moby) { update_fighter_jet_flight(jet_moby, jet_data); jet_camera_mode(); request_music_track(2, 4); - jet_moby->state = 4; + jet_moby->state = FIGHTER_JET_STATE_FLIGHT; } break; case FIGHTER_JET_STATE_FLIGHT: { @@ -2020,10 +2022,10 @@ void fighter_jet_update(Jet *jet_moby) { } update_fighter_jet_flight(jet_moby, jet_data); if (((JetPlayer *)(&hero))->pad160F & 1) - jet_moby->state = 5; + jet_moby->state = FIGHTER_JET_STATE_EXIT_PLAYER; if (jet_data->energy <= 0) { jet_data->wait_timer = scale_game_frames(1200); - jet_moby->state = 8; + jet_moby->state = FIGHTER_JET_STATE_FORCED_EXIT; } break; } @@ -2070,7 +2072,7 @@ void fighter_jet_update(Jet *jet_moby) { request_music_track(0, 5); jet_data->blend = 0.99f; D_L13_0015F3FC = 0.99f; - jet_moby->state = 1; + jet_moby->state = FIGHTER_JET_STATE_WAIT_FOR_ENTRY; break; case FIGHTER_JET_STATE_STOP_DEATH_SOUNDS: D_L13_0015F608 = 2; @@ -2091,7 +2093,7 @@ void fighter_jet_update(Jet *jet_moby) { } jet_data->weapon_sound = -1; } - jet_moby->state = 7; + jet_moby->state = FIGHTER_JET_STATE_WAIT_FOR_DEATH_RESET; break; case FIGHTER_JET_STATE_WAIT_FOR_DEATH_RESET: { struct MusicStreamState *transition; @@ -2123,7 +2125,7 @@ void fighter_jet_update(Jet *jet_moby) { } jet_data->weapon_sound = -1; } - jet_moby->state = 0; + jet_moby->state = FIGHTER_JET_STATE_INITIALIZE; } } } @@ -2181,7 +2183,7 @@ void fighter_jet_update(Jet *jet_moby) { jet_data->weapon_sound = -1; } jet_reset_camera((char *)&hero + 0x80, (char *)&hero + 0x90); - jet_moby->state = 9; + jet_moby->state = FIGHTER_JET_STATE_DELETE; break; case FIGHTER_JET_STATE_DELETE: mark_moby_for_removal(jet_moby); @@ -2204,10 +2206,10 @@ void fighter_jet_update(Jet *jet_moby) { if (jet_moby->position[2] > 1008.0f) jet_moby->position[2] = 1008.0f; state = jet_moby->state; - if ((unsigned char)state == 4) { + if ((unsigned char)state == FIGHTER_JET_STATE_FLIGHT) { qcopy_nc((char *)&hero + 0x80, jet_moby->position); qcopy_nc((char *)&hero + 0x90, jet_data->angles); } - if ((unsigned int)(state - 3) < 2 || (unsigned char)state == 8) + if ((unsigned int)(state - 3) < 2 || (unsigned char)state == FIGHTER_JET_STATE_FORCED_EXIT) spawn_fighter_jet_joint_particles(jet_moby, (char *)jet_data); } diff --git a/src/overlays/l13/mobys/forcefield.c b/src/overlays/l13/mobys/forcefield.c index 77e21ce7b6..ab240c60d3 100644 --- a/src/overlays/l13/mobys/forcefield.c +++ b/src/overlays/l13/mobys/forcefield.c @@ -115,7 +115,7 @@ void forcefield_update(struct Moby *moby) { int wrap_adjusted_step; switch (moby->state) { case FORCEFIELD_STATE_INITIALIZE: - moby->state = 1; + moby->state = FORCEFIELD_STATE_MONITOR_LINKED_MOBY; moby->alpha = 0x14; moby->flags |= 0xA08; forcefield_data->unkE = -1; @@ -131,11 +131,11 @@ void forcefield_update(struct Moby *moby) { (MOBY(linked_moby)->save_id & 0x1F)) & 1) { forcefield_data->unk4 = 1.0f; - moby->state = 2; + moby->state = FORCEFIELD_STATE_FADE_OUT; } } else { forcefield_data->unk4 = 1.0f; - moby->state = 2; + moby->state = FORCEFIELD_STATE_FADE_OUT; stub_printf(forcefield_missing_trigger_format, moby->oclass, ((short)moby->save_id)); } spawn_forcefield_contact_effects(moby, forcefield_data); @@ -143,7 +143,7 @@ void forcefield_update(struct Moby *moby) { case FORCEFIELD_STATE_FADE_OUT: forcefield_data->unk4 -= frame_scale * 0.05f; if (forcefield_data->unk4 < 0.0f) - moby->state = 3; + moby->state = FORCEFIELD_STATE_REMOVE; else moby->alpha = truncate_float_to_s32(forcefield_data->unk4 * 20.0f); break; diff --git a/src/overlays/l13/mobys/forcefield_tower.c b/src/overlays/l13/mobys/forcefield_tower.c index c91a6087fa..03e7798b3d 100644 --- a/src/overlays/l13/mobys/forcefield_tower.c +++ b/src/overlays/l13/mobys/forcefield_tower.c @@ -18,6 +18,12 @@ #include "rnc/overlay/shared/math/random/random_int_between.h" #include "rnc/sdk/debug.h" +enum { + TOWER_STATE_INITIALIZE = 0, + TOWER_STATE_ACTIVE = 1, + TOWER_STATE_DESTRUCTION = 2 +}; + extern char *find_moby_hit(void *, int, int) __asm__("FUN_L00_0025a420"); extern f32 random_float_between(f32, f32) __asm__("FUN_002132a8"); @@ -269,7 +275,7 @@ void process_forcefield_tower_damage(struct Moby *moby, unsigned char *moby_data int link; VoicePoolWindow *voice_slot_record; - if (moby->state != 2) { + if (moby->state != TOWER_STATE_DESTRUCTION) { hit_record = find_moby_hit(moby, 0x330000, 0); if (hit_record != 0) { DebugPrint(D_L13_001f4980, moby->oclass, fptodp(*(float *)(hit_record + 0x2c))); @@ -342,7 +348,7 @@ void process_forcefield_tower_damage(struct Moby *moby, unsigned char *moby_data } } *(int *)(moby_data + 0x70) = -1; - moby->state = 2; + moby->state = TOWER_STATE_DESTRUCTION; } else { *health -= *(float *)(hit_record + 0x2c); moby_data[0x67] = 0xfa; @@ -373,11 +379,6 @@ void forcefield_tower_update(struct Moby *moby) __asm__("FUN_L13_002cefc0"); /* Moby class 170 */ void forcefield_tower_update(struct Moby *moby) { - enum { - TOWER_STATE_INITIALIZE = 0, - TOWER_STATE_ACTIVE = 1, - TOWER_STATE_DESTRUCTION = 2 - }; enum { TOWER_DESTRUCTION_WAIT_FOR_POINT_1_EFFECT = 0, TOWER_DESTRUCTION_WAIT_FOR_POINT_2_EFFECT = 1, diff --git a/src/overlays/l13/mobys/gemlik_bobbing_pool_tile.c b/src/overlays/l13/mobys/gemlik_bobbing_pool_tile.c index 5adacc4a58..2a34af1f6a 100644 --- a/src/overlays/l13/mobys/gemlik_bobbing_pool_tile.c +++ b/src/overlays/l13/mobys/gemlik_bobbing_pool_tile.c @@ -295,7 +295,7 @@ void gemlik_bobbing_pool_tile_update(struct Moby *moby) { initialize_gemlik_pool_tile_neighbors(tile_index); } moby->draw_dist = 0; - moby->state = 1; + moby->state = BOBBING_PLATFORM_UPDATE; break; } case BOBBING_PLATFORM_UPDATE: { diff --git a/src/overlays/l13/mobys/gemlik_scene_controller.c b/src/overlays/l13/mobys/gemlik_scene_controller.c index 2e9f51ed05..f3e7bf47c6 100644 --- a/src/overlays/l13/mobys/gemlik_scene_controller.c +++ b/src/overlays/l13/mobys/gemlik_scene_controller.c @@ -59,27 +59,31 @@ void gemlik_scene_controller_update(struct Moby *moby) { WAIT_TO_REMOVE_LINKED_MOBY = 13, FINALIZE_LINKED_MOBY_CLEANUP = 14 }; + enum { + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xfd, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xfe + }; int *scene_controller_vars = (int *)moby->pvars; switch (moby->state) { case WAIT_TO_START_INITIAL_SCENE: if (D_L13_0015F5C4 == 0) - moby->state = 1; + moby->state = START_INITIAL_SCENE; break; case START_INITIAL_SCENE: if (alternate_item_available[0x64] == 0) { alternate_item_available[0x64] = 1; - moby->state = 2; + moby->state = WAIT_INITIAL_SCENE; start_scene(0); return; } - moby->state = 3; + moby->state = ENTER_CLIP_VOLUME_CHECK; break; case WAIT_INITIAL_SCENE: if (D_L13_0015F5C4 != 2) - moby->state = 3; + moby->state = ENTER_CLIP_VOLUME_CHECK; break; case ENTER_CLIP_VOLUME_CHECK: - moby->state = 4; + moby->state = CHECK_CLIP_VOLUME_FOR_SCENE; break; case CHECK_CLIP_VOLUME_FOR_SCENE: { if (alternate_item_available[0x65] == 0) { @@ -92,16 +96,16 @@ void gemlik_scene_controller_update(struct Moby *moby) { struct Moby *other = (struct Moby *)(moby_base + scene_controller_vars[5] * 0x100); other->flags |= 0x41; } - moby->state = 5; + moby->state = WAIT_CLIP_VOLUME_SCENE; start_scene(1); } else { - moby->state = 6; + moby->state = ENTER_LINKED_MOBY_REMOVAL_WAIT; goto after_state_4; set_state_4: - moby->state = 7; + moby->state = WAIT_LINKED_MOBY_REMOVAL_BEFORE_SCENE; } after_state_4: - if (moby->state != 4 && scene_controller_vars[3] != -1) { + if (moby->state != CHECK_CLIP_VOLUME_FOR_SCENE && scene_controller_vars[3] != -1) { mark_moby_for_removal((char *)(moby_base + scene_controller_vars[3] * 0x100)); } break; @@ -128,24 +132,25 @@ void gemlik_scene_controller_update(struct Moby *moby) { D_L13_0015F3FC = 0.99f; entity[0x20] = 2; } - moby->state = 6; + moby->state = ENTER_LINKED_MOBY_REMOVAL_WAIT; } break; } case ENTER_LINKED_MOBY_REMOVAL_WAIT: - moby->state = 7; + moby->state = WAIT_LINKED_MOBY_REMOVAL_BEFORE_SCENE; break; case WAIT_LINKED_MOBY_REMOVAL_BEFORE_SCENE: { char *object; if (alternate_item_available[0x66] == 0) { struct Moby *other; if (scene_controller_vars[5] == -1) { - moby->state = 13; + moby->state = WAIT_TO_REMOVE_LINKED_MOBY; break; } other = (struct Moby *)(moby_base + scene_controller_vars[5] * 0x100); - if (other != 0 && other->oclass == 0x184 && other->state != 0xfe && - other->state != 0xfd) + if (other != 0 && other->oclass == 0x184 && + other->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + other->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) return; if (scene_controller_vars[4] != -1) { struct Moby *other = (struct Moby *)(moby_base + scene_controller_vars[4] * 0x100); @@ -159,23 +164,23 @@ void gemlik_scene_controller_update(struct Moby *moby) { other->flags |= 0x41; } request_music_track(0, 5); - moby->state = 8; + moby->state = WAIT_SCENE_BEFORE_FOLLOWUP; start_scene(2); return; } - moby->state = 12; + moby->state = ENTER_LINKED_MOBY_CLEANUP_WAIT; break; } case WAIT_SCENE_BEFORE_FOLLOWUP: if (D_L13_0015F5C4 != 2) { - moby->state = 9; + moby->state = START_FOLLOWUP_SCENE; queue_scene_movie_with_game_language(14); } break; case START_FOLLOWUP_SCENE: if (D_L13_0015F5C4 != 2) { start_scene(3); - moby->state = 10; + moby->state = WAIT_FOLLOWUP_SCENE; } break; case WAIT_FOLLOWUP_SCENE: { @@ -195,24 +200,26 @@ void gemlik_scene_controller_update(struct Moby *moby) { D_0013E030.unk78 = 2.77f; } D_L13_0015F404 = 0; - moby->state = 11; + moby->state = WAIT_LINKED_MOBY_REMOVAL_BEFORE_SAVE; } break; } case WAIT_LINKED_MOBY_REMOVAL_BEFORE_SAVE: { if (scene_controller_vars[4] != -1) { struct Moby *other = (struct Moby *)(moby_base + scene_controller_vars[4] * 0x100); - if (other != 0 && other->oclass == 0x45 && other->state != 0xfe && other->state != 0xfd) + if (other != 0 && other->oclass == 0x45 && + other->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + other->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) return; memcard_save_data(0, -1); - moby->state = 12; + moby->state = ENTER_LINKED_MOBY_CLEANUP_WAIT; return; } - moby->state = 12; + moby->state = ENTER_LINKED_MOBY_CLEANUP_WAIT; break; } case ENTER_LINKED_MOBY_CLEANUP_WAIT: - moby->state = 13; + moby->state = WAIT_TO_REMOVE_LINKED_MOBY; break; case WAIT_TO_REMOVE_LINKED_MOBY: if (scene_controller_vars[4] != -1) { @@ -220,7 +227,7 @@ void gemlik_scene_controller_update(struct Moby *moby) { 0xb0)] == 0xff) { if (scene_controller_vars[8] != -1) mark_moby_for_removal((char *)(moby_base + scene_controller_vars[8] * 0x100)); - moby->state = 14; + moby->state = FINALIZE_LINKED_MOBY_CLEANUP; } } else { mark_moby_for_removal(moby); diff --git a/src/overlays/l13/mobys/homing_rocket.c b/src/overlays/l13/mobys/homing_rocket.c index dd32ddf0e9..6dcd83e3de 100644 --- a/src/overlays/l13/mobys/homing_rocket.c +++ b/src/overlays/l13/mobys/homing_rocket.c @@ -43,13 +43,16 @@ unsigned char *spawn_level_13_homing_rocket(char *owner_moby, float scale, float max_speed) { + enum { + HOMING_ROCKET_STATE_INITIAL = 0 + }; unsigned char *moby = (unsigned char *)create_moby(0x52); if (moby != 0) { Level13HomingRocketVars *homing_rocket_vars = (Level13HomingRocketVars *)MOBY(moby)->pvars; MOBY(moby)->update_dist = 0xFF; MOBY(moby)->draw_dist = 0xFF; MOBY(moby)->visible = 1; - MOBY(moby)->state = 0; + MOBY(moby)->state = HOMING_ROCKET_STATE_INITIAL; homing_rocket_vars->unk24 = target; homing_rocket_vars->unk20 = owner_moby; qcopy(moby + 0x10, rocket_spawn_position); diff --git a/src/overlays/l13/mobys/hovering_rocket_attacker.c b/src/overlays/l13/mobys/hovering_rocket_attacker.c index b681b01479..c1fd5f9dea 100644 --- a/src/overlays/l13/mobys/hovering_rocket_attacker.c +++ b/src/overlays/l13/mobys/hovering_rocket_attacker.c @@ -16,6 +16,16 @@ #include "rnc/overlay/shared/audio/voices/voice_is_playing.h" #include "rnc/overlay/shared/math/random/random_int_between.h" +enum { + UPDATE_INITIALIZE = 0x0, + TRACK_TARGET_BEFORE_ATTACK = 0x2, + UPDATE_ATTACK_SEQUENCE = 0x4, + WAIT_TO_MOVE_TO_TABLE_POINT = 0x5, + MOVE_TO_TABLE_POINT = 0x6, + WAIT_TO_RESUME_ATTACK_SEQUENCE = 7, + EMIT_EFFECT_AND_REMOVE = 0x8 +}; + extern char D_0013F350[]; extern f32 random_float_between(f32, f32) __asm__("FUN_002132a8"); @@ -102,15 +112,6 @@ typedef struct HoveringRocketAttackerVars { /* Moby class 101 */ void hovering_rocket_attacker_update(unsigned char *moby) { - enum { - UPDATE_INITIALIZE = 0x0, - TRACK_TARGET_BEFORE_ATTACK = 0x2, - UPDATE_ATTACK_SEQUENCE = 0x4, - WAIT_TO_MOVE_TO_TABLE_POINT = 0x5, - MOVE_TO_TABLE_POINT = 0x6, - WAIT_TO_RESUME_ATTACK_SEQUENCE = 7, - EMIT_EFFECT_AND_REMOVE = 0x8 - }; enum { START_ATTACK_ANIMATION_SEQUENCE = 0, WAIT_FOR_ATTACK_START_ANIMATION = 1, @@ -147,9 +148,9 @@ void hovering_rocket_attacker_update(unsigned char *moby) { moby_data->rocket0 = create_attached_rocket(moby, 0); moby_data->rocket1 = create_attached_rocket(moby, 1); if (moby_data->unkD4 != -1) - MOBY(moby)->state = 5; + MOBY(moby)->state = WAIT_TO_MOVE_TO_TABLE_POINT; else - MOBY(moby)->state = 2; + MOBY(moby)->state = TRACK_TARGET_BEFORE_ATTACK; moby_data->unk100[0] = random_angle_radians(); moby_data->unk100[2] = random_angle_radians(); moby_data->unk100[3] = random_angle_radians(); @@ -159,7 +160,7 @@ void hovering_rocket_attacker_update(unsigned char *moby) { if (moby_data->unkB4 == 2) return; MOBY(moby)->command = 0; - MOBY(moby)->state = 6; + MOBY(moby)->state = MOVE_TO_TABLE_POINT; break; case MOVE_TO_TABLE_POINT: index = moby_data->unkD4 * 128; @@ -180,7 +181,7 @@ void hovering_rocket_attacker_update(unsigned char *moby) { if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, 10); MOBY(moby)->command = 0; - MOBY(moby)->state = 2; + MOBY(moby)->state = TRACK_TARGET_BEFORE_ATTACK; } break; case TRACK_TARGET_BEFORE_ATTACK: @@ -199,7 +200,7 @@ void hovering_rocket_attacker_update(unsigned char *moby) { MOBY(moby)->command = 1; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, 0); - MOBY(moby)->state = 4; + MOBY(moby)->state = UPDATE_ATTACK_SEQUENCE; break; case UPDATE_ATTACK_SEQUENCE: moby_yaw = (float *)&MOBY(moby)->rot.z; @@ -294,7 +295,7 @@ void hovering_rocket_attacker_update(unsigned char *moby) { if (moby_data->unkB4 == 2) { if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, 2); - MOBY(moby)->state = 2; + MOBY(moby)->state = TRACK_TARGET_BEFORE_ATTACK; MOBY(moby)->command = 0; break; } @@ -336,7 +337,7 @@ void hovering_rocket_attacker_update(unsigned char *moby) { return; if (MOBY(moby)->prev_seq != MOBY(moby)->command) blend_moby_animation(moby, MOBY(moby)->command, 0, 10); - MOBY(moby)->state = 4; + MOBY(moby)->state = UPDATE_ATTACK_SEQUENCE; break; } } @@ -383,6 +384,9 @@ void update_hovering_rocket_attacker_common(unsigned char *moby) { HIT_REACTION_HIGH_INTERPOLATION_TARGET_ALTERNATE = 10, HIT_REACTION_NO_HIT = 11 }; + enum { + TARGET_SELECTION_NO_TARGET = 2 + }; HoveringRocketAttackerVars *moby_data; char *hit_record; int hit_reaction_code; @@ -397,7 +401,7 @@ void update_hovering_rocket_attacker_common(unsigned char *moby) { float z[4]; moby_data = ((unsigned char *)MOBY(moby)->pvars); - if (MOBY(moby)->state == 0) + if (MOBY(moby)->state == UPDATE_INITIALIZE) return; if (moby_data->unk110 == -1 || voice_is_playing(moby, moby_data->unk110) == 0) { moby_data->unk110 = -1; @@ -496,7 +500,7 @@ void update_hovering_rocket_attacker_common(unsigned char *moby) { if (moby_data->health <= 0.0f) { hit_reaction_code = 1; } else { - MOBY(moby)->state = 7; + MOBY(moby)->state = WAIT_TO_RESUME_ATTACK_SEQUENCE; } switch (hit_reaction_code) { case HIT_REACTION_HIGH_INTERPOLATION_TARGET: @@ -514,7 +518,7 @@ void update_hovering_rocket_attacker_common(unsigned char *moby) { case HIT_REACTION_LETHAL: case HIT_REACTION_REMOVE: FUN_L00_00257470(moby, 0, -1); - MOBY(moby)->state = 8; + MOBY(moby)->state = EMIT_EFFECT_AND_REMOVE; moby_data->unk67 = 0xF0; break; case HIT_REACTION_NONE: @@ -526,7 +530,7 @@ void update_hovering_rocket_attacker_common(unsigned char *moby) { } MOBY(moby)->hit_slot = 0xFF; trooper_anim_finish(moby, &moby_data->anim_state); - if (MOBY(moby)->state == 4) { + if (MOBY(moby)->state == UPDATE_ATTACK_SEQUENCE) { moby_data->unkD8 = 50.0f; } else { moby_data->unkD8 = 40.0f; @@ -541,11 +545,11 @@ void update_hovering_rocket_attacker_common(unsigned char *moby) { target_selection_point_table + 0x10, *(int *)target_selection_point_table); } - if (target_selection_status != 2) { + if (target_selection_status != TARGET_SELECTION_NO_TARGET) { if (moby_data->unkD8 < vector_distance_xy(moby + 0x10, moby_data->unk70) || 8.0f < absolute_float(MOBY(moby)->pos.z - moby_data->unk70[2])) { moby_data->unkB4 = 2; - } else if (MOBY(moby)->state != 5 && + } else if (MOBY(moby)->state != WAIT_TO_MOVE_TO_TABLE_POINT && collision_line(moby + 0x10, D_0013F350 + 0xD0, 2, moby, 0) != 0) { moby_data->unkB4 = 2; } diff --git a/src/overlays/l13/mobys/lift.c b/src/overlays/l13/mobys/lift.c index d5c08c0f4e..3eefedee24 100644 --- a/src/overlays/l13/mobys/lift.c +++ b/src/overlays/l13/mobys/lift.c @@ -15,6 +15,17 @@ #include "rnc/math/interpolation/advance_accelerated_scalar.h" #include "rnc/math/random.h" +enum { + LIFT_INITIALIZE = 0, + LIFT_BLEND_TO_MOUNT_TRANSFORM = 1, + LIFT_MOVE_TO_TOP = 2, + LIFT_MOVE_TO_BOTTOM = 3, + LIFT_IDLE_AT_TOP = 4, + LIFT_IDLE_AT_BOTTOM = 5, + LIFT_WAIT_AT_TOP_FOR_HERO_TO_LEAVE = 6, + LIFT_WAIT_AT_BOTTOM_FOR_HERO_TO_LEAVE = 7 +}; + extern float D_0015ED6C; extern char D_0013E533[]; @@ -49,16 +60,6 @@ void lift_update(struct Moby *moby) __asm__("FUN_L13_0030a6d8"); /* Moby class 1270 */ void lift_update(struct Moby *moby) { - enum { - LIFT_INITIALIZE = 0, - LIFT_BLEND_TO_MOUNT_TRANSFORM = 1, - LIFT_MOVE_TO_TOP = 2, - LIFT_MOVE_TO_BOTTOM = 3, - LIFT_IDLE_AT_TOP = 4, - LIFT_IDLE_AT_BOTTOM = 5, - LIFT_WAIT_AT_TOP_FOR_HERO_TO_LEAVE = 6, - LIFT_WAIT_AT_BOTTOM_FOR_HERO_TO_LEAVE = 7 - }; LiftVarsA6D8 *lift_vars = (LiftVarsA6D8 *)moby->pvars; float delta[4]; float rot[4]; @@ -77,7 +78,7 @@ void lift_update(struct Moby *moby) { lift_vars->pulse = random_angle_radians(); lift_vars->voice = -1; lift_vars->timer = 0; - moby->state = 4; + moby->state = LIFT_IDLE_AT_TOP; break; case LIFT_BLEND_TO_MOUNT_TRANSFORM: { float previous_mount_blend = lift_vars->blend; @@ -124,7 +125,7 @@ void lift_update(struct Moby *moby) { set_camera_position(mount_position_work); set_camera_rotation(mount_transform_work); } - if (moby->state == 2) + if (moby->state == LIFT_MOVE_TO_TOP) target = lift_vars->top; else target = lift_vars->bottom; @@ -136,10 +137,10 @@ void lift_update(struct Moby *moby) { D_0015ED6C * 40.0f); if (absolute_float(moby->pos.z - target) == 0.0f) { lift_vars->timer = scale_game_frames(0x46); - if (moby->state == 2) - moby->state = 6; + if (moby->state == LIFT_MOVE_TO_TOP) + moby->state = LIFT_WAIT_AT_TOP_FOR_HERO_TO_LEAVE; else - moby->state = 7; + moby->state = LIFT_WAIT_AT_BOTTOM_FOR_HERO_TO_LEAVE; if (moby->command != 0) jet_end_mount(2); } @@ -154,10 +155,10 @@ void lift_update(struct Moby *moby) { lift_vars->voice = -1; } if (hero.ground_moby != moby) { - if (moby->state == 7) - moby->state = 5; + if (moby->state == LIFT_WAIT_AT_BOTTOM_FOR_HERO_TO_LEAVE) + moby->state = LIFT_IDLE_AT_BOTTOM; else - moby->state = 4; + moby->state = LIFT_IDLE_AT_TOP; } break; case LIFT_IDLE_AT_TOP: @@ -173,29 +174,29 @@ void lift_update(struct Moby *moby) { if (hero.ground_moby == moby && hero.air_frames.s == 0 && vector_distance_xy(&hero.motion.pos, &moby->pos) < 0.5f) { moby->glow_color = 0x80208020; - if (moby->state == 5) + if (moby->state == LIFT_IDLE_AT_BOTTOM) moby->command = 2; else moby->command = 3; - moby->state = 1; + moby->state = LIFT_BLEND_TO_MOUNT_TRANSFORM; hero_set_state(0x72, 1); jet_mount(D_L13_001670C0, D_L13_001670C0 + 0x10, 1, 0, 0); lift_vars->blend = 0.0f; break; } - if (moby->state == 4) { + if (moby->state == LIFT_IDLE_AT_TOP) { float d = vector_distance_xy(&moby->pos, &hero.motion.pos); if (absolute_float(hero.ground_z.f - lift_vars->bottom) < 2.0f && d < 32.0f && d > 5.0f) { moby->command = 0; - moby->state = 3; + moby->state = LIFT_MOVE_TO_BOTTOM; lift_vars->speed = -(D_0015ED6C * 5.0f); } - } else if (moby->state == 5) { + } else if (moby->state == LIFT_IDLE_AT_BOTTOM) { float d = vector_distance_xy(&moby->pos, &hero.motion.pos); if (absolute_float(hero.ground_z.f - lift_vars->top) < 2.0f && d < 32.0f && d > 5.0f) { moby->command = 0; - moby->state = 2; + moby->state = LIFT_MOVE_TO_TOP; lift_vars->speed = D_0015ED6C * 5.0f; } } @@ -211,7 +212,8 @@ void compute_lift_mount_transform(struct Moby *moby, float *mount_position, floa char *mount_facing_target_base; clear_u64_value(mount_rotation); k = 2.25f; - if ((moby->command >= 2 && (moby->command & 1)) || (moby->state >= 2 && (moby->state & 1))) { + if ((moby->command >= 2 && (moby->command & 1)) || + (moby->state >= LIFT_MOVE_TO_TOP && (moby->state & 1))) { mount_offset_angle = -1.5707964f; mount_rotation[0] = moby->rot.y; } else { diff --git a/src/overlays/l13/mobys/linked_moby_rotation.c b/src/overlays/l13/mobys/linked_moby_rotation.c index b653fdfb34..e8ed3ebcc4 100644 --- a/src/overlays/l13/mobys/linked_moby_rotation.c +++ b/src/overlays/l13/mobys/linked_moby_rotation.c @@ -64,7 +64,7 @@ void linked_moby_rotation_update(struct Moby *moby) { allocate_voice_for_target_entry(rotation_vars->start_sound, 0, moby); } rotation_vars->progress = 0.0f; - moby->state = 2; + moby->state = ADVANCE_ROTATION; break; case ADVANCE_ROTATION: if (rotation_vars->linked_index != -1 && @@ -74,7 +74,7 @@ void linked_moby_rotation_update(struct Moby *moby) { if (rotation_vars->start_sound != -1) { allocate_voice_for_target_entry(rotation_vars->start_sound, 0, moby); } - moby->state = 4; + moby->state = REVERSE_ROTATION; break; } { @@ -95,7 +95,7 @@ void linked_moby_rotation_update(struct Moby *moby) { moby->rot.z = fast_add_rotations(rotation_vars->initial_rot[2], rotation_vars->angle[2] * radians); rotation_vars->progress = 1.0f; - moby->state = 3; + moby->state = HOLD_ROTATION_OFFSET; if (rotation_vars->end_sound != -1) { allocate_voice_for_target_entry(rotation_vars->start_sound, 0, moby); } @@ -113,7 +113,7 @@ void linked_moby_rotation_update(struct Moby *moby) { if (rotation_vars->start_sound != -1) { allocate_voice_for_target_entry(rotation_vars->start_sound, 0, moby); } - moby->state = 4; + moby->state = REVERSE_ROTATION; break; case REVERSE_ROTATION: if (rotation_vars->linked_index == -1 || @@ -123,7 +123,7 @@ void linked_moby_rotation_update(struct Moby *moby) { if (rotation_vars->start_sound != -1) { allocate_voice_for_target_entry(rotation_vars->start_sound, 0, moby); } - moby->state = 2; + moby->state = ADVANCE_ROTATION; } else { int invalid_index = -1; radians = 0.017453292f; @@ -145,7 +145,7 @@ void linked_moby_rotation_update(struct Moby *moby) { if (rotation_vars->start_sound != invalid_index) { allocate_voice_for_target_entry(rotation_vars->end_sound, 0, moby); } - moby->state = 1; + moby->state = WAIT_TO_ADVANCE_ROTATION; } break; case 5: diff --git a/src/overlays/l13/mobys/linked_switch_group.c b/src/overlays/l13/mobys/linked_switch_group.c index 40c3b48e91..599bfa5a92 100644 --- a/src/overlays/l13/mobys/linked_switch_group.c +++ b/src/overlays/l13/mobys/linked_switch_group.c @@ -37,6 +37,9 @@ int process_linked_switch_damage(struct Moby *moby, char *moby_data, float *heal HIT_REACTION_HIGH_INTERPOLATION_TARGET_ALTERNATE = 10, HIT_REACTION_NO_HIT = 11 }; + enum { + HIT_PROCESSING_DAMAGE_THRESHOLD = 2 + }; char *hit_record = find_moby_hit(moby, 0x330000, 0); int hit_processing_status; int health_depleted = 0; @@ -62,7 +65,7 @@ int process_linked_switch_damage(struct Moby *moby, char *moby_data, float *heal break; } color_animation_state = moby_data + 0x60; - if (hit_processing_status >= 2) { + if (hit_processing_status >= HIT_PROCESSING_DAMAGE_THRESHOLD) { float damage_amount = *(float *)(hit_record + 0x2C); unsigned short fl; if (*health <= damage_amount) { @@ -163,7 +166,7 @@ void linked_switch_group_update(char *moby) { switch_vars->unk76 = 0; set_moby_color(moby, 0x80, 0x80, 0x80); - MOBY(moby)->state = 1; + MOBY(moby)->state = MONITOR_LINKED_GROUP_HITS; break; case MONITOR_LINKED_GROUP_HITS: case WAIT_FOR_LINKED_GROUP_COMPLETION: @@ -184,14 +187,14 @@ void linked_switch_group_update(char *moby) { set_moby_color(moby, 0, 0xFF, 0); switch_vars->unk74 = 1; } - if ((unsigned char)MOBY(moby)->state == 2) { + if ((unsigned char)MOBY(moby)->state == WAIT_FOR_LINKED_GROUP_COMPLETION) { if (switch_vars->unk7A >= switch_vars->unk7B) { set_moby_list_state((unsigned char)MOBY(moby)->group, 4); allocate_voice_for_target_entry(1, 0, moby); switch_vars->unk70 = switch_vars->unk84; debug_print( D_L13_001F4D90, ((short)MOBY(moby)->save_id), MOBY(moby)->oclass, frame_count); - MOBY(moby)->state = 4; + MOBY(moby)->state = UPDATE_OPENED_STATE; } else { if (switch_vars->unk7C >= 0) { if (fast_dec_timer_s16(&switch_vars->unk70) != 0) { @@ -204,7 +207,7 @@ void linked_switch_group_update(char *moby) { ((short)MOBY(moby)->save_id), MOBY(moby)->oclass, frame_count); - MOBY(moby)->state = 3; + MOBY(moby)->state = RESET_HIT_STATE; } else if (fast_dec_timer_s16(&switch_vars->unk72) != 0) { allocate_voice_for_target_entry(0, 0, moby); switch_vars->unk72 = MIN(scale_game_frames(0x2D), @@ -221,7 +224,7 @@ void linked_switch_group_update(char *moby) { switch_vars->unk7A = 0; switch_vars->unk74 = 0; switch_vars->unk20 = (float)switch_vars->unk24; - MOBY(moby)->state = 1; + MOBY(moby)->state = MONITOR_LINKED_GROUP_HITS; break; case UPDATE_OPENED_STATE: @@ -236,7 +239,7 @@ void linked_switch_group_update(char *moby) { ((short)MOBY(moby)->save_id), MOBY(moby)->oclass, frame_count); - MOBY(moby)->state = 3; + MOBY(moby)->state = RESET_HIT_STATE; } else if (fast_dec_timer_s16(&switch_vars->unk72) != 0) { allocate_voice_for_target_entry(0, 0, moby); switch_vars->unk72 = diff --git a/src/overlays/l13/mobys/mine.c b/src/overlays/l13/mobys/mine.c index 7d42f9e060..de8a86b5c3 100644 --- a/src/overlays/l13/mobys/mine.c +++ b/src/overlays/l13/mobys/mine.c @@ -90,6 +90,10 @@ void level_13_mine_update(ProjectileMoby *moby) __asm__("FUN_L13_002c2048"); /* Moby class 83 */ void level_13_mine_update(ProjectileMoby *moby) { + enum { + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xFD, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xFE + }; char *moby_data = (char *)moby->data; ProjectileVec4 steering_and_collision_vector; float hitpos[12]; @@ -139,7 +143,8 @@ void level_13_mine_update(ProjectileMoby *moby) { return; } target = *(ProjectileMoby **)(moby_data + 0x74); - if (target != 0 && target->state != 0xFE && target->state != 0xFD && + if (target != 0 && target->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + target->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END && fast_vec_dist(pos, &target->pos) > 8.0f) { make_hit_descriptor(16.0f, &hitpos, moby, 0x30000, velocity); qcopy(&steering_and_collision_vector, pos); diff --git a/src/overlays/l13/mobys/moby_path_follower.c b/src/overlays/l13/mobys/moby_path_follower.c index f0c829d490..68fa204847 100644 --- a/src/overlays/l13/mobys/moby_path_follower.c +++ b/src/overlays/l13/mobys/moby_path_follower.c @@ -17,6 +17,12 @@ void moby_path_follower_update(struct Moby *moby) __asm__("FUN_L13_0030bb70"); /* Moby class 1403 */ void moby_path_follower_update(struct Moby *moby) { + enum { + PATH_FOLLOWER_STATE_INITIALIZE = 0, + PATH_FOLLOWER_STATE_PROJECT_TARGET_ONTO_PATH = 1, + PATH_FOLLOWER_STATE_ADVANCE_ALONG_PATH = 2, + PATH_FOLLOWER_STATE_PATH_END_REACHED = 3 + }; int *moby_vars = (int *)moby->pvars; char *path; char *pth; @@ -25,7 +31,7 @@ void moby_path_follower_update(struct Moby *moby) { int nearest_segment_index; float nearest_segment_progress; int i; - if (moby->state == 0) { + if (moby->state == PATH_FOLLOWER_STATE_INITIALIZE) { moby->update_dist = 0xFF; if (moby_vars[1] != -1) { path = D_L13_001B07B0[moby_vars[1]]; @@ -36,7 +42,7 @@ void moby_path_follower_update(struct Moby *moby) { } moby_vars[2] = 0; moby_vars[3] = 0; - moby->state = 1; + moby->state = PATH_FOLLOWER_STATE_PROJECT_TARGET_ONTO_PATH; moby_vars[4] = 0; } if (moby_vars[0] == -1) @@ -52,7 +58,7 @@ void moby_path_follower_update(struct Moby *moby) { if (moby_vars[1] == -1) return; pth = D_L13_001B07B0[moby_vars[1]]; - if (moby->state == 1) { + if (moby->state == PATH_FOLLOWER_STATE_PROJECT_TARGET_ONTO_PATH) { FUN_L00_0025df68(pth, target_moby + 0x10, nearest_path_position, @@ -68,17 +74,17 @@ void moby_path_follower_update(struct Moby *moby) { ((float *)moby_vars)[3] = nearest_segment_progress; qcopy(&moby->pos, nearest_path_position); } else { - moby->state = 2; + moby->state = PATH_FOLLOWER_STATE_ADVANCE_ALONG_PATH; } } - if (moby->state == 2) { + if (moby->state == PATH_FOLLOWER_STATE_ADVANCE_ALONG_PATH) { if (moby_vars[2] < *(int *)pth - 1) { int k = compute_advanced_moby_path_position( moby, pth, &moby->pos, moby_vars[2], 1, frame_scale * 0.25f); moby_vars[2] = k; ((float *)moby_vars)[3] = fast_vec_dist(&moby->pos, pth + (k * 16 + 0x10)); } else { - moby->state = 3; + moby->state = PATH_FOLLOWER_STATE_PATH_END_REACHED; } } } else { diff --git a/src/overlays/l13/mobys/poison_vessel.c b/src/overlays/l13/mobys/poison_vessel.c index 72c12bdad1..5323ab3690 100644 --- a/src/overlays/l13/mobys/poison_vessel.c +++ b/src/overlays/l13/mobys/poison_vessel.c @@ -287,6 +287,9 @@ void poison_vessel_update(struct Moby *moby) { HIT_RESULT_STUN_KNOCKBACK = 3, HIT_RESULT_NO_REACTION = 11 }; + enum { + HIT_STATUS_DAMAGE_PROCESSING_MINIMUM = 2 + }; struct BlastVars *poison_vessel_vars = (struct BlastVars *)moby->pvars; struct BlastHit *hit; float *health; @@ -317,7 +320,7 @@ void poison_vessel_update(struct Moby *moby) { break; } effects = poison_vessel_vars->effects; - if (kind >= 2) { + if (kind >= HIT_STATUS_DAMAGE_PROCESSING_MINIMUM) { if (*health <= hit->damage) { *health = 0; moby->flags &= 0xEFFF; @@ -328,7 +331,7 @@ void poison_vessel_update(struct Moby *moby) { spawn_poison_vessel_destruction_effects(moby, poison_vessel_vars); spawn_type_52_particle_near_moby(moby); allocate_voice_for_target_entry(0, 0, (int)moby); - moby->state = 1; + moby->state = POISON_VESSEL_BLASTING; } else { *health = *health - hit->damage; poison_vessel_vars->effect_level = 0xFA; diff --git a/src/overlays/l13/mobys/poison_vessel_fragment.c b/src/overlays/l13/mobys/poison_vessel_fragment.c index 21db7b9d04..80a3d714c4 100644 --- a/src/overlays/l13/mobys/poison_vessel_fragment.c +++ b/src/overlays/l13/mobys/poison_vessel_fragment.c @@ -34,6 +34,9 @@ char *spawn_poison_vessel_fragment(void *position, int duration_frames, int effect_mode) { + enum { + POISON_VESSEL_FRAGMENT_MODE_REDUCED_SCALE = 0 + }; unsigned char *moby = (unsigned char *)create_moby(0x662); if (moby != 0) { char *effect_moby_vars; @@ -54,7 +57,7 @@ char *spawn_poison_vessel_fragment(void *position, random_float_between(dd * 6.2831855f, dd * 12.566371f); *(short *)(effect_moby_vars + 0x18) = duration_frames; *(short *)(effect_moby_vars + 0x1A) = duration_frames; - if (effect_mode == 0) { + if (effect_mode == POISON_VESSEL_FRAGMENT_MODE_REDUCED_SCALE) { MOBY(moby)->scale = MOBY(moby)->scale * random_float_between(0.5f, 0.75f); } *(float *)(effect_moby_vars + 0x1C) = MOBY(moby)->scale; diff --git a/src/overlays/l13/mobys/qwarks_starfighter.c b/src/overlays/l13/mobys/qwarks_starfighter.c index 0b6af3e419..cf5f5de99f 100644 --- a/src/overlays/l13/mobys/qwarks_starfighter.c +++ b/src/overlays/l13/mobys/qwarks_starfighter.c @@ -34,6 +34,31 @@ #include "rnc/overlay/shared/math/quad.h" #include "rnc/overlay/l13/mobys/qwarks_starfighter_shield.h" +enum { + ATTACHMENT_DAMAGE_NONE = 0, + ATTACHMENT_DAMAGE_APPLIED = 1, + ATTACHMENT_DAMAGE_STAGE_ADVANCED = 2, + ATTACHMENT_DAMAGE_LETHAL = 3 +}; + +enum { + STARFIGHTER_STATE_INITIALIZE = 0, + STARFIGHTER_STATE_WAIT_FOR_HERO_SHIP = 1, + STARFIGHTER_STATE_FOLLOW_INITIAL_PATH = 2, + STARFIGHTER_STATE_FOLLOW_COMMAND_PATH = 3, + STARFIGHTER_STATE_FOLLOW_COMMAND_PATH_WITH_TIMED_VOLLEY = 4, + STARFIGHTER_STATE_TRACTOR_BEAM = 5, + STARFIGHTER_STATE_OWNER_UNAVAILABLE = 6, + STARFIGHTER_STATE_DEATH_FLIGHT = 7, + STARFIGHTER_STATE_EXPLODE_AND_REMOVE = 8, + STARFIGHTER_STATE_RESET = 9 +}; + +enum { + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xFD, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xFE +}; + extern f32 random_float_between(f32, f32) __asm__("FUN_002132a8"); extern float D_0015ED6C; @@ -143,7 +168,7 @@ int queue_starfighter_voice_line(void *unused, return 0; } -extern int D_L13_001D3478[] __asm__("D_L13_001D3478"); +extern int l13_starfighter_attachment_slot_indices_by_command[] __asm__("D_L13_001D3478"); typedef struct { char pad[0xC4]; @@ -179,7 +204,8 @@ void emit_gated_moby_joint_effects(struct Moby *source_moby, char *emission_gate -100, 1); } else if (source_moby->command == 0 || - D_L13_001D3478[source_moby->command - 1] != + l13_starfighter_attachment_slot_indices_by_command[source_moby->command - + 1] != joint_effect_gate_slot_indices[i] || random_integer_below(9) == 0) { effect_frame_count = scale_game_frames(random_int_between(0xF, 0x16)); @@ -271,7 +297,7 @@ void update_moby_joint_attachments(struct Moby *parent_moby, char *attachment_da } } attachment_joint_index = attachment_joint_indices_by_command[parent_moby->command]; - if (parent_moby->state == 5) + if (parent_moby->state == STARFIGHTER_STATE_TRACTOR_BEAM) attachment_joint_index = -1; if (attachment_joint_index != -1) { if (*(char **)(attachment_data + 0xF0) == 0 || @@ -280,8 +306,9 @@ void update_moby_joint_attachments(struct Moby *parent_moby, char *attachment_da *(char **)(attachment_data + 0xF0) = spawn_moby_joint_attachment(parent_moby, attachment_joint_index, 0x191); attached_moby = *(char **)(attachment_data + 0xF0); - if (attached_moby != 0 && MOBY(attached_moby)->state != 0xFE && - MOBY(attached_moby)->state != 0xFD) { + if (attached_moby != 0 && + MOBY(attached_moby)->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + MOBY(attached_moby)->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { moby_point_position(parent_moby, attachment_joint_index, attached_moby + 0x10); if (MOBY(attached_moby)->pos.x < 22.0f) MOBY(attached_moby)->pos.x = 22.0f; @@ -407,7 +434,7 @@ int advance_moby_along_selected_path(struct Moby *moby, yaw = fast_arc_tan(target_node_steering_vector[0], target_node_steering_vector[1]); pitch = -fast_arc_tan(vector_length_xy(target_node_steering_vector), target_node_steering_vector[2]); - if (moby->state == 5) { + if (moby->state == STARFIGHTER_STATE_TRACTOR_BEAM) { struct Hero *hero_state = &hero; yaw = fast_arc_tan(hero_state->motion.pos.f[0] - moby->pos.x, hero_state->motion.pos.f[1] - moby->pos.y); @@ -599,7 +626,7 @@ void begin_starfighter_death_sequence(struct Moby *moby, mobys[*(int *)(starfighter_moby_data + 0x134)].flags |= 1; mobys[*(int *)(starfighter_moby_data + 0x134)].visible = 0; activate_descriptor(*(int *)(starfighter_moby_data + 0x12C)); - moby->state = 7; + moby->state = STARFIGHTER_STATE_DEATH_FLIGHT; *(float *)(starfighter_moby_data + 0xAC) = D_0015ED6C * 80.0f; *(int *)(starfighter_moby_data + 0xF8) = scale_game_frames(600); queue_starfighter_voice_line(moby, (unsigned char *)starfighter_moby_data, 0x22, 1); @@ -725,9 +752,9 @@ void process_moby_attachment_damage(Moby_2EAE80 *moby, Data_2EAE80 *moby_data) { Hit_2EAE80 *r; Sub *dd; - if (moby->state < 6) { + if (moby->state < STARFIGHTER_STATE_OWNER_UNAVAILABLE) { dd = &moby_data->sub; - mode = 0; + mode = ATTACHMENT_DAMAGE_NONE; rf = 0; k6 = 6.0f; step = (float)dd->max_health / k6; @@ -752,17 +779,17 @@ void process_moby_attachment_damage(Moby_2EAE80 *moby, Data_2EAE80 *moby_data) { } if (dd->health <= r->f2C) { func_L13_002EAC18_2EAE80(moby, moby_data, dd, r); - mode = 3; + mode = ATTACHMENT_DAMAGE_LETHAL; moby_data->first->bA4 = 0xFF; } else { dd->health = dd->health - r->f2C; moby_data->b67 = 0xFA; - mode = 1; + mode = ATTACHMENT_DAMAGE_APPLIED; moby_data->sub.h6 = scale_game_frames(0); func_L00_0025E4B0_2EAE80(moby, moby_data->q60); moby_data->first->bA4 = 0xFF; } - if (moby->state == 7) { + if (moby->state == STARFIGHTER_STATE_DEATH_FLIGHT) { moby->bBC++; rf = 1; { @@ -774,14 +801,14 @@ void process_moby_attachment_damage(Moby_2EAE80 *moby, Data_2EAE80 *moby_data) { v->f118 = 0; } } else if (dd->health < hi) { - int tv = D_L13_001D3478[moby->bBC - 1]; + int tv = l13_starfighter_attachment_slot_indices_by_command[moby->bBC - 1]; if (tv != -1) { allocate_voice_for_target_entry(7, 0, moby); func_L13_002EAAB8_2EAE80(moby, moby_data, tv); } - if (moby->state == 5) { - moby->state = 4; + if (moby->state == STARFIGHTER_STATE_TRACTOR_BEAM) { + moby->state = STARFIGHTER_STATE_FOLLOW_COMMAND_PATH_WITH_TIMED_VOLLEY; } moby->bBC++; if (moby_data->i11C != -1) { @@ -802,10 +829,13 @@ void process_moby_attachment_damage(Moby_2EAE80 *moby, Data_2EAE80 *moby_data) { } moby_data->h138 = 0; moby_data->b148 = 0; - mode = 2; + mode = ATTACHMENT_DAMAGE_STAGE_ADVANCED; if (moby->bBC == 7) { for (j = moby->bBC - 1; j < 10; j++) { - func_L13_002EAAB8_2EAE80(moby, moby_data, D_L13_001D3478[j]); + func_L13_002EAAB8_2EAE80( + moby, + moby_data, + l13_starfighter_attachment_slot_indices_by_command[j]); } allocate_voice_for_target_entry(7, 0, moby); } @@ -814,7 +844,7 @@ void process_moby_attachment_damage(Moby_2EAE80 *moby, Data_2EAE80 *moby_data) { } } } - for (i = 0; i < 11 && mode == 0; i++) { + for (i = 0; i < 11 && mode == ATTACHMENT_DAMAGE_NONE; i++) { if (moby_data->list[i] == 0) { continue; } @@ -844,17 +874,17 @@ void process_moby_attachment_damage(Moby_2EAE80 *moby, Data_2EAE80 *moby_data) { } if (dd->health <= r->f2C) { func_L13_002EAC18_2EAE80(moby, moby_data, dd, r); - mode = 3; + mode = ATTACHMENT_DAMAGE_LETHAL; moby_data->list[i]->bA4 = 0xFF; } else { dd->health = dd->health - r->f2C; moby_data->b67 = 0xFA; - mode = 1; + mode = ATTACHMENT_DAMAGE_APPLIED; moby_data->sub.h6 = scale_game_frames(0); func_L00_0025E4B0_2EAE80(moby, moby_data->q60); moby_data->list[i]->bA4 = 0xFF; } - if (moby->state == 7) { + if (moby->state == STARFIGHTER_STATE_DEATH_FLIGHT) { moby->bBC++; rf = 1; { @@ -866,14 +896,14 @@ void process_moby_attachment_damage(Moby_2EAE80 *moby, Data_2EAE80 *moby_data) { v->f118 = 0; } } else if (dd->health < hi) { - int tv = D_L13_001D3478[moby->bBC - 1]; + int tv = l13_starfighter_attachment_slot_indices_by_command[moby->bBC - 1]; if (tv != -1) { func_L13_002EAAB8_2EAE80(moby, moby_data, tv); } allocate_voice_for_target_entry(7, 0, moby); - if (moby->state == 5) { - moby->state = 4; + if (moby->state == STARFIGHTER_STATE_TRACTOR_BEAM) { + moby->state = STARFIGHTER_STATE_FOLLOW_COMMAND_PATH_WITH_TIMED_VOLLEY; } moby->bBC++; if (moby_data->i11C != -1) { @@ -894,10 +924,11 @@ void process_moby_attachment_damage(Moby_2EAE80 *moby, Data_2EAE80 *moby_data) { } moby_data->h138 = 0; moby_data->b148 = 0; - mode = 2; + mode = ATTACHMENT_DAMAGE_STAGE_ADVANCED; if (moby->bBC == 7) { for (k = moby->bBC - 1; k < 10; k++) { - func_L13_002EAAB8_2EAE80(moby, moby_data, D_L13_001D3478[k]); + func_L13_002EAAB8_2EAE80( + moby, moby_data, l13_starfighter_attachment_slot_indices_by_command[k]); } allocate_voice_for_target_entry(7, 0, moby); } @@ -905,7 +936,7 @@ void process_moby_attachment_damage(Moby_2EAE80 *moby, Data_2EAE80 *moby_data) { moby_data->b148 = 1; } } - if (mode > 0) { + if (mode > ATTACHMENT_DAMAGE_NONE) { if (rf != 0) { switch (moby->bBC - 1) { case DAMAGE_STAGE_SKIP_LINE_QUEUE: @@ -1594,16 +1625,7 @@ void qwarks_starfighter_update(Moby388 *moby) __asm__("FUN_L13_002eb098"); /* Moby class 388 */ void qwarks_starfighter_update(Moby388 *moby) { enum { - STARFIGHTER_STATE_INITIALIZE = 0, - STARFIGHTER_STATE_WAIT_FOR_HERO_SHIP = 1, - STARFIGHTER_STATE_FOLLOW_INITIAL_PATH = 2, - STARFIGHTER_STATE_FOLLOW_COMMAND_PATH = 3, - STARFIGHTER_STATE_FOLLOW_COMMAND_PATH_WITH_TIMED_VOLLEY = 4, - STARFIGHTER_STATE_TRACTOR_BEAM = 5, - STARFIGHTER_STATE_OWNER_UNAVAILABLE = 6, - STARFIGHTER_STATE_DEATH_FLIGHT = 7, - STARFIGHTER_STATE_EXPLODE_AND_REMOVE = 8, - STARFIGHTER_STATE_RESET = 9 + STARFIGHTER_SHIELD_STATE_DEACTIVATE_REQUESTED = 3 }; Ship388 *starfighter_vars = moby->d; float offset[4]; @@ -1659,7 +1681,7 @@ void qwarks_starfighter_update(Moby388 *moby) { starfighter_vars->b10C = 1; starfighter_vars->bFE = 0; starfighter_vars->bFC = 0; - moby->state = 1; + moby->state = STARFIGHTER_STATE_WAIT_FOR_HERO_SHIP; starfighter_vars->b10E = 8; starfighter_vars->child110 = 0; starfighter_vars->snd114 = -1; @@ -1707,7 +1729,7 @@ void qwarks_starfighter_update(Moby388 *moby) { *(int *)(ship + 0x138) = 0x234; } } - moby->state = 2; + moby->state = STARFIGHTER_STATE_FOLLOW_INITIAL_PATH; } break; } @@ -1738,7 +1760,7 @@ void qwarks_starfighter_update(Moby388 *moby) { *(int *)(ship + 0x118) = 0; starfighter_vars->b13B = qwarks_starfighter_command_path_slots[moby->bBC]; starfighter_vars->iF8 = scale_game_frames(0x14); - moby->state = 3; + moby->state = STARFIGHTER_STATE_FOLLOW_COMMAND_PATH; starfighter_vars->s9C = select_point_index_by_distance( moby->pos, walker_paths[starfighter_vars->paths[starfighter_vars->b13B]], 0.0f); starfighter_vars->s9C = @@ -2003,7 +2025,7 @@ void qwarks_starfighter_update(Moby388 *moby) { starfighter_vars->s9C >= *(int *)walker_paths[starfighter_vars->paths[starfighter_vars->b13B]] - 1) { starfighter_vars->iF8 = scale_game_frames(0xB4); - moby->state = 8; + moby->state = STARFIGHTER_STATE_EXPLODE_AND_REMOVE; } moby->rot[0] = fast_add_rotations(moby->rot[0], frame_time * 4.1887903f); { @@ -2195,7 +2217,7 @@ void qwarks_starfighter_update(Moby388 *moby) { moby->bBC = 0; qzero(&starfighter_vars->f70); qzero(starfighter_vars->v80); - moby->state = 0; + moby->state = STARFIGHTER_STATE_INITIALIZE; return; } } @@ -2242,19 +2264,20 @@ void qwarks_starfighter_update(Moby388 *moby) { starfighter_vars->child110 = 0; } else if (child->cls_id != 0x160) { starfighter_vars->child110 = 0; - } else if (child->state == 0xFE) { + } else if (child->state == MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END) { starfighter_vars->child110 = 0; - } else if (child->state == 0xFD) { + } else if (child->state == MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { starfighter_vars->child110 = 0; - } else if (child->state < 3) { - child->state = 3; + } else if (child->state < STARFIGHTER_SHIELD_STATE_DEACTIVATE_REQUESTED) { + child->state = STARFIGHTER_SHIELD_STATE_DEACTIVATE_REQUESTED; } } } - if (moby->state >= 2) { + if (moby->state >= STARFIGHTER_STATE_FOLLOW_INITIAL_PATH) { update_moby_joint_attachments(moby, starfighter_vars); - if (moby->state != 8 || scale_game_frames(0x78) < starfighter_vars->iF8) { + if (moby->state != STARFIGHTER_STATE_EXPLODE_AND_REMOVE || + scale_game_frames(0x78) < starfighter_vars->iF8) { emit_gated_moby_joint_effects(moby, starfighter_vars); } if (starfighter_vars->snd114 != -1) { @@ -2281,10 +2304,11 @@ void qwarks_starfighter_update(Moby388 *moby) { { Moby388 *owner = (Moby388 *)((char *)moby_base + (starfighter_vars->i134 << 8)); - if (moby->state != 6) { - if (owner == 0 || owner->cls_id != 0x45 || owner->state == 0xFE || - owner->state == 0xFD || owner->state == 7) { - moby->state = 6; + if (moby->state != STARFIGHTER_STATE_OWNER_UNAVAILABLE) { + if (owner == 0 || owner->cls_id != 0x45 || + owner->state == MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END || + owner->state == MOBY_STATE_REMOVAL_BELOW_INSTANCE_END || owner->state == 7) { + moby->state = STARFIGHTER_STATE_OWNER_UNAVAILABLE; if (queue_starfighter_voice_line( moby, starfighter_vars, D_L13_00161950 + 0x1D, 1) != 0) { D_L13_00161950 = (D_L13_00161950 + 1) % 4; @@ -2304,7 +2328,7 @@ void qwarks_starfighter_update(Moby388 *moby) { starfighter_vars->b13A = 0; } } else { - if (moby->state != 6) { + if (moby->state != STARFIGHTER_STATE_OWNER_UNAVAILABLE) { char *hero = ((char *)&D_0013F350); if (*(int *)(hero + 0x2084) == 0x32) { if (*(Moby388 **)(hero + 0x15F0) != 0 && @@ -2319,8 +2343,10 @@ void qwarks_starfighter_update(Moby388 *moby) { } fast_dec_timer_s16(&starfighter_vars->h144); fast_dec_timer_s16(&starfighter_vars->h146); - if (moby->state >= 2 && moby->state <= 5 && (((unsigned char *)D_0013E533)[0x242C] & 1)) { - moby->state = 9; + if (moby->state >= STARFIGHTER_STATE_FOLLOW_INITIAL_PATH && + moby->state <= STARFIGHTER_STATE_TRACTOR_BEAM && + (((unsigned char *)D_0013E533)[0x242C] & 1)) { + moby->state = STARFIGHTER_STATE_RESET; } } diff --git a/src/overlays/l13/mobys/qwarks_starfighter_part.c b/src/overlays/l13/mobys/qwarks_starfighter_part.c index 241847fce6..86ada02465 100644 --- a/src/overlays/l13/mobys/qwarks_starfighter_part.c +++ b/src/overlays/l13/mobys/qwarks_starfighter_part.c @@ -63,7 +63,7 @@ void qwarks_starfighter_part_update(struct Moby *moby) { moby->flags = moby->flags | (starfighter_part_vars->parent->flags & 3); switch (moby->state) { case PART_STATE_INITIALIZE: - moby->state = 1; + moby->state = PART_STATE_SYNC_PARENT_SCALE; qzero(&starfighter_part_vars->unk20); break; case PART_STATE_SYNC_PARENT_SCALE: @@ -86,7 +86,7 @@ void qwarks_starfighter_part_update(struct Moby *moby) { hit->oclass != 0x18C && hit->oclass != 0x18F && hit->oclass != 0x190)) { reflect_vector( &starfighter_part_vars->vel, &starfighter_part_vars->vel, coll + 0x40); - moby->state = 4; + moby->state = PART_STATE_BURST_AND_REMOVE; } } moby->rot.x = fast_add_rotations(moby->rot.x, starfighter_part_vars->spin[0]); diff --git a/src/overlays/l13/mobys/qwarks_starfighter_shield.c b/src/overlays/l13/mobys/qwarks_starfighter_shield.c index cadb04995f..99a1634769 100644 --- a/src/overlays/l13/mobys/qwarks_starfighter_shield.c +++ b/src/overlays/l13/mobys/qwarks_starfighter_shield.c @@ -14,7 +14,7 @@ extern char *create_moby(int); char *spawn_qwarks_starfighter_shield(char *owner) __asm__("FUN_L13_002e8438"); -char *spawn_qwarks_starfighter_shield(char *owner) { +char *spawn_qwarks_starfighter_shield(char *shielded_starfighter) { char *moby = create_moby(0x160); if (moby != 0) { char *spawned_moby_vars; @@ -24,8 +24,8 @@ char *spawn_qwarks_starfighter_shield(char *owner) { spawned_moby_vars = ((char *)MOBY(moby)->pvars); moby[0x20] = 0; moby[0xBC] = 0; - qcopy(moby + 0x10, owner + 0x10); - *(char **)spawned_moby_vars = owner; + qcopy(moby + 0x10, shielded_starfighter + 0x10); + *(char **)spawned_moby_vars = shielded_starfighter; *(int *)(spawned_moby_vars + 4) = 0; MOBY(moby)->flags |= 0x200; update_entity(moby); @@ -53,7 +53,7 @@ void qwarks_starfighter_shield_update(struct Moby *moby) { switch (moby->state) { case INITIALIZE_COLLISION: moby->collision = moby->pclass->collision; - moby->state = 1; + moby->state = FADE_IN; break; case FADE_IN: { float fade = frame_scale * 0.02f; @@ -61,7 +61,7 @@ void qwarks_starfighter_shield_update(struct Moby *moby) { ((float *)moby_data)[1] += fade; if (((float *)moby_data)[1] >= 1.0f) { ((float *)moby_data)[1] = 1.0f; - moby->state = 2; + moby->state = WAIT_FOR_OWNER_REMOVAL; } moby->alpha = truncate_float_to_s32(((float *)moby_data)[1] * 60.0f); break; @@ -70,7 +70,7 @@ void qwarks_starfighter_shield_update(struct Moby *moby) { moby->scale += (moby->pclass->scale * 4.0f - moby->scale) * 0.1f; if (moby_data[0] == 0 || ((unsigned char *)moby_data[0])[0x20] == 0xFE || ((unsigned char *)moby_data[0])[0x20] == 0xFD) { - moby->state = 3; + moby->state = FADE_OUT; } break; case FADE_OUT: { @@ -79,7 +79,7 @@ void qwarks_starfighter_shield_update(struct Moby *moby) { ((float *)moby_data)[1] -= fade; if (((float *)moby_data)[1] <= 0.0f) { ((float *)moby_data)[1] = 0.0f; - moby->state = 4; + moby->state = REMOVE_MOBY; } moby->alpha = truncate_float_to_s32(((float *)moby_data)[1] * 60.0f); break; diff --git a/src/overlays/l13/mobys/robosquawker.c b/src/overlays/l13/mobys/robosquawker.c index 837e02e210..fbb2b3a157 100644 --- a/src/overlays/l13/mobys/robosquawker.c +++ b/src/overlays/l13/mobys/robosquawker.c @@ -51,6 +51,11 @@ int select_robosquawker_target(char *source_object, float best) __asm__("FUN_L13_0026bd00"); int select_robosquawker_target(char *source_object, char *selection_output, float best) { + enum { + ROBOSQUAWKER_TARGET_DEFAULT_HERO = 0, + ROBOSQUAWKER_TARGET_CANDIDATE_SELECTED = 1, + ROBOSQUAWKER_TARGET_HERO_SUPPRESSED = 2 + }; struct Hero *hero = &hero_lui; char *selected_object; char *candidate_object; @@ -60,10 +65,10 @@ int select_robosquawker_target(char *source_object, char *selection_output, floa float candidate_metric; selected_object = ((char *)hero->moby); - selection_status = 0; + selection_status = ROBOSQUAWKER_TARGET_DEFAULT_HERO; if (hero->state.control_mode == 0x18 || hero->state.current == 0x72) { selected_object = 0; - selection_status = 2; + selection_status = ROBOSQUAWKER_TARGET_HERO_SUPPRESSED; } for (i = 1; i <= D_L13_001B0B30[0]; i++) { candidate_object = (char *)moby_base + (D_L13_001B0B30[i] << 8); @@ -82,7 +87,7 @@ int select_robosquawker_target(char *source_object, char *selection_output, floa if (candidate_metric < best) { selected_object = candidate_object; best = candidate_metric; - selection_status = 1; + selection_status = ROBOSQUAWKER_TARGET_CANDIDATE_SELECTED; } } for (j = 0; j < 20; j++) { @@ -101,7 +106,7 @@ int select_robosquawker_target(char *source_object, char *selection_output, floa if (candidate_metric < best) { selected_object = candidate_object; best = candidate_metric; - selection_status = 1; + selection_status = ROBOSQUAWKER_TARGET_CANDIDATE_SELECTED; } } if (selected_object != 0) { @@ -508,7 +513,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { } robosquawker_vars->w38 = 0; fast_dec_timer_s16(&robosquawker_vars->h208); - if (robosquawker_moby->state != 0) { + if (robosquawker_moby->state != ROBOSQUAWKER_STATE_INITIALIZE) { if (fast_dec_timer_s16(&robosquawker_vars->h214) != 0) { robosquawker_vars->f1FC = robosquawker_vars->v1D0.f[3]; } else { @@ -521,7 +526,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { robosquawker_moby, hit, &robosquawker_vars->f20, 0, &hits, &dmg, 0, 4); fast_dec_timer_s16(&robosquawker_vars->h26); if (robosquawker_vars->h26 < scale_game_frames(0x2D) && hit != 0 && - robosquawker_moby->state != 0x63) { + robosquawker_moby->state != ROBOSQUAWKER_STATE_DEATH_KNOCKBACK) { if (hit->src->hA6 >= 0xB0 && hit->src->hA6 <= 0xB1 && robosquawker_vars->h26 != 0) { hit->f2C = 0.0f; } @@ -557,7 +562,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { 0); robosquawker_vars->f170 = 11.0f; robosquawker_vars->f174 = 18.0f; - robosquawker_moby->state = 0x63; + robosquawker_moby->state = ROBOSQUAWKER_STATE_DEATH_KNOCKBACK; release_robosquawker_particle((Level13VendorMoby *)robosquawker_vars); robosquawker_vars->x110[7] = 0x78; trooper_anim_update(robosquawker_moby, (short *)robosquawker_vars->x110); @@ -574,7 +579,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { 0); robosquawker_vars->f170 = 5.0f; robosquawker_vars->f174 = 10.0f; - robosquawker_moby->state = 6; + robosquawker_moby->state = ROBOSQUAWKER_STATE_DAMAGE_KNOCKBACK; release_robosquawker_particle((Level13VendorMoby *)robosquawker_vars); *(unsigned char *)&robosquawker_vars->x110[7] = 0xFA; robosquawker_vars->h26 = scale_game_frames(0x3C); @@ -588,12 +593,12 @@ void robosquawker_update(RsMoby *robosquawker_moby) { qcopy(&robosquawker_vars->v1D0, &robosquawker_moby->pos); robosquawker_vars->v1D0.f[3] = robosquawker_vars->f1FC; if (robosquawker_vars->h20A != 0) { - robosquawker_moby->state = 1; + robosquawker_moby->state = ROBOSQUAWKER_STATE_GROUND_IDLE; if (robosquawker_moby->b53 != 3) { blend_moby_animation(robosquawker_moby, 3, 0, 0); } } else { - robosquawker_moby->state = 0xE; + robosquawker_moby->state = ROBOSQUAWKER_STATE_FLIGHT_IDLE; robosquawker_moby->pos.f[2] += 6.0f; if (robosquawker_moby->b53 != 0) { blend_moby_animation(robosquawker_moby, 0, 0, 0); @@ -633,7 +638,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (robosquawker_moby->b53 != 0) { blend_moby_animation(robosquawker_moby, 0, 0, scale_game_frames(3)); } - robosquawker_moby->state = 0x11; + robosquawker_moby->state = ROBOSQUAWKER_STATE_LAND; release_robosquawker_particle((Level13VendorMoby *)robosquawker_vars); } else if (d > 1.0f && robosquawker_moby->bBC == 1 && random_integer_below(4) == 0) { if (random_integer_below(0x100) & 1) { @@ -645,7 +650,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { blend_moby_animation(robosquawker_moby, 0, 0, scale_game_frames(3)); } release_robosquawker_particle((Level13VendorMoby *)robosquawker_vars); - robosquawker_moby->state = 0x11; + robosquawker_moby->state = ROBOSQUAWKER_STATE_LAND; clear_u64_value(&robosquawker_vars->v40); robosquawker_moby->bBC = 0; } else if (robosquawker_vars->w220 != -1) { @@ -660,7 +665,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { } } qcopy(&robosquawker_vars->v1E0, path + robosquawker_vars->w224 * 16 + 16); - robosquawker_moby->state = 0x12; + robosquawker_moby->state = ROBOSQUAWKER_STATE_FOLLOW_FLIGHT_PATH; } else if (fast_dec_timer(&robosquawker_vars->w20C) != 0) { int i; @@ -683,7 +688,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (robosquawker_moby->b53 != 0) { blend_moby_animation(robosquawker_moby, 0, 0, scale_game_frames(3)); } - robosquawker_moby->state = 0xF; + robosquawker_moby->state = ROBOSQUAWKER_STATE_FLY_TO_RANDOM_POINT; } break; } @@ -709,7 +714,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (robosquawker_moby->b53 != 0) { blend_moby_animation(robosquawker_moby, 0, 0, scale_game_frames(3)); } - robosquawker_moby->state = 0xE; + robosquawker_moby->state = ROBOSQUAWKER_STATE_FLIGHT_IDLE; } else { qcopy(&robosquawker_moby->pos, &va); } @@ -718,7 +723,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (robosquawker_moby->b53 != 0) { blend_moby_animation(robosquawker_moby, 0, 0, scale_game_frames(3)); } - robosquawker_moby->state = 0xE; + robosquawker_moby->state = ROBOSQUAWKER_STATE_FLIGHT_IDLE; } update_robosquawker_particle((unsigned char *)robosquawker_moby, (char *)robosquawker_vars); break; @@ -759,7 +764,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (robosquawker_moby->b53 != 0) { blend_moby_animation(robosquawker_moby, 0, 0, scale_game_frames(3)); } - robosquawker_moby->state = 0xF; + robosquawker_moby->state = ROBOSQUAWKER_STATE_FLY_TO_RANDOM_POINT; } else { qcopy(&robosquawker_moby->pos, &va); } @@ -783,7 +788,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { blend_moby_animation(robosquawker_moby, 0, 0, scale_game_frames(3)); } qzero(&robosquawker_vars->v40); - robosquawker_moby->state = 0x11; + robosquawker_moby->state = ROBOSQUAWKER_STATE_LAND; release_robosquawker_particle((Level13VendorMoby *)robosquawker_vars); } else if (g > 1.0f && robosquawker_moby->bBC == 1 && random_integer_below(4) == 0) { if (random_integer_below(0x100) & 1) { @@ -797,7 +802,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { } release_robosquawker_particle((Level13VendorMoby *)robosquawker_vars); qzero(&robosquawker_vars->v40); - robosquawker_moby->state = 0x11; + robosquawker_moby->state = ROBOSQUAWKER_STATE_LAND; clear_u64_value(&robosquawker_vars->v40); robosquawker_moby->bBC = 0; } @@ -823,7 +828,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { } robosquawker_vars->f1F4 = robosquawker_vars->f1F8 * 0.017453292f; robosquawker_vars->w210 = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - robosquawker_moby->state = 3; + robosquawker_moby->state = ROBOSQUAWKER_STATE_CHASE_TARGET; clear_u64_value(&robosquawker_vars->v40); if (robosquawker_moby->b53 != 5) { blend_moby_animation(robosquawker_moby, 5, 0, scale_game_frames(3)); @@ -847,7 +852,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (robosquawker_moby->b53 != 0) { blend_moby_animation(robosquawker_moby, 0, 0, scale_game_frames(3)); } - robosquawker_moby->state = 0xE; + robosquawker_moby->state = ROBOSQUAWKER_STATE_FLIGHT_IDLE; clear_u64_value(&robosquawker_vars->v40); } update_robosquawker_particle((unsigned char *)robosquawker_moby, (char *)robosquawker_vars); @@ -858,7 +863,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (fast_vec_length(&va) < robosquawker_vars->f1FC + 4.0f && absolute_float(robosquawker_moby->pos.f[2] - selected_target_record.pos.f[2]) < 8.0f && random_integer_below(0x13) == 0) { - robosquawker_moby->state = 2; + robosquawker_moby->state = ROBOSQUAWKER_STATE_FACE_AWAY_WAIT_FOR_CHASE; if (robosquawker_moby->b53 != 4) { blend_moby_animation(robosquawker_moby, 4, 0, scale_game_frames(3)); } @@ -868,7 +873,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { } robosquawker_vars->f1F4 = robosquawker_vars->f1F8 * 0.017453292f; robosquawker_vars->w210 = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - robosquawker_moby->state = 3; + robosquawker_moby->state = ROBOSQUAWKER_STATE_CHASE_TARGET; if (robosquawker_moby->b53 != 5) { blend_moby_animation(robosquawker_moby, 5, 0, scale_game_frames(3)); } @@ -876,7 +881,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { } else if (fast_vec_length(&va) > robosquawker_vars->f1FC + 6.0f && robosquawker_vars->h20A == 0) { qzero(&robosquawker_vars->v40); - robosquawker_moby->state = 0x10; + robosquawker_moby->state = ROBOSQUAWKER_STATE_TAKEOFF; if (robosquawker_moby->b53 != 0) { blend_moby_animation(robosquawker_moby, 0, 0, scale_game_frames(3)); } @@ -888,7 +893,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (fast_vec_length(&va) < robosquawker_vars->f1FC - 4.0f && absolute_float(robosquawker_moby->pos.f[2] - selected_target_record.pos.f[2]) < 8.0f && random_integer_below(0x13) == 0) { - robosquawker_moby->state = 2; + robosquawker_moby->state = ROBOSQUAWKER_STATE_FACE_AWAY_WAIT_FOR_CHASE; robosquawker_moby->pos.f[2] += 1.0f; if (robosquawker_moby->b53 != 4) { blend_moby_animation(robosquawker_moby, 4, 0, scale_game_frames(3)); @@ -933,7 +938,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { robosquawker_vars->f174 = 10.0f; update_robosquawker_particle((unsigned char *)robosquawker_moby, (char *)robosquawker_vars); - robosquawker_moby->state = 0xB; + robosquawker_moby->state = ROBOSQUAWKER_STATE_HOME_HOP; } break; } @@ -941,7 +946,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (step_moby_motion(robosquawker_moby, robosquawker_vars->x120) & 1) { release_robosquawker_particle((Level13VendorMoby *)robosquawker_vars); qzero(robosquawker_vars->x120); - robosquawker_moby->state = 3; + robosquawker_moby->state = ROBOSQUAWKER_STATE_CHASE_TARGET; if (random_integer_below(0x100) & 1) { robosquawker_vars->f1F8 = -robosquawker_vars->f1F8; } @@ -975,7 +980,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { } robosquawker_vars->f1F4 = robosquawker_vars->f1F8 * 0.017453292f; robosquawker_vars->w210 = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - robosquawker_moby->state = 3; + robosquawker_moby->state = ROBOSQUAWKER_STATE_CHASE_TARGET; if (robosquawker_moby->b53 != 5) { blend_moby_animation(robosquawker_moby, 5, 0, scale_game_frames(3)); } @@ -986,7 +991,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { } robosquawker_vars->f1F4 = robosquawker_vars->f1F8 * 0.017453292f; robosquawker_vars->w210 = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - robosquawker_moby->state = 3; + robosquawker_moby->state = ROBOSQUAWKER_STATE_CHASE_TARGET; if (robosquawker_moby->b53 != 5) { blend_moby_animation(robosquawker_moby, 5, 0, scale_game_frames(3)); } @@ -1033,7 +1038,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { selected_target_record.moby->state != 0xFE && selected_target_record.moby->state != 0xFD && d < 2.3f)) && !(res & 2)) { - robosquawker_moby->state = 4; + robosquawker_moby->state = ROBOSQUAWKER_STATE_PECK_ATTACK; if (robosquawker_moby->b53 != 6) { blend_moby_animation(robosquawker_moby, 6, 0, scale_game_frames(3)); } @@ -1049,7 +1054,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { FUN_L01_0026e090(robosquawker_moby->b21, 1); } } else if (robosquawker_moby->bBC != 1) { - robosquawker_moby->state = 5; + robosquawker_moby->state = ROBOSQUAWKER_STATE_RETURN_HOME; } } robosquawker_moby->bBC = 0; @@ -1093,7 +1098,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { } if ((robosquawker_moby->b70 & 2) && vector_distance_xy(&robosquawker_moby->pos, &selected_target_record) > 1.5f) { - robosquawker_moby->state = 3; + robosquawker_moby->state = ROBOSQUAWKER_STATE_CHASE_TARGET; if (robosquawker_moby->b53 != 5) { blend_moby_animation(robosquawker_moby, 5, 0, scale_game_frames(3)); } @@ -1128,7 +1133,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { va.f[2] = 0.0f; res = FUN_L00_00258b50(robosquawker_moby, &robosquawker_vars->w180, &va, &vb, 1.0f); if (vector_distance_xy(&robosquawker_moby->pos, &robosquawker_vars->v1D0) < 2.0f) { - robosquawker_moby->state = 1; + robosquawker_moby->state = ROBOSQUAWKER_STATE_GROUND_IDLE; if (robosquawker_moby->b53 != 3) { blend_moby_animation(robosquawker_moby, 3, 0, scale_game_frames(3)); } @@ -1138,19 +1143,19 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (robosquawker_moby->b21 != 0xFF) { FUN_L01_0026e090(robosquawker_moby->b21, 1); } - robosquawker_moby->state = 3; + robosquawker_moby->state = ROBOSQUAWKER_STATE_CHASE_TARGET; if (robosquawker_moby->b53 != 5) { blend_moby_animation(robosquawker_moby, 5, 0, scale_game_frames(3)); } } else if (robosquawker_moby->bBC == 1) { - robosquawker_moby->state = 3; + robosquawker_moby->state = ROBOSQUAWKER_STATE_CHASE_TARGET; if (robosquawker_moby->b53 != 5) { blend_moby_animation(robosquawker_moby, 5, 0, scale_game_frames(3)); } } else if (res & 2) { robosquawker_moby->pos.f[0] = previous_position.f[0]; robosquawker_moby->pos.f[1] = previous_position.f[1]; - robosquawker_moby->state = 0xC; + robosquawker_moby->state = ROBOSQUAWKER_STATE_BLOCKED_RETURN_HOME; if (robosquawker_moby->b53 != 4) { blend_moby_animation(robosquawker_moby, 4, 0, scale_game_frames(3)); } @@ -1162,7 +1167,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { case ROBOSQUAWKER_STATE_DAMAGE_KNOCKBACK: if (step_moby_motion(robosquawker_moby, robosquawker_vars->x120) & 1) { qzero(robosquawker_vars->x120); - robosquawker_moby->state = 3; + robosquawker_moby->state = ROBOSQUAWKER_STATE_CHASE_TARGET; if (robosquawker_moby->b53 != 5) { blend_moby_animation(robosquawker_moby, 5, 0, scale_game_frames(3)); } @@ -1176,7 +1181,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { case ROBOSQUAWKER_STATE_RECOVER_TO_FLIGHT_IDLE: release_robosquawker_particle((Level13VendorMoby *)robosquawker_vars); if (FUN_L00_002dc9f0(robosquawker_moby, robosquawker_vars->x120) != 0) { - robosquawker_moby->state = 0xE; + robosquawker_moby->state = ROBOSQUAWKER_STATE_FLIGHT_IDLE; if (robosquawker_moby->b53 != 0) { blend_moby_animation(robosquawker_moby, 0, 0, 0); } @@ -1226,12 +1231,12 @@ void robosquawker_update(RsMoby *robosquawker_moby) { fast_vec_sub(&vc, &selected_target_record, &robosquawker_vars->v1D0); if (vector_distance_xy(&robosquawker_moby->pos, &selected_target_record) < 1.5f && r <= 1.0f) { - robosquawker_moby->state = 4; + robosquawker_moby->state = ROBOSQUAWKER_STATE_PECK_ATTACK; if (robosquawker_moby->b53 != 6) { blend_moby_animation(robosquawker_moby, 6, 0, scale_game_frames(3)); } } else if (r <= 1.0f && !(res & 2)) { - robosquawker_moby->state = 5; + robosquawker_moby->state = ROBOSQUAWKER_STATE_RETURN_HOME; if (robosquawker_moby->b53 != 5) { blend_moby_animation(robosquawker_moby, 5, 0, scale_game_frames(3)); } @@ -1248,7 +1253,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { } if (random_integer_below(0x63) == 0) { qzero(&robosquawker_vars->v40); - robosquawker_moby->state = 0x10; + robosquawker_moby->state = ROBOSQUAWKER_STATE_TAKEOFF; if (robosquawker_moby->b53 != 0) { blend_moby_animation(robosquawker_moby, 0, 0, scale_game_frames(3)); } @@ -1310,7 +1315,7 @@ void robosquawker_update(RsMoby *robosquawker_moby) { if (robosquawker_vars->p218 == 0 || vector_distance_xy(&robosquawker_moby->pos, robosquawker_vars->p218 + 0x10) > convert_integer_to_float(robosquawker_vars->h216)) { - robosquawker_moby->state = 5; + robosquawker_moby->state = ROBOSQUAWKER_STATE_RETURN_HOME; if (robosquawker_moby->b53 != 5) { blend_moby_animation(robosquawker_moby, 5, 0, scale_game_frames(3)); } diff --git a/src/overlays/l13/mobys/tracked_group_watcher.c b/src/overlays/l13/mobys/tracked_group_watcher.c index d5953985ae..e21f513321 100644 --- a/src/overlays/l13/mobys/tracked_group_watcher.c +++ b/src/overlays/l13/mobys/tracked_group_watcher.c @@ -8,13 +8,18 @@ void tracked_group_watcher_update(struct Moby *moby) __asm__("FUN_L13_0030be60") /* Moby class 1577 */ void tracked_group_watcher_update(struct Moby *moby) { + enum { + TRACKED_GROUP_WATCHER_STATE_INITIALIZE_TRACKING = 0, + TRACKED_GROUP_WATCHER_STATE_MONITOR_TRACKED_MOBYS = 1, + TRACKED_GROUP_WATCHER_STATE_ZERO_THRESHOLD_IDLE = 2 + }; int *moby_vars = (int *)moby->pvars; - if (moby->state == 0) { + if (moby->state == TRACKED_GROUP_WATCHER_STATE_INITIALIZE_TRACKING) { int *ids = moby_vars + 4; int *cls = moby_vars + 12; char *base; int i; - moby->state = 1; + moby->state = TRACKED_GROUP_WATCHER_STATE_MONITOR_TRACKED_MOBYS; base = (char *)moby_base; for (i = 0; i < 8; i++) { unsigned char *o = (unsigned char *)(base + (ids[i] << 8)); @@ -24,8 +29,8 @@ void tracked_group_watcher_update(struct Moby *moby) { cls[i] = -1; } if (moby_vars[0] == 0) - moby->state = 2; - } else if (moby->state == 1) { + moby->state = TRACKED_GROUP_WATCHER_STATE_ZERO_THRESHOLD_IDLE; + } else if (moby->state == TRACKED_GROUP_WATCHER_STATE_MONITOR_TRACKED_MOBYS) { int *ids = moby_vars + 4; int *cls = moby_vars + 12; char *base = (char *)moby_base; diff --git a/src/overlays/l14/hero/hero_set_state.c b/src/overlays/l14/hero/hero_set_state.c index 684d2aca61..5c772c011d 100644 --- a/src/overlays/l14/hero/hero_set_state.c +++ b/src/overlays/l14/hero/hero_set_state.c @@ -64,23 +64,33 @@ extern void clear_moby_transform_history(void *o) __asm__("FUN_L00_00262840"); extern int hero_set_state(int, int) __asm__("FUN_L14_0022ff58"); extern char level14_transform_trail_jump_velocity_keys[] __asm__("D_L14_0017C620"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int animation_update_mode) { int saved_state_step; char *moby; int old20A7; float grind_direction_or_jump_reference_position[4]; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || + animation_update_mode != 2)) return 0; } - if ((D_L14_0015F5C4 == 2 || D_L14_0015F5C4 == 6) && b != 2) + if ((D_L14_0015F5C4 == 2 || D_L14_0015F5C4 == 6) && animation_update_mode != 2) return 0; { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -93,11 +103,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -118,14 +128,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); return 1; } @@ -145,7 +155,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; q->rand_timer.range = 0x68; } - if (b) { + if (animation_update_mode) { if (hero_get_gadget_anim_id(0) == 0x54) { set_hero_animation(hero_get_gadget_anim_id(0), 0, (float)scale_game_frames(0x12)); } else { @@ -160,7 +170,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; clear_u64_value(&p->motion.momentum); p->rand_timer.range = 0x68; - if (b) { + if (animation_update_mode) { if (hero_get_gadget_anim_id(0) == 0x54) { set_hero_animation(hero_get_gadget_anim_id(0), 0, (float)scale_game_frames(0x12)); } else { @@ -185,7 +195,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (animation_update_mode) set_hero_animation(0x45, 0, (float)scale_game_frames(0xC)); break; } @@ -196,7 +206,7 @@ int hero_set_state(int a, int b) { p->health.hp = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); FUN_L00_0025f730(&p->motion.momentum, frame_time * 3.5f); - if (b) + if (animation_update_mode) set_hero_animation(0x7C, 0, (float)scale_game_frames(0xC)); break; } @@ -212,7 +222,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->unk6A0 = 0; p->unk690 = p->motion.pos.f[2] - p->unk69C; - if (b) + if (animation_update_mode) set_hero_animation(0x74, 0, (float)scale_game_frames(0xB)); break; } @@ -224,7 +234,7 @@ int hero_set_state(int a, int b) { *(int *)&D_L14_0015F688 = scale_game_frames(0x3C); if (p->unk20AA == 0) { t = hero_get_gadget_anim_id(1); - if (p->moby->prev_seq != t && b) { + if (p->moby->prev_seq != t && animation_update_mode) { set_hero_animation(t, 0, (float)scale_game_frames(0x12)); } } @@ -322,7 +332,7 @@ int hero_set_state(int a, int b) { scale_game_frames(5) < u->rail_land_frames) n = scale_game_frames(0xD); } - if (b) { + if (animation_update_mode) { struct Hero *v = &hero; set_hero_animation(v->state.step + 3, D_L14_0015F6D8[v->state.step], (float)n); } @@ -334,7 +344,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 1; p->unk2284 = 0; - if (b) { + if (animation_update_mode) { if (p->state.prev == 4) { set_hero_animation(0x5E, 2, (float)scale_game_frames(5)); } else { @@ -349,14 +359,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); - if (b) { + if (animation_update_mode) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L14_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -384,7 +394,7 @@ int hero_set_state(int a, int b) { } return 0; } - if (b) { + if (animation_update_mode) { struct Hero *q = &hero; float d = q->anim_frame; int id = 6; @@ -401,7 +411,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = gravity_length_xy((float *)v); qcopy(&p->motion.momentum, v); - if (b) { + if (animation_update_mode) { int id = 6; float d = p->anim_frame; if (return_hero_animation_id_unchanged(MOBY(moby)->seq) == 4 && 3.0f < d && d < 16.0f) @@ -428,7 +438,7 @@ int hero_set_state(int a, int b) { FUN_L00_0025f730(&q->motion.momentum, frame_time * 7.0f); if (frame_time * 3.5f < q->motion.forward_speed) allocate_hero_voice_for_entry(0xC, 0); - if (b) { + if (animation_update_mode) { if (q->moby->seq == hero_get_gadget_anim_id(0)) { set_hero_animation(0xD, 2, (float)scale_game_frames(9)); } else { @@ -455,7 +465,7 @@ int hero_set_state(int a, int b) { } p->motion.move_yaw = fast_arc_tan(p->grapple_target->pos.x - p->motion.pos.f[0], p->grapple_target->pos.y - p->motion.pos.f[1]); - if (b) { + if (animation_update_mode) { set_hero_animation(0x2F, 2, (float)scale_game_frames(5)); hero_queue_sequence(0xA, 0xE); } @@ -468,7 +478,7 @@ int hero_set_state(int a, int b) { *(int *)&p->grapple_pull_speed = 0; p->grapple_pull_ending = 0; p->item_use_locked = 1; - if (b) + if (animation_update_mode) set_hero_animation(0x30, 1, (float)scale_game_frames(0xA)); break; } @@ -480,7 +490,7 @@ int hero_set_state(int a, int b) { *(int *)&p->grapple_pull_speed = 0; p->grapple_pull_ending = 0; p->tether_radius = fast_vec_dist(&p->motion.pos, &p->grapple_target->pos); - if (b) + if (animation_update_mode) set_hero_animation(0x30, 1, (float)scale_game_frames(5)); break; } @@ -536,7 +546,7 @@ int hero_set_state(int a, int b) { } else if (q->state.prev_control_mode == 2) { q->swing_gravity = q->fall_state_gravity; } - if (b) { + if (animation_update_mode) { set_hero_animation(0x34, 0, (float)scale_game_frames(0xB)); { struct Hero *r = &hero; @@ -552,7 +562,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 7; clear_u64_value(&p->motion.rot_spring_vel); qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_update_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xF)); break; } @@ -564,7 +574,7 @@ int hero_set_state(int a, int b) { *(int *)&p->past_apex = 0; p->rise_fall_land_frames = 0; p->rise_fall_gravity = frame_time_sq * 100.0f; - if (b) + if (animation_update_mode) set_hero_animation(0x2A, 0, (float)scale_game_frames(6)); break; } @@ -619,7 +629,7 @@ int hero_set_state(int a, int b) { } } } - if (b) { + if (animation_update_mode) { struct Hero *r = &hero; set_hero_animation(r->grind_anim_variant + 0x31, 0, (float)scale_game_frames(6)); } @@ -636,7 +646,7 @@ int hero_set_state(int a, int b) { p->unk4F0 = p->smoothed_ground_z; } p->item_select_blocked = 1; - if (b) { + if (animation_update_mode) { if (frame_time * 3.5f < p->motion.flat_speed) { set_hero_animation(0x20, 0, (float)scale_game_frames(9)); } else { @@ -651,7 +661,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0xD; p->item_select_blocked = 1; p->rand_timer.range = 0x68; - if (b) + if (animation_update_mode) set_hero_animation(0x21, 0, (float)scale_game_frames(6)); break; } @@ -660,7 +670,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (animation_update_mode) set_hero_animation(0x24, 0, (float)scale_game_frames(6)); break; } @@ -669,7 +679,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (animation_update_mode) set_hero_animation(0x25, 0, (float)scale_game_frames(6)); break; } @@ -678,7 +688,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_update_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xC)); break; } @@ -690,7 +700,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -702,7 +712,7 @@ int hero_set_state(int a, int b) { q->rand_timer.range = 0x68; q->state.step = 0; qcopy(&q->motion.velocity, &q->motion.resolved_velocity); - if (b) { + if (animation_update_mode) { if (q->vehicle_mode == 3) { set_hero_animation(6, 0, (float)scale_game_frames(8)); return 1; @@ -728,7 +738,7 @@ int hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) { + if (animation_update_mode) { set_hero_animation(0x13, 0, (float)animation_timing_preset_selector); } break; @@ -743,7 +753,7 @@ int hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.displacement); - if (b) { + if (animation_update_mode) { set_hero_animation(0x13, 0, (float)animation_timing_selector); } break; @@ -775,7 +785,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; @@ -1065,7 +1076,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; if (q->fall_start_distance == 0.0f) q->fall_start_distance = q->unk430 * 1.5f; - if (b) { + if (animation_update_mode) { int s = q->state.current; if (s == 7) { set_hero_animation(7, 0, (float)scale_game_frames(5)); @@ -1164,7 +1175,7 @@ int hero_set_state(int a, int b) { update_hero_target_heading(8.0f, 1.0471976f, -1.0f); *(int *)&q->slam_descending = 0; q->items[0].timer = 0xA; - if (b) { + if (animation_update_mode) { char *m; int n = scale_game_frames(0xB); if (q->state.prev == 0xB && scale_game_frames(0x2A) > q->state.prev_timer) @@ -1202,7 +1213,7 @@ int hero_set_state(int a, int b) { q->saved_item[0] = 0; update_hero_target_heading(14.0f, 0.5235988f, -1.0f); q->unkA7C = q->unkA7C == 0; - if (b) { + if (animation_update_mode) { int n = scale_game_frames(0xA); if (q->moby->prev_seq == 0x1A) n = scale_game_frames(3); @@ -1217,7 +1228,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; if (((void *)q->items[0].moby) == 0) break; - if (b) { + if (animation_update_mode) { set_hero_animation(0x67, 4, -1.0f); blend_moby_animation(((void *)q->items[0].moby), 3, 4, -1); } @@ -1248,7 +1259,7 @@ int hero_set_state(int a, int b) { r->attack_record = k; } update_hero_target_heading(5.0f, 0.7853982f, 0.7853982f); - if (b) { + if (animation_update_mode) { char *m; int j = 0; int n; @@ -1279,7 +1290,7 @@ int hero_set_state(int a, int b) { } case HERO_STATE_ANIMATION_RECOVERY_WITH_JUMP_CANCEL: { struct Hero *q; - if (b) + if (animation_update_mode) set_hero_animation(0x2C, 7, (float)scale_game_frames(9)); q = &hero; if (q->items[0].item_id == 0xA && ((char *)q->throw_target) != 0) { @@ -1308,7 +1319,7 @@ int hero_set_state(int a, int b) { { struct Hero *q = &hero; int e = D_L14_0017C328[q->attack_record].kind; - if (b) { + if (animation_update_mode) { char *m; int z = e == 0; int n = scale_game_frames(5); @@ -1329,7 +1340,7 @@ int hero_set_state(int a, int b) { } else { p->attack_record = 0; } - if (b) { + if (animation_update_mode) { struct Hero *q = &hero; char *m; int n = scale_game_frames(4); @@ -1345,7 +1356,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0xA; p->unk2284 = 0; p->ground_speed = frame_time * 9.0f; - if (b) { + if (animation_update_mode) { char *m; HeroTableRow2C *e = &D_L14_0017C328[p->attack_record]; int k = e->kind; @@ -1366,7 +1377,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->pushback_yaw = fast_add_rotations(p->motion.rot.f[2], 3.1415927f); p->ground_speed = frame_time * 9.0f; - if (b) + if (animation_update_mode) set_hero_animation(0x29, 5, (float)scale_game_frames(8)); break; } @@ -1388,7 +1399,7 @@ int hero_set_state(int a, int b) { { struct Hero *q = &hero; q->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (animation_update_mode) { set_hero_animation(0x10, 3, -3.0f); q->moby->anim_time = level14_hero_animation_blend_curves[q->anim_blend_curve] [(q->anim_blend_step)++]; @@ -1400,7 +1411,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) + if (animation_update_mode) set_hero_animation(0, 0, (float)scale_game_frames(0xE)); break; } @@ -1408,7 +1419,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) { + if (animation_update_mode) { set_hero_animation(4, 0, (float)scale_game_frames(7)); hero_queue_sequence(0xE, 0x22); } @@ -1419,7 +1430,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_update_mode) set_hero_animation(6, 0, (float)scale_game_frames(0xC)); break; } @@ -1430,7 +1441,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (animation_update_mode) set_hero_animation(6, 0, (float)scale_game_frames(7)); break; } @@ -1447,7 +1458,7 @@ int hero_set_state(int a, int b) { if (frame_time * 1.5f < planar_speed) hero_base->ground_speed = frame_time * 1.5f; hero_base->unk3B8 = 0; - if (b) + if (animation_update_mode) set_hero_animation(1, 0, (float)scale_game_frames(8)); } break; @@ -1457,7 +1468,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (animation_update_mode) set_hero_animation(3, 0, (float)scale_game_frames(0xC)); break; } @@ -1470,7 +1481,7 @@ int hero_set_state(int a, int b) { FUN_L00_0025f730(&p->motion.velocity, frame_time * 5.0f); hero_change_health(1); p->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (animation_update_mode) { set_hero_animation(2, 3, -3.0f); p->moby->anim_time = level14_hero_animation_blend_curves[p->anim_blend_curve][(p->anim_blend_step)++]; @@ -1491,7 +1502,7 @@ int hero_set_state(int a, int b) { clear_u64_value(&p->motion.velocity); clear_u64_value(&p->motion.displacement); p->motion.velocity.f[2] = frame_time * 10.0f; - if (b) + if (animation_update_mode) set_hero_animation(0x10, 2, -3.0f); break; } @@ -1542,7 +1553,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->tilt_disabled = 1; p->item_use_locked = 1; - if (b) + if (animation_update_mode) set_hero_animation(hero_get_gadget_anim_id(0), 0, -1.0f); break; } @@ -1553,7 +1564,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->item_use_locked = 1; clear_u64_value(&p->motion.velocity); - if (b) + if (animation_update_mode) set_hero_animation(0xB, 0, -1.0f); break; } @@ -1563,7 +1574,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x18; p->item_use_locked = 1; cancel_hero_item_animation(); - if (b) + if (animation_update_mode) set_hero_animation(hero_get_gadget_anim_id(0), 0, -1.0f); break; } diff --git a/src/overlays/l14/hero/process_hero_state_transitions.c b/src/overlays/l14/hero/process_hero_state_transitions.c index af0fe8fa2e..986b3efc40 100644 --- a/src/overlays/l14/hero/process_hero_state_transitions.c +++ b/src/overlays/l14/hero/process_hero_state_transitions.c @@ -174,9 +174,11 @@ void process_hero_state_transitions(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && D_L14_0015F594 == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -239,7 +241,7 @@ void process_hero_state_transitions(void) { } } if (hero_fatal_fall_height_threshold > hero.motion.pos.f[2] && - hero.ground_distance > 2.0f && hero.vehicle_mode != 2 && + hero.ground_distance > 2.0f && hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { @@ -506,7 +508,7 @@ void process_hero_state_transitions(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -533,7 +535,7 @@ void process_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); break; } @@ -825,7 +827,8 @@ void process_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -2311,7 +2314,7 @@ void process_hero_state_transitions(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l14/hero/update_hero_motion_by_state.c b/src/overlays/l14/hero/update_hero_motion_by_state.c index 54ca42c54a..987e9fe9c0 100644 --- a/src/overlays/l14/hero/update_hero_motion_by_state.c +++ b/src/overlays/l14/hero/update_hero_motion_by_state.c @@ -35,6 +35,14 @@ float absolute_float(float input) __asm__("func_001F99C0"); void resolve_hero_surface_reactions(void) __asm__("FUN_L14_0021dd30"); void resolve_hero_surface_reactions(void) { + enum { + HERO_GROUND_TYPE_MAGNET = 2, + HERO_GROUND_TYPE_ICE = 7, + HERO_GROUND_TYPE_SINKING_SURFACE = 0xD + }; + enum { + HERO_GROUND_TYPE_SLIP = 8 + }; struct Hero *hero_ptr; struct Hero *hero_data = &hero; int keep = hero_data->ground_sound_class; @@ -46,10 +54,10 @@ void resolve_hero_surface_reactions(void) { hero_data->unk308 = 0; if (saved_ground_type == -1) return; - if (saved_ground_type == 2) { + if (saved_ground_type == HERO_GROUND_TYPE_MAGNET) { if (hero_data->frames_off_ground.s == 0 || hero_data->ground_distance < 0.3f) { hero_data->on_magnet_ground = 1; - if (hero_data->vehicle_mode == 0) { + if (hero_data->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { char *item_moby_bytes = ((char *)hero_data->items[1].moby); if (item_moby_bytes != 0 && *(short *)(item_moby_bytes + 0xA6) == 0xAD) { hero_data->unk308 = 1; @@ -72,19 +80,19 @@ void resolve_hero_surface_reactions(void) { struct Hero *q = &hero; q->selector_11 = 1; } - if (saved_ground_type == 2) { + if (saved_ground_type == HERO_GROUND_TYPE_MAGNET) { struct Hero *q = &hero; q->on_magnet_ground = 1; } - if (saved_ground_type == 7) { + if (saved_ground_type == HERO_GROUND_TYPE_ICE) { struct Hero *q = &hero; q->on_ice_ground = 1; } - if (saved_ground_type == 0xD) { + if (saved_ground_type == HERO_GROUND_TYPE_SINKING_SURFACE) { struct Hero *q = &hero; q->selector_13 = 1; } - if (saved_ground_type == 8) { + if (saved_ground_type == HERO_GROUND_TYPE_SLIP) { struct Hero *q = &hero; q->on_slip_ground = 1; } @@ -396,7 +404,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void clip_hero_horizontal_velocity(s32) __asm__("FUN_L01_00232978"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -425,7 +433,7 @@ extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); extern void build_spherical_offset(void *, f32, f32, f32) __asm__("FUN_00214db0"); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L14_0021c5c8(f32, f32); @@ -476,7 +484,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L14_0017C4B8; extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); extern s32 is_moby_in_class_range_500_to_540(s32) __asm__("FUN_L00_0025e3b8"); @@ -648,10 +656,10 @@ void update_hero_motion_by_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -662,11 +670,11 @@ void update_hero_motion_by_state(void) { } else { clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -726,11 +734,12 @@ void update_hero_motion_by_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && MV(hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -748,11 +757,12 @@ void update_hero_motion_by_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (MV(hero.grapple_target) != NULL) { hero.motion.move_yaw = @@ -914,13 +924,13 @@ void update_hero_motion_by_state(void) { if (vector_distance_xy(&hero.motion.pos, &MV(hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&motion_vector_scratch, &hero.motion.pos, &MV(hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1033,7 +1043,8 @@ void update_hero_motion_by_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1132,7 +1143,8 @@ void update_hero_motion_by_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1178,7 +1190,7 @@ void update_hero_motion_by_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1207,10 +1219,10 @@ void update_hero_motion_by_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -1236,11 +1248,11 @@ void update_hero_motion_by_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { attack_spacing_offset = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { attack_spacing_offset = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1285,7 +1297,7 @@ void update_hero_motion_by_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || MV(hero.melee_target) != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1295,7 +1307,8 @@ void update_hero_motion_by_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1309,10 +1322,11 @@ void update_hero_motion_by_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -1428,11 +1442,12 @@ void update_hero_motion_by_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1489,10 +1504,11 @@ void update_hero_motion_by_state(void) { hero.air_frames.s = 0; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1573,11 +1589,12 @@ void update_hero_motion_by_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1619,11 +1636,12 @@ void update_hero_motion_by_state(void) { AN.f110 = s * m; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); } else { hero.motion.velocity.f[2] = 0.0f; - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 150.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 150.0f); } break; } @@ -1643,9 +1661,9 @@ void update_hero_motion_by_state(void) { release_voice_slot_cf(0, MV(hero.moby), 0); } else { if (hero.grind_voice != -1) { - struct VoiceSlot *e = + struct VoiceSlot *grind_voice_slot = (struct VoiceSlot *)(((u8 *)&voice_pool) + hero.grind_voice * 0x70); - if (e->pm88 == MV(hero.moby) && e->b74 != 0) { + if (grind_voice_slot->pm88 == MV(hero.moby) && grind_voice_slot->b74 != 0) { release_voice_slot(hero.grind_voice); } } @@ -1906,7 +1924,7 @@ void update_hero_motion_by_state(void) { } else { f32 base_grind_speed_target = frame_time * 12.0f; f32 tt; - f32 e; + f32 rail_lookahead_slope_angle; f32 sp; s32 si; f32 sf; @@ -1952,21 +1970,23 @@ void update_hero_motion_by_state(void) { &sf, 0.3f, hero.rail_spline_loops); - e = fast_arc_tan( + rail_lookahead_slope_angle = fast_arc_tan( vector_distance_xy(&hero.rail_point, &vector_and_hit_descriptor_scratch), vector_and_hit_descriptor_scratch.f[2] - hero.rail_point.f[2]); - if (e > 0.0f) { - sp = e * 1.9098593f * (frame_time * -2.5f); - if (e > 0.2617994f && hero.grind_pose != 2 && hero.grind_pose != 3) { + if (rail_lookahead_slope_angle > 0.0f) { + sp = rail_lookahead_slope_angle * 1.9098593f * (frame_time * -2.5f); + if (rail_lookahead_slope_angle > 0.2617994f && hero.grind_pose != 2 && + hero.grind_pose != 3) { hero.grind_pose = 0; - } else if (e < 0.13962634f && hero.grind_pose == 0) { + } else if (rail_lookahead_slope_angle < 0.13962634f && hero.grind_pose == 0) { hero.grind_pose = -1; } } else { - sp = -e * 2.864789f * (frame_time * 8.0f); - if (e < -0.19198622f && hero.grind_pose != 2 && hero.grind_pose != 3) { + sp = -rail_lookahead_slope_angle * 2.864789f * (frame_time * 8.0f); + if (rail_lookahead_slope_angle < -0.19198622f && hero.grind_pose != 2 && + hero.grind_pose != 3) { hero.grind_pose = 1; - } else if (e > -0.12217305f && hero.grind_pose == 1) { + } else if (rail_lookahead_slope_angle > -0.12217305f && hero.grind_pose == 1) { hero.grind_pose = -1; } } @@ -2106,7 +2126,7 @@ void update_hero_motion_by_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; steer_hero_planar_velocity(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2143,7 +2163,8 @@ void update_hero_motion_by_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2160,7 +2181,8 @@ void update_hero_motion_by_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2210,7 +2232,7 @@ void update_hero_motion_by_state(void) { clip_hero_horizontal_velocity(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2226,9 +2248,9 @@ void update_hero_motion_by_state(void) { f32 sp; if (hero_slot_item_id(3) == 2) { if (hero.voice_slot4 != -1) { - struct VoiceSlot *e = + struct VoiceSlot *landing_voice_slot = (struct VoiceSlot *)(((u8 *)&voice_pool) + hero.voice_slot4 * 0x70); - if (e->pm88 == MV(hero.moby) && e->b74 != 0) { + if (landing_voice_slot->pm88 == MV(hero.moby) && landing_voice_slot->b74 != 0) { release_voice_slot(hero.voice_slot4); } } @@ -2236,9 +2258,10 @@ void update_hero_motion_by_state(void) { release_voice_slot_cf(3, MV(hero.moby), 2); } else { if (hero.unk2224 != -1) { - struct VoiceSlot *e = + struct VoiceSlot *alternate_landing_voice_slot = (struct VoiceSlot *)(((u8 *)&voice_pool) + hero.unk2224 * 0x70); - if (e->pm88 == MV(hero.moby) && e->b74 != 0) { + if (alternate_landing_voice_slot->pm88 == MV(hero.moby) && + alternate_landing_voice_slot->b74 != 0) { release_voice_slot(hero.unk2224); } } @@ -2255,7 +2278,7 @@ void update_hero_motion_by_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2354,7 +2377,7 @@ void update_hero_motion_by_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&vector_and_descriptor_scratch, &hero.motion.pos); - FUN_L00_00233810( + add_hero_up_offset( &vector_and_descriptor_scratch, &vector_and_descriptor_scratch, 0.5f); qcopy(&v10, &vector_and_descriptor_scratch); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; @@ -2384,7 +2407,7 @@ void update_hero_motion_by_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2430,7 +2453,7 @@ void update_hero_motion_by_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -2452,7 +2475,7 @@ void update_hero_motion_by_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = D_0015ED6C_a * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = D_0015ED6C_a * 0.9f; } } else { @@ -2463,29 +2486,30 @@ void update_hero_motion_by_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { clip_hero_horizontal_velocity(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2498,11 +2522,12 @@ void update_hero_motion_by_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -2520,18 +2545,19 @@ void update_hero_motion_by_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; steer_hero_planar_velocity(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -2539,7 +2565,8 @@ void update_hero_motion_by_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_movement(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -2568,11 +2595,12 @@ void update_hero_motion_by_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2589,10 +2617,10 @@ void update_hero_motion_by_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l14/level_class_tables.c b/src/overlays/l14/level_class_tables.c index 317c860d6c..26e53deca0 100644 --- a/src/overlays/l14/level_class_tables.c +++ b/src/overlays/l14/level_class_tables.c @@ -6,10 +6,10 @@ #include "rnc/camera/update_cam.h" #include "rnc/mobys/moby_class_tables.h" -void FUN_L00_002caf40(); +void get_morphoray_chicken_slot_record() __asm__("FUN_L00_002caf40"); void FUN_L00_002ea7a0(); void FUN_L00_002ed230(); -void FUN_L10_002f5f18(); +void update_path_flythrough_camera() __asm__("FUN_L10_002f5f18"); void audio_stream_callback_keeper_update() __asm__("FUN_L14_00303370"); void beam_slots_update() __asm__("FUN_L14_003039e0"); void blarg_heavy_interceptor_update() __asm__("FUN_L14_002ac618"); @@ -175,7 +175,7 @@ void *D_L14_001FD9E8[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; struct MobyClassUpdate moby_classes[154] __asm__("D_L14_001FD280") @@ -352,7 +352,7 @@ struct CameraType level_camera_types[10] __asm__("D_L14_001FDA00") __attribute__ {17, FUN_L00_002ed230, noop_main_callback, noop_main_callback, noop_main_callback}, {19, evaluate_descriptor_eligibility, initialize_path_camera, - FUN_L10_002f5f18, noop_main_callback }, + update_path_flythrough_camera, noop_main_callback }, {20, check_path_camera_priority, setup_path_camera, update_path_camera, noop_main_callback}, {21, check_path_key_camera_priority, initialize_path_key_camera, diff --git a/src/overlays/l14/mobys/audio_stream_callback_keeper.c b/src/overlays/l14/mobys/audio_stream_callback_keeper.c index ffea530c82..ba4fa4b220 100644 --- a/src/overlays/l14/mobys/audio_stream_callback_keeper.c +++ b/src/overlays/l14/mobys/audio_stream_callback_keeper.c @@ -24,7 +24,7 @@ void audio_stream_callback_keeper_update(struct Moby *moby) { case MOBY_STATE_INITIALIZE: prepare_scaled_float_table_with_target_byte( l14_scaled_table_setup_target, 0x40, 0.6666667f); - moby->state = 1; + moby->state = MOBY_STATE_REGISTER_DRAW_CALLBACK; moby->update_dist = 0xFF; break; case MOBY_STATE_REGISTER_DRAW_CALLBACK: diff --git a/src/overlays/l14/mobys/blarg_heavy_interceptor.c b/src/overlays/l14/mobys/blarg_heavy_interceptor.c index eb2211d383..7b96578c7e 100644 --- a/src/overlays/l14/mobys/blarg_heavy_interceptor.c +++ b/src/overlays/l14/mobys/blarg_heavy_interceptor.c @@ -21,6 +21,18 @@ #include "sda.h" #include "rnc/overlay/l14/mobys/blarg_heavy_interceptor_globals.h" +enum { + INTERCEPTOR_STATE_INITIALIZE = 0, + INTERCEPTOR_STATE_PATROL_AND_SCAN = 1, + INTERCEPTOR_STATE_ALERT_GROUP = 2, + INTERCEPTOR_STATE_TRACK_TARGET = 3, + INTERCEPTOR_STATE_WAIT_FOR_GROUP_READY = 4, + INTERCEPTOR_STATE_FOLLOW_RETURN_PATH = 5, + INTERCEPTOR_STATE_REJOIN_PATROL = 6, + INTERCEPTOR_STATE_INITIALIZE_DEATH_FALL = 7, + INTERCEPTOR_STATE_DEATH_FALL = 9 +}; + extern u16 *D_L14_001ABF40_u[] __asm__("D_L14_001ABF40"); extern u8 *D_L14_0015FFD8; @@ -105,7 +117,7 @@ extern int FUN_L00_001f2868_c618(float, void *, int, void *, void *) __asm__("FU extern int FUN_001efa68_c618(void *, void *, int, int, int) __asm__("FUN_001efa68"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern f32 ease_c618(f32 *pos, f32 target, f32 *vel, f32, f32, f32) __asm__("FUN_L00_0025b8c0"); @@ -172,9 +184,11 @@ extern char D_L14_0015F580[] MACRO_ADDR; #include "rnc/overlay/l14/mobys/blarg_heavy_interceptor_data/blarg_heavy_interceptor_update.h" -extern f32 D_L14_001613A0_gp __asm__("D_L14_001613A0") __attribute__((sda)); +extern f32 l14_blarg_heavy_interceptor_path_easing_error_gain __asm__("D_L14_001613A0") + __attribute__((sda)); -extern f32 D_L14_001613A4_gp __asm__("D_L14_001613A4") __attribute__((sda)); +extern f32 l14_blarg_heavy_interceptor_path_easing_damping_coefficient __asm__("D_L14_001613A4") + __attribute__((sda)); extern Vec4 D_L14_00174560; @@ -249,15 +263,7 @@ typedef struct BlargHeavyInterceptorVars { /* Moby class 8 */ void blarg_heavy_interceptor_update(struct Moby *moby) { enum { - INTERCEPTOR_STATE_INITIALIZE = 0, - INTERCEPTOR_STATE_PATROL_AND_SCAN = 1, - INTERCEPTOR_STATE_ALERT_GROUP = 2, - INTERCEPTOR_STATE_TRACK_TARGET = 3, - INTERCEPTOR_STATE_WAIT_FOR_GROUP_READY = 4, - INTERCEPTOR_STATE_FOLLOW_RETURN_PATH = 5, - INTERCEPTOR_STATE_REJOIN_PATROL = 6, - INTERCEPTOR_STATE_INITIALIZE_DEATH_FALL = 7, - INTERCEPTOR_STATE_DEATH_FALL = 9 + INTERCEPTOR_STATE_GROUP_EFFECTS_CONTROLLER = 8 }; BlargHeavyInterceptorVars *moby_vars = (BlargHeavyInterceptorVars *)moby->pvars; float vector_scratch[4]; @@ -272,7 +278,7 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { FUN_0020c828(moby); return; } - if (moby->state == 8) { + if (moby->state == INTERCEPTOR_STATE_GROUP_EFFECTS_CONTROLLER) { FUN_L14_002aed50_c618(moby); add_draw_callback(draw_blarg_heavy_interceptor_group_effects, moby); return; @@ -289,7 +295,8 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { } } process_blarg_heavy_interceptor_hit_reactions(moby); - if (moby->state > 0 && moby->state < 7) { + if (moby->state > INTERCEPTOR_STATE_INITIALIZE && + moby->state < INTERCEPTOR_STATE_INITIALIZE_DEATH_FALL) { if (fast_vec_dist(&moby->pos, D_L14_001674C0) < 40.0f) { FUN_L00_0025a120(moby); } @@ -302,7 +309,7 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { moby->flags = (moby->flags | 0x41) & 0xEFFF; moby->collision = 0; moby->update_dist = 0xFF; - moby->state = 8; + moby->state = INTERCEPTOR_STATE_GROUP_EFFECTS_CONTROLLER; moby_vars->unk58 = truncate_float_to_s32(17.0f); moby_vars->unk5A = truncate_float_to_s32(6.0f); moby_vars->group_member_count = count_moby_group_members(moby); @@ -342,7 +349,7 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { attach_manipulator_c618(moby, 1, moby_vars->unk120); moby_vars->unk1C0[2] = moby_vars->unk1C0[1] = 0.0f; *(int *)&moby_vars->unk180[3] = 0; - moby->state = 1; + moby->state = INTERCEPTOR_STATE_PATROL_AND_SCAN; moby->command = 0; break; case INTERCEPTOR_STATE_PATROL_AND_SCAN: { @@ -353,7 +360,7 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { (blarg_heavy_interceptor_patrol_glow_green_gp << 8) | blarg_heavy_interceptor_patrol_glow_red_gp; if (is_turret_group_activated_or_empty(moby_vars->turret_group)) { - moby->state = 3; + moby->state = INTERCEPTOR_STATE_TRACK_TARGET; moby_vars->timer_1F2 = scale_game_frames(blarg_heavy_interceptor_target_tracking_duration_frames_gp); } @@ -397,7 +404,7 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { } *(s32 *)&moby_vars->unk1D0[0] = -1; activate_waiting_turrets_in_group(moby_vars->turret_group); - moby->state = 3; + moby->state = INTERCEPTOR_STATE_TRACK_TARGET; moby_vars->timer_1F2 = scale_game_frames(blarg_heavy_interceptor_target_tracking_duration_frames_gp); break; @@ -439,13 +446,13 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { moby_vars->unk8C = 0.0f; moby_vars->path_point = 0; moby_vars->unk208 = 0; - moby->state = 4; + moby->state = INTERCEPTOR_STATE_WAIT_FOR_GROUP_READY; } } else { moby_vars->path_point = 0; moby_vars->unk8C = 0.0f; moby_vars->unk208 = 0; - moby->state = 4; + moby->state = INTERCEPTOR_STATE_WAIT_FOR_GROUP_READY; } case INTERCEPTOR_STATE_WAIT_FOR_GROUP_READY: moby->glow_color = 0xFF000000 | @@ -466,7 +473,7 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { moby_vars->flags |= 8; FUN_L14_002aea08_c618(moby); } - if (moby->state == 4) { + if (moby->state == INTERCEPTOR_STATE_WAIT_FOR_GROUP_READY) { if (moby->prev_seq == 0) { blend_moby_animation_c618(moby, 2, 0, 5); } @@ -484,13 +491,13 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { if (absolute_float(moby_vars->unk1B0[3]) < 0.0001f) { moby_vars->unk1B0[3] = 0.0f; } - FUN_L00_001fff28(moby_vars->unkF0, 2, moby_vars->unk1B0[3]); - FUN_L00_001fff28(moby_vars->unk130, 1, moby_vars->unk1C0[0]); + build_axis_rotation_quaternion(moby_vars->unkF0, 2, moby_vars->unk1B0[3]); + build_axis_rotation_quaternion(moby_vars->unk130, 1, moby_vars->unk1C0[0]); } if (try_retract_turret_group(moby_vars->turret_group)) { LevelPath *p = l14_paths[moby_vars->patrol_path]; - moby->state = 5; + moby->state = INTERCEPTOR_STATE_FOLLOW_RETURN_PATH; moby_vars->path_point = p->count - 2; moby_vars->unk8C = p->points[moby_vars->path_point].f[3]; moby_vars->unk208 = 0; @@ -512,7 +519,7 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { moby_vars->path_segment = near_seg; moby_vars->unk1C0[3] = near_t; moby_vars->unk200 = 0; - moby->state = 6; + moby->state = INTERCEPTOR_STATE_REJOIN_PATROL; } break; case INTERCEPTOR_STATE_REJOIN_PATROL: { @@ -542,23 +549,23 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { vector_scratch[0], &moby_vars->unk190[1], 0.005f, - D_L14_001613A4_gp, + l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); ease_c618(&moby->pos.y, vector_scratch[1], &moby_vars->unk190[2], 0.005f, - D_L14_001613A4_gp, + l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); ease_c618(&moby->pos.z, vector_scratch[2], &moby_vars->unk190[3], 0.005f, - D_L14_001613A4_gp, + l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); update_blarg_heavy_interceptor_aim_transforms(moby, 0); if (fast_vec_dist(&moby->pos, vector_scratch) < 0.5f) { - moby->state = 1; + moby->state = INTERCEPTOR_STATE_PATROL_AND_SCAN; } FUN_L00_0025d808_c618(((int *)l14_paths[moby_vars->unk78]), vector_scratch, @@ -569,20 +576,20 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { ease_c618(moby_vars->unk170, vector_scratch[0], moby_vars->unk180, - D_L14_001613A0_gp, - D_L14_001613A4_gp, + l14_blarg_heavy_interceptor_path_easing_error_gain, + l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); ease_c618(&moby_vars->unk170[1], vector_scratch[1], &moby_vars->unk180[1], - D_L14_001613A0_gp, - D_L14_001613A4_gp, + l14_blarg_heavy_interceptor_path_easing_error_gain, + l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); ease_c618(&moby_vars->unk170[2], vector_scratch[2], &moby_vars->unk180[2], - D_L14_001613A0_gp, - D_L14_001613A4_gp, + l14_blarg_heavy_interceptor_path_easing_error_gain, + l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); break; } @@ -644,7 +651,7 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { moby_vars->yaw_drift = randf_sym(0.0f, 0.08726646f); moby->rot.x = fast_add_rotations(moby->rot.x, randf_sym(0.0f, 0.7853982f)); moby->rot.y = fast_add_rotations(moby->rot.y, randf_sym(0.0f, 0.7853982f)); - moby->state = 9; + moby->state = INTERCEPTOR_STATE_DEATH_FALL; FUN_L14_002aead8_c618(moby); return; } @@ -747,17 +754,19 @@ void blarg_heavy_interceptor_update(struct Moby *moby) { return; } } - if ((s8)moby->state >= 0 && moby->prev_seq == 1) { + if ((s8)moby->state >= INTERCEPTOR_STATE_INITIALIZE && moby->prev_seq == 1) { if (moby->command == 1) { spawn_particles_at_shape_points(moby, D_L14_0015F580, 0xFFFF); } } else { moby->command = 0; } - if (moby->state == 1 && !voice_is_playing(moby, *(s32 *)&moby_vars->unk1D0[0])) { + if (moby->state == INTERCEPTOR_STATE_PATROL_AND_SCAN && + !voice_is_playing(moby, *(s32 *)&moby_vars->unk1D0[0])) { *(s32 *)&moby_vars->unk1D0[0] = allocate_voice_c618(0, 4, moby); } - if ((moby->state == 3 || moby->state == 4) && + if ((moby->state == INTERCEPTOR_STATE_TRACK_TARGET || + moby->state == INTERCEPTOR_STATE_WAIT_FOR_GROUP_READY) && !voice_is_playing(moby, *(s32 *)&moby_vars->unk1D0[0])) { *(s32 *)&moby_vars->unk1D0[0] = allocate_voice_c618(2, 4, moby); } @@ -789,6 +798,12 @@ void process_blarg_heavy_interceptor_hit_reactions(struct Moby *moby) { HIT_REACTION_LOW_RED_FLASH_AND_HIT_ANIMATION = 10, HIT_REACTION_NONE = 11 }; + enum { + HIT_REACTION_STATUS_SKIP_DAMAGE_RESPONSE = 1 + }; + enum { + HIT_REACTION_STATUS_ENABLE_HIT_PARTICLES = 3 + }; BlargHeavyInterceptorVars *blarg_heavy_interceptor_vars = (BlargHeavyInterceptorVars *)moby->pvars; int hit_reaction_status; @@ -803,14 +818,15 @@ void process_blarg_heavy_interceptor_hit_reactions(struct Moby *moby) { &damage_amount, 0, 4); - if (hit_reaction_status != 1 && moby->state < 7) { + if (hit_reaction_status != HIT_REACTION_STATUS_SKIP_DAMAGE_RESPONSE && + moby->state < INTERCEPTOR_STATE_INITIALIZE_DEATH_FALL) { float remaining_health = blarg_heavy_interceptor_vars->health - damage_amount; blarg_heavy_interceptor_vars->health = remaining_health; if (remaining_health <= 0.0f) hit_reaction_result = 1; - if (moby->state == 1) - moby->state = 2; - if (hit_reaction_status == 3) + if (moby->state == INTERCEPTOR_STATE_PATROL_AND_SCAN) + moby->state = INTERCEPTOR_STATE_ALERT_GROUP; + if (hit_reaction_status == HIT_REACTION_STATUS_ENABLE_HIT_PARTICLES) moby->command = 1; switch (hit_reaction_result) { case HIT_REACTION_ANIMATE_WITH_LOW_RED_FLASH: @@ -829,7 +845,7 @@ void process_blarg_heavy_interceptor_hit_reactions(struct Moby *moby) { break; case HIT_REACTION_LETHAL: case HIT_REACTION_DEATH_FALL: - moby->state = 7; + moby->state = INTERCEPTOR_STATE_INITIALIZE_DEATH_FALL; moby->flags &= 0xEFFF; FUN_L00_00257470(moby, 0, -1); break; @@ -1532,20 +1548,20 @@ void update_blarg_heavy_interceptor_patrol_aim_point(struct Moby *moby) { FUN_L00_0025b8c0_c(interceptor_instance_vars->unk170, interceptor_instance_vars->unk180, path_target_position[0], - *(float *)&D_L14_001613A0_gp, - *(float *)&D_L14_001613A4_gp, + *(float *)&l14_blarg_heavy_interceptor_path_easing_error_gain, + *(float *)&l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); FUN_L00_0025b8c0_c(&interceptor_instance_vars->unk170[1], &interceptor_instance_vars->unk180[1], path_target_position[1], - *(float *)&D_L14_001613A0_gp, - *(float *)&D_L14_001613A4_gp, + *(float *)&l14_blarg_heavy_interceptor_path_easing_error_gain, + *(float *)&l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); FUN_L00_0025b8c0_c(&interceptor_instance_vars->unk170[2], &interceptor_instance_vars->unk180[2], path_target_position[2], - *(float *)&D_L14_001613A0_gp, - *(float *)&D_L14_001613A4_gp, + *(float *)&l14_blarg_heavy_interceptor_path_easing_error_gain, + *(float *)&l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); if (interceptor_instance_vars->rejoin_path_loop == 0) { if (r != 0) { @@ -1588,20 +1604,20 @@ void update_blarg_heavy_interceptor_patrol_path_position(struct Moby *moby) { FUN_L00_0025b8c0_c(&moby->pos.x, &heavy_interceptor_vars->unk190[1], destination_path_target_position[0], - *(float *)&D_L14_001613A0_gp, - *(float *)&D_L14_001613A4_gp, + *(float *)&l14_blarg_heavy_interceptor_path_easing_error_gain, + *(float *)&l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); FUN_L00_0025b8c0_c(&moby->pos.y, &heavy_interceptor_vars->unk190[2], destination_path_target_position[1], - *(float *)&D_L14_001613A0_gp, - *(float *)&D_L14_001613A4_gp, + *(float *)&l14_blarg_heavy_interceptor_path_easing_error_gain, + *(float *)&l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); FUN_L00_0025b8c0_c(&moby->pos.z, &heavy_interceptor_vars->unk190[3], destination_path_target_position[2], - *(float *)&D_L14_001613A0_gp, - *(float *)&D_L14_001613A4_gp, + *(float *)&l14_blarg_heavy_interceptor_path_easing_error_gain, + *(float *)&l14_blarg_heavy_interceptor_path_easing_damping_coefficient, 0.0f); } @@ -1713,7 +1729,7 @@ void update_blarg_heavy_interceptor_oscillation_and_patrol_heading(struct Moby * blarg_heavy_interceptor_rotation_oscillation_amplitude_gp, blarg_heavy_interceptor_rotation_oscillation_first_phase_increment_gp, blarg_heavy_interceptor_rotation_oscillation_second_phase_increment_gp); - if (moby->state == 1) { + if (moby->state == INTERCEPTOR_STATE_PATROL_AND_SCAN) { if (fast_dec_timer_s16((s16 *)&interceptor_private_vars->unk1B0[1])) { *(s16 *)&interceptor_private_vars->unk1B0[1] = scale_game_frames(blarg_heavy_interceptor_patrol_heading_change_interval_frames_gp); @@ -1782,10 +1798,12 @@ int update_blarg_heavy_interceptor_aim_transforms(struct Moby *moby, int flag) { 1.0f); rotation_angle = fast_subtract_rotations( fast_arc_tan(half_span_vector[0], half_span_vector[1]), moby->rot.z); - FUN_L00_001fff28(blarg_heavy_interceptor_private_vars->unkF0, 2, rotation_angle); + build_axis_rotation_quaternion( + blarg_heavy_interceptor_private_vars->unkF0, 2, rotation_angle); blarg_heavy_interceptor_private_vars->unk1B0[3] = rotation_angle; rotation_angle = -fast_arc_tan(vector_length_xy(half_span_vector), half_span_vector[2]); - FUN_L00_001fff28(blarg_heavy_interceptor_private_vars->unk130, 1, rotation_angle); + build_axis_rotation_quaternion( + blarg_heavy_interceptor_private_vars->unk130, 1, rotation_angle); blarg_heavy_interceptor_private_vars->unk1C0[0] = rotation_angle; qcopy(blarg_heavy_interceptor_private_vars->unk90, blarg_heavy_interceptor_private_vars->unk170); @@ -1948,6 +1966,10 @@ extern int FUN_001f96f8_b45(int) __asm__("FUN_001f96f8"); extern float FUN_001fa6c0_b45(short) __asm__("FUN_001fa6c0"); int try_retract_turret_group(int index) { + enum { + TURRET_STATE_WAITING = 1, + TURRET_STATE_RETRACTING = 5 + }; short *list_entry = D_L14_001ABF40_b45[index]; unsigned char *moby_array_start; unsigned char *checked_moby; @@ -1966,7 +1988,8 @@ int try_retract_turret_group(int index) { checked_moby = moby_array_start + (moby_index_or_state << 8); if ((((unsigned char *)MOBY(checked_moby)->pvars))[0x8B] == 0) { moby_index_or_state = checked_moby[0x20]; - if (moby_index_or_state != 5 && moby_index_or_state != 1) { + if (moby_index_or_state != TURRET_STATE_RETRACTING && + moby_index_or_state != TURRET_STATE_WAITING) { return 0; } } diff --git a/src/overlays/l14/mobys/bolt_thief.c b/src/overlays/l14/mobys/bolt_thief.c index 48a9913dae..92be37570e 100644 --- a/src/overlays/l14/mobys/bolt_thief.c +++ b/src/overlays/l14/mobys/bolt_thief.c @@ -19,6 +19,16 @@ #include "rnc/overlay/shared/world/level_path.h" #include "rnc/overlay/l14/mobys/bolt_thief_globals.h" +enum { + BOLT_THIEF_STATE_INITIALIZE = 0, + BOLT_THIEF_STATE_FACE_HERO = 1, + BOLT_THIEF_STATE_WAIT_FOR_TRIGGER = 2, + BOLT_THIEF_STATE_SETTLE_AT_PATH_END = 3, + BOLT_THIEF_STATE_FOLLOW_PRIMARY_PATH = 4, + BOLT_THIEF_STATE_FOLLOW_SECONDARY_PATH = 5, + BOLT_THIEF_STATE_KNOCKBACK = 6 +}; + typedef struct { char pad00[0x60]; char effect[7]; /* 0x60: record func_L00_0025E590 updates */ @@ -117,13 +127,9 @@ void bolt_thief_update(L16CrateMoby *moby) __asm__("FUN_L14_002fe2a0"); /* Moby class 923 */ void bolt_thief_update(L16CrateMoby *moby) { enum { - BOLT_THIEF_STATE_INITIALIZE = 0, - BOLT_THIEF_STATE_FACE_HERO = 1, - BOLT_THIEF_STATE_WAIT_FOR_TRIGGER = 2, - BOLT_THIEF_STATE_SETTLE_AT_PATH_END = 3, - BOLT_THIEF_STATE_FOLLOW_PRIMARY_PATH = 4, - BOLT_THIEF_STATE_FOLLOW_SECONDARY_PATH = 5, - BOLT_THIEF_STATE_KNOCKBACK = 6 + BOLT_THIEF_MODE_PATH_LOOP_WITH_LINKED_CHILD = 0, + BOLT_THIEF_MODE_PRIMARY_PATH_THEN_FACE_HERO = 1, + BOLT_THIEF_MODE_FACE_HERO_FROM_START = 2 }; L16CrateData *moby_data = moby->data; char *hit; @@ -133,7 +139,7 @@ void bolt_thief_update(L16CrateMoby *moby) { if (hero.coll_hit_moby == moby && moby->animation != 1 && moby->frame != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(5)); hit = find_moby_hit(moby, 0x210000, 0); - if (hit && moby->state != 6) { + if (hit && moby->state != BOLT_THIEF_STATE_KNOCKBACK) { struct Hero *player = &hero; moby_data->knock_drag = 0.008f; @@ -151,13 +157,13 @@ void bolt_thief_update(L16CrateMoby *moby) { moby->position[1] - player->motion.pos.f[1])); moby_data->ticks = 0x78; FUN_L00_00257470(moby, 0, -1); - moby->state = 6; + moby->state = BOLT_THIEF_STATE_KNOCKBACK; } moby->opacity = 0xFF; switch (moby->state) { case BOLT_THIEF_STATE_INITIALIZE: - if (moby_data->mode == 2) { - moby->state = 1; + if (moby_data->mode == BOLT_THIEF_MODE_FACE_HERO_FROM_START) { + moby->state = BOLT_THIEF_STATE_FACE_HERO; moby_data->turn = 0.0f; set_moby_animation(moby, 4, 0); } else { @@ -171,7 +177,7 @@ void bolt_thief_update(L16CrateMoby *moby) { mark_moby_for_removal(moby); return; } - if (moby_data->mode != 1) { + if (moby_data->mode != BOLT_THIEF_MODE_PRIMARY_PATH_THEN_FACE_HERO) { if (moby_data->other_path == -1) { debug_print(D_L14_001FCFA0, moby->id); mark_moby_for_removal(moby); @@ -189,7 +195,7 @@ void bolt_thief_update(L16CrateMoby *moby) { return; } initialize_moby_path_state(moby); - moby->state = 2; + moby->state = BOLT_THIEF_STATE_WAIT_FOR_TRIGGER; moby->collision = 0x80; moby->flags |= 0x41; moby->bounds = 0; @@ -211,7 +217,7 @@ void bolt_thief_update(L16CrateMoby *moby) { } case BOLT_THIEF_STATE_WAIT_FOR_TRIGGER: if (is_point_inside_clip_volume(&hero.motion.pos, moby_data->trigger)) { - if (moby_data->mode == 1) { + if (moby_data->mode == BOLT_THIEF_MODE_PRIMARY_PATH_THEN_FACE_HERO) { set_moby_animation(moby, 0, 0); } else { moby_data->child = spawn_bolt_thief_mine(moby, moby->position); @@ -220,14 +226,14 @@ void bolt_thief_update(L16CrateMoby *moby) { } moby->flags &= 0xFFBE; moby->bounds = moby->model->bounds; - moby->state = 4; + moby->state = BOLT_THIEF_STATE_FOLLOW_PRIMARY_PATH; } break; case BOLT_THIEF_STATE_FOLLOW_PRIMARY_PATH: - if (moby_data->mode == 0) + if (moby_data->mode == BOLT_THIEF_MODE_PATH_LOOP_WITH_LINKED_CHILD) update_linked_moby_position(moby); if (update_bolt_thief_path_movement((char *)moby)) { - moby->state = 3; + moby->state = BOLT_THIEF_STATE_SETTLE_AT_PATH_END; blend_moby_animation(moby, 3, 0, 5); } emit_moby_offset_particles(moby); @@ -238,7 +244,7 @@ void bolt_thief_update(L16CrateMoby *moby) { float target[4]; float zero; - if (settle_data->mode == 0) + if (settle_data->mode == BOLT_THIEF_MODE_PATH_LOOP_WITH_LINKED_CHILD) update_linked_moby_position(moby); qcopy(target, path + *(int *)path * 16); zero = 0.0f; @@ -261,8 +267,8 @@ void bolt_thief_update(L16CrateMoby *moby) { bolt_thief_path_spring_damping_gp, zero); if ((moby->status & 2) && moby->frame == moby->animation) { - if (settle_data->mode == 1) { - moby->state = 1; + if (settle_data->mode == BOLT_THIEF_MODE_PRIMARY_PATH_THEN_FACE_HERO) { + moby->state = BOLT_THIEF_STATE_FACE_HERO; settle_data->turn = zero; set_moby_animation(moby, 4, 0); } else { @@ -270,7 +276,7 @@ void bolt_thief_update(L16CrateMoby *moby) { moby_set_state_one(settle_data->child); settle_data->child = 0; } - moby->state = 5; + moby->state = BOLT_THIEF_STATE_FOLLOW_SECONDARY_PATH; blend_moby_animation(moby, 0, 0, 20); settle_data->timer = zero; settle_data->counter = 0; @@ -283,7 +289,7 @@ void bolt_thief_update(L16CrateMoby *moby) { if (update_bolt_thief_path_movement((char *)moby)) { char *path; - moby->state = 2; + moby->state = BOLT_THIEF_STATE_WAIT_FOR_TRIGGER; moby->bounds = 0; moby->flags |= 0x41; moby_data->timer = 0.0f; @@ -344,7 +350,7 @@ int update_bolt_thief_path_movement(struct Moby *moby) { path_sample_step = frame_time * 20.0f; if (bolt_thief_state->unkF8 != 0.0f) path_sample_step = bolt_thief_state->unkF8 * frame_time; - if (moby->state == 5) + if (moby->state == BOLT_THIEF_STATE_FOLLOW_SECONDARY_PATH) path = ((char *)l14_paths[bolt_thief_state->path_DC]); else path = ((char *)l14_paths[bolt_thief_state->path_D8]); diff --git a/src/overlays/l14/mobys/bouncing_spark.c b/src/overlays/l14/mobys/bouncing_spark.c index 24ea619543..d5d32b4548 100644 --- a/src/overlays/l14/mobys/bouncing_spark.c +++ b/src/overlays/l14/mobys/bouncing_spark.c @@ -102,10 +102,10 @@ void bouncing_spark_update(struct Moby *spark_moby) { float hi; if (((coll_sphere(&spark_moby->pos, 0, spark_moby, 0.65f) != 0) && (D_L14_00174558 != 0)) && (D_L14_00174558 != spark_data->owner)) { - spark_moby->state = 3; + spark_moby->state = SPARK_BURST_AND_REMOVE; } if (fast_dec_timer(&spark_data->fade) != 0) { - spark_moby->state = 3; + spark_moby->state = SPARK_BURST_AND_REMOVE; } switch (spark_moby->state) { case SPARK_COUNT_NEXT_BOUNCE: @@ -113,8 +113,8 @@ void bouncing_spark_update(struct Moby *spark_moby) { case SPARK_WAIT_FOR_DESCENT: { fast_vec_add(&predicted_position_or_fade_rgb, &spark_moby->pos, &spark_data->vel); spark_data->vel.z -= spark_data->vel.w; - if ((spark_moby->state == 1) && (spark_data->vel.z < 0.0f)) { - spark_moby->state = 0; + if ((spark_moby->state == SPARK_WAIT_FOR_DESCENT) && (spark_data->vel.z < 0.0f)) { + spark_moby->state = SPARK_COUNT_NEXT_BOUNCE; } fast_dec_timer_s16(&spark_data->trail); if (spark_data->trail != 0) { @@ -160,15 +160,16 @@ void bouncing_spark_update(struct Moby *spark_moby) { qcopy(&spark_moby->pos, &predicted_position_or_fade_rgb); } if (((coll_sphere(&spark_moby->pos, 0, spark_moby, spark_contact_clearance_gp) != 0) && - ((spark_moby->state == 0) || ((spark_moby->pos.z - D_L14_00174540.hit.z) < 0.0f))) && + ((spark_moby->state == SPARK_COUNT_NEXT_BOUNCE) || + ((spark_moby->pos.z - D_L14_00174540.hit.z) < 0.0f))) && ((D_L14_00174540.owner == 0) || (D_L14_00174540.owner != spark_data->owner))) { fast_vec_normalize( &position_scratch, &D_L14_00174540.normal, spark_contact_clearance_gp); fast_vec_add(&spark_moby->pos, &D_L14_00174540.hit, &position_scratch); reflect_vector(&spark_data->vel, &spark_data->vel, &D_L14_00174540.normal); allocate_voice_for_target_entry(1, 0, spark_moby); - if (spark_moby->state == 0) { - spark_moby->state = 1; + if (spark_moby->state == SPARK_COUNT_NEXT_BOUNCE) { + spark_moby->state = SPARK_WAIT_FOR_DESCENT; if ((++spark_data->bounces) == 1) { set_vector_length_xy(&spark_data->vel, &spark_data->vel, @@ -188,7 +189,7 @@ void bouncing_spark_update(struct Moby *spark_moby) { } if (spark_data->bounces >= 4) { float min; - spark_moby->state = 2; + spark_moby->state = SPARK_ROLL_AND_FADE; spark_data->vel.z = 0.0f; spark_data->vel.w = vector_length_xy(&spark_data->vel); spark_data->vel.w *= D_L14_001620A0; @@ -253,9 +254,9 @@ void bouncing_spark_update(struct Moby *spark_moby) { return; } - if (spark_moby->state < 2) { + if (spark_moby->state < SPARK_ROLL_AND_FADE) { speed = vector_length_xy(&spark_data->vel); - } else if (spark_moby->state == 2) { + } else if (spark_moby->state == SPARK_ROLL_AND_FADE) { speed = spark_data->vel.w; } else { return; diff --git a/src/overlays/l14/mobys/button.c b/src/overlays/l14/mobys/button.c index 2915271761..26f9952756 100644 --- a/src/overlays/l14/mobys/button.c +++ b/src/overlays/l14/mobys/button.c @@ -25,6 +25,9 @@ void button_update(struct Moby *moby) { BUTTON_INITIALIZE = 0, BUTTON_WAIT_FOR_HERO_TO_STAND = 1 }; + enum { + BUTTON_ACTIVATED = 2 + }; s32 *button_pvars = (s32 *)moby->pvars; s16 id; s32 i; @@ -46,7 +49,7 @@ void button_update(struct Moby *moby) { D_0014C050[moby->mission + current_level_index * 16] == 0xFF)) { moby->command = 2; moby->glow_color = 0x80208020; - moby->state = 2; + moby->state = BUTTON_ACTIVATED; list = button_pvars[0]; if (list != -1) { i = 0; @@ -61,7 +64,7 @@ void button_update(struct Moby *moby) { } } } else { - moby->state = 1; + moby->state = BUTTON_WAIT_FOR_HERO_TO_STAND; } break; case BUTTON_WAIT_FOR_HERO_TO_STAND: @@ -79,7 +82,7 @@ void button_update(struct Moby *moby) { id = (s16)moby->save_id; D_0014C190_257218[current_level_index][id >> 5] |= 1 << (moby->save_id & 31); D_L14_001BABD0[(s16)moby->save_id >> 5] |= 1 << (moby->save_id & 31); - moby->state = 2; + moby->state = BUTTON_ACTIVATED; moby->command = 1; moby->glow_color = 0x80208020; allocate_voice_for_target_entry(0, 0, moby); diff --git a/src/overlays/l14/mobys/elevator.c b/src/overlays/l14/mobys/elevator.c index b20edf52d8..8173775862 100644 --- a/src/overlays/l14/mobys/elevator.c +++ b/src/overlays/l14/mobys/elevator.c @@ -93,7 +93,8 @@ void elevator_update(struct Moby *elevator_moby) { Vec4 delta; float level; - if (elevator_moby->state != 0 && elevator_moby->command == 2 && elevator_vars->dir < 0.0f) { + if (elevator_moby->state != ELEVATOR_STATE_INITIALIZE && elevator_moby->command == 2 && + elevator_vars->dir < 0.0f) { int *path = (int *)l14_paths[elevator_vars->path2]; elevator_vars->dir = -elevator_vars->dir; elevator_vars->segment = *path - 2; @@ -106,7 +107,7 @@ void elevator_update(struct Moby *elevator_moby) { case ELEVATOR_STATE_INITIALIZE: { u16 id; elevator_moby->command = 0; - elevator_moby->state = 1; + elevator_moby->state = ELEVATOR_STATE_WAIT_FOR_RIDER; initialize_elevator_path_state(elevator_moby); qcopy(&elevator_moby->pos, ((char *)l14_paths[elevator_vars->path]) + 0x10); qcopy(&elevator_moby->rot, elevator_vars->rot); @@ -166,7 +167,7 @@ void elevator_update(struct Moby *elevator_moby) { else elevator_moby->command = 0; } - elevator_moby->state = 2; + elevator_moby->state = ELEVATOR_STATE_FOLLOW_PATH; elevator_vars->travelled = 0; elevator_vars->dir = -elevator_vars->dir; } @@ -182,7 +183,7 @@ void elevator_update(struct Moby *elevator_moby) { } elevator_moby->glow_color = fast_tween_color(elevator_moby->glow_color, 0x80808040, 0.1f); if (advance_elevator_along_path(elevator_moby) != 0) { - elevator_moby->state = 3; + elevator_moby->state = ELEVATOR_STATE_SETTLE_AT_ENDPOINT; elevator_vars->level = elevator_vars->motor_volume; } rebuild_elevator_world_path((u8 *)elevator_moby); @@ -216,18 +217,19 @@ void elevator_update(struct Moby *elevator_moby) { voice = allocate_voice_for_target_entry(1, 0, elevator_moby); if (voice >= 0) vendor_volume(voice, elevator_vars->hum_volume / 3); - elevator_moby->state = 4; + elevator_moby->state = ELEVATOR_STATE_WAIT_FOR_RIDER_EXIT; if (hero.ground_moby != elevator_moby) - elevator_moby->state = 1; + elevator_moby->state = ELEVATOR_STATE_WAIT_FOR_RIDER; } break; case ELEVATOR_STATE_WAIT_FOR_RIDER_EXIT: update_elevator_idle_glow(elevator_moby); if (hero.ground_moby != elevator_moby) - elevator_moby->state = 1; + elevator_moby->state = ELEVATOR_STATE_WAIT_FOR_RIDER; break; } - if (elevator_moby->state != 2 && elevator_moby->state != 0) { + if (elevator_moby->state != ELEVATOR_STATE_FOLLOW_PATH && + elevator_moby->state != ELEVATOR_STATE_INITIALIZE) { settle_elevator_at_path_endpoint(elevator_moby); if (hero.ground_moby == elevator_moby) { fast_vec_sub(&delta, &elevator_moby->pos, &previous_elevator_position); diff --git a/src/overlays/l14/mobys/enemy_fighter.c b/src/overlays/l14/mobys/enemy_fighter.c index 86842eb8ec..ae1ff5974c 100644 --- a/src/overlays/l14/mobys/enemy_fighter.c +++ b/src/overlays/l14/mobys/enemy_fighter.c @@ -15,6 +15,12 @@ #include "rnc/overlay/l14/mobys/puff.h" #include "rnc/overlay/l14/mobys/enemy_fighter.h" +enum { + ENEMY_FIGHTER_STATE_INITIALIZE = 0, + ENEMY_FIGHTER_STATE_FOLLOW_PATH = 1, + ENEMY_FIGHTER_STATE_WAIT_FOR_RESPAWN = 2 +}; + extern void debug_print(const char *, short) __asm__("FUN_001e93b0"); extern void mark_moby_for_removal(void *) __asm__("FUN_0020c828"); @@ -62,18 +68,13 @@ void enemy_fighter_update(struct Moby *moby) __asm__("FUN_L14_002fc0f0"); /* Moby class 908 */ void enemy_fighter_update(struct Moby *moby) { - enum { - ENEMY_FIGHTER_STATE_INITIALIZE = 0, - ENEMY_FIGHTER_STATE_FOLLOW_PATH = 1, - ENEMY_FIGHTER_STATE_WAIT_FOR_RESPAWN = 2 - }; EnemyFighterVars *enemy_fighter_vars = (EnemyFighterVars *)moby->pvars; int hit = find_moby_hit(moby, 0x800000, 0); int index; int path_index; char *path; moby->hit_slot = 0xff; - if (hit && moby->state != 2) { + if (hit && moby->state != ENEMY_FIGHTER_STATE_WAIT_FOR_RESPAWN) { if (current_level_index == 14) { enemy_fighter_destruction_count = enemy_fighter_destruction_count + 1; if (enemy_fighter_destruction_count > 2 && D_0013D408.flag == 0) { @@ -82,7 +83,7 @@ void enemy_fighter_update(struct Moby *moby) { queue_dialogue_message(0x53d6, -1); } } - moby->state = 2; + moby->state = ENEMY_FIGHTER_STATE_WAIT_FOR_RESPAWN; cart_burst(5.0f, 13.0f, moby, &moby->pos, -1); moby->collision = 0; moby->flags |= 0x41; @@ -109,7 +110,7 @@ void enemy_fighter_update(struct Moby *moby) { return; } initialize_flight_path_state(moby); - moby->state = 1; + moby->state = ENEMY_FIGHTER_STATE_FOLLOW_PATH; moby->update_dist = 0xff; moby->draw_dist = 0xff; enemy_fighter_vars->sound = -1; @@ -124,7 +125,7 @@ void enemy_fighter_update(struct Moby *moby) { moby->flags &= 0xffbe; moby->collision = moby->pclass->collision; enemy_fighter_vars->timer = scale_game_frames(enemy_fighter_respawn_delay_frames_gp); - moby->state = 1; + moby->state = ENEMY_FIGHTER_STATE_FOLLOW_PATH; enemy_fighter_vars->segment = 0; enemy_fighter_vars->along = 0; qcopy(&moby->pos, path + 0x10); @@ -136,7 +137,8 @@ void enemy_fighter_update(struct Moby *moby) { break; } spawn_enemy_fighter_exhaust(moby); - if (moby->state != 0 && moby->state != 2 && + if (moby->state != ENEMY_FIGHTER_STATE_INITIALIZE && + moby->state != ENEMY_FIGHTER_STATE_WAIT_FOR_RESPAWN && voice_is_playing(moby, enemy_fighter_vars->sound) == 0) enemy_fighter_vars->sound = allocate_voice_for_target_entry(0, 4, moby); } @@ -159,7 +161,8 @@ void spawn_enemy_fighter_exhaust(struct Moby *emitter_moby) { int life; float size; - if (emitter_moby->state == 0 || emitter_moby->state == 2 || emitter_moby->visible == 0) + if (emitter_moby->state == ENEMY_FIGHTER_STATE_INITIALIZE || + emitter_moby->state == ENEMY_FIGHTER_STATE_WAIT_FOR_RESPAWN || emitter_moby->visible == 0) return; fast_vec_scale(&step, &emitter_moby->rot_row0, enemy_fighter_exhaust_base_row0_offset_gp); fast_vec_add(&pos, &emitter_moby->pos, &step); diff --git a/src/overlays/l14/mobys/flying_car.c b/src/overlays/l14/mobys/flying_car.c index 1591f61045..2bb0155620 100644 --- a/src/overlays/l14/mobys/flying_car.c +++ b/src/overlays/l14/mobys/flying_car.c @@ -15,6 +15,13 @@ #include "rnc/audio/voice_pool.h" #include "rnc/camera/update_cam.h" +enum { + FLYING_CAR_INITIALIZE = 0, + FLYING_CAR_WAIT_FOR_TRIGGER = 1, + FLYING_CAR_FOLLOW_PATH = 2, + FLYING_CAR_WAIT_FOR_PATH_RESET = 3 +}; + extern u8 *D_L14_00167500 NOT_SDA; void seed_linked_record_for_flying_car(u8 *flying_car_moby) __asm__("FUN_L14_003135b8"); @@ -115,20 +122,14 @@ void flying_car_update(struct Moby *m) __asm__("FUN_L14_00306ee0"); /* Moby class 1417 */ void flying_car_update(struct Moby *flying_car_moby) { - enum { - FLYING_CAR_INITIALIZE = 0, - FLYING_CAR_WAIT_FOR_TRIGGER = 1, - FLYING_CAR_FOLLOW_PATH = 2, - FLYING_CAR_WAIT_FOR_PATH_RESET = 3 - }; Data_6ee0 *flying_car_data = (Data_6ee0 *)flying_car_moby->pvars; Vec4f attached_part_offset_component __attribute__((aligned(16))); char *hit; hit = find_moby_hit(flying_car_moby, 0x800000, 0); flying_car_moby->hit_slot = 0xFF; - if (hit && flying_car_moby->state != 3) { - flying_car_moby->state = 3; + if (hit && flying_car_moby->state != FLYING_CAR_WAIT_FOR_PATH_RESET) { + flying_car_moby->state = FLYING_CAR_WAIT_FOR_PATH_RESET; cart_burst(flying_car_moby, &flying_car_moby->pos, 5.0f, 13.0f, -1); flying_car_moby->flags |= 0x41; flying_car_moby->collision = 0; @@ -158,7 +159,7 @@ void flying_car_update(struct Moby *flying_car_moby) { return; } FUN_L14_00307510_6ee0(flying_car_moby); - flying_car_moby->state = 2; + flying_car_moby->state = FLYING_CAR_FOLLOW_PATH; flying_car_moby->update_dist = 0xFF; flying_car_moby->draw_dist = 0xFF; flying_car_data->sound = -1; @@ -184,7 +185,7 @@ void flying_car_update(struct Moby *flying_car_moby) { (struct Moby *)(D_L14_0015FFD8_macro + (flying_car_data->part << 8)); o->flags |= 0x41; } - flying_car_moby->state = 1; + flying_car_moby->state = FLYING_CAR_WAIT_FOR_TRIGGER; } break; case FLYING_CAR_WAIT_FOR_TRIGGER: @@ -196,7 +197,7 @@ void flying_car_update(struct Moby *flying_car_moby) { (struct Moby *)(D_L14_0015FFD8_macro + (flying_car_data->part << 8)); o->flags &= 0xFFBE; } - flying_car_moby->state = 2; + flying_car_moby->state = FLYING_CAR_FOLLOW_PATH; } break; case FLYING_CAR_FOLLOW_PATH: @@ -256,7 +257,7 @@ void flying_car_update(struct Moby *flying_car_moby) { flying_car_moby->flags &= 0xFFBE; flying_car_moby->collision = flying_car_moby->pclass->collision; flying_car_data->timer = scale_game_frames(flying_car_path_reset_delay_frames_gp); - flying_car_moby->state = 2; + flying_car_moby->state = FLYING_CAR_FOLLOW_PATH; flying_car_data->f70 = 0; flying_car_data->f74 = 0; qcopy(&flying_car_moby->pos, &path->a); @@ -282,13 +283,15 @@ void flying_car_update(struct Moby *flying_car_moby) { } if (flying_car_data->trigger >= 0) { flying_car_moby->flags |= 0x41; - flying_car_moby->state = 1; + flying_car_moby->state = FLYING_CAR_WAIT_FOR_TRIGGER; flying_car_moby->collision = 0; } } break; } - if (flying_car_moby->state == 0 || flying_car_moby->state == 3 || flying_car_moby->state == 1) { + if (flying_car_moby->state == FLYING_CAR_INITIALIZE || + flying_car_moby->state == FLYING_CAR_WAIT_FOR_PATH_RESET || + flying_car_moby->state == FLYING_CAR_WAIT_FOR_TRIGGER) { return; } if (voice_is_playing(flying_car_moby, flying_car_data->sound) == 0) { @@ -351,7 +354,7 @@ int update_flying_car_path_motion(struct Moby *moby) { if ((*(short *)(flying_car_data + 0x8E) == 0 && end != 0) || moby->pos.z <= flying_car_burst_height_threshold_gp) { cart_burst(moby, &moby->pos, 5.0f, 13.0f, -1); - moby->state = 3; + moby->state = FLYING_CAR_WAIT_FOR_PATH_RESET; moby->flags |= 0x41; moby->collision = 0; if (*(int *)(flying_car_data + 0xA0) >= 0) { diff --git a/src/overlays/l14/mobys/group_clear_trigger.c b/src/overlays/l14/mobys/group_clear_trigger.c index f7e97227be..ed0bcffa4c 100644 --- a/src/overlays/l14/mobys/group_clear_trigger.c +++ b/src/overlays/l14/mobys/group_clear_trigger.c @@ -36,7 +36,7 @@ void group_clear_trigger_update(struct Moby *moby) { switch (moby->state) { case MOBY_UPDATE_DISTANCE_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = MOBY_UPDATE_CUTSCENE_TARGET; break; case MOBY_UPDATE_CUTSCENE_TARGET: if (D_L14_0015F5C4 == 2) { diff --git a/src/overlays/l14/mobys/level_effects.c b/src/overlays/l14/mobys/level_effects.c index de374c3dbf..db017d6078 100644 --- a/src/overlays/l14/mobys/level_effects.c +++ b/src/overlays/l14/mobys/level_effects.c @@ -37,7 +37,7 @@ void level_effects_update(struct Moby *moby) { }; switch (moby->state) { case DRAW_CALLBACK_INITIALIZE: - moby->state = 1; + moby->state = DRAW_CALLBACK_ENQUEUE; moby->update_dist = 0xFF; break; case DRAW_CALLBACK_ENQUEUE: diff --git a/src/overlays/l14/mobys/machinegun_turret.c b/src/overlays/l14/mobys/machinegun_turret.c index db377ad20e..cb966b705b 100644 --- a/src/overlays/l14/mobys/machinegun_turret.c +++ b/src/overlays/l14/mobys/machinegun_turret.c @@ -17,6 +17,22 @@ #include "rnc/overlay/l14/mobys/flying_bolt.h" #include "rnc/overlay/shared/world/level_labels.h" +enum { + MOBY_SELECTION_HERO_FALLBACK = 0, + MOBY_SELECTION_DISTANCE_CANDIDATE = 1, + MOBY_SELECTION_NO_TARGET = 2 +}; + +enum { + TURRET_STATE_INITIALIZE = 0, + TURRET_STATE_WAIT_FOR_ACTIVATION = 1, + TURRET_STATE_DEPLOY = 2, + TURRET_STATE_WAIT_FOR_TARGET = 3, + TURRET_STATE_AIM_AND_FIRE = 4, + TURRET_STATE_RETRACT = 5, + TURRET_STATE_DESTROY = 6 +}; + extern int hit_reaction(void *, void *, void *, int, void *, void *, int, int) __asm__("FUN_L00_0025a478"); @@ -115,10 +131,10 @@ int select_moby_by_xy_distance(char *selection_reference, char *selection_output float candidate_metric; selected_moby = ((char *)hero->moby); - selection_status = 0; + selection_status = MOBY_SELECTION_HERO_FALLBACK; if (hero->state.control_mode == 0x18 || hero->state.current == 0x72) { selected_moby = 0; - selection_status = 2; + selection_status = MOBY_SELECTION_NO_TARGET; } for (i = 1; i <= D_L14_001B0F30[0]; i++) { candidate_moby = D_L14_0015FFD8 + (D_L14_001B0F30[i] << 8); @@ -136,7 +152,7 @@ int select_moby_by_xy_distance(char *selection_reference, char *selection_output if (candidate_metric < best) { selected_moby = candidate_moby; best = candidate_metric; - selection_status = 1; + selection_status = MOBY_SELECTION_DISTANCE_CANDIDATE; } } for (j = 0; j < 20; j++) { @@ -155,7 +171,7 @@ int select_moby_by_xy_distance(char *selection_reference, char *selection_output if (candidate_metric < best) { selected_moby = candidate_moby; best = candidate_metric; - selection_status = 1; + selection_status = MOBY_SELECTION_DISTANCE_CANDIDATE; } } if (selected_moby != 0) { @@ -214,15 +230,6 @@ void machinegun_turret_update(char *moby) __asm__("FUN_L14_002b3bf0"); /* Moby class 30 */ void machinegun_turret_update(char *moby) { - enum { - TURRET_STATE_INITIALIZE = 0, - TURRET_STATE_WAIT_FOR_ACTIVATION = 1, - TURRET_STATE_DEPLOY = 2, - TURRET_STATE_WAIT_FOR_TARGET = 3, - TURRET_STATE_AIM_AND_FIRE = 4, - TURRET_STATE_RETRACT = 5, - TURRET_STATE_DESTROY = 6 - }; enum { TURRET_SPAWN_CENTER = 0, TURRET_SPAWN_UNNEGATED_OFFSET = 1 @@ -265,10 +272,10 @@ void machinegun_turret_update(char *moby) { machinegun_turret_private_vars->unk76 = scaled_wait_frames_or_target_query_status; machinegun_turret_private_vars->unk8B = 0; if (machinegun_turret_private_vars->unk88 != 0) { - MOBY(moby)->state = 3; + MOBY(moby)->state = TURRET_STATE_WAIT_FOR_TARGET; machinegun_turret_private_vars->unk8A = 1; } else { - MOBY(moby)->state = 1; + MOBY(moby)->state = TURRET_STATE_WAIT_FOR_ACTIVATION; MOBY(moby)->pos.z = MOBY(moby)->pos.z - machinegun_turret_retraction_depth_gp; MOBY(moby)->collision = 0; machinegun_turret_private_vars->unk8A = 0; @@ -284,7 +291,7 @@ void machinegun_turret_update(char *moby) { if (fast_dec_timer(&machinegun_turret_private_vars->timer) == 0) { return; } - MOBY(moby)->state = 2; + MOBY(moby)->state = TURRET_STATE_DEPLOY; machinegun_turret_private_vars->unk74 = func_001F9850_2B4E40(D_L14_0016150C); machinegun_turret_private_vars->unk78 = 1.0f / func_001FA888_2B4E40(machinegun_turret_private_vars->unk74); @@ -313,7 +320,7 @@ void machinegun_turret_update(char *moby) { } machinegun_turret_private_vars->unk76 = func_001F9850_2B4E40(machinegun_turret_target_wait_timeout_frames_gp); - MOBY(moby)->state = 3; + MOBY(moby)->state = TURRET_STATE_WAIT_FOR_TARGET; machinegun_turret_private_vars->unk74 = func_001F9850_2B4E40(60); MOBY(moby)->pos.z = machinegun_turret_private_vars->base_z; *(int *)&machinegun_turret_private_vars->unk8C = 0; @@ -321,10 +328,10 @@ void machinegun_turret_update(char *moby) { case TURRET_STATE_WAIT_FOR_TARGET: scaled_wait_frames_or_target_query_status = select_moby_by_xy_distance(moby, (char *)target_point_scratch, 34.0f); - if (scaled_wait_frames_or_target_query_status != 2) { + if (scaled_wait_frames_or_target_query_status != MOBY_SELECTION_NO_TARGET) { if (is_point_inside_clip_volume(target_point_scratch, machinegun_turret_private_vars->unk90) != 0) { - MOBY(moby)->state = 4; + MOBY(moby)->state = TURRET_STATE_AIM_AND_FIRE; set_moby_animation(moby, 3, 0); machinegun_turret_private_vars->unk74 = func_001F9850_2B4E40(120); machinegun_turret_private_vars->timer_9C = func_001F9850_2B4E40(20); @@ -414,7 +421,7 @@ void machinegun_turret_update(char *moby) { scaled_wait_frames_or_target_query_status = select_moby_by_xy_distance(moby, (char *)target_query_result, 34.0f); target_missing_or_outside_waking_cuboid = - (scaled_wait_frames_or_target_query_status == 2 || + (scaled_wait_frames_or_target_query_status == MOBY_SELECTION_NO_TARGET || is_point_inside_clip_volume(target_query_result, machinegun_turret_private_vars->unk90) == 0); if (target_missing_or_outside_waking_cuboid == 0) { @@ -459,7 +466,7 @@ void machinegun_turret_update(char *moby) { return; } MOBY(moby)->rot.z = machinegun_turret_private_vars->unk84; - MOBY(moby)->state = 1; + MOBY(moby)->state = TURRET_STATE_WAIT_FOR_ACTIVATION; machinegun_turret_private_vars->unk74 = func_001F9850_2B4E40(60); machinegun_turret_private_vars->unk88 = 0; machinegun_turret_private_vars->timer = @@ -526,7 +533,7 @@ void process_machinegun_turret_hit_reactions(struct Moby *moby) { } } k = hit_reaction(moby, hit_record, &moby_vars->health, 0, &loc0, &damage_amount, 0, 4); - if (loc0 != 1 && moby->state != 6) { + if (loc0 != 1 && moby->state != TURRET_STATE_DESTROY) { remaining_health = moby_vars->health - damage_amount; moby_vars->health = remaining_health; if (remaining_health <= 0.0f) @@ -549,7 +556,7 @@ void process_machinegun_turret_hit_reactions(struct Moby *moby) { break; case HIT_REACTION_LETHAL: case HIT_REACTION_DESTROY: - moby->state = 6; + moby->state = TURRET_STATE_DESTROY; moby->flags &= 0xEFFF; moby_vars->unk67 = 0xF0; FUN_L00_00257470(moby, 0, -1); diff --git a/src/overlays/l14/mobys/mine.c b/src/overlays/l14/mobys/mine.c index c267a38115..713f3556a8 100644 --- a/src/overlays/l14/mobys/mine.c +++ b/src/overlays/l14/mobys/mine.c @@ -119,7 +119,7 @@ void looping_path_mine_update(struct Moby *moby) { mine_vars->along = 0; mine_vars->dir = random_integer_below(2) != 0 ? 1.0f : -1.0f; qcopy(&moby->pos, path->points[0].pos); - moby->state = 1; + moby->state = MINE_STATE_FOLLOW_PATH; mine_vars->spin[0] = random_float_between(0.05235988f, 0.10471976f); mine_vars->spin[1] = random_float_between(0.034906585f, 0.06981317f); mine_vars->spin[2] = random_float_between(0.017453292f, 0.034906585f); diff --git a/src/overlays/l14/mobys/minibomber.c b/src/overlays/l14/mobys/minibomber.c index 3c7684b6b7..8702ea9e87 100644 --- a/src/overlays/l14/mobys/minibomber.c +++ b/src/overlays/l14/mobys/minibomber.c @@ -22,13 +22,25 @@ #include "rnc/overlay/l14/mobys/puff.h" #include "rnc/overlay/l14/mobys/minibomber_globals.h" +enum { + MINIBOMBER_STATE_INITIALIZE = 0, + MINIBOMBER_STATE_WAIT_TO_FOLLOW_PATH = 1, + MINIBOMBER_STATE_FOLLOW_INTRO_OR_EXIT_PATH = 2, + MINIBOMBER_STATE_RETRACE_INTRO_OR_EXIT_PATH = 3, + MINIBOMBER_STATE_HOLD_AT_PATH_END = 4, + MINIBOMBER_STATE_AIM_AT_BOMB_POINT = 5, + MINIBOMBER_STATE_RELEASE_BOMB = 6, + MINIBOMBER_STATE_TRAVERSE_PATH = 7, + MINIBOMBER_STATE_DESTROY = 9 +}; + extern void release_voice_slot(s32 idx) __asm__("FUN_0022d798"); extern void FUN_L00_0025a120(void *); extern void fill_transfer_words(void *, int, int) __asm__("FUN_001f97e8"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern char D_L14_001674C0[]; @@ -264,17 +276,6 @@ void minibomber_update(Moby_2B5938 *moby) __asm__("FUN_L14_002b46e8"); /* Moby class 31 */ void minibomber_update(Moby_2B5938 *moby) { - enum { - MINIBOMBER_STATE_INITIALIZE = 0, - MINIBOMBER_STATE_WAIT_TO_FOLLOW_PATH = 1, - MINIBOMBER_STATE_FOLLOW_INTRO_OR_EXIT_PATH = 2, - MINIBOMBER_STATE_RETRACE_INTRO_OR_EXIT_PATH = 3, - MINIBOMBER_STATE_HOLD_AT_PATH_END = 4, - MINIBOMBER_STATE_AIM_AT_BOMB_POINT = 5, - MINIBOMBER_STATE_RELEASE_BOMB = 6, - MINIBOMBER_STATE_TRAVERSE_PATH = 7, - MINIBOMBER_STATE_DESTROY = 9 - }; Data *d = moby->d; float v[12]; float *path_endpoint_target_position; @@ -309,8 +310,10 @@ void minibomber_update(Moby_2B5938 *moby) { FUN_L14_002b5428_c((char *)moby); FUN_L14_002b5dd8_c((char *)moby); if (moby->f31 != 0) { - if (fast_vec_dist(moby->pos, D_L14_001674C0) < 40.0f && moby->state != 0 && - moby->state != 1 && moby->state != 9) { + if (fast_vec_dist(moby->pos, D_L14_001674C0) < 40.0f && + moby->state != MINIBOMBER_STATE_INITIALIZE && + moby->state != MINIBOMBER_STATE_WAIT_TO_FOLLOW_PATH && + moby->state != MINIBOMBER_STATE_DESTROY) { FUN_L00_0025a120(moby); } } @@ -369,7 +372,7 @@ void minibomber_update(Moby_2B5938 *moby) { FUN_L14_002b55b0_c((char *)moby); d->f108 = -1; moby->f30 = 0x80; - moby->state = 1; + moby->state = MINIBOMBER_STATE_WAIT_TO_FOLLOW_PATH; FUN_L14_002b5c98_c((char *)moby); fill_transfer_words(manipulator_state, 0, 0x40); attach_manipulator(moby, 0, manipulator_state); @@ -378,7 +381,7 @@ void minibomber_update(Moby_2B5938 *moby) { } case MINIBOMBER_STATE_WAIT_TO_FOLLOW_PATH: if (d->fB4 != 2) { - moby->state = 2; + moby->state = MINIBOMBER_STATE_FOLLOW_INTRO_OR_EXIT_PATH; moby->f34 &= 0xFFBE; moby->f94 = moby->cls->f10; FUN_L14_002b5d18_c((char *)moby); @@ -392,7 +395,7 @@ void minibomber_update(Moby_2B5938 *moby) { path = ((PathNode *)l14_paths[d->f150]); } if (d->fB4 == 2) { - moby->state = 3; + moby->state = MINIBOMBER_STATE_RETRACE_INTRO_OR_EXIT_PATH; } else if (advance_minibomber_along_path((char *)moby, (char *)path, (int)&d->fE8, @@ -424,7 +427,7 @@ void minibomber_update(Moby_2B5938 *moby) { d->f154 = minibomber_intro_exit_heading_error_gain_gp; d->f158 = minibomber_heading_velocity_damping_gp; d->f15C = minibomber_heading_velocity_limit_gp; - moby->state = 4; + moby->state = MINIBOMBER_STATE_HOLD_AT_PATH_END; d->f104 = 0.0f; d->f102 = 0; } @@ -438,7 +441,7 @@ void minibomber_update(Moby_2B5938 *moby) { path = ((PathNode *)l14_paths[d->f150]); } if (d->fB4 != 2) { - moby->state = 2; + moby->state = MINIBOMBER_STATE_FOLLOW_INTRO_OR_EXIT_PATH; } else if (advance_minibomber_along_path( (char *)moby, (char *)path, @@ -453,7 +456,7 @@ void minibomber_update(Moby_2B5938 *moby) { minibomber_retrace_and_traversal_heading_error_gain_gp, minibomber_heading_velocity_damping_gp, minibomber_heading_velocity_limit_gp) != 0) { - moby->state = 1; + moby->state = MINIBOMBER_STATE_WAIT_TO_FOLLOW_PATH; FUN_L14_002b5c98_c((char *)moby); } break; @@ -465,7 +468,7 @@ void minibomber_update(Moby_2B5938 *moby) { d->f104, (float)d->f102 / convert_integer_to_float(scale_game_frames(minibomber_aim_return_duration_frames))); - FUN_L00_001fff28(d->f120, 2, blended_aim_angle); + build_axis_rotation_quaternion(d->f120, 2, blended_aim_angle); if (vector_distance_xy(moby->pos, d->fB0->pos) < minibomber_path_traversal_trigger_distance) { if (d->f10C == 0) { @@ -477,15 +480,15 @@ void minibomber_update(Moby_2B5938 *moby) { q = ((PathNode *)l14_paths[d->fDC]) + d->fE8; d->fEC = q[1].v[3]; } - moby->state = 7; + moby->state = MINIBOMBER_STATE_TRAVERSE_PATH; d->fE4 = 0.0f; clear_u64_value(d->fF0); } else if (d->fB4 == 2) { - moby->state = 3; + moby->state = MINIBOMBER_STATE_RETRACE_INTRO_OR_EXIT_PATH; FUN_L14_002b5c30_c((char *)moby); } else if (fast_dec_timer_s16(&d->f102) != 0) { if (moby->f53 != 2) { - moby->state = 5; + moby->state = MINIBOMBER_STATE_AIM_AT_BOMB_POINT; d->f102 = scale_game_frames(minibomber_bomb_aim_duration_frames); d->f104 = 0.0f; d->f100 = 0; @@ -511,7 +514,7 @@ void minibomber_update(Moby_2B5938 *moby) { minibomber_heading_velocity_damping_gp, minibomber_heading_velocity_limit_gp) != 0) { PathNode *path; - moby->state = 4; + moby->state = MINIBOMBER_STATE_HOLD_AT_PATH_END; if (d->f10C == 0) { d->f10C = 1; } else { @@ -545,13 +548,13 @@ void minibomber_update(Moby_2B5938 *moby) { d->f104, (float)d->f102 / convert_integer_to_float(scale_game_frames(minibomber_bomb_aim_duration_frames))); - FUN_L00_001fff28(d->f120, 2, blended_aim_angle); + build_axis_rotation_quaternion(d->f120, 2, blended_aim_angle); if (moby->f53 == 2) { - moby->state = 4; + moby->state = MINIBOMBER_STATE_HOLD_AT_PATH_END; d->f102 = scale_game_frames(minibomber_aim_return_duration_frames); } else if (fast_dec_timer_s16(&d->f102) != 0) { d->f104 = blended_aim_angle; - moby->state = 6; + moby->state = MINIBOMBER_STATE_RELEASE_BOMB; set_moby_animation_c(moby, 1, 0); } break; @@ -560,7 +563,7 @@ void minibomber_update(Moby_2B5938 *moby) { if (is_value_within_interpolated_window(moby, 3.0f) != 0) { PathNode *q; n = (float)scale_game_frames(minibomber_bomb_flight_duration_frames); - FUN_L00_001fff28(d->f120, 2, d->f104); + build_axis_rotation_quaternion(d->f120, 2, d->f104); moby_point_position(moby, 1, v); fast_vec_sub(v + 4, ((PathNode *)l14_paths[d->fD8]) + (d->f100 + 1), v); v[6] = 0.0f; @@ -576,11 +579,11 @@ void minibomber_update(Moby_2B5938 *moby) { FUN_L14_002b5968_u((char *)moby, v, d->f104); d->f100++; if (d->f100 >= ((PathNode *)l14_paths[d->fD8])->n) { - moby->state = 4; + moby->state = MINIBOMBER_STATE_HOLD_AT_PATH_END; d->f102 = scale_game_frames(minibomber_aim_return_duration_frames); } else { d->f102 = scale_game_frames(minibomber_bomb_aim_duration_frames); - moby->state = 5; + moby->state = MINIBOMBER_STATE_AIM_AT_BOMB_POINT; } } break; @@ -621,7 +624,8 @@ void minibomber_update(Moby_2B5938 *moby) { return; } } - if (moby->state > 1 && moby->state != 9) { + if (moby->state > MINIBOMBER_STATE_WAIT_TO_FOLLOW_PATH && + moby->state != MINIBOMBER_STATE_DESTROY) { if (voice_is_playing(moby, d->f108) == 0) { d->f108 = allocate_voice_for_target_entry(0, 4, (int)moby); } @@ -657,7 +661,8 @@ void process_minibomber_hit_reactions(struct Moby *hit_owner_moby) { char *hit_record; int k; float remaining_health; - if (hit_owner_moby->state == 0 || hit_owner_moby->state == 9) + if (hit_owner_moby->state == MINIBOMBER_STATE_INITIALIZE || + hit_owner_moby->state == MINIBOMBER_STATE_DESTROY) return; hit_owner_moby->scale = hit_owner_moby->pclass->scale; damage_amount = 0.0f; @@ -671,7 +676,7 @@ void process_minibomber_hit_reactions(struct Moby *hit_owner_moby) { } k = FUN_L00_0025a478_c( hit_owner_moby, hit_record, moby_vars + 0x20, 0, &loc0, &damage_amount, 0, 4); - if (loc0 != 1 && hit_owner_moby->state != 9) { + if (loc0 != 1 && hit_owner_moby->state != MINIBOMBER_STATE_DESTROY) { remaining_health = *(float *)(moby_vars + 0x20) - damage_amount; *(float *)(moby_vars + 0x20) = remaining_health; if (remaining_health <= 0.0f) @@ -694,7 +699,7 @@ void process_minibomber_hit_reactions(struct Moby *hit_owner_moby) { break; case HIT_REACTION_LETHAL: case HIT_REACTION_DESTROY: - hit_owner_moby->state = 9; + hit_owner_moby->state = MINIBOMBER_STATE_DESTROY; hit_owner_moby->flags &= 0xEFFF; moby_vars[0x67] = 0xFA; FUN_L00_00257470(hit_owner_moby, 0, -1); @@ -732,10 +737,11 @@ void update_minibomber_oscillation(struct Moby *moby) { unsigned char state = raw; char *minibomber_instance_vars = (char *)moby->pvars; float spring_target; - if (state == 0 || state == 9 || state == 1) + if (state == MINIBOMBER_STATE_INITIALIZE || state == MINIBOMBER_STATE_DESTROY || + state == MINIBOMBER_STATE_WAIT_TO_FOLLOW_PATH) return; spring_target = *(float *)&D_L14_00161540_gp; - if ((raw >= 2 && raw <= 3) || state == 7) { + if ((raw >= 2 && raw <= 3) || state == MINIBOMBER_STATE_TRAVERSE_PATH) { spring_target = spring_target * 1.5f; } else { FUN_L00_0025b8c0_c((float *)(minibomber_instance_vars + 0x168), @@ -770,7 +776,7 @@ void update_minibomber_target(struct Moby *moby) __asm__("FUN_L14_002b5530"); void update_minibomber_target(struct Moby *moby) { char *minibomber_private_vars = (char *)moby->pvars; - if (moby->state != 0 && moby->state != 9) { + if (moby->state != MINIBOMBER_STATE_INITIALIZE && moby->state != MINIBOMBER_STATE_DESTROY) { int *bound_path = ((int *)l14_paths[*(int *)(minibomber_private_vars + 0xD4)]); FUN_L00_0025ff38( 255.0f, moby, minibomber_private_vars + 0x70, 0, 0, bound_path + 4, *bound_path); @@ -883,7 +889,9 @@ void ease_minibomber_position_and_heading(char *moby, float heading_velocity_limit) { int minibomber_private_vars_base; int moby_state = MOBY(moby)->state & 0xFF; - if ((moby_state >= 4 && moby_state <= 6) || moby_state == 8) { + if ((moby_state >= MINIBOMBER_STATE_HOLD_AT_PATH_END && + moby_state <= MINIBOMBER_STATE_RELEASE_BOMB) || + moby_state == 8) { minibomber_private_vars_base = *(int *)(moby + 0x78); vendor_spring((float *)&MOBY(moby)->pos, (float *)(minibomber_private_vars_base + 0xF0), @@ -1120,7 +1128,8 @@ void emit_minibomber_exhaust_puffs(struct Moby *moby) { int signed_puff_value; int life; float size; - if (moby->state < 2 || moby->state == 9) + if (moby->state < MINIBOMBER_STATE_FOLLOW_INTRO_OR_EXIT_PATH || + moby->state == MINIBOMBER_STATE_DESTROY) return; fast_vec_scale(exhaust_position_offset, &moby->rot_row0, -1.25f); fast_vec_add(pos, &moby->pos, exhaust_position_offset); diff --git a/src/overlays/l14/mobys/morphoray_pickup.c b/src/overlays/l14/mobys/morphoray_pickup.c index f701146d9c..bcf3728cca 100644 --- a/src/overlays/l14/mobys/morphoray_pickup.c +++ b/src/overlays/l14/mobys/morphoray_pickup.c @@ -70,7 +70,7 @@ void morphoray_pickup_update(struct Moby *moby) { moby->rot.y = -1.5707964f; moby->pos.z = D_L14_00174568[0] + morphoray_ground_height_offset_gp; qcopy(morphoray_pvars, moby_bytes + 0x10); - moby->state = 1; + moby->state = MORPHORAY_PICKUP_WAIT_FOR_HERO; break; case MORPHORAY_PICKUP_WAIT_FOR_HERO: *(f32 *)(moby_bytes + 0x48) = @@ -91,7 +91,7 @@ void morphoray_pickup_update(struct Moby *moby) { *(s32 *)(morphoray_pvars + 0x18) = 0; grant_inventory_item(0x15, 1); start_scene(6); - moby->state = 2; + moby->state = MORPHORAY_PICKUP_WAIT_TO_REMOVE; break; case MORPHORAY_PICKUP_WAIT_TO_REMOVE: if (D_L14_0015F5C4 != state) { @@ -127,20 +127,20 @@ typedef struct { } MorphorayPrivateState; void initialize_morphoray_private_state(struct Moby *moby) { - MorphorayPrivateState *m = (MorphorayPrivateState *)moby->pvars; + MorphorayPrivateState *morphoray_private_state = (MorphorayPrivateState *)moby->pvars; s32 i; for (i = 0; i < 4; i++) - m->r[i] = random_integer_below(0xFF); - m->a[0] = -1.0f; - m->a[1] = -2.25f; - m->a[2] = 1.25f; - m->a[3] = 2.5f; + morphoray_private_state->r[i] = random_integer_below(0xFF); + morphoray_private_state->a[0] = -1.0f; + morphoray_private_state->a[1] = -2.25f; + morphoray_private_state->a[2] = 1.25f; + morphoray_private_state->a[3] = 2.5f; for (i = 0; i < 4; i++) - m->c[i] = scale_game_frames(i * 0x40 + 0x3F); - m->x40 = 2.0f; - m->x44 = 2.5f; - m->x4c = 2.0f; - m->x48 = 2.5f; + morphoray_private_state->c[i] = scale_game_frames(i * 0x40 + 0x3F); + morphoray_private_state->x40 = 2.0f; + morphoray_private_state->x44 = 2.5f; + morphoray_private_state->x4c = 2.0f; + morphoray_private_state->x48 = 2.5f; } typedef struct { @@ -155,8 +155,14 @@ typedef struct { extern int fast_tween_color(int, int, float) __asm__("FUN_001fa6e0"); -extern unsigned char * -FUN_L00_00272f68(float f, void *pos, int b, unsigned char a2, int idx, int flag, int s, int mode); +extern unsigned char *spawn_timed_hero_relative_particle(float f, + void *pos, + int b, + unsigned char a2, + int idx, + int flag, + int s, + int mode) __asm__("FUN_L00_00272f68"); void update_morphoray_particles(struct Moby *morphoray_moby) { float particle_position_and_step[8]; @@ -191,7 +197,8 @@ void update_morphoray_particles(struct Moby *morphoray_moby) { elapsed_timer_fraction = elapsed_timer_fraction / (float)scale_game_frames(255); c = fast_tween_color(0x4040FFFF, 0x1040FFFF, absolute_float(0.5f - elapsed_timer_fraction)); k = truncate_float_to_s32(*a++); - FUN_L00_00272f68(effect_data->c[j], particle_position_and_step, c, k, 0x35, 1, 2, 0); + spawn_timed_hero_relative_particle( + effect_data->c[j], particle_position_and_step, c, k, 0x35, 1, 2, 0); j++; fast_vec_add( particle_position_and_step, particle_position_and_step, &particle_position_and_step[4]); diff --git a/src/overlays/l14/mobys/path_lightning_controller.c b/src/overlays/l14/mobys/path_lightning_controller.c index 2a4dd0db09..db67a3f552 100644 --- a/src/overlays/l14/mobys/path_lightning_controller.c +++ b/src/overlays/l14/mobys/path_lightning_controller.c @@ -56,20 +56,26 @@ void path_lightning_controller_update(struct Moby *moby) __asm__("FUN_L14_002ed2 /* Moby class 684 */ void path_lightning_controller_update(struct Moby *moby) { + enum { + PATH_LIGHTNING_STATE_INITIALIZE = 0, + PATH_LIGHTNING_STATE_WAIT_SCENE_START = 1, + PATH_LIGHTNING_STATE_WAIT_TRACKED_MOBY_RESTORE = 2, + PATH_LIGHTNING_STATE_ACTIVE = 3 + }; char *moby_vars = (char *)moby->pvars; int visible_path_point_indices[5]; float visibility_test_point[4]; int moby_state; - if (MOBY(moby)->state == 0) { + if (MOBY(moby)->state == PATH_LIGHTNING_STATE_INITIALIZE) { if (current_level_index == 0xE) hero.pack_disabled = 1; - MOBY(moby)->state = 1; + MOBY(moby)->state = PATH_LIGHTNING_STATE_WAIT_SCENE_START; moby->update_dist = 0xFF; *(int *)&lightning_arc_initialized_gp = 0; *(int *)&lightning_arc_interval_remaining_frames_gp = 0; } moby_state = MOBY(moby)->state; - if (moby_state == 1) { + if (moby_state == PATH_LIGHTNING_STATE_WAIT_SCENE_START) { unsigned char *scene_start_guard_base; if (D_L14_0015F5C4 != 0) return; @@ -78,14 +84,14 @@ void path_lightning_controller_update(struct Moby *moby) { return; start_scene(0); scene_start_guard_base[0x68] = moby_state; - MOBY(moby)->state = 2; + MOBY(moby)->state = PATH_LIGHTNING_STATE_WAIT_TRACKED_MOBY_RESTORE; deactivate_recorded_moby(); return; } - if (moby_state == 2) { + if (moby_state == PATH_LIGHTNING_STATE_WAIT_TRACKED_MOBY_RESTORE) { if (D_L14_0015F5C4 == moby_state) return; - MOBY(moby)->state = 3; + MOBY(moby)->state = PATH_LIGHTNING_STATE_ACTIVE; show_tracked_moby(); return; } diff --git a/src/overlays/l14/mobys/path_mover.c b/src/overlays/l14/mobys/path_mover.c index 16818a0848..5ac5ea2cfd 100644 --- a/src/overlays/l14/mobys/path_mover.c +++ b/src/overlays/l14/mobys/path_mover.c @@ -68,6 +68,10 @@ void path_mover_update(struct Moby *moby) { PATH_MOVER_COMMAND_WAIT_AT_FIRST_POINT = 1, PATH_MOVER_COMMAND_TRAVERSE_PATH = 2 }; + enum { + PATH_MOVER_STATE_UNINITIALIZED = 0, + PATH_MOVER_STATE_INITIALIZED = 1 + }; PathMoverVars *path_mover_vars = (PathMoverVars *)moby->pvars; LevelPath *path; Vec4 orig; @@ -112,7 +116,7 @@ void path_mover_update(struct Moby *moby) { } qcopy(&orig, &moby->pos); fast_dec_timer_s16(&path_mover_vars->wait); - if (moby->state == 0) { + if (moby->state == PATH_MOVER_STATE_UNINITIALIZED) { f32 t; Vec4 *points; @@ -131,7 +135,7 @@ void path_mover_update(struct Moby *moby) { path_mover_vars->wait = 0; path_mover_vars->speed = 0.0f; path_mover_vars->rise = 0.0f; - moby->state = 1; + moby->state = PATH_MOVER_STATE_INITIALIZED; moby->update_dist = 0xFF; moby->draw_dist = 0xFF; path_mover_vars->voice = -1; diff --git a/src/overlays/l14/mobys/platform.c b/src/overlays/l14/mobys/platform.c index 6eb51a4842..e7276e73d4 100644 --- a/src/overlays/l14/mobys/platform.c +++ b/src/overlays/l14/mobys/platform.c @@ -54,13 +54,17 @@ typedef struct TiltingPlatformVars { /* Moby class 309 */ void tilting_platform_update(struct Moby *moby) { + enum { + TILTING_PLATFORM_STATE_UNINITIALIZED = 0, + TILTING_PLATFORM_STATE_INITIALIZED = 1 + }; TiltingPlatformVars *tilting_platform_state = (TiltingPlatformVars *)moby->pvars; void *rotation; u128 old_rotation; qcopy(&old_rotation, &moby->rot); - if (moby->state == 0) { - moby->state = 1; + if (moby->state == TILTING_PLATFORM_STATE_UNINITIALIZED) { + moby->state = TILTING_PLATFORM_STATE_INITIALIZED; moby->command = 0; moby->flags |= 0x100; moby->pos.z += 0.35f; diff --git a/src/overlays/l14/mobys/qwark_oltanis.c b/src/overlays/l14/mobys/qwark_oltanis.c index 7603de3a9e..64d4e9f20f 100644 --- a/src/overlays/l14/mobys/qwark_oltanis.c +++ b/src/overlays/l14/mobys/qwark_oltanis.c @@ -181,7 +181,7 @@ void qwark_oltanis_update(L14WatchMoby *moby) { moby_vars->p20 = (void *)captain_qwark_name; initialize_npc_dialogue(moby, moby_vars); moby_vars->b8 = 1; - moby->state = 1; + moby->state = QWARK_OLTANIS_STATE_UPDATE_DIALOGUE; break; } case QWARK_OLTANIS_STATE_UPDATE_DIALOGUE: @@ -199,12 +199,12 @@ void qwark_oltanis_update(L14WatchMoby *moby) { } if (update_npc_dialogue(moby, moby_vars)) { begin_dialogue_camera_transition(moby, 3.0f); - moby->state = 2; + moby->state = QWARK_OLTANIS_STATE_POST_DIALOGUE; } break; case QWARK_OLTANIS_STATE_POST_DIALOGUE: if (D_L14_0015F5C4 != 2) { - moby->state = 1; + moby->state = QWARK_OLTANIS_STATE_UPDATE_DIALOGUE; if ((unsigned)(moby_vars->sub - 3) < 2) { if ((short)moby_vars->sub == 4) queue_dialogue_message(0x53DD, -1); diff --git a/src/overlays/l14/mobys/racer.c b/src/overlays/l14/mobys/racer.c index b1f0f95bdb..0d87ab481e 100644 --- a/src/overlays/l14/mobys/racer.c +++ b/src/overlays/l14/mobys/racer.c @@ -116,6 +116,9 @@ void level14_racer_update(struct Moby *racer_moby) { RACER_STATE_FOLLOW_PATH = 5, RACER_STATE_WAIT_FOR_EXIT_VOLUME = 6 }; + enum { + RACE_PHASE_START_RACER_DELAYS = 0x14 + }; struct L14RacerVars *racer_vars = (struct L14RacerVars *)racer_moby->pvars; u8 pos[16]; f32 spawned_object_planar_velocity[3]; @@ -131,7 +134,7 @@ void level14_racer_update(struct Moby *racer_moby) { return; } initialize_racer_path_tracking(racer_moby); - racer_moby->state = 1; + racer_moby->state = RACER_STATE_WAIT_FOR_RACE_START; racer_moby->flags = (racer_moby->flags & 0xEFFF) | 0x41; racer_moby->collision = 0; racer_vars->unkF4 = -1; @@ -144,9 +147,9 @@ void level14_racer_update(struct Moby *racer_moby) { attach_manipulator(racer_moby, 4, racer_vars->manips[2]); return; case RACER_STATE_WAIT_FOR_RACE_START: - if (race_state->phase == 0x14) { + if (race_state->phase == RACE_PHASE_START_RACER_DELAYS) { racer_vars->timer = scale_game_frames(racer_vars->delay); - racer_moby->state = 2; + racer_moby->state = RACER_STATE_WAIT_FOR_START_DELAY; } return; case RACER_STATE_WAIT_FOR_START_DELAY: @@ -154,7 +157,7 @@ void level14_racer_update(struct Moby *racer_moby) { return; racer_moby->flags = (racer_moby->flags | 0x1000) & 0xFFBE; racer_moby->collision = racer_moby->pclass->collision; - racer_moby->state = 3; + racer_moby->state = RACER_STATE_WAIT_FOR_START_ANIMATION; set_moby_animation(racer_moby, 2, 0); racer_moby->anim_speed = 0.5f; racer_vars->timer = scale_game_frames(level14_racer_start_interpolation_duration_frames_gp); @@ -164,14 +167,14 @@ void level14_racer_update(struct Moby *racer_moby) { if (compute_interpolated_record_value(racer_moby) >= 3.0f) interpolate_racer_to_path_start(racer_moby); if ((racer_moby->anim_flags & 2) && racer_moby->seq == racer_moby->prev_seq) { - racer_moby->state = 4; + racer_moby->state = RACER_STATE_COMPLETE_START_INTERPOLATION; blend_moby_animation((MobyAnim *)racer_moby, 0, 0, 10); racer_moby->anim_speed = 1.0f; } break; case RACER_STATE_COMPLETE_START_INTERPOLATION: if (interpolate_racer_to_path_start(racer_moby)) { - racer_moby->state = 5; + racer_moby->state = RACER_STATE_FOLLOW_PATH; racer_vars->timer = scale_game_frames(level14_racer_path_follow_initial_timer_frames_gp); } diff --git a/src/overlays/l14/mobys/racer_path_and_weapon.c b/src/overlays/l14/mobys/racer_path_and_weapon.c index b34a958862..4d832b245e 100644 --- a/src/overlays/l14/mobys/racer_path_and_weapon.c +++ b/src/overlays/l14/mobys/racer_path_and_weapon.c @@ -275,7 +275,7 @@ int D_L14_00161A3C = 0x8c; extern char D_L14_001809C0[]; extern char D_L14_0015F580_macro[] __asm__("D_L14_0015F580") MACRO_ADDR; extern void vendor_spring(void *, void *, float, float, float, float) __asm__("FUN_L00_0025b8c0"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern void register_beam_slot(struct Moby *, int, int) __asm__("FUN_L00_002e1f28"); extern int set_beam_origin_transform_and_endpoint(struct Moby *, void *, void *) __asm__("FUN_L00_002e2190"); @@ -406,7 +406,7 @@ void update_racer_path_and_weapon(struct Moby *racer_moby) { } turn = (turn - 0.0f) * blend + 0.0f; } - FUN_L00_001fff28(&moby_data->unk150, 2, turn); + build_axis_rotation_quaternion(&moby_data->unk150, 2, turn); moby_point_position(racer_moby, 4, &joint_transform_and_aim_vectors[2]); *(u128_67e8 *)&joint_transform_and_aim_vectors[3] = 0; joint_transform_and_aim_vectors[3].z = 1.0f; @@ -522,11 +522,11 @@ void update_racer_path_and_weapon(struct Moby *racer_moby) { } else if (target_yaw_offset < -1.2217305f) { target_yaw_offset = -1.2217305f; } - FUN_L00_001fff28(&moby_data->unk110, 2, target_yaw_offset); + build_axis_rotation_quaternion(&moby_data->unk110, 2, target_yaw_offset); } /* Ported from rac1-decomp (src/overlays/l14_oltanis/vendor_002ACCC0.c: func_L14_002D84A8), where it is exact; names translated to the US level program. */ -extern float D_L14_00161A30 __attribute__((sda)); +extern float l14_racer_path_follow_speed __asm__("D_L14_00161A30") __attribute__((sda)); void advance_moby_along_path(struct Moby *moby) __asm__("FUN_L14_002d7198"); void advance_moby_along_path(struct Moby *moby) { @@ -537,7 +537,7 @@ void advance_moby_along_path(struct Moby *moby) { &path_tracking_state->unk64, &path_tracking_state->unk68, 0, - D_L14_00161A30 * frame_time); + l14_racer_path_follow_speed * frame_time); } /* Draws the racer's two glow quads, at its lamp (0xE0) and its tail (0x200), turned to face the camera. */ diff --git a/src/overlays/l14/mobys/ribbon_effect.c b/src/overlays/l14/mobys/ribbon_effect.c index a4e5fe409a..adbc8e3d44 100644 --- a/src/overlays/l14/mobys/ribbon_effect.c +++ b/src/overlays/l14/mobys/ribbon_effect.c @@ -51,7 +51,7 @@ void ribbon_effect_moby_update(struct Moby *moby) { return; } initialize_ribbon_effect_state(moby); - moby->state = 1; + moby->state = MOBY_STATE_UPDATE; *(int *)(ribbon_effect_state + 0x204) = -1; break; case MOBY_STATE_UPDATE: diff --git a/src/overlays/l14/mobys/rocket.c b/src/overlays/l14/mobys/rocket.c index fa75ef7454..db882d710b 100644 --- a/src/overlays/l14/mobys/rocket.c +++ b/src/overlays/l14/mobys/rocket.c @@ -79,7 +79,7 @@ void rocket_update(struct Moby *moby) { mark_moby_for_removal(moby); return; } - moby->state = 1; + moby->state = ROCKET_STATE_IDLE; moby->update_dist = 0xFF; moby->pos.z += 1.5f; rocket_vars->sound = -1; diff --git a/src/overlays/l14/mobys/rocket_strike_fighter.c b/src/overlays/l14/mobys/rocket_strike_fighter.c index 1c0f782408..71339c7035 100644 --- a/src/overlays/l14/mobys/rocket_strike_fighter.c +++ b/src/overlays/l14/mobys/rocket_strike_fighter.c @@ -29,6 +29,13 @@ #include "rnc/overlay/shared/rendering/effects/spawn_explosion.h" #include "rnc/overlay/shared/vendor.h" +enum { + ROCKET_STRIKE_FIGHTER_STATE_INITIALIZE = 0, + ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_MISSIONS = 1, + ROCKET_STRIKE_FIGHTER_STATE_FOLLOW_PATH = 2, + ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_RESPAWN = 3 +}; + extern float vector_length_xy(void *); extern void debug_print(const char *, short) __asm__("FUN_001e93b0"); @@ -85,16 +92,13 @@ void rocket_strike_fighter_update(struct Moby *moby) __asm__("FUN_L14_002fcbb0") /* Moby class 921 */ void rocket_strike_fighter_update(struct Moby *moby) { enum { - ROCKET_STRIKE_FIGHTER_STATE_INITIALIZE = 0, - ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_MISSIONS = 1, - ROCKET_STRIKE_FIGHTER_STATE_FOLLOW_PATH = 2, - ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_RESPAWN = 3 + ROCKET_STRIKE_FIGHTER_MISSION_COMPLETE = 0xFF }; RocketStrikeFighterVars *moby_vars = (RocketStrikeFighterVars *)moby->pvars; Vec4 target_view_point_or_rocket_offset; Vec4 rocket_position; - if (moby->state == 0) { + if (moby->state == ROCKET_STRIKE_FIGHTER_STATE_INITIALIZE) { u16 id = moby->save_id; if (D_L14_001BB930.cleared[(short)id] != 0 || (D_0014C190_257218[current_level_index][(short)id >> 5] >> (id & 0x1F)) & 1) { @@ -106,7 +110,8 @@ void rocket_strike_fighter_update(struct Moby *moby) { { void *hit = find_moby_hit(moby, 0x800000, 0); moby->hit_slot = 0xFF; - if (hit != 0 && moby_vars->rocket == -1 && moby->state != 3) { + if (hit != 0 && moby_vars->rocket == -1 && + moby->state != ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_RESPAWN) { if (current_level_index == 14) { enemy_fighter_destruction_count = enemy_fighter_destruction_count + 1; if (enemy_fighter_destruction_count >= 3 && item_unlocked[0x18] == 0) { @@ -115,7 +120,7 @@ void rocket_strike_fighter_update(struct Moby *moby) { queue_dialogue_message(0x53D6, -1); } } - moby->state = 3; + moby->state = ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_RESPAWN; FUN_L00_0025f090(moby, &moby->pos, -1, 5.0f, 13.0f); moby->collision = 0; moby->flags |= 0x41; @@ -146,7 +151,7 @@ void rocket_strike_fighter_update(struct Moby *moby) { initialize_flight_path_state(moby); if (moby_vars->rocket != 0) { struct Moby *c; - moby->state = 1; + moby->state = ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_MISSIONS; moby->update_dist = 0xFF; moby->flags |= 0x41; moby->collision = 0; @@ -154,7 +159,7 @@ void rocket_strike_fighter_update(struct Moby *moby) { c->flags |= 0x41; moby_vars->stage = 0; } else { - moby->state = 2; + moby->state = ROCKET_STRIKE_FIGHTER_STATE_FOLLOW_PATH; moby->update_dist = 0x80; } moby->draw_dist = 0x80; @@ -164,7 +169,7 @@ void rocket_strike_fighter_update(struct Moby *moby) { case ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_MISSIONS: { int lvl = current_level_index * 16; u8 first_mission_state = visited52[moby_vars->mission[0] + lvl]; - if (first_mission_state == 0xFF) { + if (first_mission_state == ROCKET_STRIKE_FIGHTER_MISSION_COMPLETE) { u8 second_mission_state = visited52[moby_vars->mission[1] + lvl]; if (second_mission_state == first_mission_state) { u8 x = visited52[moby_vars->mission[2] + lvl]; @@ -198,7 +203,7 @@ void rocket_strike_fighter_update(struct Moby *moby) { moby->flags &= 0xFFBE; moby->collision = moby->pclass->collision; rocket->flags &= 0xFFBE; - moby->state = 2; + moby->state = ROCKET_STRIKE_FIGHTER_STATE_FOLLOW_PATH; activate_descriptor(moby_vars->flythrough); target->draw_dist = 0xFF; target->update_dist = 0xFF; @@ -234,7 +239,7 @@ void rocket_strike_fighter_update(struct Moby *moby) { moby->flags &= 0xFFBE; moby->collision = moby->pclass->collision; moby_vars->timer = scale_game_frames(rocket_strike_fighter_respawn_delay_frames_gp); - moby->state = 2; + moby->state = ROCKET_STRIKE_FIGHTER_STATE_FOLLOW_PATH; moby_vars->segment = 0; moby_vars->along = 0; qcopy(&moby->pos, path + 0x10); @@ -246,7 +251,9 @@ void rocket_strike_fighter_update(struct Moby *moby) { break; } spawn_rocket_strike_fighter_exhaust(moby); - if (moby->state != 0 && moby->state != 3 && moby->state != 1 && + if (moby->state != ROCKET_STRIKE_FIGHTER_STATE_INITIALIZE && + moby->state != ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_RESPAWN && + moby->state != ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_MISSIONS && voice_is_playing(moby, moby_vars->sound) == 0) moby_vars->sound = allocate_voice_for_target_entry(0, 4, moby); } @@ -280,7 +287,9 @@ void spawn_rocket_strike_fighter_exhaust(struct Moby *moby) { int grey; float size; - if (moby->state == 0 || moby->state == 3 || moby->state == 1) + if (moby->state == ROCKET_STRIKE_FIGHTER_STATE_INITIALIZE || + moby->state == ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_RESPAWN || + moby->state == ROCKET_STRIKE_FIGHTER_STATE_WAIT_FOR_MISSIONS) return; fast_vec_scale(&step, &moby->rot_row0, rocket_strike_fighter_exhaust_base_row0_offset_gp); fast_vec_add(&pos, &moby->pos, &step); diff --git a/src/overlays/l14/mobys/sam.c b/src/overlays/l14/mobys/sam.c index 22de2b918f..7e074d050d 100644 --- a/src/overlays/l14/mobys/sam.c +++ b/src/overlays/l14/mobys/sam.c @@ -143,7 +143,7 @@ void sam_update(L14WatchMoby *moby) { } moby_data->p20 = (void *)sam_dialogue_name_text; initialize_npc_dialogue(moby, moby_data); - moby->state = 1; + moby->state = SAM_STATE_DIALOGUE; moby_data->b8 = 1; break; } @@ -165,12 +165,12 @@ void sam_update(L14WatchMoby *moby) { qcopy(D_L14_0016CF60.q10, t + 0x30); clear_u64_value((char *)&D_L14_0016CF60 + 0x20); D_L14_0016CF60.f28 = *(float *)(t + 0x78); - moby->state = 2; + moby->state = SAM_STATE_POST_DIALOGUE_WAIT; } break; case SAM_STATE_POST_DIALOGUE_WAIT: if (D_L14_0015F5C4 != 2) { - moby->state = 1; + moby->state = SAM_STATE_DIALOGUE; if ((short)moby_data->sub == 4) { unlock_planet(0xF); queue_planet_unlock_message(0xF); diff --git a/src/overlays/l14/mobys/shuttle.c b/src/overlays/l14/mobys/shuttle.c index 7c430d9ff1..94541ccab8 100644 --- a/src/overlays/l14/mobys/shuttle.c +++ b/src/overlays/l14/mobys/shuttle.c @@ -57,12 +57,16 @@ extern f32 shuttle_horizontal_rider_correction_limit_scale_gp __asm__("D_L14_001 extern void debug_print(const char *, short) __asm__("FUN_001e93b0"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); void shuttle_update(struct Moby *m) __asm__("FUN_L14_002e7bd8"); /* Moby class 557 */ void shuttle_update(struct Moby *shuttle_moby) { + enum { + SHUTTLE_STATE_INITIALIZE = 0, + SHUTTLE_RIDER_MODE_ATTACHED = 0x3039 + }; L14LiftVars *shuttle_vars; Vec4 previous_shuttle_position; Vec4 rot; @@ -102,7 +106,7 @@ void shuttle_update(struct Moby *shuttle_moby) { } qcopy(&previous_shuttle_position, &shuttle_moby->pos); qcopy(&rot, &shuttle_moby->rot); - if (shuttle_moby->state == 0) { + if (shuttle_moby->state == SHUTTLE_STATE_INITIALIZE) { qcopy(&shuttle_moby->pos, ((char *)l14_paths[shuttle_vars->path]) + 0x10); shuttle_vars->angle = 0.0f; shuttle_vars->sound = -1; @@ -118,7 +122,7 @@ void shuttle_update(struct Moby *shuttle_moby) { } gunship_update(shuttle_moby); rider = &D_L14_0015FFD8_lift[shuttle_vars->rider]; - if (shuttle_vars->mode == 0x3039) { + if (shuttle_vars->mode == SHUTTLE_RIDER_MODE_ATTACHED) { if (shuttle_vars->anchor != -1) moby_point_position( shuttle_moby, shuttle_vars->anchor, &rider_attachment_origin_or_hero_position); @@ -132,7 +136,7 @@ void shuttle_update(struct Moby *shuttle_moby) { (voice_is_playing(shuttle_moby, shuttle_vars->sound) == 0 && shuttle_vars->sound == -1)) shuttle_vars->sound = allocate_voice_for_target_entry(0, 4, shuttle_moby); shuttle_vars->angle = fast_add_rotations(shuttle_vars->angle, 0.17453292f); - FUN_L00_001fff28(shuttle_vars->wobble, 0, shuttle_vars->angle); + build_axis_rotation_quaternion(shuttle_vars->wobble, 0, shuttle_vars->angle); fast_vec_sub(&delta, &shuttle_moby->pos, &previous_shuttle_position); update_entity_matrix(shuttle_vars->spring, &delta, &rot, &shuttle_moby->rot); if (hero.state.control_mode == 13 && hero.grapple_target == rider) { diff --git a/src/overlays/l14/mobys/taxi.c b/src/overlays/l14/mobys/taxi.c index 6f8cd5ab80..9799fc2f82 100644 --- a/src/overlays/l14/mobys/taxi.c +++ b/src/overlays/l14/mobys/taxi.c @@ -18,6 +18,16 @@ #include "rnc/overlay/shared/cutscenes/update_npc_dialogue.h" #include "rnc/overlay/shared/world/cuboid.h" +enum { + TAXI_STATE_INITIALIZE = 0, + TAXI_STATE_WAIT_AT_STOP = 1, + TAXI_STATE_BLEND_STOP_TO_PATH_START = 3, + TAXI_STATE_FOLLOW_PATH = 4, + TAXI_STATE_BLEND_PATH_END_TO_STOP = 5, + TAXI_STATE_WAIT_FOR_ITEM_GATE = 6, + TAXI_STATE_BLEND_SAVED_POSE_TO_PATH_START = 7 +}; + enum TaxiStop { TAXI_STOP_RETURN_HUB = 0x0, TAXI_STOP_HUB_OUTBOUND_DESTINATION = 0x1, @@ -85,13 +95,7 @@ void taxi_update(struct Moby *moby) __asm__("FUN_L14_002f0538"); /* Moby class 712 */ void taxi_update(struct Moby *moby) { enum { - TAXI_STATE_INITIALIZE = 0, - TAXI_STATE_WAIT_AT_STOP = 1, - TAXI_STATE_BLEND_STOP_TO_PATH_START = 3, - TAXI_STATE_FOLLOW_PATH = 4, - TAXI_STATE_BLEND_PATH_END_TO_STOP = 5, - TAXI_STATE_WAIT_FOR_ITEM_GATE = 6, - TAXI_STATE_BLEND_SAVED_POSE_TO_PATH_START = 7 + TAXI_STATE_HIDDEN = 2 }; L14TaxiVars *taxi_vars = (L14TaxiVars *)moby->pvars; float previous_position[4], previous_rotation[4], position_delta[4], @@ -125,10 +129,10 @@ void taxi_update(struct Moby *moby) { request_taxi_stop_prompt(moby); if ((pad_pressed_words[0] & button) && D_L14_0015F594 == 4) { struct Moby *m; - moby->state = 3; + moby->state = TAXI_STATE_BLEND_STOP_TO_PATH_START; m = find_group_moby_by_tag(moby, taxi_vars->target); if (m != 0) { - m->state = 2; + m->state = TAXI_STATE_HIDDEN; m->flags |= 1; m->visible = 0; m->collision = 0; @@ -144,7 +148,7 @@ void taxi_update(struct Moby *moby) { taxi_vars->picked = 0; qcopy_nc(&moby->pos, &l14_cuboids[taxi_vars->points[taxi_vars->picked]].pos); qcopy_nc(&moby->rot, &l14_cuboids[taxi_vars->points[taxi_vars->picked]].rot); - moby->state = 1; + moby->state = TAXI_STATE_WAIT_AT_STOP; qcopy_nc(taxi_vars->pos, &l14_cuboids[taxi_vars->points[taxi_vars->picked]].pos); qcopy_nc(taxi_vars->rot, @@ -156,7 +160,7 @@ void taxi_update(struct Moby *moby) { taxi_vars->picked = 1; } prepare_taxi_route(moby); - moby->state = 3; + moby->state = TAXI_STATE_BLEND_STOP_TO_PATH_START; } } if (taxi_vars->clip[1] >= 0 && taxi_vars->picked != 1 && @@ -166,7 +170,7 @@ void taxi_update(struct Moby *moby) { taxi_vars->picked = 1; qcopy_nc(&moby->pos, &l14_cuboids[taxi_vars->points[taxi_vars->picked]].pos); qcopy_nc(&moby->rot, &l14_cuboids[taxi_vars->points[taxi_vars->picked]].rot); - moby->state = 1; + moby->state = TAXI_STATE_WAIT_AT_STOP; qcopy_nc(taxi_vars->pos, &l14_cuboids[taxi_vars->points[taxi_vars->picked]].pos); qcopy_nc(taxi_vars->rot, @@ -174,7 +178,7 @@ void taxi_update(struct Moby *moby) { } else { taxi_vars->picked = 0; prepare_taxi_route(moby); - moby->state = 3; + moby->state = TAXI_STATE_BLEND_STOP_TO_PATH_START; } } if (taxi_vars->clip[2] >= 0 && taxi_vars->picked < 2 && @@ -184,7 +188,7 @@ void taxi_update(struct Moby *moby) { taxi_vars->picked = 2; qcopy_nc(&moby->pos, &l14_cuboids[taxi_vars->points[taxi_vars->picked]].pos); qcopy_nc(&moby->rot, &l14_cuboids[taxi_vars->points[taxi_vars->picked]].rot); - moby->state = 1; + moby->state = TAXI_STATE_WAIT_AT_STOP; qcopy_nc(taxi_vars->pos, &l14_cuboids[taxi_vars->points[taxi_vars->picked]].pos); qcopy_nc(taxi_vars->rot, @@ -192,7 +196,7 @@ void taxi_update(struct Moby *moby) { } else { taxi_vars->picked = 2; prepare_taxi_route(moby); - moby->state = 3; + moby->state = TAXI_STATE_BLEND_STOP_TO_PATH_START; } } } @@ -225,7 +229,7 @@ void taxi_update(struct Moby *moby) { if (1.0f <= taxi_vars->t) { taxi_vars->t = 0.0f; taxi_vars->tv = 0.0f; - moby->state = 4; + moby->state = TAXI_STATE_FOLLOW_PATH; } break; } @@ -254,7 +258,7 @@ void taxi_update(struct Moby *moby) { if (1.0f <= taxi_vars->t) { taxi_vars->t = 0.0f; taxi_vars->tv = 0.0f; - moby->state = 4; + moby->state = TAXI_STATE_FOLLOW_PATH; } break; } @@ -266,7 +270,7 @@ void taxi_update(struct Moby *moby) { if (advance_moby_path((char *)moby)) { taxi_vars->t = 0.0f; taxi_vars->tv = 0.0f; - moby->state = 5; + moby->state = TAXI_STATE_BLEND_PATH_END_TO_STOP; } break; } @@ -296,7 +300,7 @@ void taxi_update(struct Moby *moby) { if (1.0f <= taxi_vars->t) { taxi_vars->t = 0.0f; taxi_vars->tv = 0.0f; - moby->state = 1; + moby->state = TAXI_STATE_WAIT_AT_STOP; reset_selected_moby_to_current_placement(moby); } g = &hero; @@ -314,13 +318,13 @@ void taxi_update(struct Moby *moby) { initialize_taxi_stop_from_position(moby); taxi_vars->picked = taxi_vars->target; prepare_taxi_route(moby); - moby->state = 7; + moby->state = TAXI_STATE_BLEND_SAVED_POSE_TO_PATH_START; qcopy(taxi_vars->pos, taxi_vars->save_pos); qcopy(taxi_vars->rot, taxi_vars->save_rot); { struct Moby *m = find_group_moby_by_tag(moby, taxi_vars->target); if (m != 0) { - m->state = 2; + m->state = TAXI_STATE_HIDDEN; m->flags |= 1; m->visible = 0; m->collision = 0; @@ -340,13 +344,14 @@ void taxi_update(struct Moby *moby) { moby->visible = 1; moby->collision = class_collision; moby->flags = bits & 0xFFFE; - moby->state = 1; + moby->state = TAXI_STATE_WAIT_AT_STOP; } break; } } apply_moby_position_and_rotation_wobble((char *)moby); - if (moby->state >= 3 && moby->state <= 4) { + if (moby->state >= TAXI_STATE_BLEND_STOP_TO_PATH_START && + moby->state <= TAXI_STATE_FOLLOW_PATH) { struct Hero *g = &hero; if (g->ground_moby == moby && g->air_frames.s == 0) { g->jump_lock_timer = 2; @@ -390,7 +395,7 @@ void initialize_taxi_stop_from_position(struct Moby *moby) { break; } } - moby->state = 1; + moby->state = TAXI_STATE_WAIT_AT_STOP; { int k = taxi_vars->points[taxi_vars->picked]; LevelCuboid *taxi_stops = l14_cuboids; @@ -468,7 +473,7 @@ extern void try_set_help_message(int, int) __asm__("FUN_00215130"); void request_taxi_stop_prompt(struct Moby *moby) { char *taxi_prompt_vars = (char *)moby->pvars; int taxi_stop_index = *(short *)(taxi_prompt_vars + 0xB4); - if (moby->state == 5) { + if (moby->state == TAXI_STATE_BLEND_PATH_END_TO_STOP) { taxi_stop_index = *(short *)(taxi_prompt_vars + 0xB6); } switch (taxi_stop_index) { diff --git a/src/overlays/l14/mobys/unfolding_column.c b/src/overlays/l14/mobys/unfolding_column.c index 9ecc92876b..fb5da5cf4f 100644 --- a/src/overlays/l14/mobys/unfolding_column.c +++ b/src/overlays/l14/mobys/unfolding_column.c @@ -78,6 +78,9 @@ void unfolding_column_update(UnfoldingColumnMoby *moby) { UNFOLDING_COLUMN_UNFOLD_PIECES = 2, UNFOLDING_COLUMN_SWING_PIVOT = 3 }; + enum { + UNFOLDING_COLUMN_COMPLETE = 4 + }; UnfoldingColumnVars *data = moby->data; float position_offset[4]; @@ -103,13 +106,13 @@ void unfolding_column_update(UnfoldingColumnMoby *moby) { } data->voice = -1; if (data->pivot != 0) { - moby->state = 1; + moby->state = UNFOLDING_COLUMN_WAIT_FOR_TRIGGER; } break; } case UNFOLDING_COLUMN_WAIT_FOR_TRIGGER: if (((UnfoldingColumnMoby *)(D_L14_0015FFD8_c + (data->trigger << 8)))->state == 2) { - moby->state = 2; + moby->state = UNFOLDING_COLUMN_UNFOLD_PIECES; data->cur = 5; data->timer = scale_game_frames(unfolding_column_piece_unfold_frames); data->rate = 1.0f / convert_integer_to_float(data->timer); @@ -126,7 +129,7 @@ void unfolding_column_update(UnfoldingColumnMoby *moby) { data->timer = scale_game_frames(unfolding_column_piece_unfold_frames); data->cur--; if (data->cur < 0) { - moby->state = 3; + moby->state = UNFOLDING_COLUMN_SWING_PIVOT; data->timer = scale_game_frames(unfolding_column_pivot_swing_frames); data->rate = 1.0f / convert_integer_to_float(data->timer); } else { @@ -166,7 +169,7 @@ void unfolding_column_update(UnfoldingColumnMoby *moby) { } } data->voice = -1; - moby->state = 4; + moby->state = UNFOLDING_COLUMN_COMPLETE; for (j = 0; j < 6; j++) { pieces[j]->state = 2; } diff --git a/src/overlays/l14/mobys/unfolding_column_piece.c b/src/overlays/l14/mobys/unfolding_column_piece.c index 9d4ca356f7..5e4a119087 100644 --- a/src/overlays/l14/mobys/unfolding_column_piece.c +++ b/src/overlays/l14/mobys/unfolding_column_piece.c @@ -7,7 +7,12 @@ void unfolding_column_piece_update(void *updated_moby) __asm__("FUN_L14_003061d8 /* Moby class 1397 */ void unfolding_column_piece_update(void *updated_moby) { enum { - MOBY_PVARS_INITIALIZE = 0 + MOBY_PVARS_INITIALIZE = 0, + UNFOLDING_COLUMN_PIECE_RELEASE = 2 + }; + enum { + UNFOLDING_COLUMN_PIECE_INITIALIZED = 1, + UNFOLDING_COLUMN_PIECE_RELEASED = 3 }; struct Moby *moby = updated_moby; char *moby_pvars; @@ -18,11 +23,11 @@ void unfolding_column_piece_update(void *updated_moby) { *(int *)(moby_pvars + 0x20) = 0; *(short *)(moby_pvars + 0x24) = 0; *(short *)(moby_pvars + 0x3E) = 0; - moby->state = 1; + moby->state = UNFOLDING_COLUMN_PIECE_INITIALIZED; break; - case 2: + case UNFOLDING_COLUMN_PIECE_RELEASE: *(short *)(((char *)moby->pvars) + 0x3E) = 5; - moby->state = 3; + moby->state = UNFOLDING_COLUMN_PIECE_RELEASED; break; } } diff --git a/src/overlays/l14/mobys/unlock_sequence_controller.c b/src/overlays/l14/mobys/unlock_sequence_controller.c index def1b3ed5f..2099da309b 100644 --- a/src/overlays/l14/mobys/unlock_sequence_controller.c +++ b/src/overlays/l14/mobys/unlock_sequence_controller.c @@ -33,6 +33,9 @@ void unlock_sequence_controller_update(struct Moby *moby) { UNLOCK_SEQUENCE_WAIT_FOR_TRIGGER = 1, UNLOCK_SEQUENCE_COUNTDOWN = 2 }; + enum { + UNLOCK_SEQUENCE_COMPLETE = 3 + }; int *unlock_sequence_data = ((int *)moby->pvars); short id; @@ -45,14 +48,14 @@ void unlock_sequence_controller_update(struct Moby *moby) { } id = ((short)moby->save_id); if (D_L14_001BB930.cleared[id] != 0) { - moby->state = 3; + moby->state = UNLOCK_SEQUENCE_COMPLETE; return; } if (D_0014C190_257218[current_level_index][id >> 5] >> (moby->save_id & 0x1F) & 1) { - moby->state = 3; + moby->state = UNLOCK_SEQUENCE_COMPLETE; return; } - moby->state = 1; + moby->state = UNLOCK_SEQUENCE_WAIT_FOR_TRIGGER; save_and_lower_unlock_sequence_mobys((char *)moby); break; case UNLOCK_SEQUENCE_WAIT_FOR_TRIGGER: @@ -62,7 +65,7 @@ void unlock_sequence_controller_update(struct Moby *moby) { D_0014C190_257218[current_level_index][((short)moby->save_id) >> 5] |= 1 << (moby->save_id & 0x1F); D_L14_001BABD0[((short)moby->save_id) >> 5] |= 1 << (moby->save_id & 0x1F); - moby->state = 2; + moby->state = UNLOCK_SEQUENCE_COUNTDOWN; unlock_sequence_data[1] = scale_game_frames(0x78); ((float *)unlock_sequence_data)[2] = 1.0f / convert_integer_to_float(unlock_sequence_data[1]); @@ -72,7 +75,7 @@ void unlock_sequence_controller_update(struct Moby *moby) { fast_dec_timer(&unlock_sequence_data[1]); raise_unlock_sequence_mobys((char *)moby); if (unlock_sequence_data[1] == 0) { - moby->state = 3; + moby->state = UNLOCK_SEQUENCE_COMPLETE; } break; } diff --git a/src/overlays/l14/mobys/wind_control.c b/src/overlays/l14/mobys/wind_control.c index cb92cf0e2a..714e76faf6 100644 --- a/src/overlays/l14/mobys/wind_control.c +++ b/src/overlays/l14/mobys/wind_control.c @@ -73,14 +73,18 @@ void wind_control_update(struct Moby *wind_control_moby) __asm__("FUN_L14_002eaf /* Moby class 610 */ void wind_control_update(struct Moby *wind_control_moby) { + enum { + WIND_CONTROL_STATE_UNINITIALIZED = 0, + WIND_CONTROL_STATE_INITIALIZED = 1 + }; L14WindVars *wind_vars = (L14WindVars *)wind_control_moby->pvars; float wind_direction_or_push_delta[4]; char *pos; struct Hero *hero_base; int i; - if (wind_control_moby->state == 0) { - wind_control_moby->state = 1; + if (wind_control_moby->state == WIND_CONTROL_STATE_UNINITIALIZED) { + wind_control_moby->state = WIND_CONTROL_STATE_INITIALIZED; if (wind_vars->clip_push < 0) { debug_print(D_L14_001FC980, wind_control_moby->save_id); mark_moby_for_removal(wind_control_moby); diff --git a/src/overlays/l14/path_camera.c b/src/overlays/l14/path_camera.c index 6469fafa94..11d049505e 100644 --- a/src/overlays/l14/path_camera.c +++ b/src/overlays/l14/path_camera.c @@ -155,6 +155,9 @@ extern float cosine_interpolate(float, float, float) __asm__("FUN_002133d0"); void update_path_camera(struct UpdateCam *path_camera) __asm__("FUN_L14_00315290"); void update_path_camera(struct UpdateCam *path_camera) { + enum { + PATH_CAMERA_TRANSITION_PATH_FINISHED = 4 + }; float initial_look_direction_or_previous_position[4]; float t[4]; float u[4]; @@ -216,7 +219,7 @@ void update_path_camera(struct UpdateCam *path_camera) { l14_camera_projection_state.fB0 = fast_sin(ang) / fast_cos(ang); update_view_context(); D_L14_001675D8 = 0.25f; - path_camera->transition_state = 4; + path_camera->transition_state = PATH_CAMERA_TRANSITION_PATH_FINISHED; path_camera_active = 0; mb = D_L14_0015FFD8_5290; reset_racer_group_to_hero_path_position((struct Moby *)(mb + *(int *)(rec + 0x50) * 256)); @@ -304,7 +307,7 @@ int check_path_camera_priority(char *camera, char *control_mode_gate_object) { if (required_control_mode >= 0 && hero.state.control_mode != required_control_mode) return 0; required_hero_state = *(int *)(rec + 0x44); - if (required_hero_state >= 0 && hero.state.current != required_hero_state) + if (required_hero_state >= HERO_STATE_IDLE && hero.state.current != required_hero_state) return 0; return 1; } diff --git a/src/overlays/l14/path_key_camera.c b/src/overlays/l14/path_key_camera.c index 98979c70c8..824aac53b4 100644 --- a/src/overlays/l14/path_key_camera.c +++ b/src/overlays/l14/path_key_camera.c @@ -35,12 +35,13 @@ compute_position_from_spherical_offset(void *, void *, void *) __asm__("FUN_L00_ void initialize_path_key_camera(struct UpdateCam *cam) __asm__("FUN_L14_003159d8"); -void initialize_path_key_camera(struct UpdateCam *cam) { - float camera_placement_parameters[4]; - float pad[4]; /* unused; keeps the frame layout */ - float hero_look_direction[4]; - float up[4]; - char *rec = *(char **)(l14_camera_preset_rows + cam->descriptor_index * 32 + 0x1C); +void initialize_path_key_camera(struct UpdateCam *path_key_camera_object) { + float camera_placement_parameters[4]; + float pad[4]; /* unused; keeps the frame layout */ + float hero_look_direction[4]; + float up[4]; + char *rec = + *(char **)(l14_camera_preset_rows + path_key_camera_object->descriptor_index * 32 + 0x1C); char *path; LevelSpline *path_record_table; char *camera_saved_state; @@ -79,7 +80,7 @@ void initialize_path_key_camera(struct UpdateCam *cam) { sum += *(float *)(path + i * 16 + 0x1C); } path_key_camera_rail_distances[2][i] = sum; - camera_saved_state = cam->saved_state; + camera_saved_state = path_key_camera_object->saved_state; *(int *)(camera_saved_state + 0x88) = 1; camera_state_block = (int *)(camera_saved_state + 0x88); camera_state_block[1] = 0; @@ -87,13 +88,13 @@ void initialize_path_key_camera(struct UpdateCam *cam) { camera_state_block[3] = 0; camera_state_block[4] = 0; D_L14_001624A8 = 1.0f; - camera_parameters = (float *)((char *)cam->saved_state + 0x60); + camera_parameters = (float *)((char *)path_key_camera_object->saved_state + 0x60); camera_parameters[0] = D_L14_001F6488_59d8[0] * 0.017453292f; camera_parameters[1] = D_L14_001F6488_59d8[1] * 0.017453292f; camera_parameters[2] = D_L14_001F6488_59d8[2]; camera_parameters[3] = D_L14_001F6488_59d8[3] * 0.017453292f; camera_parameters[4] = D_L14_001F6488_59d8[4] * 0.017453292f; - camera_parameter_state_block = (int *)((char *)cam->saved_state + 0x74); + camera_parameter_state_block = (int *)((char *)path_key_camera_object->saved_state + 0x74); *camera_parameter_state_block = 0; camera_parameter_state_block[1] = 0; camera_parameter_state_block[2] = 0; @@ -103,14 +104,16 @@ void initialize_path_key_camera(struct UpdateCam *cam) { camera_placement_parameters[1] = camera_parameters[1]; camera_placement_parameters[0] = hero_heading_radians; camera_placement_parameters[2] = camera_parameters[2]; - compute_position_from_spherical_offset(&cam->pos, camera_placement_parameters, &hero.motion); - fast_vec_sub(hero_look_direction, &hero.motion, &cam->pos); + compute_position_from_spherical_offset( + &path_key_camera_object->pos, camera_placement_parameters, &hero.motion); + fast_vec_sub(hero_look_direction, &hero.motion, &path_key_camera_object->pos); fast_vec_scale(up, &hero.gravity_dir, -1.5f); fast_vec_add(hero_look_direction, hero_look_direction, up); - fast_vec_normalize(&cam->m0, hero_look_direction, 1.0f); - fast_vec_cross(&cam->m1, &cam->m0, up); - fast_vec_normalize(&cam->m1, &cam->m1, 1.0f); - fast_vec_cross(&cam->m2, &cam->m1, &cam->m0); + fast_vec_normalize(&path_key_camera_object->m0, hero_look_direction, 1.0f); + fast_vec_cross(&path_key_camera_object->m1, &path_key_camera_object->m0, up); + fast_vec_normalize(&path_key_camera_object->m1, &path_key_camera_object->m1, 1.0f); + fast_vec_cross( + &path_key_camera_object->m2, &path_key_camera_object->m1, &path_key_camera_object->m0); /* give every key without a duration (+0x44) the default 10000 */ camera_key_default_cursor = (int *)&D_L14_001F6488_59d8[0x11]; for (j = 38; j >= 0; j--) { diff --git a/src/overlays/l15/hero/hero_set_state.c b/src/overlays/l15/hero/hero_set_state.c index 393c7ebf60..5e0da8f815 100644 --- a/src/overlays/l15/hero/hero_set_state.c +++ b/src/overlays/l15/hero/hero_set_state.c @@ -68,22 +68,32 @@ extern int hero_set_state(int, int) __asm__("FUN_L15_00216c38"); extern char hero_trail_jump_velocity_keys[] __asm__("D_L15_0017C520"); extern char hero_deep_water_jump_velocity_keys[] __asm__("D_L15_0017C560"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int entry_animation_mode) { int saved_state_step; char *moby; int old20A7; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || + entry_animation_mode != 2)) return 0; } - if ((D_L15_0015F5C4 == 2 || D_L15_0015F5C4 == 6) && b != 2) + if ((D_L15_0015F5C4 == 2 || D_L15_0015F5C4 == 6) && entry_animation_mode != 2) return 0; { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -96,11 +106,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -121,14 +131,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { set_hero_state_for_vehicle_mode(); return 1; } @@ -141,7 +151,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; q->rand_timer.range = 0x68; } - if (b) { + if (entry_animation_mode) { if (get_hero_help_value(0) == 0x54) { set_hero_animation(get_hero_help_value(0), 0, (float)scale_game_frames(0x12)); } else { @@ -156,7 +166,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; clear_u64_value(&p->motion.momentum); p->rand_timer.range = 0x68; - if (b) { + if (entry_animation_mode) { if (get_hero_help_value(0) == 0x54) { set_hero_animation(get_hero_help_value(0), 0, (float)scale_game_frames(0x12)); } else { @@ -181,7 +191,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0x45, 0, (float)scale_game_frames(0xC)); break; } @@ -203,7 +213,7 @@ int hero_set_state(int a, int b) { q->rand_timer.range = 0x68; q->unk8E0 = 0; n = scale_game_frames(0xC); - if (b) + if (entry_animation_mode) set_hero_animation(0x3B, 0, (float)n); } break; @@ -224,7 +234,7 @@ int hero_set_state(int a, int b) { n = scale_game_frames(0xB); if (p->state.prev == 0x33) n = scale_game_frames(0xF); - if (b) + if (entry_animation_mode) set_hero_animation(0x3D, 0, (float)n); break; } @@ -241,7 +251,7 @@ int hero_set_state(int a, int b) { t = -2; if (p->state.prev != 0x35) t = n; - if (b) + if (entry_animation_mode) set_hero_animation(0x3C, 0, (float)t); break; } @@ -314,7 +324,7 @@ int hero_set_state(int a, int b) { s->motion.momentum.f[2] = 0.0f; FUN_L00_0025f730(&s->motion.momentum, frame_time * 5.5f); s->rand_timer.range = 0x68; - if (b) + if (entry_animation_mode) set_hero_animation(0x3A, 0, (float)scale_game_frames(0x16)); } break; @@ -338,7 +348,7 @@ int hero_set_state(int a, int b) { int t = scale_game_frames(0x4D); struct Hero *q = &hero; q->invulnerable_frames = t; - if (b) { + if (entry_animation_mode) { if (q->state.current == 0x75) { set_hero_animation(0x70, 3, -3.0f); } else { @@ -361,7 +371,7 @@ int hero_set_state(int a, int b) { *(int *)&p->drown_sink_speed = 0; p->unk698 = scale_game_frames(0x2D); p->rand_timer.range = 0x68; - if (b) + if (entry_animation_mode) set_hero_animation(0x65, 0, (float)scale_game_frames(0x11)); break; } @@ -401,7 +411,7 @@ int hero_set_state(int a, int b) { v = (char *)&hero.motion.momentum; qcopy(v, v - 0x40); } - if (b) + if (entry_animation_mode) set_hero_animation(0x5F, 0, (float)scale_game_frames(0xA)); break; } @@ -412,7 +422,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->health.hp = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0x80, 0, (float)scale_game_frames(0xA)); break; } @@ -424,7 +434,7 @@ int hero_set_state(int a, int b) { *(int *)&D_L15_0015F688 = scale_game_frames(0x3C); if (p->unk20AA == 0) { t = get_hero_help_value(1); - if (p->moby->prev_seq != t && b) { + if (p->moby->prev_seq != t && entry_animation_mode) { set_hero_animation(t, 0, (float)scale_game_frames(0x12)); } } @@ -513,7 +523,7 @@ int hero_set_state(int a, int b) { scale_game_frames(5) < u->rail_land_frames) n = scale_game_frames(0xD); } - if (b) { + if (entry_animation_mode) { struct Hero *v = &hero; set_hero_animation(v->state.step + 3, D_L15_0015F6D8[v->state.step], (float)n); } @@ -527,14 +537,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); - if (b) { + if (entry_animation_mode) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L15_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -548,7 +558,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; fill_transfer_words((char *)p + 0x9D0, 0, 0x20); qcopy(&p->motion.momentum, &p->motion.displacement); - if (b) + if (entry_animation_mode) set_hero_animation(0x64, 0, (float)scale_game_frames(0xF)); break; } @@ -569,7 +579,7 @@ int hero_set_state(int a, int b) { } return 0; } - if (b) { + if (entry_animation_mode) { struct Hero *q = &hero; float d = q->anim_frame; int id = 6; @@ -586,7 +596,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = gravity_length_xy((float *)v); qcopy(&p->motion.momentum, v); - if (b) { + if (entry_animation_mode) { int id = 6; float d = p->anim_frame; if (return_hero_animation_id_unchanged(MOBY(moby)->seq) == 4 && 3.0f < d && d < 16.0f) @@ -613,7 +623,7 @@ int hero_set_state(int a, int b) { FUN_L00_0025f730(&q->motion.momentum, frame_time * 7.0f); if (frame_time * 3.5f < q->motion.forward_speed) allocate_hero_voice_for_entry(0xC, 0); - if (b) { + if (entry_animation_mode) { if (q->moby->seq == get_hero_help_value(0)) { set_hero_animation(0xD, 2, (float)scale_game_frames(9)); } else { @@ -640,7 +650,7 @@ int hero_set_state(int a, int b) { } p->motion.move_yaw = fast_arc_tan(p->grapple_target->pos.x - p->motion.pos.f[0], p->grapple_target->pos.y - p->motion.pos.f[1]); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x2F, 2, (float)scale_game_frames(5)); hero_queue_sequence(0xA, 0xE); } @@ -653,7 +663,7 @@ int hero_set_state(int a, int b) { *(int *)&p->grapple_pull_speed = 0; p->grapple_pull_ending = 0; p->item_use_locked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(0x30, 1, (float)scale_game_frames(0xA)); break; } @@ -665,7 +675,7 @@ int hero_set_state(int a, int b) { *(int *)&p->grapple_pull_speed = 0; p->grapple_pull_ending = 0; p->tether_radius = fast_vec_dist(&p->motion.pos, &p->grapple_target->pos); - if (b) + if (entry_animation_mode) set_hero_animation(0x30, 1, (float)scale_game_frames(5)); break; } @@ -721,7 +731,7 @@ int hero_set_state(int a, int b) { } else if (q->state.prev_control_mode == 2) { q->swing_gravity = q->fall_state_gravity; } - if (b) { + if (entry_animation_mode) { set_hero_animation(0x34, 0, (float)scale_game_frames(0xB)); { struct Hero *r = &hero; @@ -737,7 +747,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 7; clear_u64_value(&p->motion.rot_spring_vel); qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xF)); break; } @@ -749,7 +759,7 @@ int hero_set_state(int a, int b) { *(int *)&p->past_apex = 0; p->rise_fall_land_frames = 0; p->rise_fall_gravity = frame_time_sq * 100.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x2A, 0, (float)scale_game_frames(6)); break; } @@ -764,7 +774,7 @@ int hero_set_state(int a, int b) { p->unk4F0 = p->smoothed_ground_z; } p->item_select_blocked = 1; - if (b) { + if (entry_animation_mode) { if (frame_time * 3.5f < p->motion.flat_speed) { set_hero_animation(0x20, 0, (float)scale_game_frames(9)); } else { @@ -779,7 +789,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0xD; p->item_select_blocked = 1; p->rand_timer.range = 0x68; - if (b) + if (entry_animation_mode) set_hero_animation(0x21, 0, (float)scale_game_frames(6)); break; } @@ -788,7 +798,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(0x24, 0, (float)scale_game_frames(6)); break; } @@ -797,7 +807,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 3; p->unk2284 = 0xD; p->item_select_blocked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(0x25, 0, (float)scale_game_frames(6)); break; } @@ -806,7 +816,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0xB, 0, (float)scale_game_frames(0xC)); break; } @@ -818,7 +828,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -830,7 +840,7 @@ int hero_set_state(int a, int b) { q->rand_timer.range = 0x68; q->state.step = 0; qcopy(&q->motion.velocity, &q->motion.resolved_velocity); - if (b) { + if (entry_animation_mode) { if (q->vehicle_mode == 3) { set_hero_animation(6, 0, (float)scale_game_frames(8)); return 1; @@ -856,7 +866,7 @@ int hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x13, 0, (float)animation_blend_selector); } break; @@ -871,7 +881,7 @@ int hero_set_state(int a, int b) { scale_hero_motion(frame_time * 4.5f / p->motion.speed_xy); } qcopy(&p->motion.velocity, &p->motion.displacement); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x13, 0, (float)animation_blend_selector); } break; @@ -903,7 +913,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; @@ -1216,7 +1227,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; if (q->fall_start_distance == 0.0f) q->fall_start_distance = q->unk430 * 1.5f; - if (b) { + if (entry_animation_mode) { int s = q->state.current; if (s == 7) { set_hero_animation(7, 0, (float)scale_game_frames(5)); @@ -1310,7 +1321,7 @@ int hero_set_state(int a, int b) { update_hero_target_heading(8.0f, 1.0471976f, -1.0f); *(int *)&q->slam_descending = 0; q->items[0].timer = 0xA; - if (b) { + if (entry_animation_mode) { char *m; int n = scale_game_frames(0xB); if (q->state.prev == 0xB && scale_game_frames(0x2A) > q->state.prev_timer) @@ -1347,7 +1358,7 @@ int hero_set_state(int a, int b) { q->saved_item[0] = 0; update_hero_target_heading(14.0f, 0.5235988f, -1.0f); q->unkA7C = q->unkA7C == 0; - if (b) { + if (entry_animation_mode) { int n = scale_game_frames(0xA); if (q->moby->prev_seq == 0x1A) n = scale_game_frames(3); @@ -1362,7 +1373,7 @@ int hero_set_state(int a, int b) { struct Hero *q = &hero; if (((void *)q->items[0].moby) == 0) break; - if (b) { + if (entry_animation_mode) { set_hero_animation(0x67, 4, -1.0f); blend_moby_animation(((void *)q->items[0].moby), 3, 4, -1); } @@ -1393,7 +1404,7 @@ int hero_set_state(int a, int b) { r->attack_record = k; } update_hero_target_heading(5.0f, 0.7853982f, 0.7853982f); - if (b) { + if (entry_animation_mode) { char *m; int j = 0; int n; @@ -1424,7 +1435,7 @@ int hero_set_state(int a, int b) { } case HERO_STATE_ANIMATION_RECOVERY_WITH_JUMP_CANCEL: { struct Hero *q; - if (b) + if (entry_animation_mode) set_hero_animation(0x2C, 7, (float)scale_game_frames(9)); q = &hero; if (q->items[0].item_id == 0xA && ((char *)q->throw_target) != 0) { @@ -1443,7 +1454,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0xA; p->unk2284 = 0; p->ground_speed = frame_time * 9.0f; - if (b) { + if (entry_animation_mode) { char *m; HeroTableRow2C *e = &D_L15_0017C228[p->attack_record]; int k = e->kind; @@ -1464,7 +1475,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->pushback_yaw = fast_add_rotations(p->motion.rot.f[2], 3.1415927f); p->ground_speed = frame_time * 9.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x29, 5, (float)scale_game_frames(8)); break; } @@ -1486,7 +1497,7 @@ int hero_set_state(int a, int b) { { struct Hero *q = &hero; q->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (entry_animation_mode) { set_hero_animation(0x10, 3, -3.0f); q->moby->anim_time = hero_hurt_animation_blend_samples[q->anim_blend_curve][(q->anim_blend_step)++]; @@ -1511,7 +1522,7 @@ int hero_set_state(int a, int b) { r->rand_timer.range = 0x68; r->target_speed = 0.0f; r->ground_speed = 0.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x71, 0, (float)scale_game_frames(8)); } break; @@ -1525,7 +1536,7 @@ int hero_set_state(int a, int b) { p->collision_off_frames = 0x2710; allocate_hero_voice_for_entry(9, 0); p->rand_timer.range = 0x68; - if (b) + if (entry_animation_mode) set_hero_animation(0x71, 0, (float)scale_game_frames(8)); break; } @@ -1533,7 +1544,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) + if (entry_animation_mode) set_hero_animation(0, 0, (float)scale_game_frames(0xF)); break; } @@ -1553,7 +1564,7 @@ int hero_set_state(int a, int b) { int n = scale_game_frames(7); if (r->state.prev == 0x60) n = scale_game_frames(0xD); - if (b) + if (entry_animation_mode) set_hero_animation(r->attack_record + 9, 1, (float)n); } break; @@ -1562,7 +1573,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 6; p->unk2284 = 0; - if (b) + if (entry_animation_mode) set_hero_animation(0xC, 0, (float)scale_game_frames(8)); break; } @@ -1570,7 +1581,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 6; p->unk2284 = 0; - if (b) + if (entry_animation_mode) set_hero_animation(8, 0, (float)scale_game_frames(8)); break; } @@ -1581,7 +1592,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) { + if (entry_animation_mode) { if (2.5f < p->ground_distance) { set_hero_animation(5, 0, (float)scale_game_frames(8)); } else { @@ -1596,7 +1607,7 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->unk3B8 = 0; - if (b) + if (entry_animation_mode) set_hero_animation(3, 0x12, (float)scale_game_frames(8)); break; } @@ -1605,7 +1616,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(7, 0, (float)scale_game_frames(0xC)); break; } @@ -1617,7 +1628,7 @@ int hero_set_state(int a, int b) { qcopy(&p->motion.velocity, &p->motion.resolved_velocity); FUN_L00_0025f730(&p->motion.velocity, frame_time * 7.0f); p->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (entry_animation_mode) { set_hero_animation(6, 3, -3.0f); p->moby->anim_time = hero_hurt_animation_blend_samples[p->anim_blend_curve][(p->anim_blend_step)++]; @@ -1628,7 +1639,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) + if (entry_animation_mode) set_hero_animation(0, 0, (float)scale_game_frames(0xE)); break; } @@ -1636,7 +1647,7 @@ int hero_set_state(int a, int b) { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; - if (b) { + if (entry_animation_mode) { set_hero_animation(4, 0, (float)scale_game_frames(7)); hero_queue_sequence(0xE, 0x22); } @@ -1647,7 +1658,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 2; p->unk2284 = 0; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(6, 0, (float)scale_game_frames(0xC)); break; } @@ -1658,7 +1669,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; qcopy(&p->motion.velocity, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(6, 0, (float)scale_game_frames(7)); break; } @@ -1675,7 +1686,7 @@ int hero_set_state(int a, int b) { if (frame_time * 1.5f < planar_speed) hero_base->ground_speed = frame_time * 1.5f; hero_base->unk3B8 = 0; - if (b) + if (entry_animation_mode) set_hero_animation(1, 0, (float)scale_game_frames(8)); } break; @@ -1685,7 +1696,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x14; p->unk2284 = 0; qcopy(&p->motion.momentum, &p->motion.resolved_velocity); - if (b) + if (entry_animation_mode) set_hero_animation(3, 0, (float)scale_game_frames(0xC)); break; } @@ -1698,7 +1709,7 @@ int hero_set_state(int a, int b) { FUN_L00_0025f730(&p->motion.velocity, frame_time * 5.0f); hero_change_health(1); p->invulnerable_frames = scale_game_frames(0x4D); - if (b) { + if (entry_animation_mode) { set_hero_animation(2, 3, -3.0f); p->moby->anim_time = hero_hurt_animation_blend_samples[p->anim_blend_curve][(p->anim_blend_step)++]; @@ -1719,7 +1730,7 @@ int hero_set_state(int a, int b) { clear_u64_value(&p->motion.velocity); clear_u64_value(&p->motion.displacement); p->motion.velocity.f[2] = frame_time * 10.0f; - if (b) + if (entry_animation_mode) set_hero_animation(0x10, 2, -3.0f); break; } @@ -1770,7 +1781,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->tilt_disabled = 1; p->item_use_locked = 1; - if (b) + if (entry_animation_mode) set_hero_animation(get_hero_help_value(0), 0, -1.0f); break; } @@ -1781,7 +1792,7 @@ int hero_set_state(int a, int b) { p->item_select_blocked = 1; p->item_use_locked = 1; clear_u64_value(&p->motion.velocity); - if (b) + if (entry_animation_mode) set_hero_animation(0xB, 0, -1.0f); break; } @@ -1805,7 +1816,7 @@ int hero_set_state(int a, int b) { p->state.control_mode = 0x18; p->item_use_locked = 1; cancel_hero_item_animation(); - if (b) + if (entry_animation_mode) set_hero_animation(get_hero_help_value(0), 0, -1.0f); break; } diff --git a/src/overlays/l15/hero/update_hero_motion_for_current_state.c b/src/overlays/l15/hero/update_hero_motion_for_current_state.c index e4f003c337..066fcba351 100644 --- a/src/overlays/l15/hero/update_hero_motion_for_current_state.c +++ b/src/overlays/l15/hero/update_hero_motion_for_current_state.c @@ -33,6 +33,11 @@ float absolute_float(float input) __asm__("func_001F99C0"); void apply_hero_ground_type_effects(void) __asm__("FUN_L15_002044c8"); void apply_hero_ground_type_effects(void) { + enum { + HERO_GROUND_TYPE_WATER = 0, + HERO_GROUND_TYPE_MAGNET = 2, + HERO_GROUND_TYPE_FIXED_SHALLOW_WATER = 0xE + }; struct Hero *hero_state = &hero; int keep = hero_state->ground_sound_class; int saved_ground_type = hero_state->ground_type; @@ -44,23 +49,23 @@ void apply_hero_ground_type_effects(void) { hero_state->unk308 = 0; if (saved_ground_type == -1) return; - if (saved_ground_type == 2) { + if (saved_ground_type == HERO_GROUND_TYPE_MAGNET) { if (hero_state->frames_off_ground.s == 0 || hero_state->ground_distance < 0.3f) { hero_state->on_magnet_ground = 1; - if (hero_state->vehicle_mode == 0) { + if (hero_state->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { char *item_slot_one_moby = ((char *)hero_state->items[1].moby); if (item_slot_one_moby != 0 && MOBY(item_slot_one_moby)->oclass == 0xAD) hero_state->unk308 = 1; } } } - if (saved_ground_type == 0xE) { + if (saved_ground_type == HERO_GROUND_TYPE_FIXED_SHALLOW_WATER) { struct Hero *q = &hero; *(char *)&q->base_condition = 1; q->water_depth = 0.2f; q->water_surface_z = q->ground_z.f + 0.2f; } - if (saved_ground_type == 0) { + if (saved_ground_type == HERO_GROUND_TYPE_WATER) { struct Hero *q = &hero; float water_depth = q->water_surface_z - q->ground_z.f; q->water_depth = water_depth; @@ -223,7 +228,7 @@ s32 process_hero_incoming_hit(s32 apply_hit_reaction) { if (incoming_hit_record->p34 != hero_moby) { return 0; } - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { if (!(incoming_hit_record->i24 & 2)) { return 0; } @@ -233,7 +238,7 @@ s32 process_hero_incoming_hit(s32 apply_hit_reaction) { D_0013DF88[current_level_index]++; hero.damage_source_moby = (struct Moby *)incoming_hit_record->p20; D_0015EEA8++; - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { hero.vehicle_hp -= truncate_float_to_s32(incoming_hit_record->f2C); if (hero.vehicle_hp < 0) { hero.vehicle_hp = 0; @@ -453,7 +458,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void adjust_hero_planar_velocity_from_probes(s32) __asm__("FUN_L15_0020a328"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -484,7 +489,7 @@ extern void moby_point_position(struct MobyView *, s32, void *) __asm__("FUN_L00 extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L15_00202d78(f32, f32); @@ -534,7 +539,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L15_0017C3B8; extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); extern s32 is_moby_in_class_range_500_to_540(s32) __asm__("FUN_L00_0025e3b8"); @@ -713,10 +718,10 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -727,11 +732,11 @@ void update_hero_motion_for_current_state(void) { } else { adjust_hero_planar_velocity_from_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -1002,7 +1007,7 @@ void update_hero_motion_for_current_state(void) { &hero.motion.velocity, hero.ground_speed, hero.motion.rot.f[2], yaw); } else if (hero.state.current == 0x33) { f32 sp = hero.ground_speed * - FUN_L00_00209018(hero_swim_speed_by_animation_frame, 0x1E) * 5.0f; + vector_length_xyz_cf(hero_swim_speed_by_animation_frame, 0x1E) * 5.0f; if (hero.state.prev == 0x35 && scale_game_frames(15) > hero.state_timer) { if (sp < frame_time * 4.5f) { sp = frame_time * 4.5f; @@ -1133,7 +1138,7 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 4.0f, frame_time_sq * 5.0f); { f32 sp = hero.ground_speed * - FUN_L00_00209018(hero_swim_speed_by_animation_frame, 0x1E) * 5.5f; + vector_length_xyz_cf(hero_swim_speed_by_animation_frame, 0x1E) * 5.5f; hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[2] = 0.0f; @@ -1165,11 +1170,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && ((struct MobyView *)hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -1188,11 +1194,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if ((struct MobyView *)hero.grapple_target != NULL) { hero.motion.move_yaw = @@ -1359,13 +1366,13 @@ void update_hero_motion_for_current_state(void) { &((struct MobyView *)hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&motion_work_vector, &hero.motion.pos, &((struct MobyView *)hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1482,7 +1489,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1574,7 +1582,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1620,7 +1629,7 @@ void update_hero_motion_for_current_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1636,10 +1645,11 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1662,11 +1672,11 @@ void update_hero_motion_for_current_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { off = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { off = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1711,7 +1721,7 @@ void update_hero_motion_for_current_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || (struct MobyView *)hero.melee_target != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1721,7 +1731,8 @@ void update_hero_motion_for_current_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1735,10 +1746,11 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -1852,11 +1864,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_planar_velocity_from_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1967,11 +1980,12 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2117,7 +2131,7 @@ void update_hero_motion_for_current_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2154,7 +2168,8 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2171,7 +2186,8 @@ void update_hero_motion_for_current_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2215,7 +2231,7 @@ void update_hero_motion_for_current_state(void) { adjust_hero_planar_velocity_from_probes(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2260,7 +2276,7 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2364,7 +2380,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&spatial_or_hit_descriptor_work, &hero.motion.pos); - FUN_L00_00233810( + add_hero_up_offset( &spatial_or_hit_descriptor_work, &spatial_or_hit_descriptor_work, 0.5f); qcopy(&v10, &spatial_or_hit_descriptor_work); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; @@ -2403,7 +2419,7 @@ void update_hero_motion_for_current_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2449,7 +2465,7 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -2471,7 +2487,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = frame_time * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = frame_time * 0.9f; } } else { @@ -2482,29 +2498,30 @@ void update_hero_motion_for_current_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_planar_velocity_from_probes(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2517,11 +2534,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); adjust_hero_planar_velocity_from_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -2551,11 +2569,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); adjust_hero_planar_velocity_from_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_2_REPEATABLE_SQUARE_ACTION: @@ -2659,10 +2678,11 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_planar_velocity_from_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -2683,11 +2703,12 @@ void update_hero_motion_for_current_state(void) { } } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_WAIT_FOR_CIRCLE_RELEASE_AND_ANIMATION: { @@ -2719,11 +2740,12 @@ void update_hero_motion_for_current_state(void) { } } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2743,7 +2765,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); if (hero.motion.velocity.f[2] < frame_time * -10.0f) { hero.motion.velocity.f[2] = frame_time * -10.0f; } @@ -2811,11 +2834,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_planar_velocity_from_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2830,10 +2854,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } @@ -2848,18 +2872,19 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); adjust_hero_planar_velocity_from_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -2867,7 +2892,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -2896,11 +2922,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_planar_velocity_from_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2915,10 +2942,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l15/hero/update_hero_state_machine.c b/src/overlays/l15/hero/update_hero_state_machine.c index b627e5f1a4..5d06e1d0b9 100644 --- a/src/overlays/l15/hero/update_hero_state_machine.c +++ b/src/overlays/l15/hero/update_hero_state_machine.c @@ -173,9 +173,11 @@ void update_hero_state_machine(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && D_L15_0015F594 == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -238,7 +240,7 @@ void update_hero_state_machine(void) { } } if (hero_fatal_fall_trigger_z > hero.motion.pos.f[2] && hero.ground_distance > 2.0f && - hero.vehicle_mode != 2 && hero.state.current != 0x77) { + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { switch (hero.state.current) { @@ -626,7 +628,7 @@ void update_hero_state_machine(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -653,7 +655,7 @@ void update_hero_state_machine(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { set_hero_state_for_vehicle_mode(); break; } @@ -904,7 +906,8 @@ void update_hero_state_machine(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -2280,7 +2283,7 @@ void update_hero_state_machine(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l15/level_class_tables.c b/src/overlays/l15/level_class_tables.c index a1bcedc11a..a248a0de06 100644 --- a/src/overlays/l15/level_class_tables.c +++ b/src/overlays/l15/level_class_tables.c @@ -6,10 +6,10 @@ #include "rnc/camera/update_cam.h" #include "rnc/mobys/moby_class_tables.h" -void FUN_L00_002caf40(); +void get_morphoray_chicken_slot_record() __asm__("FUN_L00_002caf40"); void FUN_L00_002ea7a0(); void FUN_L00_002ed230(); -void FUN_L10_002f5f18(); +void update_path_flythrough_camera() __asm__("FUN_L10_002f5f18"); void beam_slots_update() __asm__("FUN_L14_003039e0"); void billboard_projectile_update() __asm__("FUN_L01_002c7530"); void blarg_commander_update() __asm__("FUN_L12_00308918"); @@ -170,7 +170,7 @@ void *D_L15_001E3EB4[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; struct MobyClassUpdate moby_classes[171] __asm__("D_L15_001E3680") @@ -364,7 +364,7 @@ struct CameraType level_camera_types[10] __asm__("D_L15_001E3F00") __attribute__ {17, FUN_L00_002ed230, noop_main_callback, noop_main_callback, noop_main_callback}, {19, evaluate_descriptor_eligibility, initialize_path_camera, - FUN_L10_002f5f18, noop_main_callback }, + update_path_flythrough_camera, noop_main_callback }, {22, dispatch_moby_follow_camera_update, noop_main_callback, noop_main_callback, noop_main_callback }, diff --git a/src/overlays/l15/mobys/bolt_grabber.c b/src/overlays/l15/mobys/bolt_grabber.c index 035361cc7b..82ed96c52e 100644 --- a/src/overlays/l15/mobys/bolt_grabber.c +++ b/src/overlays/l15/mobys/bolt_grabber.c @@ -42,7 +42,7 @@ void bolt_grabber_update(struct Moby *moby) { mark_moby_for_removal(moby); return; } - moby->state = 1; + moby->state = BOLT_GRABBER_WAIT_FOR_PROXIMITY; moby->pos.z = moby->pos.z + 1.0f; break; case BOLT_GRABBER_WAIT_FOR_PROXIMITY: @@ -50,7 +50,7 @@ void bolt_grabber_update(struct Moby *moby) { if (vector_distance_xy(&moby->pos, &hero.motion.pos) < 3.0f) { moby->flags |= 0x41; start_scene(5); - moby->state = 2; + moby->state = BOLT_GRABBER_FINALIZE_AND_SAVE; } break; case BOLT_GRABBER_FINALIZE_AND_SAVE: @@ -59,7 +59,7 @@ void bolt_grabber_update(struct Moby *moby) { D_L15_0015F640 = scale_game_frames(0xB4); grant_inventory_item(0x22, 1); memcard_save_data(0, -1); - moby->state = 3; + moby->state = BOLT_GRABBER_REMOVE; } break; case BOLT_GRABBER_REMOVE: diff --git a/src/overlays/l15/mobys/codebot_slot.c b/src/overlays/l15/mobys/codebot_slot.c index 2212befd90..c0ac492fcc 100644 --- a/src/overlays/l15/mobys/codebot_slot.c +++ b/src/overlays/l15/mobys/codebot_slot.c @@ -136,7 +136,7 @@ void codebot_slot_update(struct Moby *moby) { float angle; char *effect; if (codebot_slot_private_data[3] != -1) { - if (moby->state != 0) { + if (moby->state != CODEBOT_SLOT_INITIALIZE) { fast_vec_sub(position_rotation_work_vector, (char *)l15_moby_array + codebot_slot_private_data[3] * 0x100 + 0x10, codebot_slot_private_data + 4); @@ -156,11 +156,11 @@ void codebot_slot_update(struct Moby *moby) { (char *)l15_banked_moby_save_bits) >> (moby->save_id & 31) & 1) != 0)) { - moby->state = 4; + moby->state = CODEBOT_SLOT_COMPLETED; break; } D_L15_00184AAC = 0; - moby->state = 1; + moby->state = CODEBOT_SLOT_WAIT_FOR_PROXIMITY; for (i = 0; i < 24; i++) { if (codebot_slot_private_data[i + 8] != -1) set_moby_list_visibility(codebot_slot_private_data[i + 8], 0); @@ -171,7 +171,7 @@ void codebot_slot_update(struct Moby *moby) { if (alternate_item_available[2] != 0 && vector_distance_xy(D_0013F3D0, &moby->pos) < 3.0f && *((unsigned char *)D_0013F3D0 + 0x2024) == 0) { FUN_L15_002f78b8(codebot_slot_private_data[0]); - moby->state = 2; + moby->state = CODEBOT_SLOT_WAIT_TO_CREATE_EFFECT; } break; case CODEBOT_SLOT_WAIT_TO_CREATE_EFFECT: @@ -196,7 +196,7 @@ void codebot_slot_update(struct Moby *moby) { set_race_camera(position_work_vector, position_rotation_work_vector, 0x72, 0); if (codebot_slot_private_data[8] != -1) set_moby_list_visibility(codebot_slot_private_data[8], 1); - moby->state = 3; + moby->state = CODEBOT_SLOT_ANIMATE_EFFECT; } break; case CODEBOT_SLOT_ANIMATE_EFFECT: @@ -223,7 +223,7 @@ void codebot_slot_update(struct Moby *moby) { unsigned int *bits = &D_L15_001BAAD0[(short)moby->save_id >> 5]; *bits |= 1u << (moby->save_id & 31); } - moby->state = 4; + moby->state = CODEBOT_SLOT_COMPLETED; } } break; diff --git a/src/overlays/l15/mobys/construction_arm.c b/src/overlays/l15/mobys/construction_arm.c index ec3813a9e2..61760d6fa2 100644 --- a/src/overlays/l15/mobys/construction_arm.c +++ b/src/overlays/l15/mobys/construction_arm.c @@ -85,14 +85,14 @@ void construction_arm_update(struct Moby *moby) { int animation, duration, minimum_effect_duration_frames; Vec4 origin, velocity, offset, sum; - if (moby->state != 6) { + if (moby->state != CONSTRUCTION_ARM_DESTROY) { slot = find_moby_hit(moby, 0x10000, 0); if (slot != 0 && *(float *)(slot + 0x2c) > 0.0f) hit = 1; if (hit) - moby->state = 6; + moby->state = CONSTRUCTION_ARM_DESTROY; } - if (moby->state != 0) { + if (moby->state != CONSTRUCTION_ARM_INITIALIZE) { arm_vars->facing = arm_vars->yaw; update_joint_animation(frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, moby, arm_vars, 0); } @@ -103,7 +103,7 @@ void construction_arm_update(struct Moby *moby) { FUN_L15_001f8648(construction_arm_wait_time_max_gp * 60.0f))); *(int *)&arm_vars->yaw_velocity = arm_vars->side = *(int *)&arm_vars->yaw = 0; moby->update_dist = 0xff; - moby->state = 1; + moby->state = CONSTRUCTION_ARM_WAIT_TO_TURN; break; case CONSTRUCTION_ARM_WAIT_TO_TURN: if (fast_dec_timer_s16(&arm_vars->timer) && @@ -119,7 +119,8 @@ void construction_arm_update(struct Moby *moby) { group_member_moby = (struct Moby *)((*list & 0x7fff) * 0x100 + (int)l15_moby_array); if ((signed char)group_member_moby->state >= 0 && - group_member_moby->oclass == moby->oclass && group_member_moby->state != 1) + group_member_moby->oclass == moby->oclass && + group_member_moby->state != CONSTRUCTION_ARM_WAIT_TO_TURN) count++; } while ((short)*list++ >= 0); if (count != 0) { @@ -129,7 +130,7 @@ void construction_arm_update(struct Moby *moby) { } if (ready) { arm_vars->target_yaw = random_float_between(-0.20943952f, 0.20943952f); - moby->state = 2; + moby->state = CONSTRUCTION_ARM_TURN_TO_TARGET_YAW; } } break; @@ -139,7 +140,7 @@ void construction_arm_update(struct Moby *moby) { animation = arm_vars->side; animation *= 2; blend_moby_animation(moby, animation + 1, 0, scale_game_frames(6)); - moby->state = 3; + moby->state = CONSTRUCTION_ARM_WAIT_FOR_ENTRY_ANIMATION; } arm_vars->yaw = spring_turn(&arm_vars->yaw_velocity, arm_vars->yaw, @@ -155,7 +156,7 @@ void construction_arm_update(struct Moby *moby) { animation *= 2; blend_moby_animation(moby, animation + 2, 0, scale_game_frames(3)); arm_vars->direction = random_angle_radians(); - moby->state = 4; + moby->state = CONSTRUCTION_ARM_WAIT_TO_START_EXIT_ANIMATION; } break; case CONSTRUCTION_ARM_WAIT_TO_START_EXIT_ANIMATION: @@ -186,7 +187,7 @@ void construction_arm_update(struct Moby *moby) { animation = arm_vars->side; animation *= 2; blend_moby_animation(moby, animation + 3, 0, scale_game_frames(6)); - moby->state = 5; + moby->state = CONSTRUCTION_ARM_WAIT_FOR_EXIT_ANIMATION; } break; case CONSTRUCTION_ARM_WAIT_FOR_EXIT_ANIMATION: @@ -196,7 +197,7 @@ void construction_arm_update(struct Moby *moby) { arm_vars->timer = truncate_float_to_s32(random_float_between(minimum, maximum)); duration = scale_game_frames(6); blend_moby_animation(moby, 0, 0, duration); - moby->state = 1; + moby->state = CONSTRUCTION_ARM_WAIT_TO_TURN; } break; case CONSTRUCTION_ARM_DESTROY: diff --git a/src/overlays/l15/mobys/conveyor_belt.c b/src/overlays/l15/mobys/conveyor_belt.c index edbb351571..be1af223b7 100644 --- a/src/overlays/l15/mobys/conveyor_belt.c +++ b/src/overlays/l15/mobys/conveyor_belt.c @@ -23,7 +23,7 @@ void conveyor_belt_update(struct Moby *moby) { char *frame_offset = conveyor_belt_private_data + 0x40; clear_u64_value(frame_offset); *(int *)(conveyor_belt_private_data + 0x9C) |= 4; - moby->state = 3; + moby->state = CONVEYOR_BELT_UPDATE_FRAME_OFFSET; break; } case CONVEYOR_BELT_UPDATE_FRAME_OFFSET: diff --git a/src/overlays/l15/mobys/cutscene_camera_target.c b/src/overlays/l15/mobys/cutscene_camera_target.c index cc9b070f99..d67360aa86 100644 --- a/src/overlays/l15/mobys/cutscene_camera_target.c +++ b/src/overlays/l15/mobys/cutscene_camera_target.c @@ -26,7 +26,7 @@ void cutscene_camera_target_update(struct Moby *moby) { switch (moby->state) { case INITIALIZE_UPDATE_DISTANCE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = DISPATCH_MODE_SELECTED_SLOT; break; case DISPATCH_MODE_SELECTED_SLOT: if (D_L15_0015F5C4 == 2) { diff --git a/src/overlays/l15/mobys/exploding_prop.c b/src/overlays/l15/mobys/exploding_prop.c index 0cc5178db8..ea545603bd 100644 --- a/src/overlays/l15/mobys/exploding_prop.c +++ b/src/overlays/l15/mobys/exploding_prop.c @@ -68,6 +68,10 @@ void exploding_prop_update(struct Moby *moby) __asm__("FUN_L15_002aa280"); /* Moby class 154 */ void exploding_prop_update(struct Moby *moby) { + enum { + EXPLODING_PROP_STATE_UNINITIALIZED = 0, + EXPLODING_PROP_STATE_INITIALIZED = 1 + }; char *hit = 0; Vec4 velocity, hit_direction, push, offset, center; u32 palette[4]; @@ -78,7 +82,7 @@ void exploding_prop_update(struct Moby *moby) { float size; void *debris; - if (D_001413F4[0] != 2 && moby->state == 1) + if (D_001413F4[0] != 2 && moby->state == EXPLODING_PROP_STATE_INITIALIZED) return; for (hit_record_index = 0; hit_record_index < 64; hit_record_index++) { @@ -186,11 +190,11 @@ void exploding_prop_update(struct Moby *moby) { mark_moby_for_removal(moby); } else { moby->hit_slot = 0xff; - if (moby->state != 0) + if (moby->state != EXPLODING_PROP_STATE_UNINITIALIZED) return; moby->draw_dist = 0x80; moby->update_dist = 0xff; - moby->state = 1; + moby->state = EXPLODING_PROP_STATE_INITIALIZED; if (D_0013DD50 != 0) { u16 save_id = moby->save_id; if ((*(s32 *)(D_0014C190 + (((s16)save_id >> 5) * 4) + current_level_index * 0x100) >> diff --git a/src/overlays/l15/mobys/helicopter.c b/src/overlays/l15/mobys/helicopter.c index b6224fdc77..89968cdacb 100644 --- a/src/overlays/l15/mobys/helicopter.c +++ b/src/overlays/l15/mobys/helicopter.c @@ -21,6 +21,18 @@ #include "rnc/overlay/l15/mobys/helicopter_globals.h" #include "rnc/overlay/shared/math/quad.h" +enum { + HELICOPTER_INITIALIZE = 0, + HELICOPTER_WAIT_FOR_ACTIVATION = 1, + HELICOPTER_FOLLOW_ENTRY_PATH = 2, + HELICOPTER_APPROACH_AREA_PATH = 3, + HELICOPTER_HOLD_POSITION_WAIT_FOR_TARGET = 4, + HELICOPTER_ENGAGE_AND_FIRE = 5, + HELICOPTER_RECOIL = 6, + HELICOPTER_DEATH_EFFECTS = 7, + HELICOPTER_DEAD_WAIT_FOR_RESET = 0x40 +}; + extern char D_L15_001673C0[]; extern char D_0014C190[]; @@ -374,7 +386,7 @@ extern struct Moby *spawn_homing_spark_projectile( extern void FUN_L00_0025a120(void *); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern int point_in_path_xy(void *, void *, int) __asm__("FUN_L00_00259740"); @@ -389,15 +401,10 @@ void helicopter_update(struct Moby *moby) __asm__("FUN_L15_002c5630"); /* Moby class 233 */ void helicopter_update(struct Moby *moby) { enum { - HELICOPTER_INITIALIZE = 0, - HELICOPTER_WAIT_FOR_ACTIVATION = 1, - HELICOPTER_FOLLOW_ENTRY_PATH = 2, - HELICOPTER_APPROACH_AREA_PATH = 3, - HELICOPTER_HOLD_POSITION_WAIT_FOR_TARGET = 4, - HELICOPTER_ENGAGE_AND_FIRE = 5, - HELICOPTER_RECOIL = 6, - HELICOPTER_DEATH_EFFECTS = 7, - HELICOPTER_DEAD_WAIT_FOR_RESET = 0x40 + HELICOPTER_GOAL_UNAVAILABLE = 2 + }; + enum { + HELICOPTER_GOAL_DEFAULT_TARGET = 0 }; Vec4 previous_pos; HelicopterGoal goal; @@ -422,19 +429,20 @@ void helicopter_update(struct Moby *moby) { if (helicopter_instance_vars->pilot == 0) { helicopter_instance_vars->pilot = create_class_55b_moby_from_source(moby); } - if (moby->state != 0 && moby->state != 0x40 && helicopter_instance_vars->unk1A4 != 0 && - hero.vehicle_mode != 2) { + if (moby->state != HELICOPTER_INITIALIZE && moby->state != HELICOPTER_DEAD_WAIT_FOR_RESET && + helicopter_instance_vars->unk1A4 != 0 && + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK) { moby->collision = 0; moby->flags = (moby->flags | 0x41) & 0xEFFF; helicopter_instance_vars->unk58 = 0; if (helicopter_instance_vars->pilot != 0) helicopter_instance_vars->pilot->flags |= 0x41; - moby->state = 1; + moby->state = HELICOPTER_WAIT_FOR_ACTIVATION; return; } process_helicopter_hits(moby); - goal.status = 0; - if (moby->state == 1) { + goal.status = HELICOPTER_GOAL_DEFAULT_TARGET; + if (moby->state == HELICOPTER_WAIT_FOR_ACTIVATION) { helicopter_instance_vars->range = helicopter_instance_vars->wake_range; goto near; } @@ -450,11 +458,11 @@ void helicopter_update(struct Moby *moby) { helicopter_instance_vars->chase_range, moby, &goal, 0, 0, path->points, path->count); } if (helicopter_instance_vars->range < fast_vec_dist(&moby->pos, &goal)) - goal.status = 2; + goal.status = HELICOPTER_GOAL_UNAVAILABLE; if (goal.target == 0) goal.target = hero.moby; target = goal.target; - if (moby->state != 0 && helicopter_instance_vars->unk2E != 1) { + if (moby->state != HELICOPTER_INITIALIZE && helicopter_instance_vars->unk2E != 1) { if (helicopter_instance_vars->pilot != 0) mark_moby_for_removal(helicopter_instance_vars->pilot); mark_moby_for_removal(moby); @@ -484,7 +492,7 @@ void helicopter_update(struct Moby *moby) { } *(u128 *)&moby->pos = path->points[0].q; } - moby->state = 1; + moby->state = HELICOPTER_WAIT_FOR_ACTIVATION; helicopter_instance_vars->speed = 0.0f; helicopter_instance_vars->pitch_velocity = 0.0f; helicopter_instance_vars->yaw_velocity = 0.0f; @@ -505,7 +513,8 @@ void helicopter_update(struct Moby *moby) { helicopter_instance_vars->pilot->flags |= 0x41; break; case HELICOPTER_WAIT_FOR_ACTIVATION: - if (helicopter_instance_vars->unk1A4 != 0 && hero.vehicle_mode != 2) { + if (helicopter_instance_vars->unk1A4 != 0 && + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK) { moby->collision = 0; moby->flags = (moby->flags | 0x41) & 0xEFFF; helicopter_instance_vars->unk58 = 0; @@ -516,7 +525,7 @@ void helicopter_update(struct Moby *moby) { if (helicopter_instance_vars->wait_group != -1 || (is_point_inside_clip_volume(&hero.motion.pos, helicopter_instance_vars->trigger_volume) && - goal.status != 2)) { + goal.status != HELICOPTER_GOAL_UNAVAILABLE)) { if (helicopter_instance_vars->wait_group != -1 && count_active_moby_group_members(helicopter_instance_vars->wait_group, 0x40)) break; @@ -524,21 +533,21 @@ void helicopter_update(struct Moby *moby) { moby->flags = (moby->flags & 0xFFBE) | 0x1000; helicopter_instance_vars->unk58 = 0x19; if (helicopter_instance_vars->entry_path != -1) - moby->state = 2; + moby->state = HELICOPTER_FOLLOW_ENTRY_PATH; else - moby->state = 3; + moby->state = HELICOPTER_APPROACH_AREA_PATH; } else { if (helicopter_instance_vars->trigger_volume != -1) break; - if (goal.status == 2) + if (goal.status == HELICOPTER_GOAL_UNAVAILABLE) break; moby->collision = moby->pclass->collision; moby->flags = (moby->flags & 0xFFBE) | 0x1000; helicopter_instance_vars->unk58 = 0x19; if (helicopter_instance_vars->entry_path != -1) - moby->state = 2; + moby->state = HELICOPTER_FOLLOW_ENTRY_PATH; else - moby->state = 3; + moby->state = HELICOPTER_APPROACH_AREA_PATH; } if (helicopter_instance_vars->pilot != 0) helicopter_instance_vars->pilot->flags &= 0xFFBE; @@ -573,11 +582,11 @@ void helicopter_update(struct Moby *moby) { point_in_path_xy(&moby->pos, D_L15_001B0AB0[helicopter_instance_vars->area_path]->points, D_L15_001B0AB0[helicopter_instance_vars->area_path]->count)) { - if (goal.status != 2) { - moby->state = 5; + if (goal.status != HELICOPTER_GOAL_UNAVAILABLE) { + moby->state = HELICOPTER_ENGAGE_AND_FIRE; helicopter_instance_vars->fire_timer = 0; } else { - moby->state = 4; + moby->state = HELICOPTER_HOLD_POSITION_WAIT_FOR_TARGET; } } if (segment + 1 < path->count - 8) { @@ -643,11 +652,11 @@ void helicopter_update(struct Moby *moby) { steer_helicopter(moby, (SteeringVec_4f88 *)&move, (SteeringVec_4f88 *)&point); if (vector_distance_xy(&move, &moby->pos) < 1.0f || point_in_path_xy(&moby->pos, path->points, path->count)) { - if (goal.status != 2) { - moby->state = 5; + if (goal.status != HELICOPTER_GOAL_UNAVAILABLE) { + moby->state = HELICOPTER_ENGAGE_AND_FIRE; helicopter_instance_vars->fire_timer = 0; } else { - moby->state = 4; + moby->state = HELICOPTER_HOLD_POSITION_WAIT_FOR_TARGET; } } break; @@ -658,19 +667,19 @@ void helicopter_update(struct Moby *moby) { move.q = *(u128 *)&moby->pos; point.q = *(u128 *)&target->pos; steer_helicopter(moby, (SteeringVec_4f88 *)&move, (SteeringVec_4f88 *)&point); - if (goal.status == 2) + if (goal.status == HELICOPTER_GOAL_UNAVAILABLE) break; if (point_in_path_xy(&moby->pos, path->points, path->count)) { - moby->state = 5; + moby->state = HELICOPTER_ENGAGE_AND_FIRE; helicopter_instance_vars->fire_timer = 0; } else { - moby->state = 3; + moby->state = HELICOPTER_APPROACH_AREA_PATH; } break; } case HELICOPTER_ENGAGE_AND_FIRE: moby_point_position(moby, 0, &point); - if (goal.status != 2) { + if (goal.status != HELICOPTER_GOAL_UNAVAILABLE) { compute_helicopter_flocking_steering_point(moby, move.f, *(Goal_52b8 *)&goal); aim.q = *(u128 *)&target->pos; steer_helicopter(moby, (SteeringVec_4f88 *)&move, (SteeringVec_4f88 *)&aim); @@ -688,7 +697,7 @@ void helicopter_update(struct Moby *moby) { aim.q = *(u128 *)&moby->pos; target_pos.q = *(u128 *)&target->pos; steer_helicopter(moby, (SteeringVec_4f88 *)&aim, (SteeringVec_4f88 *)&target_pos); - moby->state = 4; + moby->state = HELICOPTER_HOLD_POSITION_WAIT_FOR_TARGET; } break; case HELICOPTER_RECOIL: @@ -764,7 +773,7 @@ void helicopter_update(struct Moby *moby) { FUN_L00_00257470(moby, 0x200, -1); detach_manipulator(moby, helicopter_instance_vars->turret_yaw_joint); detach_manipulator(moby, helicopter_instance_vars->turret_pitch_joint); - moby->state = 0x40; + moby->state = HELICOPTER_DEAD_WAIT_FOR_RESET; return; } case HELICOPTER_DEAD_WAIT_FOR_RESET: @@ -778,17 +787,17 @@ void helicopter_update(struct Moby *moby) { *(int *)(D_0014C190 + (((short)moby->save_id >> 5) * 4 + (current_level_index << 8))) &= ~(1 << (moby->save_id & 0x1F)); D_L15_001BAAD0[(short)moby->save_id >> 5] &= ~(1 << (moby->save_id & 0x1F)); - if (hero.vehicle_mode != 2) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK) { moby->pos.z = helicopter_instance_vars->height - 7.5f; moby->scale *= 2.0f; - moby->state = 0; + moby->state = HELICOPTER_INITIALIZE; } return; } if (moby->visible != 0 && fast_vec_dist(&moby->pos, D_L15_001673C0) < 40.0f) { FUN_L00_0025a120(moby); } - if (moby->state != 1) { + if (moby->state != HELICOPTER_WAIT_FOR_ACTIVATION) { float climb = absolute_float(moby->pos.z - previous_pos.f[2]); float limit = frame_time * 10.0f; if (limit < climb) { @@ -838,12 +847,12 @@ void helicopter_update(struct Moby *moby) { frame_time_sq * 3.1415927f, frame_time_sq * 6.2831855f, frame_time * 1.5707964f); - FUN_L00_001fff28(helicopter_instance_vars->turret_yaw_joint + 0x10, - 2, - helicopter_instance_vars->turret_yaw); - FUN_L00_001fff28(helicopter_instance_vars->turret_pitch_joint + 0x10, - 2, - helicopter_instance_vars->turret_pitch); + build_axis_rotation_quaternion(helicopter_instance_vars->turret_yaw_joint + 0x10, + 2, + helicopter_instance_vars->turret_yaw); + build_axis_rotation_quaternion(helicopter_instance_vars->turret_pitch_joint + 0x10, + 2, + helicopter_instance_vars->turret_pitch); helicopter_instance_vars->shot = 0; } else { moby_point_position(moby, 0, &turret_pos); @@ -867,12 +876,12 @@ void helicopter_update(struct Moby *moby) { frame_time_sq * 3.1415927f, frame_time_sq * 6.2831855f, frame_time * 1.5707964f); - FUN_L00_001fff28(helicopter_instance_vars->turret_yaw_joint + 0x10, - 2, - helicopter_instance_vars->turret_yaw); - FUN_L00_001fff28(helicopter_instance_vars->turret_pitch_joint + 0x10, - 2, - helicopter_instance_vars->turret_pitch); + build_axis_rotation_quaternion(helicopter_instance_vars->turret_yaw_joint + 0x10, + 2, + helicopter_instance_vars->turret_yaw); + build_axis_rotation_quaternion(helicopter_instance_vars->turret_pitch_joint + 0x10, + 2, + helicopter_instance_vars->turret_pitch); } } @@ -884,6 +893,9 @@ extern void trooper_anim_update(void *m, short *p) __asm__("FUN_L00_0025d458"); extern void trooper_anim_finish(void *, void *) __asm__("FUN_L00_0025d538"); void process_helicopter_hits(struct Moby *moby) { + enum { + HIT_REACTION_SKIP_DAMAGE = 1 + }; int hit_reaction_status; float fv; int hit_reaction_code; @@ -895,15 +907,16 @@ void process_helicopter_hits(struct Moby *moby) { hit_record = find_moby_hit(moby, 0x330000, 0); hit_reaction_code = hit_reaction(moby, hit_record, helicopter_vars + 0x20, 0, &hit_reaction_status, &fv, 0, 4); - if (hit_reaction_status != 1 && moby->state != 7 && moby->state != 0x40) { + if (hit_reaction_status != HIT_REACTION_SKIP_DAMAGE && + moby->state != HELICOPTER_DEATH_EFFECTS && moby->state != HELICOPTER_DEAD_WAIT_FOR_RESET) { float remaining_health = *(float *)(helicopter_vars + 0x20) - fv; *(float *)(helicopter_vars + 0x20) = remaining_health; if (hit_reaction_code == 1 || remaining_health <= 0.0f) { - moby->state = 7; + moby->state = HELICOPTER_DEATH_EFFECTS; } else if (hit_reaction_code != 0xB) { *(unsigned char *)(helicopter_vars + 0x67) = 0xB4; trooper_anim_update(moby, (short *)(helicopter_vars + 0x60)); - if (*(float *)(hit_record + 0x1C) == 5627.925f && moby->state != 6) { + if (*(float *)(hit_record + 0x1C) == 5627.925f && moby->state != HELICOPTER_RECOIL) { hit_away_heading = fast_arc_tan(moby->pos.x - *(float *)(hit_record + 0), moby->pos.y - *(float *)(hit_record + 4)); relative_hit_heading = fast_subtract_rotations(hit_away_heading, moby->rot.z); @@ -920,7 +933,7 @@ void process_helicopter_hits(struct Moby *moby) { *(float *)(helicopter_vars + 0x170) = frame_time * 4.0f; *(short *)(helicopter_vars + 0x16A) = scale_game_frames(0x3C); moby->command = moby->state; - moby->state = 6; + moby->state = HELICOPTER_RECOIL; } } } diff --git a/src/overlays/l15/mobys/help_hints.c b/src/overlays/l15/mobys/help_hints.c index e1b2bbaffa..e870de59cc 100644 --- a/src/overlays/l15/mobys/help_hints.c +++ b/src/overlays/l15/mobys/help_hints.c @@ -81,7 +81,7 @@ void help_hints_update(struct Moby *moby) { case HINT_DIALOGUE_INITIALIZE: moby->update_dist = 0xFF; hint_dialogue_data->wait = scale_game_frames(0x4B0); - moby->state = 1; + moby->state = HINT_DIALOGUE_CHECK_TRIGGERS; break; case HINT_DIALOGUE_CHECK_TRIGGERS: if (hint_dialogue_data->npc[0] != -1) { @@ -180,11 +180,12 @@ void help_hints_update(struct Moby *moby) { hint_dialogue_data->hold3C = 0; } } - if (hero.moby->seq == 0xC && hero.vehicle_mode == 2) { + if (hero.moby->seq == 0xC && hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { ((Items *)alternate_item_available)->f6F = 1; } if (is_point_inside_clip_volume(&hero.motion.pos, hint_dialogue_data->vol1C) != 0 && - hero.vehicle_mode == 2 && ((Items *)alternate_item_available)->f6F == 0 && + hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK && + ((Items *)alternate_item_available)->f6F == 0 && ((Help *)quartu_help_message_state)->busy == 0 && ((Help *)quartu_help_message_state)->cur == -1 && *(int *)(item_usage + 0x6EC) >= 0) { help_request(0x3A9C, 0x80); diff --git a/src/overlays/l15/mobys/poison_vessel.c b/src/overlays/l15/mobys/poison_vessel.c index 40b377d117..8326f68a13 100644 --- a/src/overlays/l15/mobys/poison_vessel.c +++ b/src/overlays/l15/mobys/poison_vessel.c @@ -139,6 +139,9 @@ void poison_vessel_update(Moby_2E9358 *moby) { POISON_VESSEL_FREE_FLIGHT = 0, POISON_VESSEL_FOLLOW_TARGET = 1 }; + enum { + MOBY_STATE_MARKED_FOR_REMOVAL = 0xFE + }; Vec previous_position; Vec collision_scratch_vector; Vec temporary_vector; @@ -170,7 +173,7 @@ void poison_vessel_update(Moby_2E9358 *moby) { if (((Tb *)D_L15_001744C0_2E9358)->f18 != 0 && get_moby_pvars_link(((Tb *)D_L15_001744C0_2E9358)->f18) != 0) { data->target = (Moby_2E9358 *)((Tb *)D_L15_001744C0_2E9358)->f18; - moby->state = 1; + moby->state = POISON_VESSEL_FOLLOW_TARGET; data->f8 = 0.0f; moby->pos = ((Tb *)D_L15_001744C0_2E9358)->v20; } else if (((Tb *)D_L15_001744C0_2E9358)->f18 == D_001413D0_lui || @@ -189,7 +192,8 @@ void poison_vessel_update(Moby_2E9358 *moby) { if (data->target != 0) { Moby_2E9358 *target_moby = data->target; - if (target_moby->state == 0xFE || data->target->state == 0xFD) { + if (target_moby->state == MOBY_STATE_MARKED_FOR_REMOVAL || + data->target->state == 0xFD) { moby->bBC = state; data->target = 0; } else if (D_L15_00174458_lui[0] != 0) { @@ -203,7 +207,7 @@ void poison_vessel_update(Moby_2E9358 *moby) { } } if (follow_context == 0) { - moby->state = 0; + moby->state = POISON_VESSEL_FREE_FLIGHT; data->f8 = 0.0f; data->target = 0; } diff --git a/src/overlays/l15/mobys/poison_vessel_spawner.c b/src/overlays/l15/mobys/poison_vessel_spawner.c index a0411ec027..eb5d03fdb6 100644 --- a/src/overlays/l15/mobys/poison_vessel_spawner.c +++ b/src/overlays/l15/mobys/poison_vessel_spawner.c @@ -21,7 +21,7 @@ void poison_vessel_spawner_update(struct Moby *moby) { case INITIALIZE_SPAWN_TIMER: spawn_timer_data[0] = truncate_float_to_s32( multiply_global_factor_ed64(*(float *)(spawn_timer_data + 1) * 60.0f)); - moby->state = 1; + moby->state = WAIT_FOR_SPAWN_TIMER; moby->update_dist = 0xFF; break; case WAIT_FOR_SPAWN_TIMER: diff --git a/src/overlays/l15/mobys/quartu_cutscene_trigger.c b/src/overlays/l15/mobys/quartu_cutscene_trigger.c index e19e96647d..d47619aaa6 100644 --- a/src/overlays/l15/mobys/quartu_cutscene_trigger.c +++ b/src/overlays/l15/mobys/quartu_cutscene_trigger.c @@ -11,6 +11,10 @@ #include "rnc/overlay/shared/game/queue_planet_unlock_message.h" #include "rnc/overlay/shared/game/unlock_planet.h" #include "rnc/overlay/shared/hero/set_hero_animation.h" + +void update_hero_item_moby_flags(void) __asm__("FUN_L00_002330d0"); +void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); + #include "rnc/rendering/clip_volume.h" extern int D_L15_0015F5C4; @@ -61,21 +65,21 @@ void quartu_cutscene_trigger_update(struct Moby *moby) { if (((unsigned char *)l15_moby_array)[(trigger_data->unk8 << 8) + 0x20] != 3) break; start_scene(3); - moby->state = 2; + moby->state = CUTSCENE_TRIGGER_WAIT_FOR_FIRST_SCENE; jet_clear_persistent(moby->mission); - FUN_L00_00232fe8(); + set_hero_item_moby_flag_bit0(); break; case CUTSCENE_TRIGGER_WAIT_FOR_FIRST_SCENE: if (D_L15_0015F5C4 != 2) { queue_scene_movie_with_game_language(0x11); - moby->state = 1; + moby->state = CUTSCENE_TRIGGER_START_SECOND_SCENE; } break; case CUTSCENE_TRIGGER_START_SECOND_SCENE: if (D_L15_0015F5C4 != 2) { start_scene(4); - moby->state = 3; - FUN_L00_002330d0(); + moby->state = CUTSCENE_TRIGGER_FINALIZE_AND_SAVE; + update_hero_item_moby_flags(); if (trigger_data->unk4 != -1) { char *o = D_L15_001600EC + (trigger_data->unk4 << 7); set_race_camera(o + 0x30, o + 0x70, 0, 1); @@ -91,7 +95,7 @@ void quartu_cutscene_trigger_update(struct Moby *moby) { } queue_planet_unlock_message(0x11); memcard_save_data(0, -1); - moby->state = 4; + moby->state = CUTSCENE_TRIGGER_COMPLETED; } break; case CUTSCENE_TRIGGER_COMPLETED: diff --git a/src/overlays/l15/mobys/radial_exploding_prop.c b/src/overlays/l15/mobys/radial_exploding_prop.c index ed28bae3f1..a1c0c28a49 100644 --- a/src/overlays/l15/mobys/radial_exploding_prop.c +++ b/src/overlays/l15/mobys/radial_exploding_prop.c @@ -71,6 +71,10 @@ void radial_exploding_prop_update(struct Moby *moby) __asm__("FUN_L15_002a7880") /* Moby classes 148, 255 */ void radial_exploding_prop_update(struct Moby *moby) { + enum { + RADIAL_EXPLODING_PROP_STATE_UNINITIALIZED = 0, + RADIAL_EXPLODING_PROP_STATE_INITIALIZED = 1 + }; char *slot = 0; Vec velocity, hit_direction_step, doubled_hit_direction_step, offset, debris_origin; u32 palette[4]; @@ -83,7 +87,7 @@ void radial_exploding_prop_update(struct Moby *moby) { void *effect; Vec *base_position; - if (D_001413F4[0] != 2 && moby->state == 1) + if (D_001413F4[0] != 2 && moby->state == RADIAL_EXPLODING_PROP_STATE_INITIALIZED) return; for (slot_index = 0; slot_index < 64; slot_index++) { @@ -216,10 +220,10 @@ void radial_exploding_prop_update(struct Moby *moby) { no_hit: moby->hit_slot = 0xff; - if (moby->state != 0) + if (moby->state != RADIAL_EXPLODING_PROP_STATE_UNINITIALIZED) return; moby->update_dist = 0xff; - moby->state = 1; + moby->state = RADIAL_EXPLODING_PROP_STATE_INITIALIZED; moby->draw_dist = 0x80; moby->scale = moby->scale + moby->scale; { diff --git a/src/overlays/l15/mobys/sliding_gate.c b/src/overlays/l15/mobys/sliding_gate.c index c46f48f962..fa06957fea 100644 --- a/src/overlays/l15/mobys/sliding_gate.c +++ b/src/overlays/l15/mobys/sliding_gate.c @@ -47,6 +47,9 @@ void sliding_gate_update(struct Moby *gate_moby) { GATE_OPEN = 3, GATE_CLOSING = 4 }; + enum { + GATE_OPEN_LATCHED = 5 + }; MovingVars *gate_vars = (MovingVars *)gate_moby->pvars; Vec4 offset; Vec4 pos; @@ -59,7 +62,7 @@ void sliding_gate_update(struct Moby *gate_moby) { switch (gate_moby->state) { case GATE_INITIALIZE: gate_vars->home.q = *(u128 *)&gate_moby->pos; - gate_moby->state = 1; + gate_moby->state = GATE_WAIT_TO_OPEN; return; case GATE_WAIT_TO_OPEN: trigger_active = 0; @@ -87,9 +90,9 @@ void sliding_gate_update(struct Moby *gate_moby) { trigger_active = 1; } if (is_point_inside_clip_volume(D_0013F3D0, gate_vars->open_volume)) { - gate_moby->state = 2; + gate_moby->state = GATE_OPENING; } else if (trigger_active) { - gate_moby->state = 2; + gate_moby->state = GATE_OPENING; } return; case GATE_OPENING: @@ -114,9 +117,9 @@ void sliding_gate_update(struct Moby *gate_moby) { (((s16)gate_moby->save_id >> 5) * 4 + current_level_index * 0x100)); *bits |= mask; D_L15_001BAAD0[((s16)gate_moby->save_id >> 5)] |= 1U << (gate_moby->save_id & 31); - gate_moby->state = 5; + gate_moby->state = GATE_OPEN_LATCHED; } else { - gate_moby->state = 3; + gate_moby->state = GATE_OPEN; } } offset.f[0] = fast_cos(gate_moby->rot.z) * -gate_vars->travel; @@ -129,7 +132,7 @@ void sliding_gate_update(struct Moby *gate_moby) { if (is_point_inside_clip_volume(D_0013F3D0, gate_vars->close_volume) || is_point_inside_clip_volume(D_L15_001673C0, gate_vars->close_volume)) return; - gate_moby->state = 4; + gate_moby->state = GATE_CLOSING; return; case GATE_CLOSING: if (((VoiceSlot_29aff0 *)(((char *)&voice_pool) + gate_vars->sound * 0x70))->owner != @@ -145,7 +148,7 @@ void sliding_gate_update(struct Moby *gate_moby) { release_voice_slot(slot); gate_vars->travel = 0; gate_vars->sound = -1; - gate_moby->state = 1; + gate_moby->state = GATE_WAIT_TO_OPEN; } offset.f[0] = fast_cos(gate_moby->rot.z) * -gate_vars->travel; offset.f[1] = fast_sin(gate_moby->rot.z) * -gate_vars->travel; @@ -154,7 +157,7 @@ void sliding_gate_update(struct Moby *gate_moby) { *(u128 *)&gate_moby->pos = pos.q; if (is_point_inside_clip_volume(D_0013F3D0, gate_vars->open_volume) || is_point_inside_clip_volume(D_L15_001673C0, gate_vars->open_volume)) - gate_moby->state = 2; + gate_moby->state = GATE_OPENING; return; default: return; diff --git a/src/overlays/l15/mobys/swinging_door.c b/src/overlays/l15/mobys/swinging_door.c index e9912d5df9..cb44638c16 100644 --- a/src/overlays/l15/mobys/swinging_door.c +++ b/src/overlays/l15/mobys/swinging_door.c @@ -50,7 +50,7 @@ void swinging_door_update(struct Moby *moby) { f32 yaw; if (door_vars->trigger == -1) { - if (moby->state != 0) { + if (moby->state != SWINGING_DOOR_INITIALIZE) { if (is_point_inside_clip_volume(&hero.motion.pos, door_vars->open_volume) || is_point_inside_clip_volume(D_L15_001673C0, door_vars->open_volume)) { open = 1; @@ -92,13 +92,13 @@ void swinging_door_update(struct Moby *moby) { door_vars->swing = 0.0f; door_vars->closed_yaw = yaw; moby->rot.z = yaw; - moby->state = 1; + moby->state = SWINGING_DOOR_CLOSED; break; case SWINGING_DOOR_CLOSED: door_vars->swing = 0.0f; moby->rot.z = door_vars->closed_yaw; if (open) { - moby->state = 2; + moby->state = SWINGING_DOOR_OPENING; door_vars->sound = allocate_voice_for_target_entry(0, 0, (int)moby); } break; @@ -110,7 +110,7 @@ void swinging_door_update(struct Moby *moby) { limit = swinging_door_swing_angle_degrees_gp * DEG_TO_RAD; if (door_vars->swing < limit) { door_vars->swing = limit; - moby->state = 3; + moby->state = SWINGING_DOOR_OPEN; } step = door_vars->swing; if (door_vars->reverse) { @@ -120,7 +120,7 @@ void swinging_door_update(struct Moby *moby) { break; case SWINGING_DOOR_OPEN: if (close) { - moby->state = 4; + moby->state = SWINGING_DOOR_CLOSING; door_vars->sound = allocate_voice_for_target_entry(0, 0, (int)moby); } break; @@ -131,7 +131,7 @@ void swinging_door_update(struct Moby *moby) { swinging_door_swing_duration_gp * DEG_TO_RAD * frame_time)); if (0.0f < door_vars->swing) { door_vars->swing = 0.0f; - moby->state = 1; + moby->state = SWINGING_DOOR_CLOSED; } step = door_vars->swing; if (door_vars->reverse) { @@ -139,7 +139,7 @@ void swinging_door_update(struct Moby *moby) { } moby->rot.z = fast_add_rotations(door_vars->closed_yaw, step); if (open) { - moby->state = 2; + moby->state = SWINGING_DOOR_OPENING; } break; } diff --git a/src/overlays/l15/mobys/ultramech_scientist.c b/src/overlays/l15/mobys/ultramech_scientist.c index 4722917e82..544620bf7d 100644 --- a/src/overlays/l15/mobys/ultramech_scientist.c +++ b/src/overlays/l15/mobys/ultramech_scientist.c @@ -115,6 +115,9 @@ void ultramech_scientist_update(struct Moby *moby) { ULTRAMECH_SCIENTIST_START_SECOND_SCENE_AND_SAVE = 7, ULTRAMECH_SCIENTIST_SAVE_AND_DISABLE = 8 }; + enum { + ULTRAMECH_SCIENTIST_DISABLED = 9 + }; UltramechScientistVars *ultramech_scientist_private_data; char *hero_pos; struct Moby *moby_list_cursor; @@ -134,7 +137,7 @@ void ultramech_scientist_update(struct Moby *moby) { 0x41; } } - if (moby->state == 9) { + if (moby->state == ULTRAMECH_SCIENTIST_DISABLED) { moby->update_dist = 0; moby->collision = 0; moby->flags |= 0x41; @@ -151,7 +154,7 @@ void ultramech_scientist_update(struct Moby *moby) { switch (moby->state) { case ULTRAMECH_SCIENTIST_INITIALIZE: - moby->state = 1; + moby->state = ULTRAMECH_SCIENTIST_WAIT_FOR_DIALOGUE; moby->update_dist = 0xFF; ultramech_scientist_private_data->unkC = 20.0f; initialize_npc_dialogue(moby, ultramech_scientist_private_data); @@ -160,10 +163,10 @@ void ultramech_scientist_update(struct Moby *moby) { break; } if (level_available[16] != 0) { - moby->state = 9; + moby->state = ULTRAMECH_SCIENTIST_DISABLED; break; } - moby->state = 3; + moby->state = ULTRAMECH_SCIENTIST_WAIT_FOR_PRE_SCENE_CONDITIONS; moby_list_cursor = (struct Moby *)D_L15_0015FFE4; if (moby_list_cursor == 0) { break; @@ -206,7 +209,7 @@ void ultramech_scientist_update(struct Moby *moby) { } jet_clear_persistent(ultramech_scientist_private_data->unk280); moby->anim_speed = 0.0f; - moby->state = 2; + moby->state = ULTRAMECH_SCIENTIST_RESUME_AFTER_DIALOGUE; moby_list_cursor = (struct Moby *)D_L15_0015FFE4; if (moby_list_cursor == 0) { break; @@ -245,9 +248,9 @@ void ultramech_scientist_update(struct Moby *moby) { FUN_L00_00284e50(paths + (ultramech_scientist_private_data->unk150 << 7) + 0x30, paths + (ultramech_scientist_private_data->unk150 << 7) + 0x70); } - moby->state = 3; + moby->state = ULTRAMECH_SCIENTIST_WAIT_FOR_PRE_SCENE_CONDITIONS; } else { - moby->state = 9; + moby->state = ULTRAMECH_SCIENTIST_DISABLED; } break; case ULTRAMECH_SCIENTIST_WAIT_FOR_PRE_SCENE_CONDITIONS: { @@ -275,7 +278,7 @@ void ultramech_scientist_update(struct Moby *moby) { if (count_active_moby_group_members(ultramech_scientist_private_data->unk148, 0x40) != 0) { break; } - moby->state = 4; + moby->state = ULTRAMECH_SCIENTIST_WAIT_FOR_PRE_SCENE_DELAY; ultramech_scientist_private_data->timer_15C = scale_game_frames(120); break; case ULTRAMECH_SCIENTIST_WAIT_FOR_PRE_SCENE_DELAY: @@ -302,31 +305,31 @@ void ultramech_scientist_update(struct Moby *moby) { FUN_L00_00284e50(paths_again + (ultramech_scientist_private_data->unk154 << 7) + 0x30, paths_again + (ultramech_scientist_private_data->unk154 << 7) + 0x70); } - moby->state = 5; + moby->state = ULTRAMECH_SCIENTIST_START_FIRST_SCENE; break; case ULTRAMECH_SCIENTIST_START_FIRST_SCENE: start_scene(1); - moby->state = 6; + moby->state = ULTRAMECH_SCIENTIST_WAIT_FOR_FIRST_SCENE; break; case ULTRAMECH_SCIENTIST_WAIT_FOR_FIRST_SCENE: if (D_L15_0015F5C4 == 2) { break; } queue_scene_movie_with_game_language(0x10); - moby->state = 7; + moby->state = ULTRAMECH_SCIENTIST_START_SECOND_SCENE_AND_SAVE; break; case ULTRAMECH_SCIENTIST_START_SECOND_SCENE_AND_SAVE: if (D_L15_0015F5C4 != 2) { queue_planet_unlock_message(0x10); start_scene(2); - moby->state = 8; + moby->state = ULTRAMECH_SCIENTIST_SAVE_AND_DISABLE; } memcard_save_data(0, -1); - moby->state = 9; + moby->state = ULTRAMECH_SCIENTIST_DISABLED; break; case ULTRAMECH_SCIENTIST_SAVE_AND_DISABLE: memcard_save_data(0, -1); - moby->state = 9; + moby->state = ULTRAMECH_SCIENTIST_DISABLED; break; default: break; diff --git a/src/overlays/l15/mobys/ultramech_unlimited.c b/src/overlays/l15/mobys/ultramech_unlimited.c index 838b44c025..a4f1af65f6 100644 --- a/src/overlays/l15/mobys/ultramech_unlimited.c +++ b/src/overlays/l15/mobys/ultramech_unlimited.c @@ -24,6 +24,21 @@ #include "rnc/overlay/shared/world/level_path.h" #include "rnc/overlay/l15/mobys/ultramech_unlimited_globals.h" +enum { + ULTRAMECH_INITIALIZE = 0, + ULTRAMECH_WAIT_FOR_ACTIVATION = 1, + ULTRAMECH_FOLLOW_ENTRY_PATH = 2, + ULTRAMECH_BALLISTIC_PATH_MOVE = 3, + ULTRAMECH_AIM_AND_SELECT_ATTACK = 4, + ULTRAMECH_FIRE_BURST = 5, + ULTRAMECH_WAIT_BETWEEN_BURSTS = 6, + ULTRAMECH_APPROACH_TARGET = 7, + ULTRAMECH_MELEE_ATTACK = 8, + ULTRAMECH_KNOCKBACK_RECOVERY = 9, + ULTRAMECH_DEATH_EFFECTS = 10, + ULTRAMECH_DEAD_WAIT_FOR_RESET = 0x40 +}; + extern char D_0014C190[]; extern int D_L15_001BAAD0[]; @@ -213,7 +228,8 @@ extern float approach_angle(void *, float, void *, float, float, float) __asm__( extern float compute_ultramech_flocking_steering_point(void *, void *, float) __asm__("FUN_L15_002cf110"); -extern int FUN_L00_00258490(void *, void *, void *, int, float, float, float, float); +extern int move_moby_xy_with_collision_constraints( + void *, void *, void *, int, float, float, float, float) __asm__("FUN_L00_00258490"); extern int sweep_hit_segment(void *a, void *b, void *c, void *d, void *e, void *f, int n) __asm__("FUN_L00_00259d08"); @@ -268,20 +284,6 @@ void ultramech_unlimited_update(UMoby *m) __asm__("FUN_L15_002cf3a8"); /* Moby class 491 */ void ultramech_unlimited_update(UMoby *ultramech_moby) { - enum { - ULTRAMECH_INITIALIZE = 0, - ULTRAMECH_WAIT_FOR_ACTIVATION = 1, - ULTRAMECH_FOLLOW_ENTRY_PATH = 2, - ULTRAMECH_BALLISTIC_PATH_MOVE = 3, - ULTRAMECH_AIM_AND_SELECT_ATTACK = 4, - ULTRAMECH_FIRE_BURST = 5, - ULTRAMECH_WAIT_BETWEEN_BURSTS = 6, - ULTRAMECH_APPROACH_TARGET = 7, - ULTRAMECH_MELEE_ATTACK = 8, - ULTRAMECH_KNOCKBACK_RECOVERY = 9, - ULTRAMECH_DEATH_EFFECTS = 10, - ULTRAMECH_DEAD_WAIT_FOR_RESET = 0x40 - }; Vec4 vector_or_hit_descriptor; Vec4 position_or_motion_vector; Vec4 vector_arithmetic_result; @@ -299,7 +301,9 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { ultramech_vars = ultramech_moby->data; process_ultramech_hits_and_update_target(ultramech_moby); combat_target = ultramech_vars->target; - if (ultramech_moby->state != 0 && ultramech_moby->state != 0x40 && hero.vehicle_mode != 2) { + if (ultramech_moby->state != ULTRAMECH_INITIALIZE && + ultramech_moby->state != ULTRAMECH_DEAD_WAIT_FOR_RESET && + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK) { ultramech_moby->w94 = 0; ultramech_moby->flags |= 0x41; idx = ultramech_vars->snd; @@ -313,7 +317,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { ultramech_vars->snd = -1; ultramech_moby->flags &= 0xEFFF; ultramech_vars->b58 = 0; - ultramech_moby->state = 1; + ultramech_moby->state = ULTRAMECH_WAIT_FOR_ACTIVATION; return; } FUN_L00_00263ac8(2.5f, (int)ultramech_moby, 6, ultramech_vars->v200); @@ -341,7 +345,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { ultramech_vars->w1D4 = 1; if (ultramech_vars->path != -1) ultramech_moby->pos.q = D_L15_001B0AB0[ultramech_vars->path]->points[0].q; - ultramech_moby->state = 1; + ultramech_moby->state = ULTRAMECH_WAIT_FOR_ACTIVATION; if (ultramech_moby->anim != 0) blend_moby_animation(ultramech_moby, 0, 0, 5); break; @@ -351,14 +355,15 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { if (ultramech_vars->w1CC != -1 && count_active_moby_group_members(ultramech_vars->w1CC, 0x40)) break; - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { ultramech_moby->w94 = *(int *)(ultramech_moby->cls + 0x10); ultramech_moby->flags = (ultramech_moby->flags & 0xFFBE) | 0x1000; } } if (ultramech_vars->w164 != 2 && ultramech_vars->path != -1) { struct Hero *pl = &hero; - if (pl->vehicle_mode == 2 && (ultramech_moby->flags & 0x1000)) { + if (pl->vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK && + (ultramech_moby->flags & 0x1000)) { if (ultramech_vars->w1D0 != -1 && !point_in_path_xy(&pl->motion.pos, D_L15_001B0AB0[ultramech_vars->w1D0]->points, @@ -368,7 +373,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { } else { LevelPath *path; int i; - ultramech_moby->state = 2; + ultramech_moby->state = ULTRAMECH_FOLLOW_ENTRY_PATH; if (ultramech_moby->anim != 4) blend_moby_animation(ultramech_moby, 4, 0, scale_game_frames(0x14)); path = D_L15_001B0AB0[ultramech_vars->path]; @@ -418,7 +423,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { float z = probe_ground_height(&ultramech_moby->pos, 0, 0.5f); if (ultramech_moby->pos.f[2] < z) ultramech_moby->pos.f[2] = z; - ultramech_moby->state = 4; + ultramech_moby->state = ULTRAMECH_AIM_AND_SELECT_ATTACK; ultramech_vars->timer = scale_game_frames(0xF); break; } @@ -473,7 +478,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { } if (ultramech_moby->pos.f[2] < z) { ultramech_moby->pos.f[2] = z; - ultramech_moby->state = 4; + ultramech_moby->state = ULTRAMECH_AIM_AND_SELECT_ATTACK; ultramech_vars->timer = scale_game_frames(0xF); } } @@ -494,17 +499,17 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { if (ultramech_vars->w1D8 == 0 && vector_distance_xy(&ultramech_moby->pos, &combat_target->pos) < *(float *)&ultramech_approach_target_range_gp) { - ultramech_moby->state = 7; + ultramech_moby->state = ULTRAMECH_APPROACH_TARGET; if (ultramech_moby->anim != 1) blend_moby_animation(ultramech_moby, 1, 0, scale_game_frames(0xA)); } else if (ultramech_vars->w1D8 == 0 && vector_distance_xy(&ultramech_moby->pos, &combat_target->pos) < *(float *)&ultramech_melee_range_gp) { - ultramech_moby->state = 8; + ultramech_moby->state = ULTRAMECH_MELEE_ATTACK; if (ultramech_moby->anim != 2) blend_moby_animation(ultramech_moby, 2, 0, scale_game_frames(0xA)); } else { - ultramech_moby->state = 5; + ultramech_moby->state = ULTRAMECH_FIRE_BURST; if (ultramech_moby->anim != 6) blend_moby_animation(ultramech_moby, 6, 0, scale_game_frames(0x14)); ultramech_vars->shots = 0; @@ -555,7 +560,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { emit_radial_particle_burst(ultramech_moby, &vector_or_hit_descriptor, 0); ultramech_vars->shots++; } else if ((float)ultramech_vars->shots >= 6.0f && (ultramech_moby->animFlags & 2)) { - ultramech_moby->state = 6; + ultramech_moby->state = ULTRAMECH_WAIT_BETWEEN_BURSTS; if (ultramech_moby->anim != 0) blend_moby_animation(ultramech_moby, 0, 0, scale_game_frames(0xA)); ultramech_vars->timer = @@ -563,19 +568,19 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { } else if (ultramech_vars->w1D8 == 0 && vector_distance_xy(&ultramech_moby->pos, &combat_target->pos) < *(float *)&ultramech_approach_target_range_gp) { - ultramech_moby->state = 7; + ultramech_moby->state = ULTRAMECH_APPROACH_TARGET; if (ultramech_moby->anim != 1) blend_moby_animation(ultramech_moby, 1, 0, scale_game_frames(0xA)); } else if (ultramech_vars->w1D8 == 0 && vector_distance_xy(&ultramech_moby->pos, &combat_target->pos) < *(float *)&ultramech_melee_range_gp) { - ultramech_moby->state = 8; + ultramech_moby->state = ULTRAMECH_MELEE_ATTACK; if (ultramech_moby->anim != 2) blend_moby_animation(ultramech_moby, 2, 0, scale_game_frames(0xA)); } else if (ultramech_vars->w1D8 == 0 && vector_distance_xy(&ultramech_moby->pos, &combat_target->pos) > 10.0f && ultramech_vars->w1C8 != 0 && ultramech_vars->w1D4 == 0) { - ultramech_moby->state = 3; + ultramech_moby->state = ULTRAMECH_BALLISTIC_PATH_MOVE; ultramech_vars->timer = 0; ultramech_vars->side = (ultramech_vars->side + 1) & 1; if (ultramech_moby->anim != 3) @@ -598,7 +603,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { -(*(float *)&ultramech_path_gravity_gp * frame_time_sq)); } } else { - ultramech_moby->state = 4; + ultramech_moby->state = ULTRAMECH_AIM_AND_SELECT_ATTACK; if (ultramech_moby->anim != 0) blend_moby_animation(ultramech_moby, 0, 0, scale_game_frames(0x14)); } @@ -619,7 +624,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { ->idx[ultramech_vars->side]] ->count - 1) { - ultramech_moby->state = 3; + ultramech_moby->state = ULTRAMECH_BALLISTIC_PATH_MOVE; ultramech_vars->timer = 0; ultramech_vars->point++; if (ultramech_moby->anim != 3) @@ -641,13 +646,13 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { *(float *)&ultramech_path_horizontal_speed_gp * frame_time, -(*(float *)&ultramech_path_gravity_gp * frame_time_sq)); } else if (fast_dec_timer(&ultramech_vars->timer)) { - ultramech_moby->state = 5; + ultramech_moby->state = ULTRAMECH_FIRE_BURST; if (ultramech_moby->anim != 6) blend_moby_animation(ultramech_moby, 6, 0, scale_game_frames(0x14)); ultramech_vars->shots = 0; } } else { - ultramech_moby->state = 4; + ultramech_moby->state = ULTRAMECH_AIM_AND_SELECT_ATTACK; if (ultramech_moby->anim != 0) blend_moby_animation(ultramech_moby, 0, 0, scale_game_frames(0x14)); } @@ -660,12 +665,12 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { ultramech_moby, &position_or_motion_vector, ultramech_vars->f1B8); if (vector_distance_xy(&ultramech_moby->pos, &combat_target->pos) < *(float *)&ultramech_melee_range_gp) { - ultramech_moby->state = 8; + ultramech_moby->state = ULTRAMECH_MELEE_ATTACK; if (ultramech_moby->anim != 2) blend_moby_animation(ultramech_moby, 2, 0, scale_game_frames(0xA)); } } else { - ultramech_moby->state = 4; + ultramech_moby->state = ULTRAMECH_AIM_AND_SELECT_ATTACK; if (ultramech_moby->anim != 0) blend_moby_animation(ultramech_moby, 0, 0, scale_game_frames(0x14)); } @@ -681,19 +686,19 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { normalize_vector_xyz( &position_or_motion_vector, &position_or_motion_vector, frame_time * 6.5f); add_vectors(&vector_arithmetic_result, &position_or_motion_vector, &ultramech_moby->pos); - if (!FUN_L00_00258490(ultramech_moby, - &vector_or_hit_descriptor, - &position_or_motion_vector, - 1, - 2.25f, - 1.75f, - 0.5f, - 0.5235988f) || + if (!move_moby_xy_with_collision_constraints(ultramech_moby, + &vector_or_hit_descriptor, + &position_or_motion_vector, + 1, + 2.25f, + 1.75f, + 0.5f, + 0.5235988f) || point_in_path_xy(&vector_or_hit_descriptor, D_L15_001B0AB0[ultramech_vars->side]->points, D_L15_001B0AB0[ultramech_vars->side]->count)) { qcopy(&ultramech_moby->pos, &vector_or_hit_descriptor); - ultramech_moby->state = 4; + ultramech_moby->state = ULTRAMECH_AIM_AND_SELECT_ATTACK; if (ultramech_moby->anim != 0) blend_moby_animation(ultramech_moby, 0, 0, scale_game_frames(0xC)); } else { @@ -717,7 +722,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { ->idx[ultramech_vars->side]] ->count - 1) { - ultramech_moby->state = 3; + ultramech_moby->state = ULTRAMECH_BALLISTIC_PATH_MOVE; ultramech_vars->timer = 0; ultramech_vars->point++; if (ultramech_moby->anim != 3) @@ -740,7 +745,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { -(*(float *)&ultramech_path_gravity_gp * frame_time_sq)); } else if (*(float *)&ultramech_melee_range_gp < vector_distance_xy(&ultramech_moby->pos, &combat_target->pos)) { - ultramech_moby->state = 4; + ultramech_moby->state = ULTRAMECH_AIM_AND_SELECT_ATTACK; if (ultramech_moby->anim != 0) blend_moby_animation(ultramech_moby, 0, 0, scale_game_frames(0x14)); } @@ -780,7 +785,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { } if ((r & 0x40) || (ultramech_vars->w1D8 != 0 && (ultramech_moby->animFlags & 2))) { if (ultramech_vars->w1D4 == 0) { - ultramech_moby->state = 3; + ultramech_moby->state = ULTRAMECH_BALLISTIC_PATH_MOVE; ultramech_vars->timer = 0; ultramech_vars->side = (ultramech_vars->side + 1) & 1; qcopy(&vector_or_hit_descriptor, @@ -802,7 +807,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { *(float *)&ultramech_path_horizontal_speed_gp * frame_time, -(*(float *)&ultramech_path_gravity_gp * frame_time_sq)); } else { - ultramech_moby->state = 4; + ultramech_moby->state = ULTRAMECH_AIM_AND_SELECT_ATTACK; if (ultramech_moby->anim != 0) blend_moby_animation(ultramech_moby, 0, 0, scale_game_frames(0x14)); } @@ -842,7 +847,7 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { FUN_L00_00263fd8(ultramech_moby, 0x64C, pp, rr, 0, 0, 0.0f, dd, dd, D_L15_0015F580); } spawn_moby_break_fragments(ultramech_moby, 0x7A9, 1, 0x7A9, 2, 4, 2); - ultramech_moby->state = 0x40; + ultramech_moby->state = ULTRAMECH_DEAD_WAIT_FOR_RESET; return; case ULTRAMECH_DEAD_WAIT_FOR_RESET: ultramech_moby->w94 = 0; @@ -854,8 +859,8 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { (((short)ultramech_moby->id >> 5) * 4 + (current_level_index << 8))) &= ~(1 << (ultramech_moby->id & 0x1F)); D_L15_001BAAD0[(short)ultramech_moby->id >> 5] &= ~(1 << (ultramech_moby->id & 0x1F)); - if (hero.vehicle_mode != 2) - ultramech_moby->state = 0; + if (hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK) + ultramech_moby->state = ULTRAMECH_INITIALIZE; break; } if (moving) { @@ -876,10 +881,10 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { if (moving) { int i; int j; - int n; + int next_particle_batch_index; spawn: - for (i = 0; i < 10; i = n) { - n = i + 1; + for (i = 0; i < 10; i = next_particle_batch_index) { + next_particle_batch_index = i + 1; for (j = 2; j < 6; j++) { int k; position_or_motion_vector.q = 0; @@ -904,7 +909,8 @@ void ultramech_unlimited_update(UMoby *ultramech_moby) { : FUN_L00_00257b90(0x14, 0x1E))); } } - } else if (ultramech_moby->state > 1 && ultramech_moby->state != 0x40) { + } else if (ultramech_moby->state > ULTRAMECH_WAIT_FOR_ACTIVATION && + ultramech_moby->state != ULTRAMECH_DEAD_WAIT_FOR_RESET) { float z; ultramech_vars->fE8 += frame_time_sq * 30.0f; ultramech_moby->pos.f[2] -= ultramech_vars->fE8 - 2.0f; @@ -982,6 +988,9 @@ void process_ultramech_hits_and_update_target(void *ultramech_instance) { HIT_REACTION_DAMAGE_WITHOUT_KNOCKBACK_ALTERNATE = 10, HIT_REACTION_NONE = 11 }; + enum { + HIT_CLASSIFICATION_NO_DAMAGE = 1 + }; UMoby *ultramech_moby = ultramech_instance; UData *ultramech_vars = ultramech_moby->data; char *slot = 0; @@ -1019,12 +1028,13 @@ void process_ultramech_hits_and_update_target(void *ultramech_instance) { } code = FUN_00249d60(ultramech_moby, slot, &ultramech_vars->f20, 0, &kind, &impact, 0, 4); if (slot != 0) { - if (kind != 1 && (state = ultramech_moby->state) != 10 && state != 0x40 && + if (kind != HIT_CLASSIFICATION_NO_DAMAGE && (state = ultramech_moby->state) != 10 && + state != ULTRAMECH_DEAD_WAIT_FOR_RESET && *(short *)(*(char **)(slot + 0x20) + 0xA6) != 0x350) { ultramech_vars->f20 -= impact; if (*(unsigned short *)(slot + 0x2A) == 0x100) code = 9; - if (ultramech_moby->state == 2) + if (ultramech_moby->state == ULTRAMECH_FOLLOW_ENTRY_PATH) code = 9; if (ultramech_vars->f20 <= 0.0f) code = 1; @@ -1074,7 +1084,7 @@ void process_ultramech_hits_and_update_target(void *ultramech_instance) { trooper_start_knockback( direction, ultramech_moby, (char *)ultramech_vars + 0x70, 8, 1, 0); trooper_play_sound(0, 0, ultramech_moby, 0x79); - ultramech_moby->state = 9; + ultramech_moby->state = ULTRAMECH_KNOCKBACK_RECOVERY; *(unsigned char *)((char *)ultramech_vars + 0x67) = 0x78; break; case HIT_REACTION_DEATH: @@ -1102,7 +1112,7 @@ void process_ultramech_hits_and_update_target(void *ultramech_instance) { hit, 0); trooper_play_sound(0, 0, ultramech_moby, 0x79); - ultramech_moby->state = 10; + ultramech_moby->state = ULTRAMECH_DEATH_EFFECTS; *(unsigned char *)((char *)ultramech_vars + 0x67) = 0xF0; mark_moby_for_removal_cf(ultramech_moby, 0x200, -1); break; @@ -1117,7 +1127,7 @@ void process_ultramech_hits_and_update_target(void *ultramech_instance) { *(float *)((char *)ultramech_moby + 0x2C) = *(float *)(ultramech_moby->cls + 0x24) * ultramech_post_hit_scale_multiplier_gp; ultramech_vars->w164 = 0; - if (ultramech_moby->state != 1) { + if (ultramech_moby->state != ULTRAMECH_WAIT_FOR_ACTIVATION) { if (ultramech_vars->w1D0 != -1) goto follow_path; ultramech_vars->f1B8 = *(float *)((char *)ultramech_vars + 0x178); diff --git a/src/overlays/l15/mobys/vertical_gate.c b/src/overlays/l15/mobys/vertical_gate.c index 5d948bf2aa..89f66c7660 100644 --- a/src/overlays/l15/mobys/vertical_gate.c +++ b/src/overlays/l15/mobys/vertical_gate.c @@ -75,14 +75,14 @@ void vertical_gate_update(GateMoby *gate_moby) { switch (gate_moby->state) { case GATE_INITIALIZE: *(u128 *)&gate_vars->home = *(u128 *)&gate_moby->pos; - gate_moby->state = 1; + gate_moby->state = GATE_WAIT_TO_OPEN; gate_vars->locked = 0; if (gate_vars->key != -1) { gate_moby->f30 = 0xFF; } if (D_0013DD50 != 0 && gate_vars->key != -1) { gate_moby->pos.z = gate_moby->pos.z - vertical_gate_travel_distance_gp; - gate_moby->state = 5; + gate_moby->state = GATE_POSITION_OVERRIDE; } break; case GATE_WAIT_TO_OPEN: @@ -95,20 +95,20 @@ void vertical_gate_update(GateMoby *gate_moby) { (struct Moby *)((char *)l15_moby_array + (gate_vars->trigger << 8)); if (trigger_moby == 0 || trigger_moby->state == 0xFE || trigger_moby->state == 0xFD) { if (D_L15_00161AC0 == 0) { - gate_moby->state = 2; + gate_moby->state = GATE_OPENING; gate_vars->locked = 1; } } } else { if (is_point_inside_clip_volume(D_0013F3D0_2A48B0, gate_vars->vol_near)) { if (gate_vars->key == -1 || D_0013F3D0_2A48B0[0x2024] == 2) { - gate_moby->state = 2; + gate_moby->state = GATE_OPENING; } } } if (D_0013DD50 != 0 && gate_vars->key != -1) { gate_moby->pos.z = gate_vars->home.z - vertical_gate_travel_distance_gp; - gate_moby->state = 5; + gate_moby->state = GATE_POSITION_OVERRIDE; } break; case GATE_OPENING: @@ -129,7 +129,7 @@ void vertical_gate_update(GateMoby *gate_moby) { } gate_vars->sound = -1; gate_vars->travel = vertical_gate_travel_distance_gp; - gate_moby->state = 3; + gate_moby->state = GATE_OPEN; } { float t = gate_vars->travel; @@ -155,7 +155,7 @@ void vertical_gate_update(GateMoby *gate_moby) { } } if (gate_vars->locked == 0) { - gate_moby->state = 4; + gate_moby->state = GATE_CLOSING; } break; case GATE_CLOSING: @@ -176,9 +176,9 @@ void vertical_gate_update(GateMoby *gate_moby) { } gate_vars->travel = 0; gate_vars->sound = -1; - gate_moby->state = 1; + gate_moby->state = GATE_WAIT_TO_OPEN; if (gate_vars->key != -1) { - gate_moby->state = 5; + gate_moby->state = GATE_POSITION_OVERRIDE; l15_key_gate_open_lui = 0; } } @@ -196,7 +196,7 @@ void vertical_gate_update(GateMoby *gate_moby) { } if (is_point_inside_clip_volume(D_0013F3D0_2A48B0, gate_vars->vol_near) != 0 || is_point_inside_clip_volume(D_L15_00167440_2A48B0, gate_vars->vol_near) != 0) { - gate_moby->state = 2; + gate_moby->state = GATE_OPENING; } break; case GATE_POSITION_OVERRIDE: @@ -208,7 +208,7 @@ void vertical_gate_update(GateMoby *gate_moby) { break; } gate_moby->pos.z = gate_vars->home.z; - gate_moby->state = 1; + gate_moby->state = GATE_WAIT_TO_OPEN; l15_key_gate_open_lui = 0; } break; diff --git a/src/overlays/l16/hero/apply_hero_ground_material_effects.c b/src/overlays/l16/hero/apply_hero_ground_material_effects.c index 0844d6dd0e..494a387a55 100644 --- a/src/overlays/l16/hero/apply_hero_ground_material_effects.c +++ b/src/overlays/l16/hero/apply_hero_ground_material_effects.c @@ -19,6 +19,16 @@ /* Per-frame update of the pickup/hit state flags from the state code. */ /* Ported from rac1-decomp (src/overlays/l16_kalebo3/help_00209D98.c: func_L16_00209D98), where it is exact; names translated to the US level program. */ +enum { + GROUND_MATERIAL_WATER = 0, + GROUND_MATERIAL_MAGNET = 2 +}; + +enum { + GROUND_MATERIAL_SINK_TRIGGER = 0xD, + GROUND_MATERIAL_FIXED_WATER_DEPTH = 0xE +}; + extern int coll_sphere(float, void *, int, void *) __asm__("FUN_L00_001f0d60"); extern void exit_hero_vehicle_mode_if_mode_three(void) __asm__("FUN_L00_0020b930"); extern int hero_set_state(int, int) __asm__("FUN_L16_0021e398"); @@ -37,23 +47,23 @@ void apply_hero_ground_material_effects(void) { hero_data->unk308 = 0; if (saved_ground_type == -1) return; - if (saved_ground_type == 2) { + if (saved_ground_type == GROUND_MATERIAL_MAGNET) { if (hero_data->frames_off_ground.s == 0 || hero_data->ground_distance < 0.3f) { hero_data->on_magnet_ground = 1; - if (hero_data->vehicle_mode == 0) { + if (hero_data->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { char *item_moby = (char *)hero_data->items[1].moby; if (item_moby != 0 && MOBY(item_moby)->oclass == 0xAD) hero_data->unk308 = 1; } } } - if (saved_ground_type == 0xE) { + if (saved_ground_type == GROUND_MATERIAL_FIXED_WATER_DEPTH) { struct Hero *q = &hero; q->base_condition = 1; q->water_depth = 0.2f; q->water_surface_z = q->ground_z.f + 0.2f; } - if (saved_ground_type == 0) { + if (saved_ground_type == GROUND_MATERIAL_WATER) { struct Hero *q = &hero; float water_depth = q->water_surface_z - q->ground_z.f; q->water_depth = water_depth; @@ -90,7 +100,7 @@ void apply_hero_ground_material_effects(void) { struct Hero *q = &hero; q->unk12E9 = 1; } - if (saved_ground_type == 0x2) { + if (saved_ground_type == GROUND_MATERIAL_MAGNET) { struct Hero *q = &hero; q->on_magnet_ground = 1; } @@ -98,7 +108,7 @@ void apply_hero_ground_material_effects(void) { struct Hero *q = &hero; q->selector_4 = 1; } - if (saved_ground_type == 0xD) { + if (saved_ground_type == GROUND_MATERIAL_SINK_TRIGGER) { struct Hero *q = &hero; q->selector_13 = 1; } @@ -179,7 +189,7 @@ void sceVu0Normalize(void *, void *) __asm__("FUN_00125180"); f32 compute_gravity_relative_vector_inclination(void *) __asm__("FUN_L00_00233d30"); void compute_rotated_vector_angles(void *, void *) __asm__("FUN_L00_00216078"); void transform_hero_polar_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_002335c8"); -void FUN_L00_002334d0(void *, void *, f32); +void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern CollisionHit HH __asm__("D_L16_00174240") NOT_SDA; #define HI(o) (*(s32 *)(D_L16_00174240 + (o))) @@ -232,7 +242,7 @@ void update_hero_ground_contact(void) { } hero.ground_sound_class = collision_sound_class; hero.ground_type = collision_hit_material(); - if (hero.ground_type == 0) { + if (hero.ground_type == GROUND_MATERIAL_WATER) { hero.water_surface_z = resolve_camera_surface_height(D_L16_00174260, (u8 *)&hero.water_surface_normal); if (hero.motion.pos.f[2] < hero.water_surface_z && hero.in_water_frames <= 0) { @@ -248,7 +258,7 @@ void update_hero_ground_contact(void) { } hero.ground_sound_class = collision_sound_class; } - if (hero.ground_type == 0xD) { + if (hero.ground_type == GROUND_MATERIAL_SINK_TRIGGER) { hero.water_surface_z = HH.point.f[2]; ground_probe_endpoint.f[2] = HH.point.f[2] - 0.01f; if (collision_line(&ground_probe_endpoint, &collision_ray_endpoint, 4, (s32)hero.moby, 0) == @@ -264,7 +274,7 @@ void update_hero_ground_contact(void) { if (is_moby_in_class_range_500_to_540(HH.moby)) { hero.on_flagged_ground_moby = 1; if ((u32)(hero.state.control_mode - 0x15) < 2) { - FUN_L00_002334d0((u8 *)&HH.point, (u8 *)&HH.point, 1.0f); + add_hero_gravity_offset((u8 *)&HH.point, (u8 *)&HH.point, 1.0f); } } hit_moby_record = get_moby_target_info(HH.moby); @@ -286,7 +296,8 @@ void update_hero_ground_contact(void) { } if (hero.ground_distance < 0.02f) { hero.frames_off_ground.s = 0; - if (hero.ground_slope.f <= 0.87266463f || hero.gravity_mode == 1 || + if (hero.ground_slope.f <= 0.87266463f || + hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.state.control_mode == 0x16) { hero.air_frames.s = 0; hero.last_landed_moby = HH.moby; @@ -383,10 +394,10 @@ typedef union { f32 f[4]; } V_2133a8; -extern void FUN_L00_002347c0(void); +extern void resolve_hero_pending_path_clearance(void) __asm__("FUN_L00_002347c0"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); -extern void FUN_L00_00233810(void *, void *, f32); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern s32 coll1_2133a8(void *, s32, s32, f32) __asm__("FUN_L00_001f0d60"); extern s32 rig_probe(void *, s32, f32, s32, f32) __asm__("FUN_L00_001f19a0"); extern s32 FUN_L00_001f3170(void *, f32); @@ -407,7 +418,7 @@ s32 resolve_hero_position_collisions(s32 mode) { qcopy(&pre_collision_position, &hero.motion.pos.q); clear_u64_value(&collision_position_offset); if (hero.path_constrain_pending != 0) { - FUN_L00_002347c0(); + resolve_hero_pending_path_clearance(); hero.path_constrain_pending = 0; } if (hero.state.control_mode != 0x11) { @@ -415,12 +426,12 @@ s32 resolve_hero_position_collisions(s32 mode) { transform_hero_local_offset_to_world(&collision_position_offset, 0.0f, 0.0f, 0.7f); fast_vec_sub( &collision_position_offset, &collision_position_offset, &hero.motion.pos.q); - } else if (hero.gravity_mode != 0 || hero.unk1F8 != 0) { - if (hero.gravity_mode == 1 || hero.unk1F8 != 0 || + } else if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN || hero.unk1F8 != 0) { + if (hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.unk1F8 != 0 || (unsigned)(hero.state.control_mode - 0x15) < 2) { - FUN_L00_00233810(&collision_position_offset, &collision_position_offset, 0.6f); + add_hero_up_offset(&collision_position_offset, &collision_position_offset, 0.6f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &collision_position_offset, &collision_position_offset, -hero.capsule_bottom); } } else { @@ -433,7 +444,7 @@ s32 resolve_hero_position_collisions(s32 mode) { mask = 0xD24; } for (i = 0; i < 8; i++) { - if (hero.gravity_mode != 0) { + if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN) { if (!coll1_2133a8(&hero.motion.pos.q, mask, ((s32)hero.moby), frame_scale * 0.4f)) break; } else if (hero.state.control_mode == 0x11) { @@ -573,7 +584,8 @@ void integrate_hero_motion(void) { player = (L16MovementPlayer *)((char *)position - 0x80); update_hero_attachment(player->physics_mode, (char *)position + 0x70, (char *)position + 0x10); /* Limit the velocity by state and mode. Inside an arm `position` moves on to the velocity; it is formed again below. */ - if (player->state == 34 || player->state == 20) { + if (player->state == HERO_STATE_RISE_THEN_FALL_WITH_AIRBORNE_HIT_QUERY || + player->state == HERO_STATE_WRENCH_SLAM) { float limit; float *limited_velocity; diff --git a/src/overlays/l16/hero/hero_set_state.c b/src/overlays/l16/hero/hero_set_state.c index 921b18e374..e0852737de 100644 --- a/src/overlays/l16/hero/hero_set_state.c +++ b/src/overlays/l16/hero/hero_set_state.c @@ -82,14 +82,15 @@ extern int hero_set_state(int, int) __asm__("FUN_L16_0021e398"); extern char level16_hero_jump_velocity_keys[] __asm__("D_L16_0017C380"); extern char level16_hero_water_surface_jump_velocity_keys[] __asm__("D_L16_0017C3C0"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int b) { int saved_state_step; char *moby; int old20A7; float vec[4]; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || b != 2)) return 0; } if ((D_L16_0015F5C4 == 2 || D_L16_0015F5C4 == 6) && b != 2) @@ -97,8 +98,16 @@ int hero_set_state(int a, int b) { { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -111,11 +120,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -136,14 +145,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); return 1; } @@ -757,14 +766,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); if (b) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L16_0015F6E8[p->state.step], (float)scale_game_frames(8)); } @@ -1100,7 +1109,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -1185,7 +1194,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; diff --git a/src/overlays/l16/hero/update_hero_motion_for_current_state.c b/src/overlays/l16/hero/update_hero_motion_for_current_state.c index a62aa52b2d..e0dc43af8f 100644 --- a/src/overlays/l16/hero/update_hero_motion_for_current_state.c +++ b/src/overlays/l16/hero/update_hero_motion_for_current_state.c @@ -143,7 +143,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void clip_hero_horizontal_velocity(s32) __asm__("FUN_L01_00232978"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -182,7 +182,7 @@ extern void moby_point_position(struct MobyView *, s32, void *) __asm__("FUN_L00 extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L16_00208038(f32, f32); @@ -233,7 +233,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L16_0017C218; extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); extern s32 is_moby_in_class_range_500_to_540(s32) __asm__("FUN_L00_0025e3b8"); @@ -401,10 +401,10 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -415,11 +415,11 @@ void update_hero_motion_for_current_state(void) { } else { clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -726,8 +726,8 @@ void update_hero_motion_for_current_state(void) { build_spherical_offset( &hero.motion.velocity, hero.ground_speed, hero.motion.rot.f[2], yaw); } else if (hero.state.current == 0x33) { - f32 sp = - hero.ground_speed * FUN_L00_00209018(swim_animation_speed_profile, 0x1E) * 5.0f; + f32 sp = hero.ground_speed * + vector_length_xyz_cf(swim_animation_speed_profile, 0x1E) * 5.0f; if (hero.state.prev == 0x35 && scale_game_frames(15) > hero.state_timer) { if (sp < frame_time * 4.5f) { sp = frame_time * 4.5f; @@ -855,8 +855,8 @@ void update_hero_motion_for_current_state(void) { } speed_step(frame_time_sq * 4.0f, frame_time_sq * 5.0f); { - f32 sp = - hero.ground_speed * FUN_L00_00209018(swim_animation_speed_profile, 0x1E) * 5.5f; + f32 sp = hero.ground_speed * + vector_length_xyz_cf(swim_animation_speed_profile, 0x1E) * 5.5f; hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[2] = 0.0f; @@ -970,7 +970,7 @@ void update_hero_motion_for_current_state(void) { hero.board_vertical_speed += t; } gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_00233810( + add_hero_up_offset( &hero.motion.velocity, &hero.motion.velocity, hero.board_vertical_speed); hero.air_frames.s = 1; } @@ -1024,10 +1024,11 @@ void update_hero_motion_for_current_state(void) { if (hero.air_frames.s != 0) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); hero.board_vertical_speed = hero.board_vertical_speed - hero.board_gravity; - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, -hero.board_vertical_speed); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 20.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 20.0f); } break; } @@ -1283,7 +1284,7 @@ void update_hero_motion_for_current_state(void) { approach_value(&len, 0.0f, frame_time_sq * 15.0f); set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, len); sp = frame_time_sq * 27.0f; - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.resolved_velocity_z, sp); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.resolved_velocity_z, sp); n = truncate_float_to_s32(predict_hero_trajectory_intercept_time(60.0f, sp, -1.0f)); k = 16; if (n != 0 && (f32)k - hero.anim_frame > 1.0f) { @@ -1336,11 +1337,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && ((struct MobyView *)hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -1359,11 +1361,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if ((struct MobyView *)hero.grapple_target != NULL) { hero.motion.move_yaw = @@ -1524,13 +1527,13 @@ void update_hero_motion_for_current_state(void) { &((struct MobyView *)hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&matrix_vector_workspace[3], &hero.motion.pos, &((struct MobyView *)hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1650,7 +1653,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1736,7 +1740,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1782,7 +1787,7 @@ void update_hero_motion_for_current_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1798,10 +1803,11 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1824,11 +1830,11 @@ void update_hero_motion_for_current_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { off = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { off = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1873,7 +1879,7 @@ void update_hero_motion_for_current_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || (struct MobyView *)hero.melee_target != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1883,7 +1889,8 @@ void update_hero_motion_for_current_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1897,10 +1904,11 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -2004,11 +2012,12 @@ void update_hero_motion_for_current_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2064,10 +2073,11 @@ void update_hero_motion_for_current_state(void) { hero.air_frames.s = 0; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2161,11 +2171,12 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2700,7 +2711,7 @@ void update_hero_motion_for_current_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2737,7 +2748,8 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2754,7 +2766,8 @@ void update_hero_motion_for_current_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2798,7 +2811,7 @@ void update_hero_motion_for_current_state(void) { clip_hero_horizontal_velocity(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2843,7 +2856,7 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2947,7 +2960,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&primary_vector_scratch, &hero.motion.pos); - FUN_L00_00233810(&primary_vector_scratch, &primary_vector_scratch, 0.5f); + add_hero_up_offset(&primary_vector_scratch, &primary_vector_scratch, 0.5f); qcopy(&v10, &primary_vector_scratch); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; v10.f[1] += fast_sin(hero.motion.rot.f[2]) * 0.85f; @@ -2982,7 +2995,7 @@ void update_hero_motion_for_current_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -3028,7 +3041,7 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -3050,7 +3063,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = D_0015ED6C_a * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = D_0015ED6C_a * 0.9f; } } else { @@ -3061,29 +3074,30 @@ void update_hero_motion_for_current_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { clip_hero_horizontal_velocity(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3096,11 +3110,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -3118,18 +3133,19 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_horizontal_velocity(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -3137,7 +3153,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -3166,11 +3183,12 @@ void update_hero_motion_for_current_state(void) { } clip_hero_horizontal_velocity(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3185,10 +3203,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l16/hero/update_hero_state_transitions.c b/src/overlays/l16/hero/update_hero_state_transitions.c index fd2b1a8c50..79b1a80b33 100644 --- a/src/overlays/l16/hero/update_hero_state_transitions.c +++ b/src/overlays/l16/hero/update_hero_state_transitions.c @@ -196,9 +196,11 @@ void update_hero_state_transitions(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && D_L16_0015F594 == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -260,7 +262,7 @@ void update_hero_state_transitions(void) { } } if (D_L16_0015F638 > hero.motion.pos.f[2] && hero.ground_distance > 2.0f && - hero.vehicle_mode != 2 && hero.state.current != 0x77) { + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { switch (hero.state.current) { @@ -662,7 +664,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -689,7 +691,7 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { request_hero_idle_state_for_vehicle_mode(); break; } @@ -952,7 +954,8 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -2666,7 +2669,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l16/level_class_tables.c b/src/overlays/l16/level_class_tables.c index c03a9c82eb..805ba38a82 100644 --- a/src/overlays/l16/level_class_tables.c +++ b/src/overlays/l16/level_class_tables.c @@ -20,6 +20,9 @@ #include "rnc/overlay/shared/vehicles.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -54,7 +57,7 @@ void *D_L16_001E9038[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L16_001E9050[6] __attribute__((section("lvl.vtbl"))) = {moby_hold_state_if_grabbed, diff --git a/src/overlays/l16/mobys/bolt_thief.c b/src/overlays/l16/mobys/bolt_thief.c index cf00ddae12..a6a5339012 100644 --- a/src/overlays/l16/mobys/bolt_thief.c +++ b/src/overlays/l16/mobys/bolt_thief.c @@ -37,6 +37,16 @@ #include "rnc/ui/text/font/font_queue_vu_state.h" #include "rnc/rendering/clip_volume.h" +enum { + BOLT_THIEF_INITIALIZE = 0, + BOLT_THIEF_FACE_HERO = 1, + BOLT_THIEF_WAIT_FOR_HERO_TRIGGER = 2, + BOLT_THIEF_SETTLE_AT_PATH_END = 3, + BOLT_THIEF_FOLLOW_PRIMARY_PATH = 4, + BOLT_THIEF_FOLLOW_OTHER_PATH = 5, + BOLT_THIEF_KNOCKBACK = 6 +}; + extern int scale_game_frames(int); /* Update of the crate platform: hit reaction, then its seven states. */ @@ -138,13 +148,9 @@ void bolt_thief_update(L16CrateMoby *moby) __asm__("FUN_L16_002e37a0"); /* Moby classes 452, 1401 */ void bolt_thief_update(L16CrateMoby *moby) { enum { - BOLT_THIEF_INITIALIZE = 0, - BOLT_THIEF_FACE_HERO = 1, - BOLT_THIEF_WAIT_FOR_HERO_TRIGGER = 2, - BOLT_THIEF_SETTLE_AT_PATH_END = 3, - BOLT_THIEF_FOLLOW_PRIMARY_PATH = 4, - BOLT_THIEF_FOLLOW_OTHER_PATH = 5, - BOLT_THIEF_KNOCKBACK = 6 + BOLT_THIEF_MODE_LINKED_MOBY_PATH_CYCLE = 0, + BOLT_THIEF_MODE_SINGLE_PATH_THEN_FACE_HERO = 1, + BOLT_THIEF_MODE_FACE_HERO_IN_PLACE = 2 }; L16CrateData *bolt_thief_data = moby->data; char *hit; @@ -156,7 +162,7 @@ void bolt_thief_update(L16CrateMoby *moby) { hit = find_moby_hit(moby, 0x210000, 0); if (!hit && bolt_thief_data->child) hit = find_moby_hit(bolt_thief_data->child, 0x210000, 0); - if (hit && moby->state != 6) { + if (hit && moby->state != BOLT_THIEF_KNOCKBACK) { struct Hero *player = &hero; bolt_thief_data->knock_drag = 0.008f; @@ -174,13 +180,13 @@ void bolt_thief_update(L16CrateMoby *moby) { moby->position[1] - player->motion.pos.f[1])); bolt_thief_data->ticks = 0x78; FUN_L00_00257470(moby, 0, -1); - moby->state = 6; + moby->state = BOLT_THIEF_KNOCKBACK; } moby->opacity = 0xFF; switch (moby->state) { case BOLT_THIEF_INITIALIZE: - if (bolt_thief_data->mode == 2) { - moby->state = 1; + if (bolt_thief_data->mode == BOLT_THIEF_MODE_FACE_HERO_IN_PLACE) { + moby->state = BOLT_THIEF_FACE_HERO; bolt_thief_data->turn = 0.0f; set_moby_animation(moby, 4, 0); } else { @@ -194,7 +200,7 @@ void bolt_thief_update(L16CrateMoby *moby) { mark_moby_for_removal(moby); return; } - if (bolt_thief_data->mode != 1) { + if (bolt_thief_data->mode != BOLT_THIEF_MODE_SINGLE_PATH_THEN_FACE_HERO) { if (bolt_thief_data->other_path == -1) { debug_print(D_L16_001E8720, moby->id); mark_moby_for_removal(moby); @@ -212,7 +218,7 @@ void bolt_thief_update(L16CrateMoby *moby) { return; } initialize_moby_path_state(moby); - moby->state = 2; + moby->state = BOLT_THIEF_WAIT_FOR_HERO_TRIGGER; moby->collision = 0x80; moby->flags |= 0x41; moby->bounds = 0; @@ -234,7 +240,7 @@ void bolt_thief_update(L16CrateMoby *moby) { } case BOLT_THIEF_WAIT_FOR_HERO_TRIGGER: if (is_point_inside_clip_volume(&hero.motion.pos, bolt_thief_data->trigger)) { - if (bolt_thief_data->mode == 1) { + if (bolt_thief_data->mode == BOLT_THIEF_MODE_SINGLE_PATH_THEN_FACE_HERO) { set_moby_animation(moby, 0, 0); } else { bolt_thief_data->child = spawn_bolt_thief_mine(moby, moby->position); @@ -243,14 +249,14 @@ void bolt_thief_update(L16CrateMoby *moby) { } moby->flags &= 0xFFBE; moby->bounds = moby->model->bounds; - moby->state = 4; + moby->state = BOLT_THIEF_FOLLOW_PRIMARY_PATH; } break; case BOLT_THIEF_FOLLOW_PRIMARY_PATH: - if (bolt_thief_data->mode == 0) + if (bolt_thief_data->mode == BOLT_THIEF_MODE_LINKED_MOBY_PATH_CYCLE) update_linked_moby_position(moby); if (advance_bolt_thief_path((char *)moby)) { - moby->state = 3; + moby->state = BOLT_THIEF_SETTLE_AT_PATH_END; blend_moby_animation(moby, 3, 0, 5); } emit_moby_offset_particles(moby); @@ -261,7 +267,7 @@ void bolt_thief_update(L16CrateMoby *moby) { float target[4]; float zero; - if (settle_data->mode == 0) + if (settle_data->mode == BOLT_THIEF_MODE_LINKED_MOBY_PATH_CYCLE) update_linked_moby_position(moby); qcopy(target, path + *(int *)path * 16); zero = 0.0f; @@ -284,8 +290,8 @@ void bolt_thief_update(L16CrateMoby *moby) { *(float *)&D_L16_00161D98_gp, zero); if ((moby->status & 2) && moby->frame == moby->animation) { - if (settle_data->mode == 1) { - moby->state = 1; + if (settle_data->mode == BOLT_THIEF_MODE_SINGLE_PATH_THEN_FACE_HERO) { + moby->state = BOLT_THIEF_FACE_HERO; settle_data->turn = zero; set_moby_animation(moby, 4, 0); } else { @@ -293,7 +299,7 @@ void bolt_thief_update(L16CrateMoby *moby) { set_moby_state_14(settle_data->child); settle_data->child = 0; } - moby->state = 5; + moby->state = BOLT_THIEF_FOLLOW_OTHER_PATH; blend_moby_animation(moby, 0, 0, 20); settle_data->timer = zero; settle_data->counter = 0; @@ -306,7 +312,7 @@ void bolt_thief_update(L16CrateMoby *moby) { if (advance_bolt_thief_path((char *)moby)) { char *path; - moby->state = 2; + moby->state = BOLT_THIEF_WAIT_FOR_HERO_TRIGGER; moby->bounds = 0; moby->flags |= 0x41; bolt_thief_data->timer = 0.0f; @@ -351,7 +357,7 @@ int advance_bolt_thief_path(struct Moby *moby) { float scaled_frame_time = bolt_thief_path_speed_gp * frame_time; int path_sample_result; char *path; - if (moby->state == 5) + if (moby->state == BOLT_THIEF_FOLLOW_OTHER_PATH) path = D_L16_001B0930[*(int *)(bolt_thief_path_data + 0xDC)]; else path = D_L16_001B0930[*(int *)(bolt_thief_path_data + 0xD8)]; diff --git a/src/overlays/l16/mobys/bomb.c b/src/overlays/l16/mobys/bomb.c index 9f3b4c74d4..d2c783bbe4 100644 --- a/src/overlays/l16/mobys/bomb.c +++ b/src/overlays/l16/mobys/bomb.c @@ -119,12 +119,12 @@ void thrown_bomb_update(L16FallingMoby *moby) { qcopy(moby->position, D_L16_hitN.position); moby->position[2] += normal[2]; if (normal[2] >= 0.3f && fast_vec_length(bomb_data->velocity) < D_0015ED6C * 0.25f) { - moby->state = 2; + moby->state = BOMB_STATE_RESTING; bomb_data->timer = scale_game_frames(90); } } if (fast_dec_timer(&bomb_data->timer)) { - moby->state = 3; + moby->state = BOMB_STATE_EXPLODE; } else if (bomb_data->timer < scale_game_frames(45) && bomb_data->timer % scale_game_frames(10) == 0) { bomb_data->reaction = 250; @@ -134,7 +134,7 @@ void thrown_bomb_update(L16FallingMoby *moby) { break; case BOMB_STATE_RESTING: if (fast_dec_timer(&bomb_data->timer)) { - moby->state = 3; + moby->state = BOMB_STATE_EXPLODE; } else if (bomb_data->timer < scale_game_frames(61) && bomb_data->timer % scale_game_frames(20) == 0) { bomb_data->reaction = 250; diff --git a/src/overlays/l16/mobys/breakable_prop.c b/src/overlays/l16/mobys/breakable_prop.c index 0825752012..57905ff09f 100644 --- a/src/overlays/l16/mobys/breakable_prop.c +++ b/src/overlays/l16/mobys/breakable_prop.c @@ -36,13 +36,13 @@ void breakable_prop_update(struct Moby *moby) { char *hit_record = find_moby_hit(moby, 0x10000, 0); switch (moby->state) { case MOBY_STATE_INITIALIZE: - moby->state = 1; + moby->state = MOBY_STATE_CHECK_HIT_FOR_REMOVAL; break; case MOBY_STATE_CHECK_HIT_FOR_REMOVAL: if (hit_record != 0 && 0.0f < *(float *)(hit_record + 0x2C)) flag = 1; if (flag) - moby->state = 2; + moby->state = MOBY_STATE_REMOVE_WITH_EFFECTS; break; case MOBY_STATE_REMOVE_WITH_EFFECTS: allocate_voice_for_target_entry(0, 0, moby); diff --git a/src/overlays/l16/mobys/chicken_relocator.c b/src/overlays/l16/mobys/chicken_relocator.c index 58c09b8b55..702464443f 100644 --- a/src/overlays/l16/mobys/chicken_relocator.c +++ b/src/overlays/l16/mobys/chicken_relocator.c @@ -43,6 +43,11 @@ #include "rnc/ui/text/font/font_queue_vu_state.h" #include "rnc/world/collision/ground_probe.h" +enum { + TARGET_REPOSITION_STATE_REQUESTABLE = 1, + TARGET_REPOSITION_STATE_REQUESTED = 7 +}; + extern float D_0015ED6C; #include "rnc/overlay/shared/math/quad.h" @@ -154,10 +159,10 @@ int is_moby_in_state_6(Level16VendorMoby *moby) { void request_target_reposition(struct Moby *moby) __asm__("FUN_L16_002e0de0"); void request_target_reposition(struct Moby *moby) { - int state = 1; + int state = TARGET_REPOSITION_STATE_REQUESTABLE; if (moby->state == state) { allocate_voice_for_target_entry(0, 0, moby); - state = 7; + state = TARGET_REPOSITION_STATE_REQUESTED; moby->state = state; } } @@ -169,7 +174,7 @@ int get_target_reposition_status(char *moby_or_private_data) __asm__("FUN_L16_00 int get_target_reposition_status(char *moby_or_private_data) { unsigned char moby_state = moby_or_private_data[0x20]; moby_or_private_data = *(char **)(moby_or_private_data + 0x78); - if (moby_state == 7 || moby_state == 8) { + if (moby_state == TARGET_REPOSITION_STATE_REQUESTED || moby_state == 8) { if (moby_state == 8 && *(float *)(moby_or_private_data + 0x34) > 0.2f) { return 2; } @@ -212,14 +217,14 @@ void chicken_relocator_update(struct Moby *moby) { target = D_L16_0015FFD8 + (target_cycle_data->unk4 << 8); switch (moby->state) { case TARGET_CYCLE_INITIALIZE_DELAY: - moby->state = 1; + moby->state = TARGET_CYCLE_WAIT_TO_TRIGGER; target_cycle_data->timer_C = scale_game_frames(random_int_between(0xB4, 0x168)); break; case TARGET_CYCLE_WAIT_TO_TRIGGER: if (vector_distance_xy(hero_position, target + 0x10) > 3.0f) { if (find_group_chicken_in_state_6(*(int *)target_cycle_data) != 0) { if (fast_dec_timer(&target_cycle_data->timer_C)) { - moby->state = 2; + moby->state = TARGET_CYCLE_POLL_STATUS; request_target_reposition(target); target_cycle_data->timer_C = scale_game_frames(random_int_between(0xB4, 0x168)); } @@ -230,10 +235,10 @@ void chicken_relocator_update(struct Moby *moby) { target_status = get_target_reposition_status(target); switch (target_status) { case TARGET_STATUS_INACTIVE: - moby->state = 1; + moby->state = TARGET_CYCLE_WAIT_TO_TRIGGER; break; case TARGET_STATUS_REPOSITION_READY: - moby->state = 1; + moby->state = TARGET_CYCLE_WAIT_TO_TRIGGER; { char *moby_to_reposition = find_group_chicken_in_state_6(*(int *)target_cycle_data); if (moby_to_reposition != 0) { diff --git a/src/overlays/l16/mobys/chomper.c b/src/overlays/l16/mobys/chomper.c index a7c40ab8ea..a18891a639 100644 --- a/src/overlays/l16/mobys/chomper.c +++ b/src/overlays/l16/mobys/chomper.c @@ -36,6 +36,15 @@ #include "rnc/overlay/shared/game/unlock_planet.h" #include "rnc/ui/text/font/font_queue_vu_state.h" +enum { + CHOMPER_INITIALIZE = 0, + CHOMPER_WAIT_TO_APPROACH_TARGET = 1, + CHOMPER_APPROACH_TARGET = 4, + CHOMPER_FACE_TARGET = 5, + CHOMPER_RETURN_HOME = 6, + CHOMPER_KNOCKBACK = 8 +}; + extern int scale_game_frames(int); extern float frame_time, D_0015EE70; extern void FUN_L00_00257470(void *, int, int); @@ -91,14 +100,6 @@ typedef struct ChomperVars { /* Moby class 1445 */ void chomper_update(struct Moby *chomper_moby) { - enum { - CHOMPER_INITIALIZE = 0, - CHOMPER_WAIT_TO_APPROACH_TARGET = 1, - CHOMPER_APPROACH_TARGET = 4, - CHOMPER_FACE_TARGET = 5, - CHOMPER_RETURN_HOME = 6, - CHOMPER_KNOCKBACK = 8 - }; ChomperVars *chomper_data = (ChomperVars *)chomper_moby->pvars; update_chomper_hit_reaction_and_target(chomper_moby); FUN_L00_00263ac8(2.1f, (int)chomper_moby, 1, &chomper_data->unk220); @@ -119,7 +120,7 @@ void chomper_update(struct Moby *chomper_moby) { if (rand() & 1) chomper_moby->flags |= 0x8000; qcopy(chomper_data->unk1D0, &chomper_moby->pos); - chomper_moby->state = 1; + chomper_moby->state = CHOMPER_WAIT_TO_APPROACH_TARGET; if (chomper_moby->prev_seq != 2) blend_moby_animation(chomper_moby, 2, 0, scale_game_frames(20)); chomper_data->unk58 = truncate_float_to_s32(8.0f); @@ -127,7 +128,7 @@ void chomper_update(struct Moby *chomper_moby) { break; case CHOMPER_WAIT_TO_APPROACH_TARGET: if (chomper_data->unk1C4 != 2) { - chomper_moby->state = 4; + chomper_moby->state = CHOMPER_APPROACH_TARGET; if (chomper_moby->prev_seq != 0) blend_moby_animation(chomper_moby, 0, 0, scale_game_frames(20)); } @@ -137,11 +138,11 @@ void chomper_update(struct Moby *chomper_moby) { break; case CHOMPER_APPROACH_TARGET: if (move_chomper_toward_position(chomper_moby, chomper_data->unk180) < 1.25f) { - chomper_moby->state = 5; + chomper_moby->state = CHOMPER_FACE_TARGET; if (chomper_moby->prev_seq != 1) blend_moby_animation(chomper_moby, 1, 0, scale_game_frames(20)); } else if (chomper_data->unk1C4 == 2) - chomper_moby->state = 6; + chomper_moby->state = CHOMPER_RETURN_HOME; break; case CHOMPER_FACE_TARGET: { float *yaw = &chomper_moby->rot.z; @@ -157,7 +158,7 @@ void chomper_update(struct Moby *chomper_moby) { collect_mobies_in_sphere_at_moby_point(chomper_moby, 0, 1, 0.333f, 1.0f, 1.0f, 0, 1, 0); } else if ((chomper_moby->anim_flags & 2) && fast_vec_dist(&chomper_moby->pos, chomper_data->unk180) > 1.5f) { - chomper_moby->state = 4; + chomper_moby->state = CHOMPER_APPROACH_TARGET; if (chomper_moby->prev_seq != 0) blend_moby_animation(chomper_moby, 0, 0, scale_game_frames(20)); } @@ -165,15 +166,15 @@ void chomper_update(struct Moby *chomper_moby) { } case CHOMPER_RETURN_HOME: if (move_chomper_toward_position(chomper_moby, chomper_data->unk1D0) < 1.0f) { - chomper_moby->state = 1; + chomper_moby->state = CHOMPER_WAIT_TO_APPROACH_TARGET; if (chomper_moby->prev_seq != 2) blend_moby_animation(chomper_moby, 2, 0, scale_game_frames(20)); } else if (chomper_data->unk1C4 != 2) - chomper_moby->state = 4; + chomper_moby->state = CHOMPER_APPROACH_TARGET; break; case 7: if (FUN_L00_002dc9f0(chomper_moby, &chomper_data->unk120)) { - chomper_moby->state = 1; + chomper_moby->state = CHOMPER_WAIT_TO_APPROACH_TARGET; chomper_data->unkC8 = 0; } break; @@ -262,7 +263,7 @@ void update_chomper_hit_reaction_and_target(void *chomper_instance) { float knockback_vector_and_heading [8]; /* [0..3] where the hit came from, [4] the heading that gives */ - if (chomper_moby->state == 0) { + if (chomper_moby->state == CHOMPER_INITIALIZE) { return; } hit = find_moby_hit(chomper_moby, 0x330000, 0); @@ -289,7 +290,7 @@ void update_chomper_hit_reaction_and_target(void *chomper_instance) { chomper_moby, pursuit_data->knock, 5, 1, 0, knockback_vector_and_heading[4]); pursuit_data->f170 = 8.0f; pursuit_data->f174 = 16.0f; - chomper_moby->state = 8; + chomper_moby->state = CHOMPER_KNOCKBACK; chomper_moby->i94 = 0; pursuit_data->reaction_time = 0x78; trooper_anim_update(chomper_moby, pursuit_data->reaction); diff --git a/src/overlays/l16/mobys/conveyor_belt.c b/src/overlays/l16/mobys/conveyor_belt.c index f11b469d61..b714afa36b 100644 --- a/src/overlays/l16/mobys/conveyor_belt.c +++ b/src/overlays/l16/mobys/conveyor_belt.c @@ -68,7 +68,7 @@ void conveyor_belt_update(struct Moby *moby) { if (conveyor_data->unk60 == -1) { moby->flags |= 2; } else { - moby->state = 2; + moby->state = CONVEYOR_BELT_STATE_APPROACH_NEGATED_SPEED; } conveyor_data->unk74 = -1; break; @@ -91,7 +91,7 @@ void conveyor_belt_update(struct Moby *moby) { update_conveyor_group_motion_transforms(moby->group, conveyor_motion_vector); } if (is_point_inside_clip_volume(&hero.motion.pos, conveyor_data->clip_volume_64)) - moby->state = 2; + moby->state = CONVEYOR_BELT_STATE_APPROACH_NEGATED_SPEED; add_draw_callback(draw_conveyor_belt_strips, moby); break; } diff --git a/src/overlays/l16/mobys/cutscene_joint_trails.c b/src/overlays/l16/mobys/cutscene_joint_trails.c index 84eb7e1477..842dfdbbeb 100644 --- a/src/overlays/l16/mobys/cutscene_joint_trails.c +++ b/src/overlays/l16/mobys/cutscene_joint_trails.c @@ -61,7 +61,7 @@ void cutscene_joint_trails_update(struct Moby *moby) { switch (moby->state) { case JOINT_TRAIL_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = JOINT_TRAIL_EMIT; break; case JOINT_TRAIL_EMIT: if (D_L16_0015F5C4 == 2) { diff --git a/src/overlays/l16/mobys/elevator.c b/src/overlays/l16/mobys/elevator.c index 1b441e8322..5c22aa9c7a 100644 --- a/src/overlays/l16/mobys/elevator.c +++ b/src/overlays/l16/mobys/elevator.c @@ -118,7 +118,7 @@ void elevator_update(L16PlatformMoby *moby) { elevator_data->joint * 0x80 + 0x38) + elevator_height_offset; moby->reverse = 1; - moby->state = 2; + moby->state = ELEVATOR_WAIT_FOR_HERO; break; case ELEVATOR_WAIT_FOR_HERO: if (voice_is_playing(moby, elevator_data->particle)) { @@ -143,7 +143,7 @@ void elevator_update(L16PlatformMoby *moby) { moby->reverse = (moby->reverse + 1) & 1; elevator_data->goal = motion.v[2]; elevator_data->speed = 0.0f; - moby->state = 3; + moby->state = ELEVATOR_UPDATE_HEIGHT; break; } } @@ -163,7 +163,7 @@ void elevator_update(L16PlatformMoby *moby) { elevator_data->joint * 0x80 + 0x38) + elevator_height_offset; elevator_data->speed = 0.0f; - moby->state = 3; + moby->state = ELEVATOR_UPDATE_HEIGHT; } break; case ELEVATOR_UPDATE_HEIGHT: { @@ -205,7 +205,7 @@ void elevator_update(L16PlatformMoby *moby) { if (moby->position[2] == elevator_data->goal && (hero.ground_moby != moby || hero.air_frames.s != 0)) { clear_u64_value(elevator_data->basis[1]); - moby->state = 2; + moby->state = ELEVATOR_WAIT_FOR_HERO; break; } if (elevator_data->speed != 0.0f) { diff --git a/src/overlays/l16/mobys/gadgetron_ceo.c b/src/overlays/l16/mobys/gadgetron_ceo.c index 2bec43d18f..7e65642a5c 100644 --- a/src/overlays/l16/mobys/gadgetron_ceo.c +++ b/src/overlays/l16/mobys/gadgetron_ceo.c @@ -173,6 +173,11 @@ void gadgetron_ceo_update(L16ChallengeMoby *ceo_moby) { GADGETRON_CEO_MONITOR_CHALLENGE_EVENTS = 3, GADGETRON_CEO_WAIT_TO_SAVE = 4 }; + enum { + GADGETRON_CEO_DIALOGUE_AFTER_CHALLENGE_START = 2, + GADGETRON_CEO_DIALOGUE_START_CHALLENGE = 3, + GADGETRON_CEO_DIALOGUE_AFTER_CHALLENGE_RETURN = 4 + }; L16ChallengeScratch ceo_gaze_vectors; L16ChallengeData *ceo_data = ceo_moby->data; L16ChallengeActivation *activation = (L16ChallengeActivation *)ceo_data->activation; @@ -186,7 +191,7 @@ void gadgetron_ceo_update(L16ChallengeMoby *ceo_moby) { switch (ceo_moby->state) { case GADGETRON_CEO_INITIALIZE_DIALOGUE: ceo_moby->opacity = 255; - ceo_moby->state = 1; + ceo_moby->state = GADGETRON_CEO_POLL_DIALOGUE; initialize_npc_dialogue(ceo_moby, activation); *(float *)((char *)ceo_data + 0x2C) = 3.7f; ceo_data->initial_yaw = ceo_moby->yaw; @@ -202,7 +207,7 @@ void gadgetron_ceo_update(L16ChallengeMoby *ceo_moby) { if (update_npc_dialogue(ceo_moby, (char *)ceo_data + 0x20)) { ceo_moby->yaw = ceo_data->initial_yaw; begin_dialogue_camera_transition(3.5f, ceo_moby); - ceo_moby->state = 2; + ceo_moby->state = GADGETRON_CEO_WAIT_AFTER_DIALOGUE; } if (!D_0013D4DE && vector_distance_xy(&hero.motion.pos, ceo_moby->position) < 3.5f) { int elapsed, period; @@ -219,13 +224,13 @@ void gadgetron_ceo_update(L16ChallengeMoby *ceo_moby) { *(unsigned short *)(statistics + 0x43A) = scale_game_frames(D_0015EEA4) / 600; } } - if (activation->mode == 3) { + if (activation->mode == GADGETRON_CEO_DIALOGUE_START_CHALLENGE) { char *camera; char *pose; int pending; pending = D_L16_0015F5CC; activation->previous = (unsigned short)activation->mode; - activation->mode = 2; + activation->mode = GADGETRON_CEO_DIALOGUE_AFTER_CHALLENGE_START; activation->pending = pending; ceo_moby->event = 0; pose = gadgetron_ceo_challenge_start_pose; @@ -233,11 +238,11 @@ void gadgetron_ceo_update(L16ChallengeMoby *ceo_moby) { camera = (char *)hero.saved_pos_rot; qcopy(camera, pose + 0x20); qcopy(camera + 0x10, pose + 0x30); - ceo_moby->state = 3; + ceo_moby->state = GADGETRON_CEO_MONITOR_CHALLENGE_EVENTS; activate_gadgetron_ceo_challenge_environment((char *)ceo_moby); } if (((L16ChallengePlayer *)((char *)&D_0013E633_challenge + 0xE1D))->mode == 22) { - ceo_moby->state = 3; + ceo_moby->state = GADGETRON_CEO_MONITOR_CHALLENGE_EVENTS; activate_gadgetron_ceo_challenge_environment((char *)ceo_moby); } break; @@ -245,7 +250,7 @@ void gadgetron_ceo_update(L16ChallengeMoby *ceo_moby) { case GADGETRON_CEO_WAIT_AFTER_DIALOGUE: if (*(int *)&D_L16_0015F5C4 != 2) { int previous; - ceo_moby->state = 1; + ceo_moby->state = GADGETRON_CEO_POLL_DIALOGUE; previous = activation->previous; if (previous == 4) { FUN_L16_002923d0(0); @@ -255,7 +260,7 @@ void gadgetron_ceo_update(L16ChallengeMoby *ceo_moby) { break; case GADGETRON_CEO_WAIT_TO_SAVE: if (*(int *)&D_L16_0015F5C4 == 0) { - ceo_moby->state = 1; + ceo_moby->state = GADGETRON_CEO_POLL_DIALOGUE; grant_inventory_item(31, 1); memcard_save_data(0, -1); } @@ -275,7 +280,7 @@ void gadgetron_ceo_update(L16ChallengeMoby *ceo_moby) { D_0015EE6C_p = player->points; } if (((L16ChallengePlayer *)((char *)&D_0013E633_challenge + 0xE1D))->mode == 0) { - ceo_moby->state = 1; + ceo_moby->state = GADGETRON_CEO_POLL_DIALOGUE; restore_gadgetron_ceo_non_challenge_environment((char *)ceo_moby); } event = ceo_moby->event; @@ -292,14 +297,14 @@ void gadgetron_ceo_update(L16ChallengeMoby *ceo_moby) { previous = activation->mode; pending = D_L16_0015F5CC; activation->previous = previous; - activation->mode = 4; + activation->mode = GADGETRON_CEO_DIALOGUE_AFTER_CHALLENGE_RETURN; activation->pending = pending; activation->flag = event; } restore_gadgetron_ceo_non_challenge_environment((char *)ceo_moby); } if (ceo_moby->event == 2) { - ceo_moby->state = 1; + ceo_moby->state = GADGETRON_CEO_POLL_DIALOGUE; set_race_camera(gadgetron_ceo_challenge_return_pose, gadgetron_ceo_challenge_return_pose + 0x10, 0, diff --git a/src/overlays/l16/mobys/gadgetron_sign.c b/src/overlays/l16/mobys/gadgetron_sign.c index 8935362214..f53acfcf6d 100644 --- a/src/overlays/l16/mobys/gadgetron_sign.c +++ b/src/overlays/l16/mobys/gadgetron_sign.c @@ -53,7 +53,7 @@ void gadgetron_sign_update(struct Moby *moby) { float size = moby->scale * 4.0f; int ff = 0xFF; int twohundred = 0x200; - moby->state = 1; + moby->state = GADGETRON_SIGN_ROTATE; moby->update_dist = ff; moby->draw_dist = twohundred; moby->pos.z = 160.0f; diff --git a/src/overlays/l16/mobys/grindrail_button.c b/src/overlays/l16/mobys/grindrail_button.c index 26ec4f3d25..205bc88eeb 100644 --- a/src/overlays/l16/mobys/grindrail_button.c +++ b/src/overlays/l16/mobys/grindrail_button.c @@ -60,7 +60,7 @@ void grindrail_button_update(struct Moby *button_moby) { float glow_blend_factor; switch (button_moby->state) { case GRINDRAIL_BUTTON_INITIALIZE_GLOW_PHASE: - button_moby->state = 1; + button_moby->state = GRINDRAIL_BUTTON_CHECK_ACTIVATION; *(float *)button_data = random_angle_radians(); break; case GRINDRAIL_BUTTON_CHECK_ACTIVATION: @@ -125,7 +125,10 @@ typedef struct { void activate_grindrail_button(Level16VendorTurnMoby *moby) __asm__("FUN_L16_002e56e0"); void activate_grindrail_button(Level16VendorTurnMoby *moby) { + enum { + GRINDRAIL_BUTTON_ACTIVATED = 2 + }; moby->data->value = -3.1415925f; moby->active = 1; - moby->state = 2; + moby->state = GRINDRAIL_BUTTON_ACTIVATED; } diff --git a/src/overlays/l16/mobys/grindrail_gate.c b/src/overlays/l16/mobys/grindrail_gate.c index 8b25851f74..e74af932f2 100644 --- a/src/overlays/l16/mobys/grindrail_gate.c +++ b/src/overlays/l16/mobys/grindrail_gate.c @@ -41,7 +41,7 @@ void grindrail_gate_update(struct Moby *gate_moby) { D_L16_00161DE0); switch (gate_moby->state) { case GRINDRAIL_GATE_INITIALIZE: - gate_moby->state = 1; + gate_moby->state = GRINDRAIL_GATE_CHECK_HERO_BOUNDS; gate_moby->update_dist = 0xFF; break; case GRINDRAIL_GATE_CHECK_HERO_BOUNDS: @@ -57,7 +57,7 @@ void grindrail_gate_update(struct Moby *gate_moby) { grindrail_gate_local_trigger_bounds[4] < hero_offset_from_gate[2] && hero_offset_from_gate[2] < grindrail_gate_local_trigger_bounds[5]) { gate_moby->command = 1; - gate_moby->state = 2; + gate_moby->state = GRINDRAIL_GATE_WAIT_FOR_COMMAND_TIMEOUT; *(int *)command_timer = scale_game_frames(D_L16_00161DD8); func_0022ED80_6478(1, 0, gate_moby); } @@ -65,7 +65,7 @@ void grindrail_gate_update(struct Moby *gate_moby) { break; case GRINDRAIL_GATE_WAIT_FOR_COMMAND_TIMEOUT: if (fast_dec_timer((int *)command_timer)) { - gate_moby->state = 1; + gate_moby->state = GRINDRAIL_GATE_CHECK_HERO_BOUNDS; gate_moby->command = 0; } break; diff --git a/src/overlays/l16/mobys/help_desk_lady.c b/src/overlays/l16/mobys/help_desk_lady.c index 10713c8d5d..92d69eddfa 100644 --- a/src/overlays/l16/mobys/help_desk_lady.c +++ b/src/overlays/l16/mobys/help_desk_lady.c @@ -115,6 +115,9 @@ void help_desk_lady_update(L16WatchMoby *moby) { HELP_DESK_POLL_DIALOGUE = 1, HELP_DESK_REQUEST_HELP_AND_SAVE = 2 }; + enum { + HELP_DESK_HELP_AND_SAVE_REQUESTED = 3 + }; L16WatchScratch gaze_vectors; L16WatchData *watch_data = moby->data; L16WatchFlags *flags; @@ -127,7 +130,7 @@ void help_desk_lady_update(L16WatchMoby *moby) { switch (moby->state) { case HELP_DESK_INITIALIZE_DIALOGUE: initialize_npc_dialogue(moby, activation); - moby->state = 1; + moby->state = HELP_DESK_POLL_DIALOGUE; watch_data->activation.radius = 20.0f; moby->opacity = 0xFF; break; @@ -136,14 +139,14 @@ void help_desk_lady_update(L16WatchMoby *moby) { if (player->disabled == 0 && player->mode != 15 && player->mode != 22) { if (is_point_inside_clip_volume((char *)player + 0x80, watch_data->activation_region) && update_npc_dialogue(moby, activation)) - moby->state = 2; + moby->state = HELP_DESK_REQUEST_HELP_AND_SAVE; } break; } case HELP_DESK_REQUEST_HELP_AND_SAVE: if (*(int *)&D_L16_0015F5C4 != 2) { char *player; - moby->state = 1; + moby->state = HELP_DESK_POLL_DIALOGUE; set_race_camera(D_L16_001D96C0, D_L16_001D96C0 + 4, 0, 1); help_request(0x3E82, 0x84); grant_inventory_item(0x21, 1); @@ -151,7 +154,7 @@ void help_desk_lady_update(L16WatchMoby *moby) { player = (char *)&D_0013E533 + 0xE9D; jet_reset_camera(player, player + 0x10); memcard_save_data(0, -1); - moby->state = 3; + moby->state = HELP_DESK_HELP_AND_SAVE_REQUESTED; } break; } diff --git a/src/overlays/l16/mobys/linked_pair_ribbons.c b/src/overlays/l16/mobys/linked_pair_ribbons.c index 2592a513bd..2b2b6df38d 100644 --- a/src/overlays/l16/mobys/linked_pair_ribbons.c +++ b/src/overlays/l16/mobys/linked_pair_ribbons.c @@ -42,7 +42,7 @@ void linked_pair_ribbons_update(struct Moby *moby) { case MOBY_STATE_INITIALIZE_LINKED_PAIRS: if (linked_pair_effect_data[0] == 0) { func_L16_002D0990_2D0870(moby); - moby->state = 1; + moby->state = MOBY_STATE_UPDATE_DRAW_AND_SOUND; } break; case MOBY_STATE_UPDATE_DRAW_AND_SOUND: diff --git a/src/overlays/l16/mobys/local_bounds_command_trigger.c b/src/overlays/l16/mobys/local_bounds_command_trigger.c index 8266ce3181..bafba1c051 100644 --- a/src/overlays/l16/mobys/local_bounds_command_trigger.c +++ b/src/overlays/l16/mobys/local_bounds_command_trigger.c @@ -43,7 +43,7 @@ void local_bounds_command_trigger_update(struct Moby *trigger_moby) { D_L16_00161DEC); switch (trigger_moby->state) { case GRINDRAIL_TRIGGER_INITIALIZE: - trigger_moby->state = 1; + trigger_moby->state = GRINDRAIL_TRIGGER_CHECK_LOCAL_BOUNDS; trigger_moby->update_dist = 0xFF; break; case GRINDRAIL_TRIGGER_CHECK_LOCAL_BOUNDS: @@ -63,14 +63,14 @@ void local_bounds_command_trigger_update(struct Moby *trigger_moby) { bounds_check_offset_from_trigger[2] < D_L16_001D9768[5]) { allocate_voice_for_target_entry(1, 0, trigger_moby); trigger_moby->command = 1; - trigger_moby->state = 2; + trigger_moby->state = GRINDRAIL_TRIGGER_WAIT_FOR_COMMAND_TIMEOUT; *(int *)command_timer = scale_game_frames(D_L16_00161DE4); } } break; case GRINDRAIL_TRIGGER_WAIT_FOR_COMMAND_TIMEOUT: if (fast_dec_timer((int *)command_timer)) { - trigger_moby->state = 1; + trigger_moby->state = GRINDRAIL_TRIGGER_CHECK_LOCAL_BOUNDS; trigger_moby->command = 0; } break; diff --git a/src/overlays/l16/mobys/path_following_rocket.c b/src/overlays/l16/mobys/path_following_rocket.c index e54aaa9a21..a2fea6089c 100644 --- a/src/overlays/l16/mobys/path_following_rocket.c +++ b/src/overlays/l16/mobys/path_following_rocket.c @@ -60,7 +60,7 @@ void path_following_rocket_update(struct Moby *moby) { } rocket_path_data->unkC = rocket_path_data->unk8 * D_0015ED6C / fast_vec_dist(path + 0x10, path + 0x20); - moby->state = 1; + moby->state = ROCKET_STATE_WAIT_FOR_TRIGGER; moby->update_dist = 100; moby->command = 0; break; @@ -69,7 +69,7 @@ void path_following_rocket_update(struct Moby *moby) { if (player->state.control_mode != 15) break; if (is_point_inside_clip_volume(&player->motion.body_center, *(int *)rocket_path_data)) { - moby->state = 2; + moby->state = ROCKET_STATE_FOLLOW_PATH; rocket_path_data->unk16 = 0; } break; @@ -78,7 +78,7 @@ void path_following_rocket_update(struct Moby *moby) { rocket_path_data->unk10 += rocket_path_data->unkC; if ((float)(*(int *)path - 1) <= rocket_path_data->unk10) { moby->update_dist = 0xFF; - moby->state = 3; + moby->state = ROCKET_STATE_WAIT_FOR_RESET; } else { sample_camera_path( (int *)path, 0, &moby->pos, &moby->rot.x, 0, rocket_path_data->unk10); @@ -113,7 +113,7 @@ void path_following_rocket_update(struct Moby *moby) { moby->flags &= ~1; moby->collision = moby->pclass->collision; rocket_path_data->unk16 = 0; - moby->state = 1; + moby->state = ROCKET_STATE_WAIT_FOR_TRIGGER; } } break; diff --git a/src/overlays/l16/mobys/path_walker.c b/src/overlays/l16/mobys/path_walker.c index 45dec03206..cf0064da82 100644 --- a/src/overlays/l16/mobys/path_walker.c +++ b/src/overlays/l16/mobys/path_walker.c @@ -86,7 +86,7 @@ void path_walker_update(unsigned char *walker_moby) { PATH_WALKER_INITIALIZE_GROUP = 0, PATH_WALKER_FOLLOW_PATH = 1 }; - float old[4], rotation[4], trial[4]; + float walker_previous_position[4], rotation[4], trial[4]; char *path; L16WalkerData_c *walker_data; int playing = 0; @@ -100,7 +100,7 @@ void path_walker_update(unsigned char *walker_moby) { playing = 1; } } else { - qcopy(old, walker_moby + 0x10); + qcopy(walker_previous_position, walker_moby + 0x10); } switch (walker_moby[0x20]) { case PATH_WALKER_INITIALIZE_GROUP: @@ -111,8 +111,8 @@ void path_walker_update(unsigned char *walker_moby) { initialize_path_walker_group(walker_moby); break; case PATH_WALKER_FOLLOW_PATH: { - L16WalkerData_c *other = *(L16WalkerData_c **)(walker_data->owner + 0x78); - float gap, step, next, height, acceleration; + L16WalkerData_c *linked_walker_data = *(L16WalkerData_c **)(walker_data->owner + 0x78); + float gap, step, candidate_path_parameter, height, acceleration; /* `playing` again, in a variable of case 1's own. The logic does not need it: tested directly, `playing` is one value from the top of the function to the test, the compiler ranks it below `path` and gives them $s5 and $s4, the reverse of retail. The narrowing copy ends that value @@ -130,46 +130,47 @@ void path_walker_update(unsigned char *walker_moby) { MOBY(walker_moby)->pos.z += walker_data->height_step; walker_data->parameter += walker_data->speed; approach_value(&walker_data->speed, walker_data->target_speed, acceleration); - gap = other->parameter - walker_data->parameter; + gap = linked_walker_data->parameter - walker_data->parameter; if (gap < 0.0f) { gap += walker_data->period; } if (gap < path_walker_gap_range_start_gp && - walker_data->target_speed > other->target_speed) { + walker_data->target_speed > linked_walker_data->target_speed) { float saved = walker_data->target_speed; - float theirs = other->target_speed; + float theirs = linked_walker_data->target_speed; - other->target_speed = saved; + linked_walker_data->target_speed = saved; walker_data->target_speed = theirs; } if (gap < 1.5f) { step = frame_time_sq * 50.0f; approach_value(&walker_data->speed, walker_data->target_speed, step); - approach_value(&other->speed, other->target_speed, step); + approach_value(&linked_walker_data->speed, linked_walker_data->target_speed, step); } if (walker_moby[0x31] == 0 && blocked == 0) { if (gap > path_walker_gap_range_end_gp + 1.0f) { height = random_float_between(path_walker_height_range_start_gp, path_walker_height_range_end_gp); if (walker_data->owner[0x31] != 0 && walker_data->countdown != 0) { - next = other->parameter - random_float_between(path_walker_gap_range_start_gp, - path_walker_gap_range_end_gp); + candidate_path_parameter = linked_walker_data->parameter - + random_float_between(path_walker_gap_range_start_gp, + path_walker_gap_range_end_gp); walker_data->countdown--; } else { - next = walker_data->parameter + - path_walker_reposition_advance_rate_gp * frame_time; + candidate_path_parameter = walker_data->parameter + + path_walker_reposition_advance_rate_gp * frame_time; } - if (next < 0.0f) { - next += walker_data->period; + if (candidate_path_parameter < 0.0f) { + candidate_path_parameter += walker_data->period; } - sample_camera_path(path, next, 0, trial, rotation, 1); + sample_camera_path(path, candidate_path_parameter, 0, trial, rotation, 1); trial[2] += height; trial[3] = 2.0f; if (fast_bsphere_check((char *)trial, (float)path_walker_draw_distance_gp) == -1) { float random = random_float_between(path_walker_speed_range_start_gp, path_walker_speed_range_end_gp); - walker_data->parameter = next; + walker_data->parameter = candidate_path_parameter; walker_data->height_step = height; walker_data->target_speed = random * frame_time; } @@ -184,7 +185,7 @@ void path_walker_update(unsigned char *walker_moby) { } } if (((unsigned short)MOBY(walker_moby)->oclass) & 1) { - emit_path_walker_particle(walker_moby, old); + emit_path_walker_particle(walker_moby, walker_previous_position); } } diff --git a/src/overlays/l16/mobys/reflection_mesh.c b/src/overlays/l16/mobys/reflection_mesh.c index 312e4baf1a..59e49ca386 100644 --- a/src/overlays/l16/mobys/reflection_mesh.c +++ b/src/overlays/l16/mobys/reflection_mesh.c @@ -169,7 +169,7 @@ void reflection_mesh_update(struct Moby *moby) { single_mesh_bounding_sphere_components[3] = vertex_to_center_distance; } } - moby->state = 1; + moby->state = SINGLE_MESH_RENDER_QUEUE_CALLBACK; moby->update_dist = moby->draw_dist = 255; break; } diff --git a/src/overlays/l16/mobys/reflection_mesh_pair.c b/src/overlays/l16/mobys/reflection_mesh_pair.c index c6dfb97740..849f4fa649 100644 --- a/src/overlays/l16/mobys/reflection_mesh_pair.c +++ b/src/overlays/l16/mobys/reflection_mesh_pair.c @@ -180,7 +180,7 @@ void reflection_mesh_pair_update(struct Moby *moby) { two_mesh_bounding_sphere_components[3] = vertex_to_center_distance; } } - moby->state = 1; + moby->state = TWO_MESH_RENDER_QUEUE_CALLBACK; moby->update_dist = moby->draw_dist = 255; break; } diff --git a/src/overlays/l16/mobys/reflection_mesh_trio.c b/src/overlays/l16/mobys/reflection_mesh_trio.c index 4dbb82aae7..c2466f60f4 100644 --- a/src/overlays/l16/mobys/reflection_mesh_trio.c +++ b/src/overlays/l16/mobys/reflection_mesh_trio.c @@ -253,7 +253,7 @@ void reflection_mesh_trio_update(struct Moby *moby) { mesh_bounding_sphere_components[3] = vertex_to_center_distance; } } - moby->state = 1; + moby->state = MESH_RENDER_QUEUE_CALLBACK; break; } case MESH_RENDER_QUEUE_CALLBACK: diff --git a/src/overlays/l16/mobys/reflection_mesh_trio_b.c b/src/overlays/l16/mobys/reflection_mesh_trio_b.c index ce027bb48a..d8350bf319 100644 --- a/src/overlays/l16/mobys/reflection_mesh_trio_b.c +++ b/src/overlays/l16/mobys/reflection_mesh_trio_b.c @@ -138,7 +138,7 @@ void reflection_mesh_trio_b_update(struct Moby *moby) { current_mesh_sphere_components[3] = vertex_to_center_distance; } } - moby->state = 1; + moby->state = MESH_RENDER_QUEUE_CALLBACK; moby->update_dist = moby->draw_dist = 255; break; } diff --git a/src/overlays/l16/mobys/rocket.c b/src/overlays/l16/mobys/rocket.c index f4774fe424..0f0cfa5e6b 100644 --- a/src/overlays/l16/mobys/rocket.c +++ b/src/overlays/l16/mobys/rocket.c @@ -172,7 +172,7 @@ void homing_projectile_update(unsigned char *moby) { { int impact_state; query.flags = 0x830000; - impact_state = 1; + impact_state = PROJECTILE_STATE_IMPACT; query.owner = moby; query.scale = 1.0f; query.active = impact_state; diff --git a/src/overlays/l16/mobys/spinning_sprite_effect.c b/src/overlays/l16/mobys/spinning_sprite_effect.c index e1083dc78b..1cda722c29 100644 --- a/src/overlays/l16/mobys/spinning_sprite_effect.c +++ b/src/overlays/l16/mobys/spinning_sprite_effect.c @@ -16,6 +16,10 @@ #include "rnc/world/collision/collision_line.h" #include "rnc/math/random.h" #include "rnc/overlay/shared/rendering/effects/particles.h" + +unsigned char *spawn_timed_hero_relative_particle( + u128 *, int, unsigned char, int, int, int, int, float) __asm__("FUN_L00_00272f68"); + #include "rnc/world/collision/ground_probe.h" /* updates the moby: initialises in state 0, then runs its motion in state 1 */ /* Ported from rac1-decomp (src/overlays/l16_kalebo3/vendor_002A50F0.c: func_L16_002CA848), where it is exact; names translated to the US level program. */ @@ -45,7 +49,7 @@ void spinning_sprite_effect_update(struct Moby *moby) { if (vertical_distance_to_ground < 1.0f) { moby->pos.z = ground_height + 0.9f; } - moby->state = 1; + moby->state = MOBY_STATE_SPIN_AND_DRAW_SPRITES; break; } case MOBY_STATE_SPIN_AND_DRAW_SPRITES: @@ -123,14 +127,14 @@ void draw_spinning_sprite_effect_sprites(struct Moby *moby) { elapsed_cycle_fraction = elapsed_cycle_fraction / (float)scale_game_frames(0xFF); col = fast_tween_color(0x4040FFFF, 0x1040FFFF, absolute_float(0.5f - elapsed_cycle_fraction)); - FUN_L00_00272f68(d, - col, - truncate_float_to_s32(sprite_data->a[i]) & 0xFF, - 0x35, - 1, - 2, - 0, - sprite_data->d[i]); + spawn_timed_hero_relative_particle(d, + col, + truncate_float_to_s32(sprite_data->a[i]) & 0xFF, + 0x35, + 1, + 2, + 0, + sprite_data->d[i]); fast_vec_add(d, d, particle_position_step); } } diff --git a/src/overlays/l16/mobys/taxi.c b/src/overlays/l16/mobys/taxi.c index d9a89f5a32..ae5822f65e 100644 --- a/src/overlays/l16/mobys/taxi.c +++ b/src/overlays/l16/mobys/taxi.c @@ -117,7 +117,7 @@ void taxi_update(struct Moby *moby) { FUN_L16_002e4a58_c(moby); request_taxi_destination_help_message(moby); if ((pad_pressed_words[0] & 0x10) && *(int *)&D_L16_0015F594 == 8) { - moby->state = 3; + moby->state = TAXI_BLEND_TO_PATH_START; matched_moby = find_group_moby_by_data_id(moby, *(short *)(taxi_data + 0xAE)); if (matched_moby != 0) { matched_moby[0x20] = 2; @@ -162,14 +162,14 @@ void taxi_update(struct Moby *moby) { if (1.0f <= *(float *)(taxi_data + 0xB0)) { *(float *)(taxi_data + 0xB0) = z; *(float *)(taxi_data + 0xB4) = z; - moby->state = 4; + moby->state = TAXI_FOLLOW_PATH; } break; case TAXI_FOLLOW_PATH: if (advance_taxi_path(moby)) { *(int *)(taxi_data + 0xB0) = 0; *(int *)(taxi_data + 0xB4) = 0; - moby->state = 5; + moby->state = TAXI_BLEND_TO_DESTINATION_POSE; } break; case TAXI_BLEND_TO_DESTINATION_POSE: @@ -207,7 +207,7 @@ void taxi_update(struct Moby *moby) { if (1.0f <= *(float *)(taxi_data + 0xB0)) { *(int *)(taxi_data + 0xB0) = 0; *(int *)(taxi_data + 0xB4) = 0; - moby->state = 1; + moby->state = TAXI_WAIT_FOR_DEPARTURE; transfer_moby_placement_to_linked_moby(moby); } break; @@ -219,12 +219,12 @@ void taxi_update(struct Moby *moby) { moby->visible = 1; moby->collision = taxi_model_collision; moby->flags = flags & 0xFFFE; - moby->state = 1; + moby->state = TAXI_WAIT_FOR_DEPARTURE; } break; } apply_taxi_wobble(moby); - if (moby->state >= 3 && moby->state <= 5) { + if (moby->state >= TAXI_BLEND_TO_PATH_START && moby->state <= TAXI_BLEND_TO_DESTINATION_POSE) { travel_player = &hero; travel_player->jump_lock_timer = 2; travel_player->unk1F4 = 2; @@ -411,14 +411,19 @@ int advance_taxi_path(struct Moby *moby) { void request_taxi_destination_help_message(struct Moby *moby) __asm__("FUN_L16_002e4cd8"); void request_taxi_destination_help_message(struct Moby *moby) { + enum { + TAXI_DESTINATION_FIRST_STOP = 0, + TAXI_DESTINATION_SECOND_STOP = 1, + TAXI_DESTINATION_THIRD_STOP = 2 + }; switch (*(short *)((char *)moby->pvars + 0xae)) { - case 0: + case TAXI_DESTINATION_FIRST_STOP: try_set_help_message(8, 0x3e89); break; - case 1: + case TAXI_DESTINATION_SECOND_STOP: try_set_help_message(8, 0x3e8a); break; - case 2: + case TAXI_DESTINATION_THIRD_STOP: try_set_help_message(8, 0x139A); break; case 3: diff --git a/src/overlays/l16/mobys/test_dummy.c b/src/overlays/l16/mobys/test_dummy.c index 514b835b13..55fead4bc3 100644 --- a/src/overlays/l16/mobys/test_dummy.c +++ b/src/overlays/l16/mobys/test_dummy.c @@ -20,6 +20,21 @@ #include "qcopy.h" +enum { + TEST_DUMMY_STATE_INITIALIZE = 0, + TEST_DUMMY_STATE_IDLE = 1, + TEST_DUMMY_STATE_APPROACH_FIRST_PATH_NODE = 2, + TEST_DUMMY_STATE_APPROACH_THROW_NODE = 3, + TEST_DUMMY_STATE_THROW_AT_TARGET = 4, + TEST_DUMMY_STATE_MOVE_ALONG_PATH = 5, + TEST_DUMMY_STATE_TURN_TO_NEXT_PATH_NODE = 6, + TEST_DUMMY_STATE_APPROACH_SPRAY_NODE = 7, + TEST_DUMMY_STATE_SPRAY_FROM_CHILD = 8, + TEST_DUMMY_STATE_TURN_AND_RESUME_SAVED_STATE = 9, + TEST_DUMMY_STATE_BURST = 10, + TEST_DUMMY_STATE_RESPAWN = 11 +}; + extern char *create_moby(int); extern char *create_moby(int) __asm__("FUN_0020c4f8"); @@ -127,25 +142,14 @@ void test_dummy_update(unsigned char *m) __asm__("FUN_L16_002cddb8"); /* Moby class 541 */ void test_dummy_update(unsigned char *moby) { - enum { - TEST_DUMMY_STATE_INITIALIZE = 0, - TEST_DUMMY_STATE_IDLE = 1, - TEST_DUMMY_STATE_APPROACH_FIRST_PATH_NODE = 2, - TEST_DUMMY_STATE_APPROACH_THROW_NODE = 3, - TEST_DUMMY_STATE_THROW_AT_TARGET = 4, - TEST_DUMMY_STATE_MOVE_ALONG_PATH = 5, - TEST_DUMMY_STATE_TURN_TO_NEXT_PATH_NODE = 6, - TEST_DUMMY_STATE_APPROACH_SPRAY_NODE = 7, - TEST_DUMMY_STATE_SPRAY_FROM_CHILD = 8, - TEST_DUMMY_STATE_TURN_AND_RESUME_SAVED_STATE = 9, - TEST_DUMMY_STATE_BURST = 10, - TEST_DUMMY_STATE_RESPAWN = 11 - }; enum { TEST_DUMMY_KIND_THROWER = 0, TEST_DUMMY_KIND_PATH_MOVER = 1, TEST_DUMMY_KIND_SPRAYER = 2 }; + enum { + TEST_DUMMY_TARGET_MODE_NO_MOBY_TARGET = 2 + }; L16QuadVector position_or_delta, position_or_direction, launch_velocity; L16HitDescriptor fx; L16DummyData *dummy_data = ((L16DummyData *)MOBY(moby)->pvars); @@ -204,9 +208,9 @@ void test_dummy_update(unsigned char *moby) { dummy_data->timer = scale_game_frames(30); dummy_data->node = 1; dummy_data->step = 1; - if (dummy_data->kind == 0) { + if (dummy_data->kind == TEST_DUMMY_KIND_THROWER) { moby[0x20] = 3; - } else if (dummy_data->kind == 1) { + } else if (dummy_data->kind == TEST_DUMMY_KIND_PATH_MOVER) { moby[0x20] = 5; } else { moby[0x20] = 7; @@ -232,13 +236,13 @@ void test_dummy_update(unsigned char *moby) { FUN_L00_0025ff38( 12.0f, (char *)moby, dummy_data->target, 0, 0, p + 16, *(int *)p); } else { - dummy_data->mode = 2; + dummy_data->mode = TEST_DUMMY_TARGET_MODE_NO_MOBY_TARGET; } } } break; case TEST_DUMMY_STATE_THROW_AT_TARGET: /* thrower: launch the held object at the target, then face it or the next node */ - if (dummy_data->mode == 2) { + if (dummy_data->mode == TEST_DUMMY_TARGET_MODE_NO_MOBY_TARGET) { qcopy(position_or_delta.f, D_L16_001600EC_c + dummy_data->aim[dummy_data->node] * 0x80 + 0x30); } else { @@ -351,13 +355,13 @@ void test_dummy_update(unsigned char *moby) { FUN_L00_0025ff38( 12.0f, (char *)moby, dummy_data->target, 0, 0, p + 16, *(int *)p); } else { - dummy_data->mode = 2; + dummy_data->mode = TEST_DUMMY_TARGET_MODE_NO_MOBY_TARGET; } } } break; case TEST_DUMMY_STATE_SPRAY_FROM_CHILD: /* sprayer: face the target and emit from the child toward it */ - if (dummy_data->mode != 2) { + if (dummy_data->mode != TEST_DUMMY_TARGET_MODE_NO_MOBY_TARGET) { position_or_delta.quad = *(u128 *)(moby + 16); move_test_dummy_toward_position_and_heading( moby, @@ -529,6 +533,9 @@ extern void mark_moby_for_removal_c2(void *) __asm__("func_0020C828"); /* Per-frame update of a hit-point moby: handles a hit (respawn at the spawn point or removal when out of lives) and its state timers. */ void update_test_dummy_damage_and_respawn(void *moby) { + enum { + HIT_REACTION_STATUS_NO_DAMAGE = 1 + }; L16HitMoby *hit_moby = moby; float matrix[16]; int status; @@ -536,7 +543,7 @@ void update_test_dummy_damage_and_respawn(void *moby) { L16HitData *hit_data; char *dummy_hit_record; - if (hit_moby->state == 1) { + if (hit_moby->state == TEST_DUMMY_STATE_IDLE) { return; } hit_data = hit_moby->data; @@ -548,7 +555,7 @@ void update_test_dummy_damage_and_respawn(void *moby) { hit_moby->flags &= 0xEFFF; hit_data->lives--; if (hit_data->lives != -1) { - hit_moby->state = 11; + hit_moby->state = TEST_DUMMY_STATE_RESPAWN; qcopy(hit_moby->position, hit_data->spawn); hit_data->timer = scale_game_frames(60); } else { @@ -565,12 +572,13 @@ void update_test_dummy_damage_and_respawn(void *moby) { amount = 0.0f; dummy_hit_record = find_moby_hit(hit_moby, 0x330000, 0); hit_reaction(hit_moby, dummy_hit_record, &hit_data->health, 0, &status, &amount, 0, 4); - if (status != 1 && hit_moby->state != 10 && hit_moby->state != 11) { + if (status != HIT_REACTION_STATUS_NO_DAMAGE && hit_moby->state != TEST_DUMMY_STATE_BURST && + hit_moby->state != TEST_DUMMY_STATE_RESPAWN) { hit_data->health -= amount; if (hit_data->health <= 0.0f) { - hit_moby->state = 10; + hit_moby->state = TEST_DUMMY_STATE_BURST; } else { - if (hit_moby->state != 9) { + if (hit_moby->state != TEST_DUMMY_STATE_TURN_AND_RESUME_SAVED_STATE) { hit_data->next_state = hit_moby->state; hit_data->next_anim = hit_moby->animation; } @@ -580,7 +588,7 @@ void update_test_dummy_damage_and_respawn(void *moby) { hit_data->heading = fast_arc_tan(player->motion.pos.f[0] - x, player->motion.pos.f[1] - y); } - hit_moby->state = 9; + hit_moby->state = TEST_DUMMY_STATE_TURN_AND_RESUME_SAVED_STATE; /* No pointer local for the reaction record anywhere: d->reaction is written at each call and the compiler caches it itself (formed before the hit query, and formed again here with a copy after the call). It only forms it again here when this place cannot be reached along one straight path @@ -681,6 +689,7 @@ extern char *D_L16_0015FFD8; extern void add_draw_callback(void (*)(void), void *) __asm__("FUN_001f4600"); #include "rnc/overlay/l16/mobys/test_dummy_globals.h" + /* spins the level's rotating parts by the current angle and queues the draw callback */ /* Ported from rac1-decomp (src/overlays/l16_kalebo3/vendor_002A50F0.c: func_L16_002D0238), where it is exact; names translated to the US level program. */ diff --git a/src/overlays/l16/mobys/test_dummy_challenge.c b/src/overlays/l16/mobys/test_dummy_challenge.c index 44a5ef2a96..89b81f20f2 100644 --- a/src/overlays/l16/mobys/test_dummy_challenge.c +++ b/src/overlays/l16/mobys/test_dummy_challenge.c @@ -73,12 +73,12 @@ void test_dummy_challenge_update(struct Moby *moby) { return; } if (scene_data->hidden == -1) { - moby->state = 5; + moby->state = SCENE_STATE_HIDDEN_WAIT_FOR_TRIGGER; moby->flags |= 1; moby->visible = 0; moby->collision = 0; } else { - moby->state = 1; + moby->state = SCENE_STATE_WAIT_FOR_TRIGGER; set_class_0287_group_activation_and_find_nearest(scene_data->helper, 1); } break; @@ -87,7 +87,7 @@ void test_dummy_challenge_update(struct Moby *moby) { if (!is_point_inside_clip_volume(player, scene_data->trigger)) break; scene_data->timer_q = scale_game_frames(60); - moby->state = 2; + moby->state = SCENE_STATE_WAIT_TO_HIDE; if (scene_data->camera >= 0) *(unsigned short *)(player + 0x225A) = *(unsigned short *)&scene_data->camera; jet_mount(D_L16_001671C0_lui, D_L16_001671C0_lui + 0x10, 1, 0, 0); @@ -98,7 +98,7 @@ void test_dummy_challenge_update(struct Moby *moby) { if (scene_data->camera >= 0) *(unsigned short *)(D_0014162A_lui) = *(unsigned short *)&scene_data->camera; if (fast_dec_timer(&scene_data->timer_q)) { - moby->state = 3; + moby->state = SCENE_STATE_WAIT_FOR_LINKED_MOBYS_AND_TIMER; scene_data->timer_q = scale_game_frames(60); moby->visible = 0; moby->flags |= 1; @@ -116,7 +116,7 @@ void test_dummy_challenge_update(struct Moby *moby) { if (!fast_dec_timer(&scene_data->timer_q)) break; moby->visible = 1; - moby->state = 4; + moby->state = SCENE_STATE_COMPLETE; moby->flags &= 0xFFFE; jet_end_mount(3); set_race_camera(D_L16_001600EC + (scene_data->pose << 7) + 0x30, @@ -144,7 +144,7 @@ void test_dummy_challenge_update(struct Moby *moby) { if (is_point_inside_clip_volume(D_0013F3D0, scene_data->trigger)) { activate_class_0287_group_and_find_nearest(scene_data->helper, 0); activate_test_dummy_group(scene_data->path); - moby->state = 6; + moby->state = SCENE_STATE_HIDDEN_WAIT_FOR_LINKED_MOBYS; } break; case SCENE_STATE_HIDDEN_WAIT_FOR_LINKED_MOBYS: { @@ -152,7 +152,7 @@ void test_dummy_challenge_update(struct Moby *moby) { if (is_point_inside_clip_volume(player, scene_data->trigger) && scene_data->camera >= 0) *(unsigned short *)(player + 0x225A) = *(unsigned short *)&scene_data->camera; if (!count_active_moby_group_members(scene_data->path, -1)) { - moby->state = 4; + moby->state = SCENE_STATE_COMPLETE; helper = set_class_0287_group_activation_and_find_nearest(scene_data->helper, 0); if (helper) allocate_voice_for_target_entry(1, 0, helper); diff --git a/src/overlays/l16/mobys/test_dummy_door.c b/src/overlays/l16/mobys/test_dummy_door.c index 9b97856548..be45c54df9 100644 --- a/src/overlays/l16/mobys/test_dummy_door.c +++ b/src/overlays/l16/mobys/test_dummy_door.c @@ -41,7 +41,7 @@ void test_dummy_door_update(struct Moby *moby) { char *test_dummy_door_motion_data = (char *)moby->pvars; switch (moby->state) { case TEST_DUMMY_DOOR_STATE_INITIALIZE: - moby->state = 1; + moby->state = TEST_DUMMY_DOOR_STATE_UPDATE_HEIGHT; *(float *)test_dummy_door_motion_data = moby->pos.z; break; case TEST_DUMMY_DOOR_STATE_UPDATE_HEIGHT: { diff --git a/src/overlays/l16/mobys/test_dummy_on_hoverboard.c b/src/overlays/l16/mobys/test_dummy_on_hoverboard.c index c3b20d0994..8251369793 100644 --- a/src/overlays/l16/mobys/test_dummy_on_hoverboard.c +++ b/src/overlays/l16/mobys/test_dummy_on_hoverboard.c @@ -609,7 +609,7 @@ void test_dummy_on_hoverboard_update(unsigned char *moby) { } hoverboard_dummy_data->unk2E8 = random_angle_radians(); hoverboard_dummy_data->unk29 = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = HOVERBOARD_DUMMY_STATE_WAIT_FOR_RACE; break; } case HOVERBOARD_DUMMY_STATE_WAIT_FOR_RACE: @@ -628,12 +628,12 @@ void test_dummy_on_hoverboard_update(unsigned char *moby) { MOBY(moby)->flags |= 0x8000; } MOBY(moby)->hit_slot = 255; - MOBY(moby)->state = 2; + MOBY(moby)->state = HOVERBOARD_DUMMY_STATE_RACING; } break; case HOVERBOARD_DUMMY_STATE_WAIT_FOR_REACTIVATION: if (hero.state.control_mode != 22) { - MOBY(moby)->state = 0; + MOBY(moby)->state = HOVERBOARD_DUMMY_STATE_INITIALIZE; } else { int count = *(unsigned short *)&hoverboard_dummy_data->unk2F2 + 1; short timer = count; @@ -649,7 +649,7 @@ void test_dummy_on_hoverboard_update(unsigned char *moby) { MOBY(moby)->collision = MOBY(moby)->pclass->collision; MOBY(moby)->flags &= ~0x41; MOBY(moby)->hit_slot = 255; - MOBY(moby)->state = 2; + MOBY(moby)->state = HOVERBOARD_DUMMY_STATE_RACING; } } } @@ -657,7 +657,7 @@ void test_dummy_on_hoverboard_update(unsigned char *moby) { case HOVERBOARD_DUMMY_STATE_RACING: hero_base = ((char *)&hero); if (*(int *)(hero_base + 0x208C) != 22) { - MOBY(moby)->state = 0; + MOBY(moby)->state = HOVERBOARD_DUMMY_STATE_INITIALIZE; break; } if (find_moby_hit(moby, mask, 0)) { @@ -685,7 +685,7 @@ void test_dummy_on_hoverboard_update(unsigned char *moby) { spawn_moby_break_fragments(moby, 0x6FA, 1, 0x6FB, 1, 1, 0); hoverboard_dummy_data->unk2F2 = 0; *(int *)(hero_base + 0x8A8) += 250; - MOBY(moby)->state = 3; + MOBY(moby)->state = HOVERBOARD_DUMMY_STATE_WAIT_FOR_REACTIVATION; MOBY(moby)->collision = 0; MOBY(moby)->flags |= 0x41; break; diff --git a/src/overlays/l16/mobys/wall_button_blocker.c b/src/overlays/l16/mobys/wall_button_blocker.c index 26ff5c2e17..d58406dde8 100644 --- a/src/overlays/l16/mobys/wall_button_blocker.c +++ b/src/overlays/l16/mobys/wall_button_blocker.c @@ -44,11 +44,15 @@ void wall_button_blocker_update(struct Moby *moby) __asm__("FUN_L16_002e36e8"); /* Moby class 1387 */ void wall_button_blocker_update(struct Moby *moby) { + enum { + WALL_BUTTON_BLOCKER_STATE_UNINITIALIZED = 0, + WALL_BUTTON_BLOCKER_STATE_INITIALIZED = 1 + }; float *rotation_scale_data = (float *)moby->pvars; - if (moby->state == 0) { + if (moby->state == WALL_BUTTON_BLOCKER_STATE_UNINITIALIZED) { fast_vec_normalize(&moby->rot_row1, &moby->rot_row1, rotation_scale_data[0] * 0.25f); fast_vec_normalize(&moby->rot_row2, &moby->rot_row2, rotation_scale_data[1] * 0.25f); - moby->state = 1; + moby->state = WALL_BUTTON_BLOCKER_STATE_INITIALIZED; moby->flags |= 0x101; update_entity(moby); } diff --git a/src/overlays/l17/hero/hero_set_state.c b/src/overlays/l17/hero/hero_set_state.c index ff89ae6ec7..6a454bc6c0 100644 --- a/src/overlays/l17/hero/hero_set_state.c +++ b/src/overlays/l17/hero/hero_set_state.c @@ -92,7 +92,7 @@ extern int hero_set_state(int, int) __asm__("FUN_L17_0021e530"); extern char level17_hero_water_surface_jump_velocity_keys[] __asm__("D_L17_0017C860"); extern char level17_hero_trail_jump_velocity_keys[] __asm__("D_L17_0017C820"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int b) { int previous_state_step; char *moby; int old20A7; @@ -103,7 +103,8 @@ int hero_set_state(int a, int b) { V4_21ED38 sampled_path_position; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || b != 2)) return 0; } if ((D_L17_0015F5C4 == 2 || D_L17_0015F5C4 == 6) && b != 2) @@ -111,8 +112,16 @@ int hero_set_state(int a, int b) { { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -125,11 +134,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -150,14 +159,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { enter_hero_idle_state_for_current_vehicle_mode(); return 1; } @@ -635,14 +644,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); if (b) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L17_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -1017,7 +1026,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -1030,7 +1039,7 @@ int hero_set_state(int a, int b) { q->state.step = 0; qcopy(&q->motion.velocity, &q->motion.resolved_velocity); if (b) { - if (q->vehicle_mode == 1) { + if (q->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(4, 0, (float)scale_game_frames(8)); return 1; } @@ -1106,7 +1115,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; diff --git a/src/overlays/l17/hero/update_hero_motion_for_current_state.c b/src/overlays/l17/hero/update_hero_motion_for_current_state.c index 56d94c3814..16646456d1 100644 --- a/src/overlays/l17/hero/update_hero_motion_for_current_state.c +++ b/src/overlays/l17/hero/update_hero_motion_for_current_state.c @@ -138,7 +138,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void adjust_hero_velocity_from_collision_probes(s32) __asm__("FUN_L06_002291d0"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -166,7 +166,7 @@ extern void moby_point_position(struct MobyView *, s32, void *) __asm__("FUN_L00 extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L17_00207150(f32, f32); @@ -218,7 +218,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L17_0017C6B8; extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void update_hero_motion_response_parameters(void) __asm__("FUN_L00_00215b68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); @@ -395,10 +395,10 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -409,11 +409,11 @@ void update_hero_motion_for_current_state(void) { } else { adjust_hero_velocity_from_collision_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -718,7 +718,7 @@ void update_hero_motion_for_current_state(void) { &hero.motion.velocity, hero.ground_speed, hero.motion.rot.f[2], yaw); } else if (hero.state.current == 0x33) { f32 sp = hero.ground_speed * - FUN_L00_00209018(l17_swim_speed_scale_by_animation_frame, 0x1E) * 5.0f; + vector_length_xyz_cf(l17_swim_speed_scale_by_animation_frame, 0x1E) * 5.0f; if (hero.state.prev == 0x35 && scale_game_frames(15) > hero.state_timer) { if (sp < frame_time * 4.5f) { sp = frame_time * 4.5f; @@ -844,7 +844,7 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 4.0f, frame_time_sq * 5.0f); { f32 sp = hero.ground_speed * - FUN_L00_00209018(l17_swim_speed_scale_by_animation_frame, 0x1E) * 5.5f; + vector_length_xyz_cf(l17_swim_speed_scale_by_animation_frame, 0x1E) * 5.5f; hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[2] = 0.0f; @@ -899,11 +899,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && ((struct MobyView *)hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -922,11 +923,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if ((struct MobyView *)hero.grapple_target != NULL) { hero.motion.move_yaw = @@ -1083,13 +1085,13 @@ void update_hero_motion_for_current_state(void) { &((struct MobyView *)hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&temporary_vector, &hero.motion.pos, &((struct MobyView *)hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1206,7 +1208,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1308,7 +1311,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1354,7 +1358,7 @@ void update_hero_motion_for_current_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1383,10 +1387,10 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -1415,11 +1419,11 @@ void update_hero_motion_for_current_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { off = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { off = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1464,7 +1468,7 @@ void update_hero_motion_for_current_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || (struct MobyView *)hero.melee_target != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1474,7 +1478,8 @@ void update_hero_motion_for_current_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1488,10 +1493,11 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -1606,11 +1612,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_velocity_from_collision_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1665,10 +1672,11 @@ void update_hero_motion_for_current_state(void) { hero.air_frames.s = 0; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1762,11 +1770,12 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1808,11 +1817,12 @@ void update_hero_motion_for_current_state(void) { AN.f110 = s * m; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); } else { hero.motion.velocity.f[2] = 0.0f; - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 150.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 150.0f); } break; } @@ -2425,7 +2435,7 @@ void update_hero_motion_for_current_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; steer_hero_planar_velocity(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2462,7 +2472,8 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2479,7 +2490,8 @@ void update_hero_motion_for_current_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2529,7 +2541,7 @@ void update_hero_motion_for_current_state(void) { adjust_hero_velocity_from_collision_probes(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2574,7 +2586,7 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2690,7 +2702,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&scratch_vector, &hero.motion.pos); - FUN_L00_00233810(&scratch_vector, &scratch_vector, 0.5f); + add_hero_up_offset(&scratch_vector, &scratch_vector, 0.5f); qcopy(&v10, &scratch_vector); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; v10.f[1] += fast_sin(hero.motion.rot.f[2]) * 0.85f; @@ -2726,10 +2738,10 @@ void update_hero_motion_for_current_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } - if (hero.vehicle_mode == 1) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { update_hero_motion_response_parameters(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2779,7 +2791,7 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -2799,7 +2811,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = D_0015ED6C_a * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = D_0015ED6C_a * 0.9f; } } else { @@ -2810,29 +2822,30 @@ void update_hero_motion_for_current_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_velocity_from_collision_probes(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2845,11 +2858,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); adjust_hero_velocity_from_collision_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -2887,11 +2901,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); adjust_hero_velocity_from_collision_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_1_ATTACK: { @@ -2899,12 +2914,15 @@ void update_hero_motion_for_current_state(void) { s32 ok; tb = &D_L17_0017C528[hero.attack_record]; hero.target_speed = 0.0f; - if ((tb->kind == 0 ? 1 : tb->kind == 1) && hero.anim_frame < 5.5f) { + if ((tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE + ? 1 + : tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) && + hero.anim_frame < 5.5f) { hero.target_speed = frame_time * 3.5f; } if (hero.anim_changing == 0 && (f32)tb->f1C <= hero.anim_frame && hero.anim_frame <= (f32)tb->f20) { - s32 k = tb->kind == 1 ? 0 : 2; + s32 k = tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION ? 0 : 2; moby_point_position((struct MobyView *)hero.moby, k, &v10); moby_point_position((struct MobyView *)hero.moby, k | 1, &vector_workspace); fast_vec_add(&scratch_vector, &v10, &vector_workspace); @@ -2914,7 +2932,7 @@ void update_hero_motion_for_current_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || (struct MobyView *)hero.melee_target != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -2924,7 +2942,8 @@ void update_hero_motion_for_current_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -2953,14 +2972,14 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 15.0f, frame_time_sq * 7.0f); set_planar_vel(99999.0f); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); break; } case HERO_STATE_VEHICLE_MODE_1_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; steer_hero_planar_velocity(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_1_FALL: @@ -2968,7 +2987,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { hero_move_state_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); if (hero.motion.velocity.f[2] < frame_time * -10.0f) { hero.motion.velocity.f[2] = frame_time * -10.0f; } @@ -3000,11 +3020,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_velocity_from_collision_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3019,10 +3040,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } @@ -3093,18 +3114,19 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); adjust_hero_velocity_from_collision_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; steer_hero_planar_velocity(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -3112,7 +3134,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { hero_move_state_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -3141,11 +3164,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_velocity_from_collision_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3160,10 +3184,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l17/hero/update_hero_state_transitions.c b/src/overlays/l17/hero/update_hero_state_transitions.c index a048a27c1b..b438a4f6a3 100644 --- a/src/overlays/l17/hero/update_hero_state_transitions.c +++ b/src/overlays/l17/hero/update_hero_state_transitions.c @@ -199,8 +199,10 @@ void update_hero_state_transitions(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && D_L17_0015F594 == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0)) { switch (hero.vehicle_mode) { case HERO_VEHICLE_MODE_ON_FOOT: case 3: { @@ -279,7 +281,7 @@ void update_hero_state_transitions(void) { } } if (D_L17_0015F638 > hero.motion.pos.f[2] && hero.ground_distance > 2.0f && - hero.vehicle_mode != 2 && hero.state.current != 0x77) { + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { switch (hero.state.current) { @@ -697,7 +699,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -724,7 +726,7 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { enter_hero_idle_state_for_current_vehicle_mode(); break; } @@ -1041,7 +1043,8 @@ void update_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -3038,7 +3041,7 @@ void update_hero_state_transitions(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l17/level_class_tables.c b/src/overlays/l17/level_class_tables.c index 4a65e5b12c..d4e1e3c8c2 100644 --- a/src/overlays/l17/level_class_tables.c +++ b/src/overlays/l17/level_class_tables.c @@ -18,6 +18,9 @@ #include "rnc/overlay/shared/vehicles.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -51,7 +54,7 @@ void *D_L17_001E783C[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L17_001E7854[6] diff --git a/src/overlays/l17/mobys/blarg_ship.c b/src/overlays/l17/mobys/blarg_ship.c index d793956977..15089f938a 100644 --- a/src/overlays/l17/mobys/blarg_ship.c +++ b/src/overlays/l17/mobys/blarg_ship.c @@ -92,13 +92,13 @@ void blarg_ship_update(struct Moby *moby) { moby->draw_dist = 0xFF; moby->update_dist = 0xFF; if (moby_pvars->unk88 == 0) { - moby->state = 1; + moby->state = BLARG_SHIP_FOLLOW_PATH; moby_pvars->unk6C = randf_sym(0.3f, 0.5f); moby_pvars->unk70 = random_angle_radians(); moby_pvars->unk74 = randf_sym(60.0f, 120.0f) * DEG_TO_RAD * frame_time; moby_pvars->unk78 = random_float_between(8.0f, 12.0f); } else { - moby->state = 4; + moby->state = BLARG_SHIP_INACTIVE; moby->collision = 0; moby->flags |= 1; } @@ -119,7 +119,7 @@ void blarg_ship_update(struct Moby *moby) { } fast_add_rotations(moby_pvars->unk70, moby_pvars->unk74); update_moby_path_transform(moby); - if (moby->state == 2) { + if (moby->state == BLARG_SHIP_BURST_AND_HIDE) { cart_burst(moby, &moby->pos, -1, 2.0f, 13.0f); if (random_integer_below(2)) { spawn_ship_pickup((char *)&moby->pos, 0xE0); @@ -127,12 +127,12 @@ void blarg_ship_update(struct Moby *moby) { spawn_ship_pickup((char *)&moby->pos, 0xE4); } FUN_0022da68(1, 0, (int)moby); - moby->state = 3; + moby->state = BLARG_SHIP_WAIT_TO_REACTIVATE; moby->collision = 0; moby->flags |= 1; } else if (moby->visible == 0) { if (fast_vec_dist(&moby->pos, &hero.motion.pos) < 32.0f) { - moby->state = 3; + moby->state = BLARG_SHIP_WAIT_TO_REACTIVATE; moby->collision = 0; moby->flags |= 1; } @@ -145,7 +145,7 @@ void blarg_ship_update(struct Moby *moby) { if (fast_vec_dist(&moby->pos, &hero.motion.pos) > 32.0f) { moby_pvars->unk84 += 1; if (scale_game_frames(60) < moby_pvars->unk84) { - moby->state = 1; + moby->state = BLARG_SHIP_FOLLOW_PATH; if (moby->prev_seq) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -266,7 +266,7 @@ void blarg_ship_update(struct Moby *moby) { } } if (moby->visible == 0) { - moby->state = 4; + moby->state = BLARG_SHIP_INACTIVE; moby->collision = 0; moby->flags |= 1; } @@ -283,7 +283,7 @@ void blarg_ship_update(struct Moby *moby) { spawn_ship_pickup((char *)&moby->pos, 0xE4); } FUN_0022da68(1, 0, (int)moby); - moby->state = 4; + moby->state = BLARG_SHIP_INACTIVE; moby->collision = 0; moby->flags |= 1; break; diff --git a/src/overlays/l17/mobys/breakaway_prop.c b/src/overlays/l17/mobys/breakaway_prop.c index c960d8a23b..349b1c22e8 100644 --- a/src/overlays/l17/mobys/breakaway_prop.c +++ b/src/overlays/l17/mobys/breakaway_prop.c @@ -37,7 +37,7 @@ void breakaway_prop_update(struct Moby *moby) { char *hit_result = find_moby_hit(moby, 0x10000, 0); switch (moby->state) { case HIT_EFFECT_INITIALIZE: - moby->state = 1; + moby->state = HIT_EFFECT_WAIT_FOR_HIT; break; case HIT_EFFECT_WAIT_FOR_HIT: if (hit_result) { @@ -45,7 +45,7 @@ void breakaway_prop_update(struct Moby *moby) { flag = 1; } if (flag) - moby->state = 2; + moby->state = HIT_EFFECT_EMIT_AND_REMOVE; break; case HIT_EFFECT_EMIT_AND_REMOVE: allocate_voice_for_target_entry(0, 0, (int)moby); diff --git a/src/overlays/l17/mobys/camera_box_watcher.c b/src/overlays/l17/mobys/camera_box_watcher.c index 08faabbe8c..39a313fe9a 100644 --- a/src/overlays/l17/mobys/camera_box_watcher.c +++ b/src/overlays/l17/mobys/camera_box_watcher.c @@ -115,7 +115,8 @@ void fleet_camera_box_watcher_update(struct Moby *moby) { case CLIP_VOLUME_SEQUENCE_MONITOR_FOLLOWUP: { struct Hero *h = &hero; int hero_current_state = h->state.current; - if (hero_current_state == 0x76 || hero_current_state == 0x32) { + if (hero_current_state == HERO_STATE_HURT_WITH_DISPLACEMENT_VELOCITY || + hero_current_state == HERO_STATE_OPTIONAL_IDLE_ANIMATION) { pvars->unk6C = 0; } else if (is_point_inside_clip_volume(&h->motion.pos, pvars->unk64) || is_point_inside_clip_volume(&h->motion.pos, pvars->unk68)) { @@ -167,7 +168,7 @@ void fleet_camera_box_watcher_update(struct Moby *moby) { pvars->unk44); pvars->unk4C = 1; } - moby->state = 1; + moby->state = CAMERA_BOX_WATCHER_MONITOR; break; case CAMERA_BOX_WATCHER_MONITOR: pending_help_clip_volume_index = -1; @@ -261,7 +262,7 @@ void fleet_camera_box_watcher_update(struct Moby *moby) { } if (fleet_help_request_gate_state[0] != 0 || fleet_help_request_gate_state[9] != -1) { pvars->unk50 = 0; - moby->state = 2; + moby->state = CAMERA_BOX_WATCHER_ALIGN_FIRST_TARGET; pvars->unk5C = scale_game_frames(0xB4); hero_set_state(0x72, 0); } @@ -278,7 +279,7 @@ void fleet_camera_box_watcher_update(struct Moby *moby) { *(float *)(D_L17_001600EC + ((pvars->unk44 << 7) + 0x34)) - *(float *)(cam + 0x144)); if (fast_difference_between_rotations(*(float *)(cam + 0x158), target_heading) < 0.034906585f) { - moby->state = 3; + moby->state = CAMERA_BOX_WATCHER_WAIT_AND_ALIGN_SECOND_TARGET; pvars->unk5C = scale_game_frames(0x3C); } break; @@ -298,7 +299,7 @@ void fleet_camera_box_watcher_update(struct Moby *moby) { 0.034906585f) { enter_hero_idle_state_for_current_vehicle_mode(); pvars->unk4C = 1; - moby->state = 1; + moby->state = CAMERA_BOX_WATCHER_MONITOR; } } break; diff --git a/src/overlays/l17/mobys/cutscene_camera_target.c b/src/overlays/l17/mobys/cutscene_camera_target.c index 837e590da0..fbccc91dfc 100644 --- a/src/overlays/l17/mobys/cutscene_camera_target.c +++ b/src/overlays/l17/mobys/cutscene_camera_target.c @@ -24,7 +24,7 @@ void cutscene_camera_target_update(struct Moby *moby) { switch (moby->state) { case MOBY_UPDATE_DISTANCE_INITIALIZE: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = MOBY_GUARDED_TABLE_CALL; break; case MOBY_GUARDED_TABLE_CALL: if (D_L17_0015F5C4 == 2) { diff --git a/src/overlays/l17/mobys/door.c b/src/overlays/l17/mobys/door.c index 1f38b466ba..f8c1617e8e 100644 --- a/src/overlays/l17/mobys/door.c +++ b/src/overlays/l17/mobys/door.c @@ -78,7 +78,7 @@ void door_update(struct Moby *door_moby) { door_moby->command = 1; } *(OvlQuad *)door_vars = *(OvlQuad *)&door_moby->pos; - door_moby->state = 1; + door_moby->state = DOOR_STATE_WAIT_AT_ORIGIN; break; case DOOR_STATE_MOVE_AWAY_FROM_ORIGIN: if (door_moby->pclass->sound_defs != 0 && @@ -114,7 +114,7 @@ void door_update(struct Moby *door_moby) { } } (*(int *)(door_vars + ((0x20)))) = -1; - door_moby->state = 4; + door_moby->state = DOOR_STATE_WAIT_DISPLACED; } break; case DOOR_STATE_WAIT_AT_ORIGIN: @@ -143,7 +143,7 @@ void door_update(struct Moby *door_moby) { (*(int *)(door_vars + ((0x20)))) = allocate_voice_for_target_entry(0, 4, (int)door_moby); } - door_moby->state = 2; + door_moby->state = DOOR_STATE_MOVE_AWAY_FROM_ORIGIN; } break; case 3: @@ -172,7 +172,7 @@ void door_update(struct Moby *door_moby) { (*(int *)(door_vars + ((0x20)))) = allocate_voice_for_target_entry(0, 4, (int)door_moby); } - door_moby->state = 5; + door_moby->state = DOOR_STATE_RETURN_TO_ORIGIN; break; case DOOR_STATE_RETURN_TO_ORIGIN: if (door_moby->pclass->sound_defs != 0 && @@ -186,7 +186,7 @@ void door_update(struct Moby *door_moby) { is_point_inside_clip_volume(D_L17_0015FFD8 + (*(int *)(door_vars + ((0x10)))) * 0x100 + 0x10, (*(int *)(door_vars + ((0x18))))))) { - door_moby->state = 2; + door_moby->state = DOOR_STATE_MOVE_AWAY_FROM_ORIGIN; break; } displacement_sample = absolute_float((*(float *)(door_vars + ((0x14))))); @@ -227,7 +227,7 @@ void door_update(struct Moby *door_moby) { } } (*(int *)(door_vars + ((0x20)))) = -1; - door_moby->state = 1; + door_moby->state = DOOR_STATE_WAIT_AT_ORIGIN; } break; } diff --git a/src/overlays/l17/mobys/dreks_fleet_turret.c b/src/overlays/l17/mobys/dreks_fleet_turret.c index f9710c7e1e..4aa1f34884 100644 --- a/src/overlays/l17/mobys/dreks_fleet_turret.c +++ b/src/overlays/l17/mobys/dreks_fleet_turret.c @@ -20,6 +20,16 @@ #include "qzero.h" #include "rnc/overlay/l17/mobys.h" +enum { + FLEET_TURRET_INITIALIZE = 0, + FLEET_TURRET_DEPLETED = 1, + FLEET_TURRET_WAIT_FOR_TARGET = 1, + FLEET_TURRET_AIM_AND_FIRE_AT_ZONE = 2, + FLEET_TURRET_AIM_AND_FIRE_AT_HERO_SHIP = 3, + FLEET_TURRET_DESTROY = 4, + FLEET_TURRET_NOT_DEPLETED = 0xB +}; + extern int hit_reaction(void *, void *, void *, int, void *, void *, int, int) __asm__("FUN_L00_0025a478"); extern void trooper_anim_update(void *m, short *p) __asm__("FUN_L00_0025d458"); @@ -88,13 +98,6 @@ void dreks_fleet_turret_update(struct Moby *m) __asm__("FUN_L17_002cb310"); /* Moby class 347 */ void dreks_fleet_turret_update(struct Moby *turret_moby) { - enum { - FLEET_TURRET_INITIALIZE = 0, - FLEET_TURRET_WAIT_FOR_TARGET = 1, - FLEET_TURRET_AIM_AND_FIRE_AT_ZONE = 2, - FLEET_TURRET_AIM_AND_FIRE_AT_HERO_SHIP = 3, - FLEET_TURRET_DESTROY = 4 - }; float targeting_vector_scratch[4]; float from[4]; Vars347 *turret_vars = (Vars347 *)turret_moby->pvars; @@ -102,7 +105,7 @@ void dreks_fleet_turret_update(struct Moby *turret_moby) { process_dreks_fleet_turret_hits(turret_moby); switch (turret_moby->state) { case FLEET_TURRET_INITIALIZE: - turret_moby->state = 1; + turret_moby->state = FLEET_TURRET_WAIT_FOR_TARGET; turret_vars->f20 = 15.0f; turret_vars->s24 = 0xF; distribute_group_blarg_ships_along_path(turret_moby); @@ -121,13 +124,13 @@ void dreks_fleet_turret_update(struct Moby *turret_moby) { fast_vec_add(from, from, targeting_vector_scratch); from[2] += 0.5f; if (collision_line(targeting_vector_scratch, from, 2, turret_moby, 0) == 0) { - turret_moby->state = 2; + turret_moby->state = FLEET_TURRET_AIM_AND_FIRE_AT_ZONE; } } else if (g->state.current == 0x32) { char *hero_ship_moby = ((char *)g->ship_moby); if (hero_ship_moby != 0 && MOBY(hero_ship_moby)->oclass == 0x563) { if (vector_distance_xy(&turret_moby->pos, &g->motion.pos) < 254.0f) { - turret_moby->state = 3; + turret_moby->state = FLEET_TURRET_AIM_AND_FIRE_AT_HERO_SHIP; } } } @@ -135,7 +138,7 @@ void dreks_fleet_turret_update(struct Moby *turret_moby) { } case FLEET_TURRET_AIM_AND_FIRE_AT_ZONE: { if (hero.unk308 == 0) { - turret_moby->state = 1; + turret_moby->state = FLEET_TURRET_WAIT_FOR_TARGET; } { float j[8]; @@ -205,7 +208,7 @@ void dreks_fleet_turret_update(struct Moby *turret_moby) { struct Hero *g = &hero; if (g->state.current != 0x32 || ((char *)g->ship_moby) == 0 || g->ship_moby->oclass != 0x563) { - turret_moby->state = 1; + turret_moby->state = FLEET_TURRET_WAIT_FOR_TARGET; } else { Aim347 aim; float j[8]; @@ -295,6 +298,9 @@ void dreks_fleet_turret_update(struct Moby *turret_moby) { void process_dreks_fleet_turret_hits(struct Moby *turret_moby) __asm__("FUN_L17_002cbc10"); void process_dreks_fleet_turret_hits(struct Moby *turret_moby) { + enum { + HIT_REACTION_NO_DAMAGE = 1 + }; char *turret_vars; char *hit_animation_state; char *hit_record; @@ -302,7 +308,7 @@ void process_dreks_fleet_turret_hits(struct Moby *turret_moby) { float fv; int depletion_status; turret_vars = ((char *)turret_moby->pvars); - if (turret_moby->state != 0) { + if (turret_moby->state != FLEET_TURRET_INITIALIZE) { fv = 0.0f; hit_record = find_moby_hit(turret_moby, 0x330000, 0); if (hit_record != 0) { @@ -317,14 +323,15 @@ void process_dreks_fleet_turret_hits(struct Moby *turret_moby) { hit_animation_state = turret_vars + 0x60; hit_reaction( turret_moby, hit_record, turret_vars + 0x20, 0, &hit_reaction_status, &fv, 0, 4); - if (hit_reaction_status != 1 && turret_moby->state != 4) { + if (hit_reaction_status != HIT_REACTION_NO_DAMAGE && + turret_moby->state != FLEET_TURRET_DESTROY) { float remaining_value = *(float *)(turret_vars + 0x20) - fv; *(float *)(turret_vars + 0x20) = remaining_value; - depletion_status = 0xB; + depletion_status = FLEET_TURRET_NOT_DEPLETED; if (remaining_value <= 0.0f) - depletion_status = 1; - if (depletion_status == 1) { - turret_moby->state = 4; + depletion_status = FLEET_TURRET_DEPLETED; + if (depletion_status == FLEET_TURRET_DEPLETED) { + turret_moby->state = FLEET_TURRET_DESTROY; turret_moby->flags &= 0xEFFF; } *(unsigned char *)(turret_vars + 0x67) = 0xF0; diff --git a/src/overlays/l17/mobys/dreks_fleet_turret_shot.c b/src/overlays/l17/mobys/dreks_fleet_turret_shot.c index a001886dee..b91db88e7c 100644 --- a/src/overlays/l17/mobys/dreks_fleet_turret_shot.c +++ b/src/overlays/l17/mobys/dreks_fleet_turret_shot.c @@ -224,14 +224,14 @@ void fleet_turret_shot_update(struct Moby *moby) { } } drone_vars->timer_38 = scale_game_frames(0x1E); - moby->state = 1; + moby->state = DRONE_STATE_SPARKS_UNTIL_REMOVAL; return; } } else if (vector_distance_xy(&moby->pos, *(char **)&drone_vars->unk3C + 0x10) > 10.0f) { qcopy(&moby->pos, r + 0x20); drone_vars->timer_38 = scale_game_frames(0x1E); - moby->state = 1; + moby->state = DRONE_STATE_SPARKS_UNTIL_REMOVAL; return; } } diff --git a/src/overlays/l17/mobys/fighter_jet.c b/src/overlays/l17/mobys/fighter_jet.c index f798a14a58..7c16fc8de5 100644 --- a/src/overlays/l17/mobys/fighter_jet.c +++ b/src/overlays/l17/mobys/fighter_jet.c @@ -46,6 +46,17 @@ collision restores the class collision or clears it; -1 leaves that one alone. */ /* Ported from rac1-decomp (src/overlays/l17/mobyutil_00254B40.c: func_L17_00254B40), where it is exact; names translated to the US level program. */ +enum { + FIGHTER_JET_STATE_INITIALIZE = 0, + FIGHTER_JET_STATE_WAIT_FOR_BOARDING = 1, + FIGHTER_JET_STATE_BOARDING_FADE = 2, + FIGHTER_JET_STATE_PILOTED_FLIGHT = 4, + FIGHTER_JET_STATE_DISMOUNT = 5, + FIGHTER_JET_STATE_DEATH_RESPAWN_DELAY = 7, + FIGHTER_JET_STATE_VICTORY_EXIT = 8, + FIGHTER_JET_STATE_FADE_THEN_REMOVE = 9 +}; + typedef struct { char pad0[0x10]; int value; @@ -75,9 +86,12 @@ void set_class_mobys_flags_and_collision(int class_id, int collision) __asm__("FUN_L17_00253a90"); void set_class_mobys_flags_and_collision(int class_id, int flag2, int flag1, int collision) { + enum { + MOBY_STATE_MIN_LIVE = 0 + }; Level17Moby *moby; for (moby = (Level17Moby *)D_L17_0015FFD8; moby <= l17_moby_array_last; moby++) { - if (moby->class_id == class_id && moby->state >= 0) { + if (moby->class_id == class_id && moby->state >= MOBY_STATE_MIN_LIVE) { if (flag2 != -1) { if (flag2 != 0) moby->flags &= ~2; @@ -119,7 +133,7 @@ typedef struct { extern IconEC5D0 l17_fighter_jet_radar_contact_icon_definitions[] __asm__("D_L17_001D9B38"); extern unsigned char frame_size[] __asm__("D_0013E504"); -extern unsigned char D_0015EDB4[4]; +extern unsigned char draw_map51[4] __asm__("D_0015EDB4"); extern void draw_textured_quad(s32, s32, s32, s32, s32, s32, s32, s32, s64, s64) __asm__("func_001F5450"); @@ -152,7 +166,7 @@ void draw_fighter_jet_radar_contact_icon( fast_vec_scale(radar_offset, radar_offset, 0.0714285746f); radar_distance = fast_vec_length(radar_offset); side = 1.0f; - if (D_0015EDB4[0] != 0) { + if (draw_map51[0] != 0) { side = -1.0f; } x = truncate_float_to_s32(side * radar_offset[0]); @@ -922,7 +936,7 @@ void draw_fighter_jet_hud(struct Moby *moby) { if (hero.ship_hp < hero.ship_hp_max / 10.0f && (D_L17_0015F5CC / 90) & 1) { font_print_center_small(0x100, 0x186, 0x80000080L, get_help_message_text(0x5269), 0x64); } - if (moby->state == 8) { + if (moby->state == FIGHTER_JET_STATE_VICTORY_EXIT) { font_print_center_small(0x100, 0xC8, 0x80005080L, get_help_message_text(0x523E), 0x64); } hp_display_step = hero.ship_hp - *(float *)(ship_vars + 0xF0); @@ -1538,7 +1552,7 @@ void update_fighter_jet_flight(FighterJetMoby *ship_moby, FighterJetVars *ship_v 1, -1, 0); - ship_moby->state = 7; + ship_moby->state = FIGHTER_JET_STATE_DEATH_RESPAWN_DELAY; } ship_vars->iDC = D_L17_0016215C; } @@ -1563,7 +1577,7 @@ void update_fighter_jet_flight(FighterJetMoby *ship_moby, FighterJetVars *ship_v -1, 0); ship_vars->s62 = l17_fighter_jet_collision_death_respawn_delay; - ship_moby->state = 7; + ship_moby->state = FIGHTER_JET_STATE_DEATH_RESPAWN_DELAY; ship_moby->flags |= 0x41; } } @@ -1740,16 +1754,6 @@ void fighter_jet_update(ShipMoby *moby) __asm__("FUN_L17_002ed0 /* Moby class 1379 */ void fighter_jet_update(ShipMoby *moby) { - enum { - FIGHTER_JET_STATE_INITIALIZE = 0, - FIGHTER_JET_STATE_WAIT_FOR_BOARDING = 1, - FIGHTER_JET_STATE_BOARDING_FADE = 2, - FIGHTER_JET_STATE_PILOTED_FLIGHT = 4, - FIGHTER_JET_STATE_DISMOUNT = 5, - FIGHTER_JET_STATE_DEATH_RESPAWN_DELAY = 7, - FIGHTER_JET_STATE_VICTORY_EXIT = 8, - FIGHTER_JET_STATE_FADE_THEN_REMOVE = 9 - }; ShipVars *ship_vars; ShipHit *hit; sceVu0FVECTOR dir; @@ -1762,9 +1766,11 @@ void fighter_jet_update(ShipMoby *moby) { if (moby != 0) { ship_vars = (ShipVars *)moby->vars; fast_dec_timer(&ship_vars->timerDC); - if (moby->state != 7 && moby->state != 1 && moby->state != 2) { + if (moby->state != FIGHTER_JET_STATE_DEATH_RESPAWN_DELAY && + moby->state != FIGHTER_JET_STATE_WAIT_FOR_BOARDING && + moby->state != FIGHTER_JET_STATE_BOARDING_FADE) { hit = (ShipHit *)find_moby_hit(moby, 0x30001, 0); - if (hit != 0 && moby->state == 4) { + if (hit != 0 && moby->state == FIGHTER_JET_STATE_PILOTED_FLIGHT) { struct Hero *g = &hero; if (hit->damage < g->ship_hp) { g->ship_hp -= hit->damage; @@ -1799,7 +1805,7 @@ void fighter_jet_update(ShipMoby *moby) { s->shake_frames = scale_game_frames(5); } g->ship_hp = 0.0f; - moby->state = 7; + moby->state = FIGHTER_JET_STATE_DEATH_RESPAWN_DELAY; ship_vars->hit_timer = scale_game_frames(30); g->motion.pos.f[2] += 0.2f; ((ShipCamera *)g->moby)->unk98 = 0; @@ -1837,7 +1843,7 @@ void fighter_jet_update(ShipMoby *moby) { } switch (moby->state) { case FIGHTER_JET_STATE_INITIALIZE: - moby->state = 1; + moby->state = FIGHTER_JET_STATE_WAIT_FOR_BOARDING; ship_vars->b60 = 0; moby->scale = *(float *)(moby->pclass + 0x24); ship_vars->f20 = ship_vars->rot[0]; @@ -1862,7 +1868,7 @@ void fighter_jet_update(ShipMoby *moby) { ship_vars->timerF8 = 1; ship_vars->iE8 = 1; if (moby->bB0 != 0xFF && visited52[moby->bB0 + current_level_index * 16] == 0xFF) { - moby->state = 9; + moby->state = FIGHTER_JET_STATE_FADE_THEN_REMOVE; } if (ship_vars->i11C > 0) { jet_group_state(ship_vars->i11C, 0, 0, 0); @@ -1877,7 +1883,7 @@ void fighter_jet_update(ShipMoby *moby) { FUN_00215130(7, 0x53E4) != 0 && (pad_pressed_words[0] & 0x10); if (board) { remove_help_message_for_selector(7); - moby->state = 2; + moby->state = FIGHTER_JET_STATE_BOARDING_FADE; ship_vars->i124 = -1; } else if (ship_vars->fade != 0.0f) { FUN_00213ed8(&ship_vars->fade, 0.0f, frame_time * 4.0f); @@ -1948,7 +1954,7 @@ void fighter_jet_update(ShipMoby *moby) { jet_camera_mode(); D_L17_0015F608 = 2; update_fighter_jet_flight((FighterJetMoby *)moby, (FighterJetVars *)ship_vars); - moby->state = 4; + moby->state = FIGHTER_JET_STATE_PILOTED_FLIGHT; } break; case FIGHTER_JET_STATE_PILOTED_FLIGHT: @@ -1962,7 +1968,7 @@ void fighter_jet_update(ShipMoby *moby) { update_fighter_jet_flight((FighterJetMoby *)moby, (FighterJetVars *)ship_vars); if (ship_vars->iE8 <= 0) { ship_vars->timerF8 = D_L17_00162178; - moby->state = 8; + moby->state = FIGHTER_JET_STATE_VICTORY_EXIT; } if (ship_vars->fade != 0.0f) { FUN_00213ed8(&ship_vars->fade, 0.0f, frame_time * 4.0f); @@ -1971,7 +1977,7 @@ void fighter_jet_update(ShipMoby *moby) { { struct Hero *g = &hero; if (g->ship_flags & 1) { - moby->state = 5; + moby->state = FIGHTER_JET_STATE_DISMOUNT; } } break; @@ -2006,7 +2012,7 @@ void fighter_jet_update(ShipMoby *moby) { } } ship_vars->voice2 = -1; - moby->state = 1; + moby->state = FIGHTER_JET_STATE_WAIT_FOR_BOARDING; ship_vars->fade = 0.99f; fighter_jet_transition_fade_value = 0.99f; break; @@ -2040,7 +2046,7 @@ void fighter_jet_update(ShipMoby *moby) { } } ship_vars->voice2 = -1; - moby->state = 0; + moby->state = FIGHTER_JET_STATE_INITIALIZE; } break; case FIGHTER_JET_STATE_VICTORY_EXIT: @@ -2102,7 +2108,7 @@ void fighter_jet_update(ShipMoby *moby) { } ship_vars->voice2 = -1; jet_reset_camera((&hero.motion.pos), &hero.motion.rot); - moby->state = 9; + moby->state = FIGHTER_JET_STATE_FADE_THEN_REMOVE; } break; case 10: @@ -2134,11 +2140,11 @@ void fighter_jet_update(ShipMoby *moby) { if (moby->pos[2] > 1008.0f) { moby->pos[2] = 1008.0f; } - if (moby->state == 4) { + if (moby->state == FIGHTER_JET_STATE_PILOTED_FLIGHT) { qcopy_nc((&hero.motion.pos), moby->pos); qcopy_nc(&hero.motion.rot, ship_vars->rot); } - if (moby->state == 3 || moby->state == 4) { + if (moby->state == 3 || moby->state == FIGHTER_JET_STATE_PILOTED_FLIGHT) { emit_type_74_particles_from_moby_joints(moby, ship_vars); } } diff --git a/src/overlays/l17/mobys/fleet_backdrop.c b/src/overlays/l17/mobys/fleet_backdrop.c index bd24afcde9..645dc7b6a2 100644 --- a/src/overlays/l17/mobys/fleet_backdrop.c +++ b/src/overlays/l17/mobys/fleet_backdrop.c @@ -198,6 +198,10 @@ void fleet_backdrop_animation_update(struct Moby *moby) __asm__("FUN_L17_002f384 /* Moby class 1772 */ void fleet_backdrop_animation_update(struct Moby *moby) { + enum { + FLEET_BACKDROP_STATE_UNINITIALIZED = 0, + FLEET_BACKDROP_STATE_INITIALIZED = 1 + }; FleetBackdropAnimationVars *moby_pvars = (FleetBackdropAnimationVars *)moby->pvars; float offset_accumulator[4]; float pvar_angle_offset[4]; @@ -215,8 +219,8 @@ void fleet_backdrop_animation_update(struct Moby *moby) { D_L17_0015F638 = 10.0f; } done: - if (moby->state == 0) { - moby->state = 1; + if (moby->state == FLEET_BACKDROP_STATE_UNINITIALIZED) { + moby->state = FLEET_BACKDROP_STATE_INITIALIZED; for (i = 0; i < 5; i++) { backdrop_quad_uv_rotation_angles[i] = (float)i * 25.0f; } diff --git a/src/overlays/l17/mobys/fleet_beam.c b/src/overlays/l17/mobys/fleet_beam.c index 9997480e9c..f34bce0c39 100644 --- a/src/overlays/l17/mobys/fleet_beam.c +++ b/src/overlays/l17/mobys/fleet_beam.c @@ -127,14 +127,14 @@ void fleet_beam_update(struct Moby *beam_moby) { qcopy(beam_vars, &beam_moby->pos); beam_vars->unk54 = beam_vars->unk48 * frame_time / fast_vec_dist(beam_vars, D_L17_001600EC + (k << 7) + 0x30); - beam_moby->state = 2; + beam_moby->state = BEAM_UPDATE_OSCILLATING; } else if ((j = beam_vars->unk68) != -1) { qcopy(beam_vars, &beam_moby->pos); beam_vars->unk54 = beam_vars->unk48 * frame_time / fast_vec_dist(beam_vars, D_L17_0015FFD0[2] + (j << 8) + 0x10); - beam_moby->state = 2; + beam_moby->state = BEAM_UPDATE_OSCILLATING; } else { - beam_moby->state = 1; + beam_moby->state = BEAM_UPDATE_STATIONARY; } beam_vars->unk60 = 0; beam_vars->unk4C = 0.1f; diff --git a/src/overlays/l17/mobys/fleet_rotating_radial_effect.c b/src/overlays/l17/mobys/fleet_rotating_radial_effect.c index 0eab6686d2..3a4cf96b60 100644 --- a/src/overlays/l17/mobys/fleet_rotating_radial_effect.c +++ b/src/overlays/l17/mobys/fleet_rotating_radial_effect.c @@ -86,7 +86,7 @@ void fleet_rotating_radial_effect_update(char *moby) { switch (MOBY(moby)->state) { case RING_INITIALIZE: MOBY(moby)->update_dist = 0xFF; - MOBY(moby)->state = 1; + MOBY(moby)->state = RING_ROTATE_AND_DRAW; ring_vars[1] = ring_vars[0] * *(float *)&fleet_radial_rotation_rate_degrees_factor * DEG_TO_RAD * frame_time; break; diff --git a/src/overlays/l17/mobys/floating_mine.c b/src/overlays/l17/mobys/floating_mine.c index 2a8eb24d0c..73f4ff0479 100644 --- a/src/overlays/l17/mobys/floating_mine.c +++ b/src/overlays/l17/mobys/floating_mine.c @@ -41,7 +41,7 @@ extern void spawn_explosion(void *, int, int, int) __asm__("FUN_L00_0025e450"); -extern short D_L17_00161D2C __attribute__((sda)); +extern short l17_bobbing_vertical_amplitude __asm__("D_L17_00161D2C") __attribute__((sda)); extern short fleet_bobbing_phase_rate_degrees __asm__("D_L17_00161D30") __attribute__((sda)); extern void update_moby_vertical_oscillation(float, float, char *, float *, float *) __asm__("FUN_L00_00262b00"); extern int func_L00_001F2BE8_alt(float, void *, int, void *, void *) __asm__("FUN_L00_001f2868"); @@ -97,10 +97,10 @@ void floating_mine_update(struct Moby *moby) { case BOBBING_INITIALIZE: *(float *)(bobbing_moby_vars + 0x60) = random_angle_radians(); *(int *)(bobbing_moby_vars + 0x64) = 0; - moby->state = 1; + moby->state = BOBBING_UPDATE_AND_CHECK_CONTACT; break; case BOBBING_UPDATE_AND_CHECK_CONTACT: - update_moby_vertical_oscillation(*(float *)&D_L17_00161D2C, + update_moby_vertical_oscillation(*(float *)&l17_bobbing_vertical_amplitude, *(float *)&fleet_bobbing_phase_rate_degrees * DEG_TO_RAD * frame_time, moby, diff --git a/src/overlays/l17/mobys/magnet_elevator.c b/src/overlays/l17/mobys/magnet_elevator.c index ee79a9c41a..2dd13bf6ec 100644 --- a/src/overlays/l17/mobys/magnet_elevator.c +++ b/src/overlays/l17/mobys/magnet_elevator.c @@ -121,23 +121,24 @@ void magnet_elevator_update(struct Moby *moby) { frame_time_sq * 4.0f, frame_time * 4.0f); if ((*(float *)((char *)(state) + (0x70))) < 1.0f) { - float t = (1.0f - (*(float *)((char *)(state) + (0x70)))) / - (1.0f - previous_camera_blend_progress); + float remaining_camera_blend_ratio = (1.0f - (*(float *)((char *)(state) + (0x70)))) / + (1.0f - previous_camera_blend_progress); char *camera_pose_base; FUN_L17_002ee9c0_c(moby, (char *)camera_position, (char *)camera_rotation); fast_vec_sub(camera_position_offset, D_L17_001676C0, camera_position); camera_pose_base = D_L17_001676C0 - 0x140; - fast_vec_scale(camera_position_offset, camera_position_offset, t); + fast_vec_scale( + camera_position_offset, camera_position_offset, remaining_camera_blend_ratio); fast_vec_add(camera_position, camera_position, camera_position_offset); camera_rotation[1] = fast_add_rotations( fast_subtract_rotations((*(float *)((char *)(camera_pose_base) + (0x154))), camera_rotation[1]) * - t, + remaining_camera_blend_ratio, camera_rotation[1]); camera_rotation[2] = fast_add_rotations( fast_subtract_rotations((*(float *)((char *)(camera_pose_base) + (0x158))), camera_rotation[2]) * - t, + remaining_camera_blend_ratio, camera_rotation[2]); set_camera_position(camera_position); set_camera_rotation(camera_rotation); @@ -225,8 +226,8 @@ void magnet_elevator_update(struct Moby *moby) { i = 0x20; } { - int t = (i << 8) | 0x80000000; - W(moby, 0x90) = (i << 16) | t | i; + int pulse_color_green_alpha_bits = (i << 8) | 0x80000000; + W(moby, 0x90) = (i << 16) | pulse_color_green_alpha_bits | i; } hero_state = (char *)((char *)&hero); if (H(hero_state, 0x308) != 0 || W(state, 0x7C) == 0) { diff --git a/src/overlays/l17/mobys/robot_dog.c b/src/overlays/l17/mobys/robot_dog.c index aa7f563bf9..0da5e116c7 100644 --- a/src/overlays/l17/mobys/robot_dog.c +++ b/src/overlays/l17/mobys/robot_dog.c @@ -147,6 +147,10 @@ void robot_dog_update(unsigned char *m) __asm__("FUN_L17_002eeb68"); /* Moby classes 573, 1382 */ void robot_dog_update(unsigned char *robot_dog_moby) { + enum { + ROBOT_DOG_DETECTION_LINE_BLOCKED = 0, + ROBOT_DOG_DETECTION_CLEAR_LINE_IN_FACING_CONE = 2 + }; Vars1382 *robot_dog_vars; struct Moby *facing_target_moby; int clip_volume_suppressed; @@ -222,7 +226,8 @@ void robot_dog_update(unsigned char *robot_dog_moby) { } break; case ROBOT_DOG_STATE_WAIT_FOR_DETECTION_TRIGGER: - if (robot_dog_vars->mode != 0 && random_integer_below(0x1F) == 0) { + if (robot_dog_vars->mode != ROBOT_DOG_DETECTION_LINE_BLOCKED && + random_integer_below(0x1F) == 0) { robot_dog_moby[0x20] = 2; if (robot_dog_moby[0x53] != 1) { blend_moby_animation(robot_dog_moby, 1, 0, scale_game_frames(10)); @@ -285,7 +290,7 @@ void robot_dog_update(unsigned char *robot_dog_moby) { } MOBY(robot_dog_moby)->anim_speed = 1.7f; mode = robot_dog_vars->mode; - if (mode == 2 && + if (mode == ROBOT_DOG_DETECTION_CLEAR_LINE_IN_FACING_CONE && (fast_dec_timer_s16(&robot_dog_vars->t1E2) || D_0013E533[0x2EC1] != 3)) { if (random_integer_below(3) == 0) { if (robot_dog_moby[0x53] != mode) { @@ -302,7 +307,8 @@ void robot_dog_update(unsigned char *robot_dog_moby) { blend_moby_animation(robot_dog_moby, 7, 0, scale_game_frames(10)); } } - } else if (robot_dog_vars->t1E0 == 0 && robot_dog_vars->mode == 0) { + } else if (robot_dog_vars->t1E0 == 0 && + robot_dog_vars->mode == ROBOT_DOG_DETECTION_LINE_BLOCKED) { robot_dog_moby[0x20] = 3; if (robot_dog_moby[0x53] != 0) { clip_volume_id_or_animation_value = random_integer_below( @@ -615,7 +621,7 @@ void update_robot_dog_hit_reaction_and_target_detection(void *moby_v, int clip_v float target_heading; moby_vars = moby->data; - if (moby->state == 0) { + if (moby->state == ROBOT_DOG_STATE_INITIALIZE) { return; } if (moby_vars->i38 != 0) { @@ -626,7 +632,7 @@ void update_robot_dog_hit_reaction_and_target_detection(void *moby_v, int clip_v y = 0; hit_record = (Hit_2F1558 *)find_moby_hit(moby, 0x330000, 0); hit_reaction(moby, hit_record, &moby_vars->f20, 0, &x, &y, 0, 4); - if (x != 1 && moby->state != 15) { + if (x != 1 && moby->state != ROBOT_DOG_STATE_FALL_THEN_REMOVE) { moby_vars->f20 -= y; moby_vars->f130 = frame_time_sq * 42.0f; moby_vars->f134 = frame_time_sq * 24.0f; @@ -644,7 +650,7 @@ void update_robot_dog_hit_reaction_and_target_detection(void *moby_v, int clip_v fast_arc_tan(moby_vars->f1F0 - moby->pos[0], moby_vars->f1F4 - moby->pos[1]); } trooper_start_knockback(knockback_heading, moby, moby_vars->v120, 0xB, 1, 0); - moby->state = 15; + moby->state = ROBOT_DOG_STATE_FALL_THEN_REMOVE; moby_vars->b117 = 0xF0; trooper_anim_update(moby, moby_vars->h110); } @@ -710,9 +716,9 @@ int enemy_stun_update(struct Moby *moby) __asm__("FUN_L17_002efea8"); int enemy_stun_update(struct Moby *moby) { int suction_status = process_moby_suck_cannon_suction(moby); if (suction_status) { - moby->state = 12; - } else if (moby->state == 12) { - moby->state = 6; + moby->state = ROBOT_DOG_STATE_RECOVER_THEN_REINITIALIZE; + } else if (moby->state == ROBOT_DOG_STATE_RECOVER_THEN_REINITIALIZE) { + moby->state = ROBOT_DOG_STATE_WAIT_FOR_CHASE_TRIGGER; if (moby->prev_seq != 7) { int animation_blend_frames = scale_game_frames(10); blend_moby_animation(moby, 7, 0, animation_blend_frames); @@ -727,7 +733,7 @@ int cancel_suck_cannon_suction_and_set_state_12(struct Moby *moby) __asm__("FUN_ int cancel_suck_cannon_suction_and_set_state_12(struct Moby *moby) { int helper_result = cancel_suck_cannon_suction(moby); - moby->state = 0xc; + moby->state = ROBOT_DOG_STATE_RECOVER_THEN_REINITIALIZE; return helper_result; } @@ -783,6 +789,11 @@ extern int fast_tween_color(int, int, float) __asm__("FUN_001fa6e0"); void draw_three_moby_effect_quads(struct Moby *effect_owner) __asm__("FUN_L17_002f0448"); void update_robot_dog_glow_effects(struct Moby *moby) { + enum { + ROBOT_DOG_GLOW_MODE_SLOW_PULSE = 0, + ROBOT_DOG_GLOW_MODE_MEDIUM_PULSE = 1, + ROBOT_DOG_GLOW_MODE_FAST_PULSE = 2 + }; char *robot_dog_glow_vars; int glow_pulse_period_frames; int alpha; @@ -808,12 +819,12 @@ void update_robot_dog_glow_effects(struct Moby *moby) { robot_dog_glow_vars = (char *)moby->pvars; glow_pulse_period_frames = scale_game_frames(glow_pulse_period_frames); alpha = 0x80; - mode = 0; + mode = ROBOT_DOG_GLOW_MODE_SLOW_PULSE; switch (moby->state) { case ROBOT_DOG_STATE_FALL_UNTIL_LANDING: case ROBOT_DOG_STATE_TRACK_TARGET_FACING: case ROBOT_DOG_STATE_WAIT_FOR_CHASE_TRIGGER: - mode = 1; + mode = ROBOT_DOG_GLOW_MODE_MEDIUM_PULSE; break; case ROBOT_DOG_STATE_WAIT_FOR_CHASE_TRIGGER_FAST_PULSE: case ROBOT_DOG_STATE_TURN_TOWARD_TARGET: @@ -823,16 +834,16 @@ void update_robot_dog_glow_effects(struct Moby *moby) { case 13: case 14: case ROBOT_DOG_STATE_FALL_THEN_REMOVE: - mode = 2; + mode = ROBOT_DOG_GLOW_MODE_FAST_PULSE; break; case ROBOT_DOG_STATE_RECOVER_THEN_REINITIALIZE: mode = -1; break; } - if (mode >= 0) { - if (mode == 2) { + if (mode >= ROBOT_DOG_GLOW_MODE_SLOW_PULSE) { + if (mode == ROBOT_DOG_GLOW_MODE_FAST_PULSE) { glow_pulse_period_frames = scale_game_frames(0x32); - } else if (mode == 1) { + } else if (mode == ROBOT_DOG_GLOW_MODE_MEDIUM_PULSE) { glow_pulse_period_frames = scale_game_frames(0x5A); } glow_pulse_sine = fast_sin(((float)(D_L17_0015F5CC % glow_pulse_period_frames) / @@ -851,9 +862,9 @@ void update_robot_dog_glow_effects(struct Moby *moby) { if (g > 255) { g = 255; } - if (mode == 2) { + if (mode == ROBOT_DOG_GLOW_MODE_FAST_PULSE) { color = (alpha << 24) | (b << 16) | ((r / 2) << 8) | g; - } else if (mode != 0) { + } else if (mode != ROBOT_DOG_GLOW_MODE_SLOW_PULSE) { color = (alpha << 24) | (b << 16) | ((r / 2) << 8) | g; } else { color = (alpha << 24) | (b << 16) | (g << 8) | r; diff --git a/src/overlays/l17/mobys/shattering_prop.c b/src/overlays/l17/mobys/shattering_prop.c index 1a5501b362..038e018f7d 100644 --- a/src/overlays/l17/mobys/shattering_prop.c +++ b/src/overlays/l17/mobys/shattering_prop.c @@ -25,13 +25,13 @@ void shattering_prop_update(struct Moby *moby) { char *hit_result = find_moby_hit(moby, 0x10000, 0); switch (moby->state) { case HIT_EFFECT_INITIALIZE: - moby->state = 1; + moby->state = HIT_EFFECT_WAIT_FOR_HIT; break; case HIT_EFFECT_WAIT_FOR_HIT: if (hit_result && *(float *)(hit_result + 0x2C) > 0.0f) flag = 1; if (flag) - moby->state = 2; + moby->state = HIT_EFFECT_EMIT_AND_REMOVE; break; case HIT_EFFECT_EMIT_AND_REMOVE: FUN_0022da68(0, 0, (int)moby); diff --git a/src/overlays/l17/mobys/shuttle.c b/src/overlays/l17/mobys/shuttle.c index 728fc93cd7..3726490b18 100644 --- a/src/overlays/l17/mobys/shuttle.c +++ b/src/overlays/l17/mobys/shuttle.c @@ -142,7 +142,7 @@ void shuttle_update(struct Moby *shuttle_moby) { shuttle_moby->update_dist = 0xFF; shuttle_moby->draw_dist = 0x80; shuttle_moby->spawn_frame = *(long *)(((char *)hero.moby) + 0x38); - shuttle_moby->state = 1; + shuttle_moby->state = SHUTTLE_STATE_WAIT_FOR_ACTIVATION; if (shuttle_moby->prev_seq != 2) { blend_moby_animation(shuttle_moby, 2, 0, 0); } @@ -196,7 +196,7 @@ void shuttle_update(struct Moby *shuttle_moby) { if (shuttle_vars->go != 0) { shuttle_vars->go = 0; remove_help_message_for_selector(10); - shuttle_moby->state = 2; + shuttle_moby->state = SHUTTLE_STATE_TRAVEL; allocate_voice_for_target_entry(2, 0, (int)shuttle_moby); if (shuttle_moby->prev_seq != 0) { blend_moby_animation(shuttle_moby, 0, 0, 0); @@ -247,7 +247,7 @@ void shuttle_update(struct Moby *shuttle_moby) { if (update_shuttle_travel_and_camera(shuttle_moby, shuttle_vars->side)) { int ofs; int base; - shuttle_moby->state = 3; + shuttle_moby->state = SHUTTLE_STATE_RESET_AFTER_TRAVEL; shuttle_vars->wA4 = 0; ofs = shuttle_vars->cam[shuttle_vars->sel] << 7; base = (int)D_L17_001600EC; @@ -271,7 +271,7 @@ void shuttle_update(struct Moby *shuttle_moby) { } break; case SHUTTLE_STATE_RESET_AFTER_TRAVEL: - shuttle_moby->state = 1; + shuttle_moby->state = SHUTTLE_STATE_WAIT_FOR_ACTIVATION; if (shuttle_moby->prev_seq != 2) { blend_moby_animation(shuttle_moby, 2, 0, scale_game_frames(30)); } diff --git a/src/overlays/l18/hero/apply_hero_ground_type_effects.c b/src/overlays/l18/hero/apply_hero_ground_type_effects.c index ef7f6823d0..0d6dc5733e 100644 --- a/src/overlays/l18/hero/apply_hero_ground_type_effects.c +++ b/src/overlays/l18/hero/apply_hero_ground_type_effects.c @@ -21,6 +21,11 @@ float absolute_float(float input) __asm__("func_001F99C0"); void apply_hero_ground_type_effects(void) __asm__("FUN_L18_00213b40"); void apply_hero_ground_type_effects(void) { + enum { + GROUND_TYPE_WATER = 0, + GROUND_TYPE_MAGNETIC = 2, + GROUND_TYPE_SHALLOW_WATER = 0xE + }; struct Hero *hero_state = &hero; int keep = hero_state->ground_sound_class; int saved_ground_type = hero_state->ground_type; @@ -32,23 +37,23 @@ void apply_hero_ground_type_effects(void) { hero_state->unk308 = 0; if (saved_ground_type == -1) return; - if (saved_ground_type == 2) { + if (saved_ground_type == GROUND_TYPE_MAGNETIC) { if (hero_state->frames_off_ground.s == 0 || hero_state->ground_distance < 0.3f) { hero_state->on_magnet_ground = 1; - if (hero_state->vehicle_mode == 0) { + if (hero_state->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { char *item_moby = ((char *)hero_state->items[1].moby); if (item_moby != 0 && MOBY(item_moby)->oclass == 0xAD) hero_state->unk308 = 1; } } } - if (saved_ground_type == 0xE) { + if (saved_ground_type == GROUND_TYPE_SHALLOW_WATER) { struct Hero *q = &hero; *(char *)&q->base_condition = 1; q->water_depth = 0.2f; q->water_surface_z = q->ground_z.f + 0.2f; } - if (saved_ground_type == 0) { + if (saved_ground_type == GROUND_TYPE_WATER) { struct Hero *q = &hero; float water_depth = q->water_surface_z - q->ground_z.f; q->water_depth = water_depth; @@ -82,7 +87,7 @@ void apply_hero_ground_type_effects(void) { struct Hero *q = &hero; *(char *)&q->selector_11 = 1; } - if (saved_ground_type == 0x2) { + if (saved_ground_type == GROUND_TYPE_MAGNETIC) { struct Hero *q = &hero; *(char *)&q->on_magnet_ground = 1; } @@ -209,7 +214,7 @@ s32 process_hero_hurt_response(s32 apply_hurt_response) { if (response_record->p34 != hero_moby_bytes) { return 0; } - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { if (!(response_record->i24 & 2)) { return 0; } @@ -223,7 +228,7 @@ s32 process_hero_hurt_response(s32 apply_hurt_response) { hero.unk5BE = 1; return 0; } - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { hero.vehicle_hp -= truncate_float_to_s32(response_record->f2C); if (hero.vehicle_hp < 0) { hero.vehicle_hp = 0; diff --git a/src/overlays/l18/hero/hero_set_state.c b/src/overlays/l18/hero/hero_set_state.c index 5bc1be4005..27c60c892c 100644 --- a/src/overlays/l18/hero/hero_set_state.c +++ b/src/overlays/l18/hero/hero_set_state.c @@ -69,14 +69,15 @@ extern int hero_set_state(int, int) __asm__("FUN_L18_00227dd0"); extern char hero_trail_jump_velocity_key_profile[] __asm__("D_L18_0017C920"); extern char hero_water_surface_jump_velocity_key_profile[] __asm__("D_L18_0017C960"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int b) { int previous_state_step; char *moby; int old20A7; float grind_direction_or_jump_probe_position[4]; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || b != 2)) return 0; } if ((D_L18_0015F5C4 == 2 || D_L18_0015F5C4 == 6) && b != 2) @@ -84,8 +85,16 @@ int hero_set_state(int a, int b) { { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -98,11 +107,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -123,14 +132,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { set_hero_state_for_vehicle_mode(); return 1; } @@ -569,14 +578,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); if (b) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation( p->state.step + 3, D_L18_0015F6D8[p->state.step], (float)scale_game_frames(8)); } @@ -917,7 +926,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -1002,7 +1011,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; diff --git a/src/overlays/l18/hero/process_hero_state_transitions.c b/src/overlays/l18/hero/process_hero_state_transitions.c index 241f03906e..5166d486a4 100644 --- a/src/overlays/l18/hero/process_hero_state_transitions.c +++ b/src/overlays/l18/hero/process_hero_state_transitions.c @@ -196,9 +196,11 @@ void process_hero_state_transitions(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && hero_triangle_hud_activation_inhibit == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.vehicle_mode == 0 || hero.vehicle_mode == 3)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0) && + (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT || hero.vehicle_mode == 3)) { int id; if (hero.quick_swap_tap_window != 0) { @@ -261,7 +263,7 @@ void process_hero_state_transitions(void) { } } if (D_L18_0015F638 > hero.motion.pos.f[2] && hero.ground_distance > 2.0f && - hero.vehicle_mode != 2 && hero.state.current != 0x77) { + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { switch (hero.state.current) { @@ -664,7 +666,7 @@ void process_hero_state_transitions(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { @@ -691,7 +693,7 @@ void process_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { set_hero_state_for_vehicle_mode(); break; } @@ -949,7 +951,8 @@ void process_hero_state_transitions(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -2749,7 +2752,7 @@ void process_hero_state_transitions(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (((unsigned char *)hero.moby)[0x53] != 0xD) { diff --git a/src/overlays/l18/hero/update_hero_motion_for_current_state.c b/src/overlays/l18/hero/update_hero_motion_for_current_state.c index 95501585d6..a7dea1b0d9 100644 --- a/src/overlays/l18/hero/update_hero_motion_for_current_state.c +++ b/src/overlays/l18/hero/update_hero_motion_for_current_state.c @@ -138,7 +138,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void adjust_hero_planar_velocity_from_probes(s32) __asm__("FUN_L15_0020a328"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -166,7 +166,7 @@ extern void moby_point_position(struct MobyView *, s32, void *) __asm__("FUN_L00 extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void FUN_L18_002123f0(f32, f32); @@ -217,7 +217,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L18_0017C7B8; extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); extern s32 is_moby_in_class_range_500_to_540(s32) __asm__("FUN_L00_0025e3b8"); @@ -392,10 +392,10 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -406,11 +406,11 @@ void update_hero_motion_for_current_state(void) { } else { adjust_hero_planar_velocity_from_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -682,8 +682,8 @@ void update_hero_motion_for_current_state(void) { build_spherical_offset( &hero.motion.velocity, hero.ground_speed, hero.motion.rot.f[2], yaw); } else if (hero.state.current == 0x33) { - f32 sp = - hero.ground_speed * FUN_L00_00209018(hero_swim_speed_scale_data, 0x1E) * 5.0f; + f32 sp = hero.ground_speed * + vector_length_xyz_cf(hero_swim_speed_scale_data, 0x1E) * 5.0f; if (hero.state.prev == 0x35 && scale_game_frames(15) > hero.state_timer) { if (sp < frame_time * 4.5f) { sp = frame_time * 4.5f; @@ -814,8 +814,8 @@ void update_hero_motion_for_current_state(void) { } speed_step(frame_time_sq * 4.0f, frame_time_sq * 5.0f); { - f32 sp = - hero.ground_speed * FUN_L00_00209018(hero_swim_speed_scale_data, 0x1E) * 5.5f; + f32 sp = hero.ground_speed * + vector_length_xyz_cf(hero_swim_speed_scale_data, 0x1E) * 5.5f; hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[2] = 0.0f; @@ -872,11 +872,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && ((struct MobyView *)hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -895,11 +896,12 @@ void update_hero_motion_for_current_state(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if ((struct MobyView *)hero.grapple_target != NULL) { hero.motion.move_yaw = @@ -1076,13 +1078,13 @@ void update_hero_motion_for_current_state(void) { &((struct MobyView *)hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&position_or_displacement_scratch, &hero.motion.pos, &((struct MobyView *)hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1207,7 +1209,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } @@ -1306,7 +1309,8 @@ void update_hero_motion_for_current_state(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (window_end < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1352,7 +1356,7 @@ void update_hero_motion_for_current_state(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1368,10 +1372,11 @@ void update_hero_motion_for_current_state(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1394,11 +1399,11 @@ void update_hero_motion_for_current_state(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { off = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { off = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1443,7 +1448,7 @@ void update_hero_motion_for_current_state(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || (struct MobyView *)hero.melee_target != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1453,7 +1458,8 @@ void update_hero_motion_for_current_state(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1467,10 +1473,11 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -1584,11 +1591,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_planar_velocity_from_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1646,10 +1654,11 @@ void update_hero_motion_for_current_state(void) { hero.air_frames.s = 0; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1743,11 +1752,12 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2312,7 +2322,7 @@ void update_hero_motion_for_current_state(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2349,7 +2359,8 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2366,7 +2377,8 @@ void update_hero_motion_for_current_state(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2410,7 +2422,7 @@ void update_hero_motion_for_current_state(void) { adjust_hero_planar_velocity_from_probes(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2455,7 +2467,7 @@ void update_hero_motion_for_current_state(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2559,9 +2571,9 @@ void update_hero_motion_for_current_state(void) { } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { qcopy(&general_vector_or_hit_descriptor_scratch, &hero.motion.pos); - FUN_L00_00233810(&general_vector_or_hit_descriptor_scratch, - &general_vector_or_hit_descriptor_scratch, - 0.5f); + add_hero_up_offset(&general_vector_or_hit_descriptor_scratch, + &general_vector_or_hit_descriptor_scratch, + 0.5f); qcopy(&v10, &general_vector_or_hit_descriptor_scratch); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; v10.f[1] += fast_sin(hero.motion.rot.f[2]) * 0.85f; @@ -2599,7 +2611,7 @@ void update_hero_motion_for_current_state(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { @@ -2649,7 +2661,7 @@ void update_hero_motion_for_current_state(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { @@ -2672,7 +2684,7 @@ void update_hero_motion_for_current_state(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = D_0015ED6C_a * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = D_0015ED6C_a * 0.9f; } } else { @@ -2683,29 +2695,30 @@ void update_hero_motion_for_current_state(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_planar_velocity_from_probes(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2719,11 +2732,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); adjust_hero_planar_velocity_from_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -2753,11 +2767,12 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); adjust_hero_planar_velocity_from_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_2_REPEATABLE_SQUARE_ACTION: @@ -2861,10 +2876,11 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_planar_velocity_from_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -2886,11 +2902,12 @@ void update_hero_motion_for_current_state(void) { } } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_WAIT_FOR_CIRCLE_RELEASE_AND_ANIMATION: { @@ -2924,11 +2941,12 @@ void update_hero_motion_for_current_state(void) { } } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2948,7 +2966,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); if (hero.motion.velocity.f[2] < frame_time * -10.0f) { hero.motion.velocity.f[2] = frame_time * -10.0f; } @@ -3016,11 +3035,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_planar_velocity_from_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3035,10 +3055,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } @@ -3053,18 +3073,19 @@ void update_hero_motion_for_current_state(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); adjust_hero_planar_velocity_from_probes(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; air_accel(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -3072,7 +3093,8 @@ void update_hero_motion_for_current_state(void) { if (hero.move_lock_timer == 0) { hero_update_hop_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -3101,11 +3123,12 @@ void update_hero_motion_for_current_state(void) { } adjust_hero_planar_velocity_from_probes(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3120,10 +3143,10 @@ void update_hero_motion_for_current_state(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/l18/level_class_tables.c b/src/overlays/l18/level_class_tables.c index ab29117b6e..f1ba4a4162 100644 --- a/src/overlays/l18/level_class_tables.c +++ b/src/overlays/l18/level_class_tables.c @@ -19,6 +19,9 @@ #include "rnc/overlay/shared/vehicles.h" #include "rnc/overlay/shared/vendor.h" #include "rnc/overlay/shared/weapons.h" + +s32 get_morphoray_chicken_slot_record(s32) __asm__("FUN_L00_002caf40"); + #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" #include "rnc/overlay/shared/weapons/devastator.h" #include "rnc/overlay/shared/weapons/mine.h" @@ -52,7 +55,7 @@ void *D_L18_001F3480[6] moby_set_state_from_check, launch_suck_cannon_projectile_and_update_moby_state, cancel_suck_cannon_suction_and_set_moby_state_5, - FUN_L00_002caf40, + get_morphoray_chicken_slot_record, hud_counter_update}; void *D_L18_001F3498[6] __attribute__((section("lvl.vtbl"))) = {update_moby_state_pause, diff --git a/src/overlays/l18/mobys/camera_transition.c b/src/overlays/l18/mobys/camera_transition.c index d83d568499..5b640a2a81 100644 --- a/src/overlays/l18/mobys/camera_transition.c +++ b/src/overlays/l18/mobys/camera_transition.c @@ -21,6 +21,11 @@ #include "rnc/math/interpolation/advance_accelerated_scalar.h" #include "rnc/overlay/shared/camera/scripted_camera.h" +enum { + CAMERA_TRANSITION_STATE_PRE_TRANSITION_RAMP_UP = 2, + CAMERA_TRANSITION_STATE_INTERPOLATE_TRANSITION = 3 +}; + extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern int help_request(int, int) __asm__("FUN_L00_00203908"); @@ -72,11 +77,14 @@ void boss_camera_transition_update(struct Moby *moby) { STATE_INTERPOLATE_TRANSITION_WITH_RAMP_UP = 4, STATE_POST_TRANSITION_RAMP_DOWN = 5 }; + enum { + STATE_IDLE = 1 + }; BossCameraTransitionVars *transition_private_vars = (BossCameraTransitionVars *)moby->pvars; float transition_scratch_vectors[12]; switch (moby->state) { case STATE_INITIALIZE: - moby->state = 1; + moby->state = STATE_IDLE; moby->update_dist = 0xFF; break; case STATE_PRE_TRANSITION_RAMP_UP: @@ -97,9 +105,9 @@ void boss_camera_transition_update(struct Moby *moby) { transition_private_vars, &transition_private_vars->unk20, 1, 0, 0); if (transition_private_vars->unk78 == 1) { help_request(0x4650, 0x85); - moby->state = 4; + moby->state = STATE_INTERPOLATE_TRANSITION_WITH_RAMP_UP; } else { - moby->state = 3; + moby->state = STATE_INTERPOLATE_TRANSITION; } } } @@ -142,7 +150,7 @@ void boss_camera_transition_update(struct Moby *moby) { FUN_L00_00216f90_q( &transition_private_vars->unk40, transition_scratch_vectors + 8, 0, 0); jet_end_mount(2); - moby->state = 5; + moby->state = STATE_POST_TRANSITION_RAMP_DOWN; } else if (*(int *)(camera_secondary_mode_lui) != 0x72) { clear_u64_value(transition_scratch_vectors + 8); transition_scratch_vectors[10] = transition_private_vars->unk4C; @@ -193,7 +201,7 @@ void boss_camera_transition_update(struct Moby *moby) { FUN_L00_00216f90_q( &transition_private_vars->unk40, transition_scratch_vectors + 8, 0, 0); jet_end_mount(3); - moby->state = 5; + moby->state = STATE_POST_TRANSITION_RAMP_DOWN; } } else if (*(int *)(camera_secondary_mode_lui) != 0x72) { clear_u64_value(transition_scratch_vectors + 8); @@ -211,7 +219,7 @@ void boss_camera_transition_update(struct Moby *moby) { approach_value(&transition_private_vars->unk6C, 0.0f, (*(float *)&frame_time) * 4.0f); D_L18_0015F3FC_d = transition_private_vars->unk6C; } else { - moby->state = 1; + moby->state = STATE_IDLE; } break; } @@ -252,7 +260,7 @@ void start_camera_transition(struct Moby *moby, qcopy(&position_rotation_transition_vars->unk20, transition_start_rotation); qcopy(position_rotation_transition_vars->unk30, transition_target_rotation); qcopy(&position_rotation_transition_vars->unk40, transition_setup_vector); - moby->state = 2; + moby->state = CAMERA_TRANSITION_STATE_PRE_TRANSITION_RAMP_UP; position_rotation_transition_vars->unk68 = frame_time_sq * 0.333f; position_rotation_transition_vars->unk70 = 1.0f / (float)scale_game_frames(invulnerability_duration_frames); @@ -287,10 +295,10 @@ s32 classify_moby_state_two_or_three(const u8 *moby) { u32 state = MOBY(moby)->state; s32 state_classification = 2; - if (state == 2) { + if (state == CAMERA_TRANSITION_STATE_PRE_TRANSITION_RAMP_UP) { return 1; } - if (state != 3) { + if (state != CAMERA_TRANSITION_STATE_INTERPOLATE_TRANSITION) { state_classification = 0; } return state_classification; diff --git a/src/overlays/l18/mobys/child_carrier.c b/src/overlays/l18/mobys/child_carrier.c index 576c28ffbf..9e20eb8bfe 100644 --- a/src/overlays/l18/mobys/child_carrier.c +++ b/src/overlays/l18/mobys/child_carrier.c @@ -36,7 +36,7 @@ void child_carrier_update(char *moby) { char *child; switch (MOBY(moby)->state) { case INITIALIZE_TRANSFORM_HISTORY: - MOBY(moby)->state = 1; + MOBY(moby)->state = UPDATE_TRANSFORM_FROM_HISTORY; break; case UPDATE_TRANSFORM_FROM_HISTORY: fast_vec_sub(position_delta, moby + 0x10, transform_and_child_vars->unk60); diff --git a/src/overlays/l18/mobys/cutscene_effects.c b/src/overlays/l18/mobys/cutscene_effects.c index 4badd62a5f..e2113b95a5 100644 --- a/src/overlays/l18/mobys/cutscene_effects.c +++ b/src/overlays/l18/mobys/cutscene_effects.c @@ -137,7 +137,7 @@ void deplanetizer_effects_update(struct Moby *moby) { deplanetizer_three_quad_scale_ramp_start_frame_gp = 190; deplanetizer_three_quad_scale_ramp_end_frame_gp = 365; moby->update_dist = 255; - moby->state = 1; + moby->state = UPDATE_SEQUENCE_EFFECTS; return; case UPDATE_SEQUENCE_EFFECTS: break; diff --git a/src/overlays/l18/mobys/cutscene_joint_trail.c b/src/overlays/l18/mobys/cutscene_joint_trail.c index 2189f809ad..087ea49d68 100644 --- a/src/overlays/l18/mobys/cutscene_joint_trail.c +++ b/src/overlays/l18/mobys/cutscene_joint_trail.c @@ -46,7 +46,7 @@ void cutscene_joint_trail_update(CutsceneJointTrailMoby *moby) { switch (moby->state) { case INITIALIZE_TRAIL_EFFECT: moby->update_dist = 0xFF; - moby->state = 1; + moby->state = UPDATE_TRAIL_EFFECT; break; case UPDATE_TRAIL_EFFECT: if (D_L18_0015F5C4 == 2) { diff --git a/src/overlays/l18/mobys/deplanetizer_gun.c b/src/overlays/l18/mobys/deplanetizer_gun.c index aa07498766..0568ea232b 100644 --- a/src/overlays/l18/mobys/deplanetizer_gun.c +++ b/src/overlays/l18/mobys/deplanetizer_gun.c @@ -37,11 +37,11 @@ void deplanetizer_gun_update(DeplanetizerGunSceneMoby *moby) { }; switch (moby->state) { case MOBY_INITIALIZE: - moby->state = 1; + moby->state = MOBY_WAIT_FOR_SCENE_TRIGGER; case MOBY_WAIT_FOR_SCENE_TRIGGER: if ((D_L18_0015F5C4 == 2 && D_L18_0016D290_lui == 3) || (game_frame < 5 && D_L18_001623A0_gp != 0 && moby->f40 == 0.0f)) { - moby->state = 2; + moby->state = MOBY_WAIT_FOR_SCENE_END; moby->flags |= 1; moby->substate = 0; } @@ -55,7 +55,7 @@ void deplanetizer_gun_update(DeplanetizerGunSceneMoby *moby) { } if (D_L18_0015F5C4 != 2) { moby->substate = 1; - moby->state = 1; + moby->state = MOBY_WAIT_FOR_SCENE_TRIGGER; moby->flags &= 0xFFFE; } break; diff --git a/src/overlays/l18/mobys/destructible_scenery.c b/src/overlays/l18/mobys/destructible_scenery.c index 5ed5ac0294..2b72f2a937 100644 --- a/src/overlays/l18/mobys/destructible_scenery.c +++ b/src/overlays/l18/mobys/destructible_scenery.c @@ -70,7 +70,7 @@ void destructible_scenery_update(struct Moby *moby) { if (((unsigned char *)((int *)visited52))[mission_table_index] == 0xff) goto remove; } - moby->state = 1; + moby->state = STATE_WAIT_FOR_HIT; if (*(int *)hit_response_and_flight_private_vars != 0) *(int *)(*(int *)hit_response_and_flight_private_vars) = 3; return; @@ -176,7 +176,7 @@ void destructible_scenery_update(struct Moby *moby) { float vector[4]; float speed = random_float_between(10.0f, 15.0f) * frame_time; moby->collision = 0; - moby->state = 3; + moby->state = STATE_BALLISTIC_FLIGHT; hit_response_and_flight_private_vars[2] = randf_sym(0.0f, 90.0f) * DEG_TO_RAD * frame_time; hit_response_and_flight_private_vars[3] = diff --git a/src/overlays/l18/mobys/drek_boss_electric_ball.c b/src/overlays/l18/mobys/drek_boss_electric_ball.c index 58646119f5..747e62b2fd 100644 --- a/src/overlays/l18/mobys/drek_boss_electric_ball.c +++ b/src/overlays/l18/mobys/drek_boss_electric_ball.c @@ -21,6 +21,11 @@ #include "rnc/rendering/view/build_look_at_matrix.h" #include "rnc/world/collision/ground_probe.h" +enum { + STATE_TIMED_REMOVAL_WAIT = 0, + STATE_TRAVEL_TO_TARGET = 1 +}; + extern void add_draw_callback(void (*)(void), void *) __asm__("FUN_001f4600"); #include "qcopy.h" @@ -54,10 +59,6 @@ void drek_boss_electric_ball_update(struct Moby *moby) __asm__("FUN_L18_ /* Moby class 983 */ void drek_boss_electric_ball_update(struct Moby *moby) { - enum { - STATE_TIMED_REMOVAL_WAIT = 0, - STATE_TRAVEL_TO_TARGET = 1 - }; float *moby_vars = (float *)moby->pvars; float updated_rotation_angle = fast_add_rotations( moby_vars[0xB], target_effect_first_rotation_rate_degrees_gp * DEG_TO_RAD * frame_time); @@ -149,8 +150,8 @@ void refresh_moby_position_and_activate( qcopy(&moby->pos, moby_position); *(int *)(refreshed_moby_private_vars + 0x28) = scale_game_frames(5); *(float *)(refreshed_moby_private_vars + 0x24) = speed; - if (active && moby->state == 0) { - moby->state = 1; + if (active && moby->state == STATE_TIMED_REMOVAL_WAIT) { + moby->state = STATE_TRAVEL_TO_TARGET; *(int *)(refreshed_moby_private_vars + 0x28) = 0; qcopy(refreshed_moby_private_vars, position); } @@ -199,77 +200,95 @@ float homing_spark_quad_vertices[4][4][4] __asm__("D_L18_001D9B70") = { {0.0f, -3.0f, 3.0f, 1.0f}}, }; -extern s32 fast_tween_color_c(s32, s32, f32) __asm__("func_001FA6E0"); -extern s64 get_effect_texture_c(s32) __asm__("func_001F44B8"); -extern int D_L18_00161EE4 __attribute__((sda)); -extern int D_L18_00161EE8 __attribute__((sda)); -extern int D_L18_00161EEC __attribute__((sda)); -extern int D_L18_00161EF0 __attribute__((sda)); -extern int D_L18_00161EF8 __attribute__((sda)); -extern int D_L18_00161F08 __attribute__((sda)); +extern s32 fast_tween_color_c(s32, s32, f32) __asm__("func_001FA6E0"); +extern s64 get_effect_texture_c(s32) __asm__("func_001F44B8"); +extern int l18_homing_spark_blend_minuend_selector __asm__("D_L18_00161EE4") __attribute__((sda)); +extern int l18_homing_spark_blend_subtrahend_selector __asm__("D_L18_00161EE8") + __attribute__((sda)); +extern int l18_homing_spark_blend_alpha_factor_selector __asm__("D_L18_00161EEC") + __attribute__((sda)); +extern int l18_homing_spark_blend_addend_selector __asm__("D_L18_00161EF0") __attribute__((sda)); +extern int l18_homing_spark_quad_colors __asm__("D_L18_00161EF8") __attribute__((sda)); +extern int l18_homing_spark_quad_texture_ids __asm__("D_L18_00161F08") __attribute__((sda)); extern void fast_draw_quad_real(void *, void *, int) __asm__("FUN_001f7d30"); void homing_spark_draw(char *moby) __asm__("FUN_L18_002ea1f8"); void homing_spark_draw(char *moby) { Pkt pkt[4]; - float rot[4]; - float m[4][4][4]; - char *data = ((char *)MOBY(moby)->pvars); - - clear_u64_value(rot); - rot[2] = fast_arc_tan(l18_camera_lui.pos.f[0] - MOBY(moby)->pos.x, - l18_camera_lui.pos.f[1] - MOBY(moby)->pos.y); - rot[1] = -fast_arc_tan(vector_distance_xy(moby + 0x10, &l18_camera_lui.pos.f[0]), - l18_camera_lui.pos.f[2] - MOBY(moby)->pos.z); - euler_rotation_matrix(m[0][0], rot); - euler_rotation_matrix(m[1][0], rot); - fast_vec_scale(m[1][1], m[1][1], *(float *)(data + 0x24)); - fast_vec_scale(m[1][2], m[1][2], *(float *)(data + 0x24)); - qcopy(m[0][3], moby + 0x10); - qcopy(m[1][3], moby + 0x10); - rot[0] = *(float *)(data + 0x2C); - euler_rotation_matrix(m[2][0], rot); - fast_vec_scale(m[2][1], m[2][1], *(float *)(data + 0x24)); - fast_vec_scale(m[2][2], m[2][2], *(float *)(data + 0x24)); - qcopy(m[2][3], moby + 0x10); - rot[0] = *(float *)(data + 0x30); - euler_rotation_matrix(m[3][0], rot); - fast_vec_scale(m[3][1], m[3][1], *(float *)(data + 0x24)); - fast_vec_scale(m[3][2], m[3][2], *(float *)(data + 0x24)); - qcopy(m[3][3], moby + 0x10); + float quad_euler_angles[4]; + float quad_transform_matrices[4][4][4]; + char *homing_spark_private_vars = ((char *)MOBY(moby)->pvars); + + clear_u64_value(quad_euler_angles); + quad_euler_angles[2] = fast_arc_tan(l18_camera_lui.pos.f[0] - MOBY(moby)->pos.x, + l18_camera_lui.pos.f[1] - MOBY(moby)->pos.y); + quad_euler_angles[1] = -fast_arc_tan(vector_distance_xy(moby + 0x10, &l18_camera_lui.pos.f[0]), + l18_camera_lui.pos.f[2] - MOBY(moby)->pos.z); + euler_rotation_matrix(quad_transform_matrices[0][0], quad_euler_angles); + euler_rotation_matrix(quad_transform_matrices[1][0], quad_euler_angles); + fast_vec_scale(quad_transform_matrices[1][1], + quad_transform_matrices[1][1], + *(float *)(homing_spark_private_vars + 0x24)); + fast_vec_scale(quad_transform_matrices[1][2], + quad_transform_matrices[1][2], + *(float *)(homing_spark_private_vars + 0x24)); + qcopy(quad_transform_matrices[0][3], moby + 0x10); + qcopy(quad_transform_matrices[1][3], moby + 0x10); + quad_euler_angles[0] = *(float *)(homing_spark_private_vars + 0x2C); + euler_rotation_matrix(quad_transform_matrices[2][0], quad_euler_angles); + fast_vec_scale(quad_transform_matrices[2][1], + quad_transform_matrices[2][1], + *(float *)(homing_spark_private_vars + 0x24)); + fast_vec_scale(quad_transform_matrices[2][2], + quad_transform_matrices[2][2], + *(float *)(homing_spark_private_vars + 0x24)); + qcopy(quad_transform_matrices[2][3], moby + 0x10); + quad_euler_angles[0] = *(float *)(homing_spark_private_vars + 0x30); + euler_rotation_matrix(quad_transform_matrices[3][0], quad_euler_angles); + fast_vec_scale(quad_transform_matrices[3][1], + quad_transform_matrices[3][1], + *(float *)(homing_spark_private_vars + 0x24)); + fast_vec_scale(quad_transform_matrices[3][2], + quad_transform_matrices[3][2], + *(float *)(homing_spark_private_vars + 0x24)); + qcopy(quad_transform_matrices[3][3], moby + 0x10); { int i; int j; - Pkt *p; + Pkt *quad_packet; for (i = 0; i < 4; i++) { { - long r = - ((long (*)(int))get_effect_texture_c)(((int *)&(*(short *)&D_L18_00161F08))[i]); - p = &pkt[i]; - p->b = r; + long r = ((long (*)(int))get_effect_texture_c)( + ((int *)&(*(short *)&l18_homing_spark_quad_texture_ids))[i]); + quad_packet = &pkt[i]; + quad_packet->b = r; } - p->c = 0xFF9000000260; - p->d = (D_L18_00161EE4) | (long)(D_L18_00161EE8) << 2 | (long)(D_L18_00161EEC) << 4 | - (long)(D_L18_00161EF0) << 6 | 0x8000L << 24; - p->a = 0; + quad_packet->c = 0xFF9000000260; + quad_packet->d = (l18_homing_spark_blend_minuend_selector) | + (long)(l18_homing_spark_blend_subtrahend_selector) << 2 | + (long)(l18_homing_spark_blend_alpha_factor_selector) << 4 | + (long)(l18_homing_spark_blend_addend_selector) << 6 | 0x8000L << 24; + quad_packet->a = 0; for (j = 0; j < 4; j++) { pkt[i].uv[j][0] = homing_spark_quad_uvs[j][0]; pkt[i].uv[j][1] = homing_spark_quad_uvs[j][1]; if (i == 0) { - pkt[0].color[j] = fast_tween_color_c( - D_L18_00161EF8 & 0xFFFFFF, D_L18_00161EF8, *(float *)(data + 0x24)); + pkt[0].color[j] = + fast_tween_color_c(l18_homing_spark_quad_colors & 0xFFFFFF, + l18_homing_spark_quad_colors, + *(float *)(homing_spark_private_vars + 0x24)); } else { - pkt[i].color[j] = ((int *)&(*(short *)&D_L18_00161EF8))[i]; + pkt[i].color[j] = ((int *)&(*(short *)&l18_homing_spark_quad_colors))[i]; } qcopy(pkt[i].vtx[j], homing_spark_quad_vertices[i][j]); } } } - fast_draw_quad_real(&pkt[0], m[0], 0); - fast_draw_quad_real(&pkt[1], m[1], 0); - fast_draw_quad_real(&pkt[2], m[2], 0); - fast_draw_quad_real(&pkt[3], m[3], 0); + fast_draw_quad_real(&pkt[0], quad_transform_matrices[0], 0); + fast_draw_quad_real(&pkt[1], quad_transform_matrices[1], 0); + fast_draw_quad_real(&pkt[2], quad_transform_matrices[2], 0); + fast_draw_quad_real(&pkt[3], quad_transform_matrices[3], 0); } extern float random_float_between(float, float) __asm__("FUN_002132a8"); diff --git a/src/overlays/l18/mobys/drek_boss_ring_projectile.c b/src/overlays/l18/mobys/drek_boss_ring_projectile.c index 9385cac78c..dd7f3c91ea 100644 --- a/src/overlays/l18/mobys/drek_boss_ring_projectile.c +++ b/src/overlays/l18/mobys/drek_boss_ring_projectile.c @@ -151,7 +151,7 @@ void drek_boss_ring_projectile_update(struct Moby *moby) { { float ground_height = probe_ground_height(&moby->pos, 0, 0.5f); if (moby->pos.z - 0.333f < ground_height) { - moby->state = 1; + moby->state = STATE_GROUND_IMPACT_DELAY; moby->pos.z = ground_height + 0.333f; *(int *)(moby_vars + 11) = scale_game_frames(1); } @@ -171,7 +171,7 @@ void drek_boss_ring_projectile_update(struct Moby *moby) { (fast_sin(moby_vars[12]) + 1.0f) * 0.5f); if (fast_dec_timer((int *)(moby_vars + 11))) { trooper_play_sound(0xF, 0, (int)moby, 0x58E); - moby->state = 2; + moby->state = STATE_EXPANDING_RING; moby_vars[9] = 0.5f; moby->collision = 0; moby->visible = 0; @@ -183,7 +183,7 @@ void drek_boss_ring_projectile_update(struct Moby *moby) { process_expanding_ring_collisions(moby); add_draw_callback(draw_expanding_projectile_ring, moby); if (moby_vars[9] > moby_vars[10]) { - moby->state = 3; + moby->state = STATE_REMOVE; } break; case STATE_REMOVE: diff --git a/src/overlays/l18/mobys/drek_fight_missile.c b/src/overlays/l18/mobys/drek_fight_missile.c index d0334dc585..bc852819aa 100644 --- a/src/overlays/l18/mobys/drek_fight_missile.c +++ b/src/overlays/l18/mobys/drek_fight_missile.c @@ -60,7 +60,8 @@ extern int update_drek_fight_missile_wander_movement(char *moby, float *vec) __asm__("FUN_L18_002f0120"); extern s32 random_integer_below(s32) __asm__("FUN_00213260"); extern short l18_drek_missile_roll_rate_degrees_gp __asm__("D_L18_00162210") __attribute__((sda)); -extern short D_L18_00162214_gp __asm__("D_L18_00162214") __attribute__((sda)); +extern short l18_drek_missile_wander_horizontal_speed_gp __asm__("D_L18_00162214") + __attribute__((sda)); extern short l18_drek_missile_dive_speed_gp __asm__("D_L18_00162218") __attribute__((sda)); extern short l18_drek_missile_wander_to_dive_random_bound_gp __asm__("D_L18_00162234") __attribute__((sda)); @@ -122,8 +123,11 @@ typedef struct DrekFightMissileVars { /* Moby class 1355 */ void drek_fight_missile_update(struct Moby *moby) { + enum { + DREK_MISSILE_WAIT_FOR_ACTIVATION = 1 + }; DrekFightMissileVars *missile_vars = (DrekFightMissileVars *)moby->pvars; - if (moby->state != 4) { + if (moby->state != DREK_MISSILE_WAIT_TO_EXPLODE) { moby->rot.x = fast_add_rotations(moby->rot.x, *(float *)&l18_drek_missile_roll_rate_degrees_gp * DEG_TO_RAD * frame_time); @@ -146,7 +150,7 @@ void drek_fight_missile_update(struct Moby *moby) { missile_vars->unk128 += 5.0f; missile_vars->unk128 = probe_ground_height(&missile_vars->unk120, 0, 0.5f); select_drek_fight_missile_wander_target(moby, &missile_vars->unk110); - moby->state = 1; + moby->state = DREK_MISSILE_WAIT_FOR_ACTIVATION; moby->flags |= 1; moby->visible = 0; moby->collision = 0; @@ -161,11 +165,13 @@ void drek_fight_missile_update(struct Moby *moby) { if (random_integer_below(*(int *)&l18_drek_missile_wander_to_dive_random_bound_gp)) { return; } - moby->state = 3; + moby->state = DREK_MISSILE_DIVE; missile_vars->unk130[0] = - fast_cos(moby->rot.z) * (*(float *)&D_L18_00162214_gp * frame_time); + fast_cos(moby->rot.z) * + (*(float *)&l18_drek_missile_wander_horizontal_speed_gp * frame_time); missile_vars->unk130[1] = - fast_sin(moby->rot.z) * (*(float *)&D_L18_00162214_gp * frame_time); + fast_sin(moby->rot.z) * + (*(float *)&l18_drek_missile_wander_horizontal_speed_gp * frame_time); missile_vars->unk130[2] = missile_vars->unk144; missile_vars->unk14C = 0; break; @@ -191,7 +197,7 @@ void drek_fight_missile_update(struct Moby *moby) { if (ground_check_position[2] < missile_vars->unk128) { float minimum_missile_height; func_0022ED80_2F0F78(1, 0, (int)moby); - moby->state = 4; + moby->state = DREK_MISSILE_WAIT_TO_EXPLODE; missile_vars->timer_160 = scale_game_frames(0x5A); minimum_missile_height = missile_vars->unk128 + 0.7f; if (moby->pos.z < minimum_missile_height) { @@ -209,7 +215,7 @@ void drek_fight_missile_update(struct Moby *moby) { if (fast_dec_timer(&missile_vars->timer_160)) { int i; char *pos = &moby->pos; - moby->state = 2; + moby->state = DREK_MISSILE_WANDER; missile_vars->unk164 = 0; spawn_explosion(missile_vars->unk16C, D_L18_0015F580, @@ -310,8 +316,10 @@ int update_drek_fight_missile_wander_movement(char *moby, float *wander_target_p *(float *)(missile_vars + 0x150), *(float *)(missile_vars + 0x150), *(float *)(missile_vars + 0x154)); - MOBY(moby)->pos.x += fast_cos(MOBY(moby)->rot.z) * (*(float *)&D_L18_00162214_gp * frame_time); - MOBY(moby)->pos.y += fast_sin(MOBY(moby)->rot.z) * (*(float *)&D_L18_00162214_gp * frame_time); + MOBY(moby)->pos.x += fast_cos(MOBY(moby)->rot.z) * + (*(float *)&l18_drek_missile_wander_horizontal_speed_gp * frame_time); + MOBY(moby)->pos.y += fast_sin(MOBY(moby)->rot.z) * + (*(float *)&l18_drek_missile_wander_horizontal_speed_gp * frame_time); FUN_00213f38_c((float *)&MOBY(moby)->pos.z, (float *)(missile_vars + 0x144), wander_target_position[2], @@ -374,7 +382,7 @@ void select_drek_fight_missile_wander_target(struct Moby *moby, *(int *)(missile_private_vars + 0x160) = scale_game_frames(180); } -extern int D_L18_00162238_gp __asm__("D_L18_00162238") __attribute__((sda)); +extern int l18_drek_missile_group_effects_disabled __asm__("D_L18_00162238") __attribute__((sda)); #include "rnc/overlay/l18/mobys/drek_fight_missile_globals.h" @@ -413,7 +421,7 @@ void draw_drek_fight_missile_group_trails(struct Moby *moby) { int trail_segment_index; int trail_segment_start_slot; - if (D_L18_00162238_gp != 0) { + if (l18_drek_missile_group_effects_disabled != 0) { return; } for (i = 0; i < 16; i++) { @@ -495,7 +503,7 @@ void render_drek_fight_missile_group_effects(struct Moby *group_moby) { float moving_phase_step; float wait_to_explode_phase_step; int phase_blended_color; - if (D_L18_00162238_gp != 0) { + if (l18_drek_missile_group_effects_disabled != 0) { return; } group_entry = D_L18_001AC240_c7[group_moby->group]; diff --git a/src/overlays/l18/mobys/drek_final_boss_robot.c b/src/overlays/l18/mobys/drek_final_boss_robot.c index 70393dae1d..8ff5e7b2ac 100644 --- a/src/overlays/l18/mobys/drek_final_boss_robot.c +++ b/src/overlays/l18/mobys/drek_final_boss_robot.c @@ -1,5 +1,6 @@ /* Level 18 drek_final_boss_robot: the final boss fight. */ #include "types.h" +#include "rnc/overlay/l18/drek_boss_states.h" #include "rnc/overlay/shared/camera/level_camera.h" #include "rnc/audio/voice_pool.h" @@ -329,7 +330,8 @@ extern int launch_first_idle_group_class_0772_moby(int idx, extern int count_group_gadgebots_not_in_state_8(int idx) __asm__("FUN_L18_002fc7e0"); extern int random_integer_below(int) __asm__("FUN_00213260"); extern s32 allocate_voice_for_target_entry(s32, s32, void *) __asm__("func_0022DA68"); -extern short D_L18_00162378_gp __asm__("D_L18_00162378") __attribute__((sda)); +extern short l18_drek_boss_hero_follow_default_radius __asm__("D_L18_00162378") + __attribute__((sda)); extern short l18_drek_boss_scene_2_started_gp __asm__("D_L18_00162360") __attribute__((sda)); extern short D_L18_00162390 __attribute__((sda)); extern short l18_drek_boss_paired_transition_duration_frames_gp __asm__("D_L18_00162394") @@ -427,31 +429,6 @@ void spawn_drek_boss_firing_effects(char *moby, void *effect_position) __asm__(" /* Moby class 1422 */ void drek_final_boss_robot_update(BossMoby *moby) { - enum { - DREK_BOSS_INITIALIZE = 0, - DREK_BOSS_WAIT_FOR_ENCOUNTER_TRIGGER = 1, - DREK_BOSS_CIRCLE_AND_FIRE_AT_HERO = 2, - DREK_BOSS_WAIT_TO_RESTORE_SAVED_TRANSFORM = 3, - DREK_BOSS_WAIT_FOR_GROUNDED_HERO_TO_START_SCENE = 4, - DREK_BOSS_INITIALIZE_PAIRED_TRANSFORM_TRANSITION = 5, - DREK_BOSS_WAIT_FOR_SCENE = 7, - DREK_BOSS_WAIT_FOR_PAIRED_TRANSFORM_TRANSITION = 8, - DREK_BOSS_APPROACH_PATH_START = 9, - DREK_BOSS_FOLLOW_PATH_AND_FIRE_AT_MOBYS = 10, - DREK_BOSS_FINISH_PATH_AND_WAIT_FOR_HERO = 0xB, - DREK_BOSS_SELECT_NEXT_ACTION = 0xC, - DREK_BOSS_LAUNCH_FORWARD_WITH_LATERAL_OFFSET = 0xD, - DREK_BOSS_ACTION_REPOSITION_AND_AIM = 0xE, - DREK_BOSS_TARGET_GROUND_POINTS = 0xF, - DREK_BOSS_TARGET_RANDOM_ARENA_POINTS = 0x10, - DREK_BOSS_TARGET_SIDE_GROUND_POINTS = 0x11, - DREK_BOSS_APPROACH_AIM_NODE = 0x12, - DREK_BOSS_FOLLOW_HERO = 0x13, - DREK_BOSS_ACTIVATE_MISSILE_GROUP = 0x14, - DREK_BOSS_APPROACH_SELECTED_MOBY = 0x15, - DREK_BOSS_DEATH_EXPLOSIONS = 0x1A, - DREK_BOSS_RUN_ENDING_SEQUENCE = 0x1B - }; enum { DREK_BOSS_PHASE_FIRST_ARENA_PATH = 0, DREK_BOSS_PHASE_SECOND_ARENA_PATH = 1, @@ -549,7 +526,7 @@ void drek_final_boss_robot_update(BossMoby *moby) { break; case DREK_BOSS_WAIT_FOR_ENCOUNTER_TRIGGER: if (is_point_inside_clip_volume(hero.motion.pos.f, boss_data->f274) != 0 && - hero.vehicle_mode == 2) { + hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { moby->f20 = 7; moby->f34 |= 0x41; start_scene(0); @@ -648,7 +625,7 @@ void drek_final_boss_robot_update(BossMoby *moby) { frame_time * 6.2831855f); update_drek_boss_arena_circling_movement((struct Moby *)moby); if (boss_data->f38C <= 301.0f) { - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { ((BossMoby *)hero.moby)->f94 = 0; ((BossMoby *)hero.moby)->f34 |= 0x41; } @@ -1470,7 +1447,7 @@ void drek_final_boss_robot_update(BossMoby *moby) { } if (vector_distance_xy(hero.motion.pos.f, D_L18_001600EC + boss_data->f250[2] * 0x80 + 0x30) > - *(float *)&D_L18_00162378_gp + 5.8f) { + *(float *)&l18_drek_boss_hero_follow_default_radius + 5.8f) { fire = 1; } if (fire) { @@ -1837,6 +1814,10 @@ extern short l18_drek_boss_class_scale_multiplier_gp __asm__("D_L18_00162330") _ /* Ported from rac1-decomp src/overlays/l18_veldin2/vendor_002F2AE0.c (func_L18_002F72E0) */ void update_drek_boss_damage_and_phase_transitions(char *moby) { + enum { + HIT_PROCESSING_NO_DAMAGE = 1, + LINKED_MOBY_REARMED = 1 + }; char *boss_data = ((char *)MOBY(moby)->pvars); int hit_processing_status; float step; @@ -1870,9 +1851,10 @@ void update_drek_boss_damage_and_phase_transitions(char *moby) { } resolve_moby_hit_response( moby, hit_record, boss_data + 0x20, 0, &hit_processing_status, &step, 0, 4); - if (hit_processing_status != 1) { + if (hit_processing_status != HIT_PROCESSING_NO_DAMAGE) { int type = MOBY(moby)->state; - if ((type >= 0xC && type <= 0x13) || type == 2) { + if ((type >= DREK_BOSS_SELECT_NEXT_ACTION && type <= DREK_BOSS_FOLLOW_HERO) || + type == DREK_BOSS_CIRCLE_AND_FIRE_AT_HERO) { char *o = *(char **)(hit_record + 0x20); if (o != 0) { short h = *(short *)(o + 0xA6); @@ -1891,7 +1873,7 @@ void update_drek_boss_damage_and_phase_transitions(char *moby) { } if (step != 0.0f) { float unclamped_health; - if (MOBY(moby)->state == 2) { + if (MOBY(moby)->state == DREK_BOSS_CIRCLE_AND_FIRE_AT_HERO) { if (hit_record != 0 && (*(int *)(hit_record + 0x24) & 0x80000) && MOBY(moby)->prev_seq != 0xE) { blend_moby_animation(moby, 0xE, 5, 1); @@ -1971,10 +1953,10 @@ void update_drek_boss_damage_and_phase_transitions(char *moby) { } { int type = MOBY(moby)->state; - if (type >= 0xC && type <= 0x13) { + if (type >= DREK_BOSS_SELECT_NEXT_ACTION && type <= DREK_BOSS_FOLLOW_HERO) { int linked_moby_state_transition_status = poll_moby_state_and_rearm( (char *)*(int *)&D_L18_0015FFD8_5e80 + (*(int *)(boss_data + 0x21C) << 8)); - if (linked_moby_state_transition_status == 1) { + if (linked_moby_state_transition_status == LINKED_MOBY_REARMED) { moby[0x20] = 0x13; if (MOBY(moby)->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(0x14)); @@ -2158,11 +2140,12 @@ int advance_drek_boss_planar_position_toward_target(char *moby, /* Moves a moby's follow distance toward a target, clamped to a range, then applies it. */ /* Ported from rac1-decomp (src/overlays/l18_veldin2/vendor_002F2AE0.c: func_L18_002F7DC0), where it is exact; names translated to the US level program. */ -extern short D_L18_0016234C_gp __asm__("D_L18_0016234C") __attribute__((sda)); -extern void FUN_L00_0025f730(void *a, float x); -int advance_drek_boss_planar_position_toward_target(char *moby, - float arg, - void *x) __asm__("FUN_L18_002f6878"); +extern short l18_drek_boss_hero_follow_target_distance __asm__("D_L18_0016234C") + __attribute__((sda)); +extern void FUN_L00_0025f730(void *a, float x); +int advance_drek_boss_planar_position_toward_target(char *moby, + float arg, + void *x) __asm__("FUN_L18_002f6878"); extern short drek_boss_hero_follow_mode_0f_radius_gp __asm__("D_L18_0016237C") __attribute__((sda)); @@ -2180,15 +2163,17 @@ void update_drek_boss_hero_follow_movement(struct Moby *moby) { FUN_L00_0025f730(follow_target_position, *(float *)&drek_boss_hero_follow_mode_0f_radius_gp); } else { - FUN_L00_0025f730(follow_target_position, *(float *)&D_L18_00162378_gp); + FUN_L00_0025f730(follow_target_position, + *(float *)&l18_drek_boss_hero_follow_default_radius); } fast_vec_add(follow_target_position, follow_target_position, D_L18_001600EC + (*(int *)(moby_vars + 0x344) << 7) + 0x30); follow_speed_limit = hero.motion.speed_xy; - follow_speed_limit += - (vector_distance_xy(&moby->pos, follow_target_position) - *(float *)&D_L18_0016234C_gp) / - *(float *)&D_L18_0016234C_gp * (frame_time * 4.75f); + follow_speed_limit += (vector_distance_xy(&moby->pos, follow_target_position) - + *(float *)&l18_drek_boss_hero_follow_target_distance) / + *(float *)&l18_drek_boss_hero_follow_target_distance * + (frame_time * 4.75f); hi = frame_time * 20.0f; lo = frame_time * 4.75f; if (follow_speed_limit > hi) { @@ -2246,7 +2231,7 @@ void update_drek_boss_arena_circling_movement(struct Moby *moby) { else if (circling_goal_angle < -0.17453292f) circling_goal_angle = -0.17453292f; circling_goal_angle = fast_add_rotations(circling_goal_angle, self_ang); - if (moby->state == 2) { + if (moby->state == DREK_BOSS_CIRCLE_AND_FIRE_AT_HERO) { goal.f[0] = fast_cos(circling_goal_angle) * drek_boss_circle_and_fire_radius_gp; goal.f[1] = fast_sin(circling_goal_angle) * drek_boss_circle_and_fire_radius_gp; goal.f[2] = 0.0f; @@ -2265,12 +2250,12 @@ void update_drek_boss_arena_circling_movement(struct Moby *moby) { far = drek_boss_circling_base_far_hero_distance_gp; slow = drek_boss_circling_default_far_hero_speed_gp; fast = drek_boss_circling_default_near_hero_speed_gp; - if (moby->state == 0xD) { + if (moby->state == DREK_BOSS_LAUNCH_FORWARD_WITH_LATERAL_OFFSET) { slow = 2.0f; fast = 5.5f; near *= 0.5f; far *= 0.5f; - } else if (moby->state == 0xF) { + } else if (moby->state == DREK_BOSS_TARGET_GROUND_POINTS) { slow = 6.0f; near *= 1.5f; fast = 10.0f; @@ -2416,40 +2401,40 @@ int select_drek_boss_next_action(struct Moby *moby) { boss_action_choice_index = random_integer_below(6); switch (boss_action_choice_index) { case BOSS_ACTION_CHOICE_LAUNCH_FORWARD_WITH_LATERAL_OFFSET: - state = 0xD; + state = DREK_BOSS_LAUNCH_FORWARD_WITH_LATERAL_OFFSET; break; case BOSS_ACTION_CHOICE_REPOSITION_AND_AIM: - state = 0xE; + state = DREK_BOSS_ACTION_REPOSITION_AND_AIM; break; case BOSS_ACTION_CHOICE_TARGET_GROUND_POINTS: - state = 0xF; + state = DREK_BOSS_TARGET_GROUND_POINTS; break; case BOSS_ACTION_CHOICE_TARGET_RANDOM_ARENA_POINTS: - state = 0x10; + state = DREK_BOSS_TARGET_RANDOM_ARENA_POINTS; break; case BOSS_ACTION_CHOICE_TARGET_SIDE_GROUND_POINTS: - state = 0x11; + state = DREK_BOSS_TARGET_SIDE_GROUND_POINTS; break; case BOSS_ACTION_CHOICE_FOLLOW_HERO: - state = 0x13; + state = DREK_BOSS_FOLLOW_HERO; break; } ok = *(short *)((char *)drek_boss_action_eligibility_by_phase + boss_action_choice_index * 2 + *(int *)(boss_action_vars + 0x34C) * 12); if (state == *(int *)(boss_action_vars + 0x350)) ok = 0; - if (state == 0x13) { + if (state == DREK_BOSS_FOLLOW_HERO) { if (*(int *)(boss_action_vars + 0x364) != 0) { ok = 0; } else { float d = vector_distance_xy(D_0013E533 + 0xE9D, D_L18_001600EC + *(int *)(boss_action_vars + 0x25C) * 128 + 0x30); - if (*(float *)&D_L18_00162378_gp + 2.0f < d) + if (*(float *)&l18_drek_boss_hero_follow_default_radius + 2.0f < d) ok = 0; } } - if (state == 0x11) { + if (state == DREK_BOSS_TARGET_SIDE_GROUND_POINTS) { if (*(int *)(boss_action_vars + 0x350) == 0xE) ok = 0; } @@ -2492,7 +2477,8 @@ extern short l18_drek_boss_scalar_acceleration_and_braking_gp __asm__("D_L18_001 #include "rnc/overlay/l18/mobys/drek_final_boss_robot_data/update_drek_boss_state_dependent_scalars_3.h" -extern float D_L18_001623DC_gp __asm__("D_L18_001623DC") __attribute__((sda)); +extern float l18_drek_boss_second_scalar_near_node_follow_target_gp __asm__("D_L18_001623DC") + __attribute__((sda)); #include "rnc/overlay/l18/mobys/drek_final_boss_robot_data/update_drek_boss_state_dependent_scalars_2.h" @@ -2539,7 +2525,7 @@ void update_drek_boss_state_dependent_scalars(char *moby) { f + drek_boss_second_scalar_near_hero_target_gp; boss_state = MOBY(moby)->state; - if (boss_state == 0x13) { + if (boss_state == DREK_BOSS_FOLLOW_HERO) { char *g = D_0013E533 + 0xe1d; if ((*(int *)(g + 0x208c) == 0xf || *(int *)(g + 0x2084) == 0x42) && *(int *)(boss_data + 0x364) == 0 && *(float *)(boss_data + 0x390) <= 25.0f && @@ -2559,18 +2545,21 @@ void update_drek_boss_state_dependent_scalars(char *moby) { D_L18_001600EC + (*(int *)(boss_data + 0x344) << 7) + 0x30) < 28.0f) { x = drek_boss_first_scalar_near_node_follow_target_gp; - y = D_L18_001623DC_gp; + y = l18_drek_boss_second_scalar_near_node_follow_target_gp; } } - } else if (boss_state == 9 || boss_state == 6) { + } else if (boss_state == DREK_BOSS_APPROACH_PATH_START || boss_state == 6) { x = drek_boss_follow_camera_distance_target_gp; y = drek_boss_follow_camera_height_target_gp; first_scalar_value = (float *)(selected_scalar_record + 0x34); second_scalar_value = (float *)(selected_scalar_record + 0x38); first_scalar_update_state = (float *)(boss_data + 0x378); second_scalar_update_state = (float *)(boss_data + 0x37c); - } else if (boss_state == 0 || boss_state == 10 || boss_state == 11 || boss_state == 1 || - boss_state == 0x1b) { + } else if (boss_state == DREK_BOSS_INITIALIZE || + boss_state == DREK_BOSS_FOLLOW_PATH_AND_FIRE_AT_MOBYS || + boss_state == DREK_BOSS_FINISH_PATH_AND_WAIT_FOR_HERO || + boss_state == DREK_BOSS_WAIT_FOR_ENCOUNTER_TRIGGER || + boss_state == DREK_BOSS_RUN_ENDING_SEQUENCE) { int i; char *g; char *follow_camera_gate_source; @@ -2598,7 +2587,7 @@ void update_drek_boss_state_dependent_scalars(char *moby) { set_animation_parameter(*(int *)(boss_data + 0x368), 0); *(int *)(boss_data + 0x368) = -1; } - if (MOBY(moby)->state >= 2) { + if (MOBY(moby)->state >= DREK_BOSS_CIRCLE_AND_FIRE_AT_HERO) { if (*(int *)(boss_data + 0x3ec) != 0 || D_L18_001623A0_gp != 0) { char *follow_camera_gate_record; follow_camera_gate_source = (char *)&l18_camera; diff --git a/src/overlays/l18/mobys/falling_moby_group.c b/src/overlays/l18/mobys/falling_moby_group.c index 3ccabf9cfb..bbce54df35 100644 --- a/src/overlays/l18/mobys/falling_moby_group.c +++ b/src/overlays/l18/mobys/falling_moby_group.c @@ -35,6 +35,16 @@ #include "rnc/math/random.h" #include "rnc/overlay/l18/mobys.h" +enum { + MOBY_INITIALIZE = 0, + MOBY_APPROACH_TARGET_TRANSFORM = 2, + MOBY_FALL_AND_REMOVE = 4 +}; + +enum { + FALLING_MOBY_GROUP_AWAIT_ACTIVATION = 1 +}; + extern void mark_moby_for_removal(void *) __asm__("FUN_0020c828"); extern short *D_L18_001AC240[]; @@ -94,11 +104,6 @@ void falling_moby_group_update(struct Moby *moby) __asm__("FUN_L18_002f16f0"); /* Moby class 1381 */ void falling_moby_group_update(struct Moby *moby) { - enum { - MOBY_INITIALIZE = 0, - MOBY_APPROACH_TARGET_TRANSFORM = 2, - MOBY_FALL_AND_REMOVE = 4 - }; VData *moby_vars = (VData *)moby->pvars; if (moby_vars) { float initial_acceleration_step = group_transform_initial_acceleration_gp * frame_time_sq; @@ -132,7 +137,7 @@ void falling_moby_group_update(struct Moby *moby) { moby_vars->f34C = scale_game_frames(30); moby_vars->cnt = j; capture_linked_moby_relative_transforms(moby, (char *)moby_vars + 0x30, j); - moby->state = 1; + moby->state = FALLING_MOBY_GROUP_AWAIT_ACTIVATION; break; } case MOBY_APPROACH_TARGET_TRANSFORM: { @@ -162,7 +167,7 @@ void falling_moby_group_update(struct Moby *moby) { } if (moby_vars->f330 > group_transform_fall_progress_threshold_gp && moby_vars->i8 != 0) { - moby->state = 4; + moby->state = MOBY_FALL_AND_REMOVE; } hero_on_group_or_class_764_moby = 0; for (i = 0; i < moby_vars->cnt; i++) { @@ -182,7 +187,7 @@ void falling_moby_group_update(struct Moby *moby) { if (moby_vars->f348 != 0 && hero_on_group_or_class_764_moby == 0 && hero.air_frames.s == 0) { if (fast_dec_timer(&moby_vars->f34C)) - moby->state = 4; + moby->state = MOBY_FALL_AND_REMOVE; } break; } @@ -213,7 +218,7 @@ void falling_moby_group_update(struct Moby *moby) { } apply_linked_moby_relative_transforms(moby, (char *)moby_vars + 0x30, moby_vars->cnt); if (moby_vars->f344 != 0.0f) { - if (moby->state != 4) { + if (moby->state != MOBY_FALL_AND_REMOVE) { float debris_spawn_position[4]; float s, z, debris_spawn_angle; int debris_spawn_frames; @@ -252,13 +257,13 @@ void activate_drek_boss_class_0565_moby(struct Moby *moby) __asm__("FUN_L18_002f void activate_drek_boss_class_0565_moby(struct Moby *moby) { char *state = (char *)moby->pvars; - if (moby->oclass == 0x565 && moby->state == 1) { + if (moby->oclass == 0x565 && moby->state == FALLING_MOBY_GROUP_AWAIT_ACTIVATION) { if (*(int *)(state + 0xC) != -1) { mark_block_entries_within_transform_xy_bounds(0x802, *(int *)(state + 0xC)); mark_block_entries_within_transform_xy_bounds(0x908, *(int *)(state + 0xC)); mark_block_entries_within_transform_xy_bounds(0x954, *(int *)(state + 0xC)); } - moby->state = 2; + moby->state = MOBY_APPROACH_TARGET_TRANSFORM; set_group_child_carrier_byte_bc(moby->group, 1); } } @@ -289,7 +294,7 @@ void reset_drek_boss_falling_moby_group(L18VM_1cc8 *moby) __asm__("FUN_L18_002f1 void reset_drek_boss_falling_moby_group(L18VM_1cc8 *moby) { L18VD_1cc8 *data = moby->data; if (moby->class_id == 0x565) { - moby->state = 1; + moby->state = FALLING_MOBY_GROUP_AWAIT_ACTIVATION; data->field330 = 0; data->field344 = 0; } diff --git a/src/overlays/l18/mobys/floating_platform.c b/src/overlays/l18/mobys/floating_platform.c index 7ca81bfd98..e2ab9d1c42 100644 --- a/src/overlays/l18/mobys/floating_platform.c +++ b/src/overlays/l18/mobys/floating_platform.c @@ -20,6 +20,15 @@ #include "rnc/overlay/l18/hero.h" #include "rnc/overlay/shared/math/random/random_int_between.h" +enum { + STATE_INITIALIZE = 0, + STATE_WAIT_FOR_TILT_REQUEST = 1, + STATE_WAIT_FOR_SINK_REQUEST = 2, + STATE_TILT_DELAY = 3, + STATE_WAIT_FOR_SINK_TRIGGER = 4, + STATE_SINKING = 5 +}; + void update_floating_platform_tilt_and_bob(struct Moby *moby) __asm__("FUN_L18_002d8710"); #include "qcopy.h" @@ -49,14 +58,6 @@ void floating_platform_update(struct Moby *moby) __asm__("FUN_L18_002d82c0"); /* Moby classes 481, 587, 810 */ void floating_platform_update(struct Moby *moby) { - enum { - STATE_INITIALIZE = 0, - STATE_WAIT_FOR_TILT_REQUEST = 1, - STATE_WAIT_FOR_SINK_REQUEST = 2, - STATE_TILT_DELAY = 3, - STATE_WAIT_FOR_SINK_TRIGGER = 4, - STATE_SINKING = 5 - }; char *floating_platform_update_private_vars; float delta[4] __attribute__((aligned(16))); float old_rot[4] __attribute__((aligned(16))); @@ -79,9 +80,9 @@ void floating_platform_update(struct Moby *moby) { *(int *)(floating_platform_update_private_vars + 0x5C) |= 1; *(float *)(floating_platform_update_private_vars + 0x74) = angle; if (*(int *)(floating_platform_update_private_vars + 0x88) != 0) { - moby->state = 2; + moby->state = STATE_WAIT_FOR_SINK_REQUEST; } else { - moby->state = 1; + moby->state = STATE_WAIT_FOR_TILT_REQUEST; } break; case STATE_TILT_DELAY: @@ -104,7 +105,7 @@ void floating_platform_update(struct Moby *moby) { rate = floating_platform_tilt_rate_degrees_config_84_zero_gp * tilt_rate_scale; } *(float *)(floating_platform_update_private_vars + 0x6C) = rate * DEG_TO_RAD * frame_time; - moby->state = 4; + moby->state = STATE_WAIT_FOR_SINK_TRIGGER; break; case STATE_WAIT_FOR_SINK_TRIGGER: if (moby->visible != 0 && @@ -115,7 +116,7 @@ void floating_platform_update(struct Moby *moby) { } if (hero.ground_moby == moby && hero.air_frames.s == 0) { *(int *)(floating_platform_update_private_vars + 0x8C) = 0; - moby->state = 5; + moby->state = STATE_SINKING; *(short *)(floating_platform_update_private_vars + 0x92) = allocate_voice_for_target_entry(1, 0, moby); } @@ -124,7 +125,7 @@ void floating_platform_update(struct Moby *moby) { } if (vector_distance_xy(&moby->pos, &hero.motion.pos) < floating_platform_sink_trigger_distance_gp) { - moby->state = 5; + moby->state = STATE_SINKING; *(short *)(floating_platform_update_private_vars + 0x92) = allocate_voice_for_target_entry(1, 0, moby); } @@ -192,13 +193,13 @@ void update_floating_platform_tilt_and_bob(struct Moby *moby) { float unclamped_rotation_y = fast_add_rotations(moby->rot.y, *(float *)(floating_platform_private_vars + 0x6C)); moby->rot.y = unclamped_rotation_y; - if (moby->state == 5) { + if (moby->state == STATE_SINKING) { if (unclamped_rotation_y > 0.5235988f) { moby->rot.y = 0.5235988f; } else if (unclamped_rotation_y < -0.5235988f) { moby->rot.y = -0.5235988f; } - } else if (moby->state == 4) { + } else if (moby->state == STATE_WAIT_FOR_SINK_TRIGGER) { if (unclamped_rotation_y > 0.08726646f) { moby->rot.y = 0.08726646f; } else if (unclamped_rotation_y < -0.08726646f) { @@ -229,11 +230,11 @@ typedef struct { int request_floating_platform_sink(Level18State *platform_moby) __asm__("FUN_L18_002d8858"); int request_floating_platform_sink(Level18State *platform_moby) { - if (platform_moby->state == 1) { + if (platform_moby->state == STATE_WAIT_FOR_TILT_REQUEST) { return 1; } - if (platform_moby->state == 2) { - platform_moby->state = 5; + if (platform_moby->state == STATE_WAIT_FOR_SINK_REQUEST) { + platform_moby->state = STATE_SINKING; } return 0; } @@ -248,8 +249,8 @@ int request_floating_platform_tilt(struct Moby *platform_moby, int scaled_frame_count) { int *platform_vars = (int *)platform_moby->pvars; - if (platform_moby->state == 1) { - platform_moby->state = 3; + if (platform_moby->state == STATE_WAIT_FOR_TILT_REQUEST) { + platform_moby->state = STATE_TILT_DELAY; platform_vars[0x7C / 4] = tilt_delay_frames; platform_vars[0x78 / 4] = scaled_frame_count; return 1; @@ -268,7 +269,8 @@ spawn_spark(void *, void *, void *, int, int, int, int, int, int) __asm__("FUN_0 extern int FUN_001fa6e0(int, int, float); extern short floating_platform_spark_first_vector_length_base_rate_gp __asm__("D_L18_00161A68") __attribute__((sda)); -extern short D_L18_00161A6C_gp __asm__("D_L18_00161A6C") __attribute__((sda)); +extern short l18_floating_platform_spark_second_vector_length_base_rate_gp __asm__("D_L18_00161A6C") + __attribute__((sda)); extern short floating_platform_spark_second_vector_downward_z_rate_gp __asm__("D_L18_00161A70") __attribute__((sda)); extern short @@ -348,7 +350,7 @@ void spawn_floating_platform_sparks(struct Moby *moby) { fast_vec_normalize( second_spark_vector, first_spark_vector, - (*(float *)&(D_L18_00161A6C_gp)) * + (*(float *)&(l18_floating_platform_spark_second_vector_length_base_rate_gp)) * (random_float_between( -(*(float *)&( floating_platform_spark_vector_length_relative_variation_limit_gp)), diff --git a/src/overlays/l18/mobys/gadgebot.c b/src/overlays/l18/mobys/gadgebot.c index 70e4724a1a..3cfba0d785 100644 --- a/src/overlays/l18/mobys/gadgebot.c +++ b/src/overlays/l18/mobys/gadgebot.c @@ -19,6 +19,19 @@ #include "rnc/math_consts.h" #include "rnc/overlay/shared/world/level_labels.h" +enum { + GADGEBOT_INITIALIZE = 0, + GADGEBOT_LAUNCH_FLIGHT = 1, + GADGEBOT_TARGET_HERO = 2, + GADGEBOT_WAIT_TO_APPROACH = 2, + GADGEBOT_APPROACH_TARGET = 3, + GADGEBOT_FACE_TARGET = 4, + GADGEBOT_DEATH_FALL = 5, + GADGEBOT_EXPLODE = 6, + GADGEBOT_SUCK_CANNON_SUCTION = 7, + GADGEBOT_IDLE = 8 +}; + extern int D_L18_0015F5C4; extern unsigned char *D_L18_0015FFD8; extern s32 random_integer_below(s32) __asm__("FUN_00213260"); @@ -72,15 +85,6 @@ void gadgebot_update(unsigned char *m) __asm__("FUN_L18_002fbb98"); /* Moby class 1906 */ void gadgebot_update(unsigned char *moby) { - enum { - GADGEBOT_INITIALIZE = 0, - GADGEBOT_LAUNCH_FLIGHT = 1, - GADGEBOT_WAIT_TO_APPROACH = 2, - GADGEBOT_APPROACH_TARGET = 3, - GADGEBOT_FACE_TARGET = 4, - GADGEBOT_DEATH_FALL = 5, - GADGEBOT_EXPLODE = 6 - }; char position_scratch[16]; unsigned char *moby_vars = ((unsigned char *)MOBY(moby)->pvars); unsigned char *moby_transform_ptr; @@ -88,7 +92,7 @@ void gadgebot_update(unsigned char *moby) { switch (MOBY(moby)->state) { case GADGEBOT_INITIALIZE: { unsigned short moby_flags; - MOBY(moby)->state = 8; + MOBY(moby)->state = GADGEBOT_IDLE; if (random_integer_below(2)) MOBY(moby)->flags |= 0x8000; else @@ -124,17 +128,17 @@ void gadgebot_update(unsigned char *moby) { r = probe_ground_height(position_scratch, 0, 0.5f); if (MOBY(moby)->pos.z < r) { MOBY(moby)->pos.z = r; - MOBY(moby)->state = 2; + MOBY(moby)->state = GADGEBOT_WAIT_TO_APPROACH; if (MOBY(moby)->prev_seq) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else if (MOBY(moby)->pos.z < launch_gravity_and_minimum_z) { - MOBY(moby)->state = 6; + MOBY(moby)->state = GADGEBOT_EXPLODE; } break; } - case 7: + case GADGEBOT_SUCK_CANNON_SUCTION: if (FUN_L00_002dc9f0(moby, moby_vars + 0x70)) { - MOBY(moby)->state = 2; + MOBY(moby)->state = GADGEBOT_WAIT_TO_APPROACH; *(short *)(moby_vars + 0x138) = 0; } break; @@ -143,7 +147,7 @@ void gadgebot_update(unsigned char *moby) { if (!(10.0f < vector_distance_xy(moby + 0x10, moby_vars + 0x180))) break; } - MOBY(moby)->state = 3; + MOBY(moby)->state = GADGEBOT_APPROACH_TARGET; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); break; @@ -152,13 +156,13 @@ void gadgebot_update(unsigned char *moby) { *(QVd058 *)position_scratch = *(QVd058 *)(moby_vars + 0x180); target_distance = move_gadgebot_toward_target(moby, position_scratch); if (*(int *)(moby_vars + 0x1C4) == 2 && target_distance < 5.0f) { - MOBY(moby)->state = 2; + MOBY(moby)->state = GADGEBOT_WAIT_TO_APPROACH; if (MOBY(moby)->prev_seq) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); break; } if (target_distance < 1.5f) { - MOBY(moby)->state = 4; + MOBY(moby)->state = GADGEBOT_FACE_TARGET; if (MOBY(moby)->prev_seq != 2) { int animation_frame_index = (int)gadgebot_sequence_2_start_frame_gp; blend_moby_animation(moby, 2, animation_frame_index, scale_game_frames(5)); @@ -180,14 +184,14 @@ void gadgebot_update(unsigned char *moby) { collect_mobies_in_sphere_at_moby_point(moby, 0.5f, 1.0f, 1.0f, 1, 1, 0, 1, 0); if (MOBY(moby)->anim_flags & 2) { if (*(int *)(moby_vars + 0x1C4) == 2) { - MOBY(moby)->state = 2; + MOBY(moby)->state = GADGEBOT_WAIT_TO_APPROACH; if (MOBY(moby)->prev_seq) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); break; } if (!(2.5f < vector_distance_xy(moby + 0x10, moby_vars + 0x180))) break; - MOBY(moby)->state = 3; + MOBY(moby)->state = GADGEBOT_APPROACH_TARGET; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); break; @@ -218,7 +222,7 @@ void gadgebot_update(unsigned char *moby) { 1, -1, 0); - MOBY(moby)->state = 8; + MOBY(moby)->state = GADGEBOT_IDLE; if (MOBY(moby)->prev_seq) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); MOBY(moby)->collision = 0; @@ -311,28 +315,29 @@ void update_gadgebot_damage_target_and_glow(struct Moby *moby) { int reaction_value_or_path_address; /* the reaction kind, later the path */ int fall_setup_value_or_path_slot_address; /* the reaction flags, later the path's slot in the table */ - if (moby->state == 0 || moby->state == 8) { + if (moby->state == GADGEBOT_INITIALIZE || moby->state == GADGEBOT_IDLE) { return; } - if (moby->state != 7 && game_frame != gadgebot_joint_glows_last_queued_frame_gp) { + if (moby->state != GADGEBOT_SUCK_CANNON_SUCTION && + game_frame != gadgebot_joint_glows_last_queued_frame_gp) { gadgebot_joint_glows_last_queued_frame_gp = game_frame; add_draw_callback(draw_group_gadgebot_joint_glows, moby); } speed = gadgebot_glow_default_phase_speed_degrees_per_second_gp; - if (moby->state == 4 || moby->state == 5) { + if (moby->state == GADGEBOT_FACE_TARGET || moby->state == GADGEBOT_DEATH_FALL) { speed = gadgebot_glow_state_4_or_5_phase_speed_degrees_per_second_gp; } sentry_vars->spin = fast_add_rotations(sentry_vars->spin, speed * DEG_TO_RAD * frame_time); moby->glow_color = fast_tween_color(gadgebot_glow_tint_start_gp, gadgebot_glow_tint_end_gp, fast_sin(sentry_vars->spin) * 0.5f + 0.5f); - if (moby->pos.z < 100.0f && moby->state != 7) { - moby->state = 6; + if (moby->pos.z < 100.0f && moby->state != GADGEBOT_SUCK_CANNON_SUCTION) { + moby->state = GADGEBOT_EXPLODE; } moby->scale = moby->pclass->scale * D_L18_001625FC; if (hero.state.current == 0x72 || D_L18_0015F5C4 == 2) { - if (moby->state != 7) { - moby->state = 8; + if (moby->state != GADGEBOT_SUCK_CANNON_SUCTION) { + moby->state = GADGEBOT_IDLE; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -344,11 +349,11 @@ void update_gadgebot_damage_target_and_glow(struct Moby *moby) { dmg = 0.0f; coll = find_moby_hit(moby, 0x330000, 0); resolve_moby_hit_response(moby, coll, &sentry_vars->health, 0, &hit, &dmg, 0, 4); - if (hit != 1 && moby->state != 6 && dmg != 0.0f) { + if (hit != 1 && moby->state != GADGEBOT_EXPLODE && dmg != 0.0f) { sentry_vars->health -= dmg; if (sentry_vars->health <= 0.0f) { if (random_integer_below(2) != 0) { - moby->state = 6; + moby->state = GADGEBOT_EXPLODE; } else { fall_setup_value_or_path_slot_address = 0x200; sentry_vars->unk90 = fall_setup_value_or_path_slot_address; @@ -368,7 +373,7 @@ void update_gadgebot_damage_target_and_glow(struct Moby *moby) { trooper_start_knockback(moby, sentry_vars->fall, 3, 1, 0, angle); sentry_vars->unkC0 = 7.5f; sentry_vars->unkC4 = 15.0f; - moby->state = 5; + moby->state = GADGEBOT_DEATH_FALL; moby->collision = 0; sentry_vars->anim_flags = 0x78; trooper_anim_update(moby, sentry_vars->anim); @@ -386,7 +391,7 @@ void update_gadgebot_damage_target_and_glow(struct Moby *moby) { 0, (int *)(reaction_value_or_path_address + 0x10), *(int *)reaction_value_or_path_address); - if (sentry_vars->target_mode == 2) { + if (sentry_vars->target_mode == GADGEBOT_TARGET_HERO) { if (hero.state.control_mode == 0xF) { int *list = (int *)hero.rail_spline; qcopy(&sentry_vars->target, (char *)list + *list * 16); @@ -480,13 +485,13 @@ int launch_first_idle_group_class_0772_moby(int group, void *from, void *to, flo for (;;) { moby = &table[*group_moby_entry & 0x7FFF]; if (moby->oclass == 0x772) { - if (moby->state == 8) { + if (moby->state == GADGEBOT_IDLE) { LaunchedMobyVars *launched_moby_vars = (LaunchedMobyVars *)moby->pvars; moby->flags &= ~0x41; moby->collision = moby->pclass->collision; moby->flags |= 0x1000; qcopy(&moby->pos, from); - moby->state = 1; + moby->state = GADGEBOT_LAUNCH_FLIGHT; launched_moby_vars->unk1F4 = 1.0f; fast_vec_sub(launched_moby_vars->velocity, to, from); launched_moby_vars->velocity[2] = 0.0f; @@ -516,7 +521,7 @@ short count_group_gadgebots_not_in_state_8(int group_index) { while (1) { unsigned char *moby = (unsigned char *)(moby_table_address + ((group_moby_entry[0] & 0x7FFF) << 8)); - if (MOBY(moby)->oclass == 0x772 && MOBY(moby)->state != 8) + if (MOBY(moby)->oclass == 0x772 && MOBY(moby)->state != GADGEBOT_IDLE) n++; if ((short)*group_moby_entry++ < 0) return n; @@ -642,10 +647,10 @@ int update_moby_suck_cannon_state(struct Moby *a) __asm__("FUN_L18_002fcbb0"); int update_moby_suck_cannon_state(struct Moby *moby) { int suction_result = process_moby_suck_cannon_suction(moby); if (suction_result == 0) { - if (moby->state == 0x7) - moby->state = 0x2; + if (moby->state == GADGEBOT_SUCK_CANNON_SUCTION) + moby->state = GADGEBOT_WAIT_TO_APPROACH; } else { - moby->state = 0x7; + moby->state = GADGEBOT_SUCK_CANNON_SUCTION; } return suction_result; } @@ -655,7 +660,7 @@ void hide_moby_and_clear_collision(struct Moby *moby) __asm__("FUN_L18_002fcd00" /* Method: sends the gadgebot back to its idle state 8, hidden and without collision. */ void hide_moby_and_clear_collision(struct Moby *moby) { unsigned short flags; - moby->state = 0x8; + moby->state = GADGEBOT_IDLE; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } diff --git a/src/overlays/l18/mobys/grind_rail_junction.c b/src/overlays/l18/mobys/grind_rail_junction.c index 4d98717cff..02fe1cc00a 100644 --- a/src/overlays/l18/mobys/grind_rail_junction.c +++ b/src/overlays/l18/mobys/grind_rail_junction.c @@ -54,7 +54,7 @@ void grind_rail_junction_update(struct Moby *moby) { switch (moby->state) { case STATE_INITIALIZE_PATH_PAIRS: - moby->state = 1; + moby->state = STATE_SELECT_NEARER_PATH; moby->update_dist = 0xFF; pair_or_node_index = 0; do { diff --git a/src/overlays/l18/mobys/hidden_deplanetizer_gun.c b/src/overlays/l18/mobys/hidden_deplanetizer_gun.c index ae9616ffa5..b684988897 100644 --- a/src/overlays/l18/mobys/hidden_deplanetizer_gun.c +++ b/src/overlays/l18/mobys/hidden_deplanetizer_gun.c @@ -21,22 +21,25 @@ void hidden_deplanetizer_gun_update(struct Moby *moby) { WAIT_TO_HIDE_AND_TURN = 1, HIDDEN_WAIT_TO_SHOW = 2 }; + enum { + VISIBLE_RESTORED = 3 + }; switch (moby->state) { case INITIALIZE_STATE_MACHINE: - moby->state = 1; + moby->state = WAIT_TO_HIDE_AND_TURN; break; case WAIT_TO_HIDE_AND_TURN: if (D_L18_0015F5C4 == 2 && D_L18_0016D290_lui == 3) { moby->flags |= 1; moby->visible = 0; moby->rot.x = fast_add_rotations(moby->rot.x, 3.1415927f); - moby->state = 2; + moby->state = HIDDEN_WAIT_TO_SHOW; } break; case HIDDEN_WAIT_TO_SHOW: if (D_L18_0015F5C4 != 2) { unsigned short fl = moby->flags; - moby->state = 3; + moby->state = VISIBLE_RESTORED; fl &= 0xFFFE; moby->visible = 1; moby->flags = fl; diff --git a/src/overlays/l18/mobys/inert_moby.c b/src/overlays/l18/mobys/inert_moby.c index b214d6fc64..3997bc5322 100644 --- a/src/overlays/l18/mobys/inert_moby.c +++ b/src/overlays/l18/mobys/inert_moby.c @@ -49,8 +49,12 @@ void inert_moby_update(Level18VendorMobyShort *moby) __asm__("FUN_L18_002f7ab0") /* Moby class 1432 */ void inert_moby_update(Level18VendorMobyShort *moby) { - if (moby->state == 0) { - moby->state = 1; + enum { + INERT_MOBY_STATE_UNINITIALIZED = 0, + INERT_MOBY_STATE_INITIALIZED = 1 + }; + if (moby->state == INERT_MOBY_STATE_UNINITIALIZED) { + moby->state = INERT_MOBY_STATE_INITIALIZED; moby->flags |= 3; moby->substate = 0; } diff --git a/src/overlays/l18/mobys/lift.c b/src/overlays/l18/mobys/lift.c index b1e6580e53..2839c8cc43 100644 --- a/src/overlays/l18/mobys/lift.c +++ b/src/overlays/l18/mobys/lift.c @@ -86,7 +86,7 @@ void lift_update(struct Moby *lift_moby) { } *(int *)(lift_vars + 0x1C) = next_lift_instance_index_gp++; lift_moby->update_dist = 0xFF; - lift_moby->state = 1; + lift_moby->state = LIFT_SELECT_INITIAL_HEIGHT; ((M_2310 *)lift_moby)->h34 |= 1; lift_moby->draw_dist = 0; lift_moby->collision = 0; @@ -98,17 +98,17 @@ void lift_update(struct Moby *lift_moby) { initial_height_selector = *(int *)(lift_vars + 8); next_lift_instance_index_gp = 0; if (initial_height_selector != 0 && D_00141400 == 0) { - lift_moby->state = 2; + lift_moby->state = LIFT_APPROACH_BASE_HEIGHT; lift_moby->pos.z = *(float *)(lift_vars + 0); } else { - lift_moby->state = 3; + lift_moby->state = LIFT_APPROACH_ALTERNATE_HEIGHT; lift_moby->pos.z = *(float *)(lift_vars + 4); } break; case LIFT_APPROACH_ALTERNATE_HEIGHT: if (lift_moby->command & 4) { lift_alternate_height_requested_gp = 0; - lift_moby->state = 2; + lift_moby->state = LIFT_APPROACH_BASE_HEIGHT; if (*(int *)(lift_vars + 8) == 0) { D_0013D406 = 1; } @@ -124,7 +124,7 @@ void lift_update(struct Moby *lift_moby) { break; case LIFT_APPROACH_BASE_HEIGHT: if (lift_moby->command & 8) { - lift_moby->state = 3; + lift_moby->state = LIFT_APPROACH_ALTERNATE_HEIGHT; lift_alternate_height_requested_gp = 1; } lift_moby->command = 2; @@ -183,6 +183,9 @@ extern E l18_lift_height_records[] __asm__("D_L18_001DB500"); extern short *D_L18_001AC240_c[] __asm__("D_L18_001AC240"); void synchronize_lift_group_height(void *source_moby) { + enum { + MOBY_CLASS_LIFT = 0x57A + }; unsigned char *source_moby_bytes = source_moby; short *group_entry = D_L18_001AC240_c[source_moby_bytes[0x21]]; E *height_records = l18_lift_height_records; @@ -190,7 +193,7 @@ void synchronize_lift_group_height(void *source_moby) { Mx *group_moby = (Mx *)(((*(unsigned short *)group_entry & 0x7FFF) << 8) + (int)D_L18_0015FFD8); group_moby->f = *(float *)(source_moby_bytes + 0x18); - if (group_moby->kind == 0x57A) { + if (group_moby->kind == MOBY_CLASS_LIFT) { height_records[group_moby->l->idx].f = *(float *)(source_moby_bytes + 0x18); } } while (*group_entry++ >= 0); diff --git a/src/overlays/l18/mobys/mine.c b/src/overlays/l18/mobys/mine.c index 01e4d68539..b9b045524e 100644 --- a/src/overlays/l18/mobys/mine.c +++ b/src/overlays/l18/mobys/mine.c @@ -18,6 +18,18 @@ #include "qcopy.h" +enum { + STATE_INITIALIZE = 0, + STATE_BALLISTIC_FLIGHT = 1, + STATE_POST_FLIGHT_SETTLING = 2, + STATE_APPROACH_NEARBY_TARGET = 3, + STATE_WAIT_TO_RESUME_APPROACH = 4 +}; + +enum { + STATE_INACTIVE = 5 +}; + extern int scale_game_frames(int); /* Moby update: hovers, drifts toward the player and plays its animations by state. */ @@ -36,13 +48,6 @@ void moby_568_update(struct Moby *moby) __asm__("FUN_L18_002d5918"); /* Moby class 568 */ void moby_568_update(struct Moby *moby) { - enum { - STATE_INITIALIZE = 0, - STATE_BALLISTIC_FLIGHT = 1, - STATE_POST_FLIGHT_SETTLING = 2, - STATE_APPROACH_NEARBY_TARGET = 3, - STATE_WAIT_TO_RESUME_APPROACH = 4 - }; char *class_238_update_private_vars = (char *)moby->pvars; float settling_displacement_or_steering_increment[4]; update_mine_detonation(moby); @@ -52,14 +57,14 @@ void moby_568_update(struct Moby *moby) { moby->flags = (moby->flags | 0x41) & 0xEFFF; *(void **)(class_238_update_private_vars + 0xD0) = &D_L18_00161988; *(float *)(class_238_update_private_vars + 0x30) = 0.05f; - moby->state = 5; + moby->state = STATE_INACTIVE; break; case STATE_BALLISTIC_FLIGHT: fast_vec_add(&moby->pos, &moby->pos, class_238_update_private_vars + 0x180); *(float *)(class_238_update_private_vars + 0x188) -= frame_time_sq * 10.0f; if (moby->pos.z < *(float *)(class_238_update_private_vars + 0x178)) { moby->pos.z = *(float *)(class_238_update_private_vars + 0x178); - moby->state = 2; + moby->state = STATE_POST_FLIGHT_SETTLING; *(float *)(class_238_update_private_vars + 0x188) = -(D_L18_00161994 * 2.0f * frame_time); } @@ -80,7 +85,7 @@ void moby_568_update(struct Moby *moby) { if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(12)); } - moby->state = 3; + moby->state = STATE_APPROACH_NEARBY_TARGET; moby->hit_slot = 0xFF; } break; @@ -141,7 +146,7 @@ void moby_568_update(struct Moby *moby) { break; case STATE_WAIT_TO_RESUME_APPROACH: if (FUN_L00_002dc9f0(moby, class_238_update_private_vars + 0x110)) { - moby->state = 3; + moby->state = STATE_APPROACH_NEARBY_TARGET; *(short *)(class_238_update_private_vars + 0xC8) = 0; } break; @@ -376,9 +381,9 @@ int update_moby_state_pause(struct Moby *moby) { unsigned char current_state = moby->state; if ((unsigned)(current_state - 3) < 2) { state_pause_result = 2; - if (current_state != 4) { + if (current_state != STATE_WAIT_TO_RESUME_APPROACH) { moby->command = current_state; - moby->state = 4; + moby->state = STATE_WAIT_TO_RESUME_APPROACH; } } else { *(short *)(moby_vars + 0xC8) = 0; @@ -403,8 +408,8 @@ int moby_hold_state_while_active(struct Moby *moby) __asm__("FUN_L18_002d6190"); int moby_hold_state_while_active(struct Moby *moby) { int active = store_moby_in_suck_cannon(moby); if (active != 0) { - moby->state = 4; - } else if (moby->state == 4) { + moby->state = STATE_WAIT_TO_RESUME_APPROACH; + } else if (moby->state == STATE_WAIT_TO_RESUME_APPROACH) { moby->state = moby->command; } return active; @@ -416,7 +421,7 @@ void hide_moby_and_disable_collision(struct Moby *moby) __asm__("FUN_L18_002d628 void hide_moby_and_disable_collision(struct Moby *moby) { unsigned short flags; - moby->state = 5; + moby->state = STATE_INACTIVE; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } diff --git a/src/overlays/l18/mobys/rocket.c b/src/overlays/l18/mobys/rocket.c index 15cbf2e654..ed68e25168 100644 --- a/src/overlays/l18/mobys/rocket.c +++ b/src/overlays/l18/mobys/rocket.c @@ -48,6 +48,9 @@ void rocket_moby_update(struct Moby *moby) __asm__("FUN_L18_002d5050"); /* Moby class 564 */ void rocket_moby_update(struct Moby *moby) { + enum { + ROCKET_STATE_FLYING = 0 + }; L18D *moby_vars = (L18D *)moby->pvars; float target_movement_step[4]; float movement_step[4]; @@ -60,7 +63,7 @@ void rocket_moby_update(struct Moby *moby) { int movement_collision_result; if (hero.state.current == 0x72 || D_L18_0015F5C4 == 2) { mark_moby_for_removal(moby); - } else if (moby->state == 0) { + } else if (moby->state == ROCKET_STATE_FLYING) { qcopy(previous_position, &moby->pos); movement_blend_weight = convert_integer_to_float(moby_vars->c); movement_blend_weight = movement_blend_weight / convert_integer_to_float(moby_vars->lim); @@ -291,7 +294,7 @@ void spawn_rocket_explosion(void *moby_object, void *movement_step) { -1, 0); if (hit_radius != 0.0f) { - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { play_entity_sound( (int)moby, 2.0f, moby + 0x10, 2, rocket_explosion_hit_priority_gp, 1.0f, 0, 1, 0); } diff --git a/src/overlays/l18/mobys/rocket_tank.c b/src/overlays/l18/mobys/rocket_tank.c index cc98d671e9..7fcb94f99c 100644 --- a/src/overlays/l18/mobys/rocket_tank.c +++ b/src/overlays/l18/mobys/rocket_tank.c @@ -146,7 +146,7 @@ void rocket_tank_update(M1454 *moby) { if (moby->b53 != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } - moby->state = 1; + moby->state = ROCKET_TANK_PATROLLING; break; case ROCKET_TANK_PATROLLING: func_L18_002F9AB8_v(moby); @@ -156,7 +156,7 @@ void rocket_tank_update(M1454 *moby) { if (moby->b53 != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(20)); } - moby->state = 2; + moby->state = ROCKET_TANK_FIRING; } break; case ROCKET_TANK_FIRING: @@ -194,7 +194,7 @@ void rocket_tank_update(M1454 *moby) { if (moby->b53 != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(20)); } - moby->state = 1; + moby->state = ROCKET_TANK_PATROLLING; } break; } @@ -241,7 +241,7 @@ extern void *FUN_L00_00257470_cf(char *src, float *v10, float *v11, float *v12) __asm__("FUN_L00_00263fd8"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); extern void trooper_anim_update(void *, short *) __asm__("FUN_L00_0025d458"); extern void mark_moby_for_removal_cf(void *, int, int) __asm__("FUN_L00_00257470"); extern void func_L00_0025F4A8_alt(void *, @@ -264,6 +264,9 @@ extern void func_L00_0025F4A8_alt(void *, int) __asm__("FUN_L00_0025e450"); void update_rocket_tank_damage_and_aim(void *mv) { + enum { + HIT_REACTION_NO_DAMAGE = 1 + }; unsigned char *moby_bytes = mv; char *tank_data = *(char **)(moby_bytes + 0x78); int r; @@ -278,7 +281,7 @@ void update_rocket_tank_damage_and_aim(void *mv) { &damage_amount, 0, 4); - if (hit_reaction_status != 1 && moby_bytes[0x20] != 0) { + if (hit_reaction_status != HIT_REACTION_NO_DAMAGE && moby_bytes[0x20] != 0) { float remaining_health = *(float *)(tank_data + 0x20) - damage_amount; *(float *)(tank_data + 0x20) = remaining_health; if (remaining_health > 0.0f) { @@ -388,8 +391,8 @@ void update_rocket_tank_damage_and_aim(void *mv) { frame_time_sq * 12.566371f, frame_time * 9.424778f); } - FUN_L00_001fff28(explosion_and_aim_scratch, 1, *(float *)(tank_data + 0x118)); - FUN_L00_001fff28( + build_axis_rotation_quaternion(explosion_and_aim_scratch, 1, *(float *)(tank_data + 0x118)); + build_axis_rotation_quaternion( tank_data + 0xD0, 2, fast_subtract_rotations(*(float *)(tank_data + 0x110), *(float *)(moby_bytes + 0x48))); diff --git a/src/overlays/l18/mobys/thruster_pack_lock_red.c b/src/overlays/l18/mobys/thruster_pack_lock_red.c index e56003c88f..280dbaa98d 100644 --- a/src/overlays/l18/mobys/thruster_pack_lock_red.c +++ b/src/overlays/l18/mobys/thruster_pack_lock_red.c @@ -20,6 +20,12 @@ #include "rnc/math/random.h" #include "rnc/ui/frames/draw_ui_frame.h" +enum { + THRUSTER_PACK_LOCK_RED_STATE_APPROACH_CONFIGURED_HEIGHT = 1, + THRUSTER_PACK_LOCK_RED_STATE_WAIT_FOR_GROUNDED_HERO_TRIGGER = 2, + THRUSTER_PACK_LOCK_RED_STATE_POST_WAIT_APPROACH_CONFIGURED_HEIGHT = 3 +}; + extern int scale_game_frames(int); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); @@ -57,6 +63,9 @@ void thruster_pack_lock_red_update(struct Moby *moby) { STATE_WAIT_FOR_DEPRESSION_TRIGGER = 4, STATE_SETTLE_DEPRESSED_HEIGHT = 5 }; + enum { + STATE_DEPRESSED_HEIGHT_SETTLED = 6 + }; char *thruster_pack_lock_red_private_vars = (char *)moby->pvars; int index; @@ -65,11 +74,11 @@ void thruster_pack_lock_red_update(struct Moby *moby) { *(float *)(thruster_pack_lock_red_private_vars + 0x64) = moby->pos.z; *(unsigned short *)(thruster_pack_lock_red_private_vars + 0x3E) |= 8; if (*(int *)(thruster_pack_lock_red_private_vars + 0x60) != 0) { - moby->state = 1; + moby->state = STATE_APPROACH_CONFIGURED_HEIGHT; moby->scale = moby->pclass->scale * l18_thruster_pack_lock_red_scale_multiplier; return; } - moby->state = 4; + moby->state = STATE_WAIT_FOR_DEPRESSION_TRIGGER; return; case STATE_APPROACH_CONFIGURED_HEIGHT: case STATE_POST_WAIT_APPROACH_CONFIGURED_HEIGHT: @@ -91,7 +100,7 @@ void thruster_pack_lock_red_update(struct Moby *moby) { frame_time_sq * 10.0f, frame_time * 20.0f); if (hero.air_frames.s == 0 && hero.ground_moby == moby && hero.state.current == 0x22) { - moby->state = 3; + moby->state = STATE_POST_WAIT_APPROACH_CONFIGURED_HEIGHT; allocate_voice_for_target_entry(0, 0, (int)moby); index = *(int *)(thruster_pack_lock_red_private_vars + 0x70); if (index != -1) { @@ -110,7 +119,7 @@ void thruster_pack_lock_red_update(struct Moby *moby) { break; case STATE_WAIT_FOR_DEPRESSION_TRIGGER: if (hero.air_frames.s == 0 && hero.ground_moby == moby && hero.state.current == 0x22) { - moby->state = 5; + moby->state = STATE_SETTLE_DEPRESSED_HEIGHT; moby->command = 1; moby->pos.z -= 1.5f; if (current_level_index == 0x12) @@ -145,7 +154,7 @@ void thruster_pack_lock_red_update(struct Moby *moby) { *(float *)(thruster_pack_lock_red_private_vars + 0x64) - 1.5f, 0.15f) != 0.0f) return; - moby->state = 6; + moby->state = STATE_DEPRESSED_HEIGHT_SETTLED; break; } } @@ -160,8 +169,8 @@ void request_thruster_pack_lock_red_wait(struct Moby *moby, int value) __asm__(" void request_thruster_pack_lock_red_wait(struct Moby *moby, int wait_duration_frames) { char *red_lock_vars = (char *)moby->pvars; - if (moby->state != 2) { - moby->state = 2; + if (moby->state != THRUSTER_PACK_LOCK_RED_STATE_WAIT_FOR_GROUNDED_HERO_TRIGGER) { + moby->state = THRUSTER_PACK_LOCK_RED_STATE_WAIT_FOR_GROUNDED_HERO_TRIGGER; *(int *)(red_lock_vars + 0x6C) = wait_duration_frames; } if (!voice_is_playing(moby, *(int *)(red_lock_vars + 0x70))) { @@ -174,9 +183,9 @@ void end_thruster_pack_lock_red_wait(struct Moby *moby) __asm__("FUN_L18_002d7fd void end_thruster_pack_lock_red_wait(struct Moby *moby) { int *red_lock_private_vars = (int *)moby->pvars; - if (moby->state == 2) { + if (moby->state == THRUSTER_PACK_LOCK_RED_STATE_WAIT_FOR_GROUNDED_HERO_TRIGGER) { int voice_slot_index; - moby->state = 3; + moby->state = THRUSTER_PACK_LOCK_RED_STATE_POST_WAIT_APPROACH_CONFIGURED_HEIGHT; voice_slot_index = red_lock_private_vars[0x70 / 4]; if (voice_slot_index != -1) { unsigned char *voice_slot_entry = @@ -194,11 +203,12 @@ int poll_moby_state_and_rearm(struct Moby *moby) __asm__("FUN_L18_002d8050"); int poll_moby_state_and_rearm(struct Moby *moby) { int *moby_private_vars = (int *)moby->pvars; - if (moby->state == 3) { - moby->state = 1; + if (moby->state == THRUSTER_PACK_LOCK_RED_STATE_POST_WAIT_APPROACH_CONFIGURED_HEIGHT) { + moby->state = THRUSTER_PACK_LOCK_RED_STATE_APPROACH_CONFIGURED_HEIGHT; return 1; } - if (moby->state == 2 && moby_private_vars[0x6C / 4] == 0) { + if (moby->state == THRUSTER_PACK_LOCK_RED_STATE_WAIT_FOR_GROUNDED_HERO_TRIGGER && + moby_private_vars[0x6C / 4] == 0) { return -1; } return 0; diff --git a/src/overlays/l18/mobys/trespasser_barrier.c b/src/overlays/l18/mobys/trespasser_barrier.c index 92fd496fec..9c1bda1f0b 100644 --- a/src/overlays/l18/mobys/trespasser_barrier.c +++ b/src/overlays/l18/mobys/trespasser_barrier.c @@ -57,7 +57,7 @@ void trespasser_barrier_update(struct Moby *moby) { int *moby_vars = (int *)moby->pvars; switch (moby->state) { case GLOW_INITIALIZE: - moby->state = 1; + moby->state = GLOW_ACTIVE; ((float *)moby_vars)[3] = 1.0f; break; case GLOW_ACTIVE: @@ -69,7 +69,7 @@ void trespasser_barrier_update(struct Moby *moby) { unsigned char *linked_moby = D_L18_0015FFD8 + (moby_vars[0] << 8); if (MOBY(linked_moby)->oclass == 0x267 && linked_moby[0x20] >= 3) { moby->collision = 0; - moby->state = 2; + moby->state = GLOW_FADE_OUT; if (voice_is_playing(moby, moby_vars[1]) != 0) { int i = moby_vars[1]; if (i != -1) { diff --git a/src/overlays/shared/audio/emitters/box_emitter.c b/src/overlays/shared/audio/emitters/box_emitter.c index 14efa9501a..d7e2a00bc5 100644 --- a/src/overlays/shared/audio/emitters/box_emitter.c +++ b/src/overlays/shared/audio/emitters/box_emitter.c @@ -11,7 +11,7 @@ #include "rnc/overlay/shared/vendor/vendor_volume.h" #include "rnc/math/random.h" -extern char D_L01_00167240[]; +extern char camera_pos[] __asm__("D_L01_00167240"); extern char *D_L00_0015F5F4; extern char D_0013E550[]; @@ -27,7 +27,7 @@ void update_box_emitter(char *moby) { float box_length, listener_length; radius.f[2] = radius.f[1] = radius.f[0] = MOBY(moby)->bsphere.w; - fast_vec_sub(&delta, D_L01_00167240, moby + 0x40); + fast_vec_sub(&delta, camera_pos, moby + 0x40); delta.f[3] = 0.0f; transform_vector_by_basis(&box_size, &delta, moby + 0x50); transform_vector_by_basis(&listener, &radius, moby + 0x50); diff --git a/src/overlays/shared/audio/emitters/listener_emitter.c b/src/overlays/shared/audio/emitters/listener_emitter.c index e6ea98fad5..f83de8e4cd 100644 --- a/src/overlays/shared/audio/emitters/listener_emitter.c +++ b/src/overlays/shared/audio/emitters/listener_emitter.c @@ -5,7 +5,7 @@ #include "rnc/audio/voice_alloc.h" #include "rnc/overlay/shared/audio/voices/play_voice.h" -extern char D_L01_00167240[]; +extern char camera_pos[] __asm__("D_L01_00167240"); void update_listener_emitter(int sound_owner) __asm__("FUN_L01_0031a078"); @@ -14,10 +14,10 @@ void update_listener_emitter(int sound_owner) { int voice_slot_index = *(int *)(sound_data + 4); char *voice_slot; int flag; - qcopy(voice_positions + voice_slot_index * 0x70, D_L01_00167240); + qcopy(voice_positions + voice_slot_index * 0x70, camera_pos); voice_slot = voice_positions - 0x90 + voice_slot_index * 0x70; flag = *(int *)(voice_slot + 0x8C) == sound_owner && *(unsigned char *)(voice_slot + 0x74) != 0; - if (*(int *)(D_L01_00167240 + 0x254) != 0) { + if (*(int *)(camera_pos + 0x254) != 0) { if (!flag) { *(int *)(sound_data + 4) = play_voice(*(int *)sound_data, 0x15, sound_owner, 0x400); } diff --git a/src/overlays/shared/camera/follow_camera_setup.c b/src/overlays/shared/camera/follow_camera_setup.c index 5fd5944b33..1d78481a9c 100644 --- a/src/overlays/shared/camera/follow_camera_setup.c +++ b/src/overlays/shared/camera/follow_camera_setup.c @@ -24,10 +24,11 @@ extern float D_L00_0015EF44_macro __asm__("D_L00_0015EF44") MACRO_ADDR; extern unsigned char *D_L00_00168FC0_lui __asm__("D_L00_00168FC0") NOT_SDA; extern int D_L00_0015EF60_macro __asm__("D_L00_0015EF60") MACRO_ADDR; extern float D_L00_00161CA0_gp __asm__("D_L00_00161CA0") __attribute__((sda)); -extern float D_L00_00161CDC_gp __asm__("D_L00_00161CDC") __attribute__((sda)); -extern float D_L00_00161CE0_gp __asm__("D_L00_00161CE0") __attribute__((sda)); -extern float D_L00_00161CE4_gp __asm__("D_L00_00161CE4") __attribute__((sda)); -extern float D_L00_00161D1C_gp __asm__("D_L00_00161D1C") __attribute__((sda)); +extern float l00_follow_camera_collision_probe_step_growth_factor __asm__("D_L00_00161CDC") + __attribute__((sda)); +extern float l00_follow_camera_collision_probe_count __asm__("D_L00_00161CE0") __attribute__((sda)); +extern float l00_follow_camera_collision_probe_scale __asm__("D_L00_00161CE4") __attribute__((sda)); +extern float D_L00_00161D1C_gp __asm__("D_L00_00161D1C") __attribute__((sda)); typedef struct { char pad0[0x2C]; @@ -163,9 +164,9 @@ void follow_camera_approach(unsigned char *moby) { ((CamTarget *)target)->unkE8 = 0.2f; ((CamTarget *)target)->unkD6 = 0; spring_reset = (CamSpring *)(*(unsigned char **)(moby + 0x70) + 0x1D0); - spring_reset->unk44 = D_L00_00161CDC_gp; - spring_reset->unk3C = D_L00_00161CE4_gp; - spring_reset->unk40 = D_L00_00161CE0_gp; + spring_reset->unk44 = l00_follow_camera_collision_probe_step_growth_factor; + spring_reset->unk3C = l00_follow_camera_collision_probe_scale; + spring_reset->unk40 = l00_follow_camera_collision_probe_count; spring_reset->unk48 = D_L00_0015EF60_macro; reset = *(unsigned char **)(moby + 0x70) + 0x220; ((CamEnd *)reset)->unkC = D_L00_00161D1C_gp; @@ -284,7 +285,7 @@ void follow_camera_apply_overrides(O_2e6000 *camera_moby) { flag = 1; { S40 *camera_target = (S40 *)((u8 *)camera_moby->m + 0x40); - if (hero.vehicle_mode == 1) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { camera_target->fB0 = 0.25f; follow_camera_set_height(1.5f, 0.003f); } else { @@ -295,7 +296,7 @@ void follow_camera_apply_overrides(O_2e6000 *camera_moby) { } if (hero.state.control_mode == 0x10) camera_moby->m->fF0 = 0.25f; - if (hero.vehicle_mode == 1) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { if (camera_override_state->i0 == 0) { q = (S40 *)((u8 *)camera_moby->m + 0x40); follow_camera_set_distance(1, 3.0f, 0.003f); @@ -306,7 +307,7 @@ void follow_camera_apply_overrides(O_2e6000 *camera_moby) { } *(f32 *)((u8 *)camera_moby->m + 0x20C) = 0.6f; } - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { if (camera_override_state->i10 < 2) { follow_camera_set_offset_scale(0, follow_camera_vehicle_offset_scale_gp, 0.005f); follow_camera_set_distance(1, follow_camera_vehicle_orbit_distance_gp, 0.003f); @@ -866,9 +867,9 @@ void follow_camera_setup(Moby_2E8210 *camera_moby) { g->h38 = 0; g->i4C = 0; g->h34 = r; - g->f44 = D_L00_00161CDC_gp; - g->f3C = D_L00_00161CE4_gp; - g->f40 = D_L00_00161CE0_gp; + g->f44 = l00_follow_camera_collision_probe_step_growth_factor; + g->f3C = l00_follow_camera_collision_probe_scale; + g->f40 = l00_follow_camera_collision_probe_count; g->i48 = D_L00_0015EF60; clear_u64_value(camera_state_base->g.v10); @@ -943,8 +944,8 @@ int update_follow_camera_orbit_after_collision(unsigned char *camera_moby, return sphere_collision_found; } adjusted_orbit_length = fast_vec_length(A); - if (hero.vehicle_mode != 2 && absolute_float(D_0013CA40_lui[0]) > 0.05f && - sphere_collision_found) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && + absolute_float(D_0013CA40_lui[0]) > 0.05f && sphere_collision_found) { adjusted_orbit_length -= follow_camera_collision_retraction_rate_gp * frame_scale; *(short *)(B + 0x34) = scale_game_frames(0x884); } @@ -1311,7 +1312,7 @@ int resolve_follow_camera_orbit_path_collisions(unsigned char *camera_moby) { accumulated_radial_adjustment_distance, spd)) { found = 1; - if (hero_state->vehicle_mode != 2 && + if (hero_state->vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && absolute_float(D_0013CA40_lui[0]) > 0.05f) { fast_vec_sub(position_delta, step, save); fast_vec_normalize(position_delta, position_delta, 1.0f); diff --git a/src/overlays/shared/camera/follow_camera_springs.c b/src/overlays/shared/camera/follow_camera_springs.c index 1e4a2b4850..70daee4200 100644 --- a/src/overlays/shared/camera/follow_camera_springs.c +++ b/src/overlays/shared/camera/follow_camera_springs.c @@ -111,14 +111,16 @@ extern float D_L00_00166EEC NOT_SDA; extern s32 D_L00_00161D24_gp __asm__("D_L00_00161D24") __attribute__((sda)); extern short follow_camera_ground_aware_focus_transition_frames_gp __asm__("D_L00_00161D38") __attribute__((sda)); -extern short D_L00_00161D3C_gp __asm__("D_L00_00161D3C") __attribute__((sda)); +extern short l00_follow_camera_ground_focus_exit_transition_frames_gp __asm__("D_L00_00161D3C") + __attribute__((sda)); extern short D_L00_00161D40_gp __asm__("D_L00_00161D40") __attribute__((sda)); extern short follow_camera_blend_out_focus_offset_gp __asm__("D_L00_00161D48") __attribute__((sda)); extern short follow_camera_project_hero_focus_blend_base_frames_gp __asm__("D_L00_00161D4C") __attribute__((sda)); extern short follow_camera_focus_blend_transition_frames_gp __asm__("D_L00_00161D50") __attribute__((sda)); -extern short D_L00_00161D54_gp __asm__("D_L00_00161D54") __attribute__((sda)); +extern short l00_follow_camera_post_blend_focus_transition_frames_gp __asm__("D_L00_00161D54") + __attribute__((sda)); extern short follow_camera_project_hero_focus_offset_gp __asm__("D_L00_00161D58") __attribute__((sda)); extern short follow_camera_hold_focus_blend_base_frames_gp __asm__("D_L00_00161D5C") @@ -840,7 +842,7 @@ void FUN_L00_002e4930(char *camera) { if (player->state.control_mode == 2) { attach_state->prev = attach_state->state; attach_state->state = 1; - attach_state->timer = D_L00_00161D3C_gp; + attach_state->timer = l00_follow_camera_ground_focus_exit_transition_frames_gp; attach_state->invTimer = 1.0f / convert_integer_to_float(attach_state->timer); } else { struct Hero *current_player = &hero; @@ -963,7 +965,8 @@ void FUN_L00_002e4930(char *camera) { if (p->state.control_mode == 2) { attach_state->prev = attach_state->state; attach_state->state = 1; - attach_state->timer = scale_game_frames(*(int *)&D_L00_00161D54_gp); + attach_state->timer = + scale_game_frames(*(int *)&l00_follow_camera_post_blend_focus_transition_frames_gp); attach_state->invTimer = 1.0f / convert_integer_to_float(attach_state->timer); return; } @@ -972,12 +975,14 @@ void FUN_L00_002e4930(char *camera) { if (D_001413DC == 2) { attach_state->prev = 4; attach_state->state = 1; - attach_state->timer = scale_game_frames(*(int *)&D_L00_00161D54_gp); + attach_state->timer = + scale_game_frames(*(int *)&l00_follow_camera_post_blend_focus_transition_frames_gp); attach_state->invTimer = 1.0f / convert_integer_to_float(attach_state->timer); } else { attach_state->prev = 4; attach_state->state = 0; - attach_state->timer = scale_game_frames(*(int *)&D_L00_00161D54_gp); + attach_state->timer = + scale_game_frames(*(int *)&l00_follow_camera_post_blend_focus_transition_frames_gp); attach_state->invTimer = 1.0f / convert_integer_to_float(attach_state->timer); } return; @@ -1015,14 +1020,16 @@ void FUN_L00_002e4930(char *camera) { if (attach_state->state == 6 && camera_secondary_mode_lui != 0xB) { attach_state->prev = attach_state->state; attach_state->state = 0; - attach_state->timer = scale_game_frames(*(int *)&D_L00_00161D54_gp); + attach_state->timer = + scale_game_frames(*(int *)&l00_follow_camera_post_blend_focus_transition_frames_gp); attach_state->invTimer = 1.0f / convert_integer_to_float(attach_state->timer); return; } if ((attach_state->state == 3 || attach_state->state == 5) && D_001413DC != 4) { attach_state->prev = attach_state->state; attach_state->state = 0; - attach_state->timer = scale_game_frames(*(int *)&D_L00_00161D54_gp); + attach_state->timer = + scale_game_frames(*(int *)&l00_follow_camera_post_blend_focus_transition_frames_gp); attach_state->invTimer = 1.0f / convert_integer_to_float(attach_state->timer); return; } @@ -1039,7 +1046,8 @@ void FUN_L00_002e4930(char *camera) { to_one: attach_state->prev = attach_state->state; attach_state->state = 1; - attach_state->timer = scale_game_frames(*(int *)&D_L00_00161D54_gp); + attach_state->timer = + scale_game_frames(*(int *)&l00_follow_camera_post_blend_focus_transition_frames_gp); r = 1.0f / convert_integer_to_float(attach_state->timer); camera_timer_base_frames = *(int *)&D_L00_00161D24_gp; attach_state->invTimer = r; @@ -1059,7 +1067,8 @@ void FUN_L00_002e4930(char *camera) { if (attach_state->state == 0xA && FUN_001f9770_c2(&attach_state->moveTimer)) { attach_state->prev = attach_state->state; attach_state->state = 0; - attach_state->timer = scale_game_frames(*(int *)&D_L00_00161D54_gp); + attach_state->timer = + scale_game_frames(*(int *)&l00_follow_camera_post_blend_focus_transition_frames_gp); attach_state->invTimer = 1.0f / convert_integer_to_float(attach_state->timer); return; } @@ -1117,7 +1126,7 @@ void FUN_L00_002e4fe8(char *camera, float *out_focus_velocity) { *(float *)&follow_camera_ground_focus_angle_upper_bound_gp < y))) { int v; *(unsigned char *)(attach_state + 0xC4) = 1; - v = *(unsigned short *)&D_L00_00161D3C_gp; + v = *(unsigned short *)&l00_follow_camera_ground_focus_exit_transition_frames_gp; *(short *)(attach_state + 0xC6) = v; *(float *)(attach_state + 0xC8) = 1.0f / convert_integer_to_float((short)v); } @@ -1195,7 +1204,7 @@ void FUN_L00_002e4fe8(char *camera, float *out_focus_velocity) { } else { int v; *(unsigned char *)(attach_state + 0xC4) = 4; - v = *(unsigned short *)&D_L00_00161D54_gp; + v = *(unsigned short *)&l00_follow_camera_post_blend_focus_transition_frames_gp; *(short *)(attach_state + 0xC6) = v; *(float *)(attach_state + 0xC8) = 1.0f / convert_integer_to_float((short)v); } @@ -1299,8 +1308,11 @@ void follow_camera_transition(O002e5730 *camera, void *input_offset) { compute_follow_camera_target_position( camera, input_offset, &target_position, attach_state->xc4); attach_mode = attach_state->xc4; - if (attach_mode == 3 || attach_mode == 5 || attach_mode == 6 || attach_mode == 7 || - attach_mode == 1) { + if (attach_mode == CAM_ATTACH_BLEND_TO_PROJECT_HERO_FOCUS_VELOCITY || + attach_mode == CAM_ATTACH_BLEND_FOCUS_VELOCITY_WITH_HOLD_TRANSITION || + attach_mode == CAM_ATTACH_BLEND_OUT_FOCUS_VELOCITY || + attach_mode == CAM_ATTACH_BLEND_BACK_FOCUS_VELOCITY || + attach_mode == CAM_ATTACH_HERO_POSITION_BASE) { x = follow_camera_position_transition_end_stiffness_gp + (follow_camera_position_default_stiffness_gp - follow_camera_position_transition_end_stiffness_gp) * @@ -1401,9 +1413,9 @@ void follow_camera_springs(void *camera_moby) { fast_vec_add(camera_state->follow.look_target, look, blended_focus_or_collision_origin); } follow_camera_transition(camera_moby, look); - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { scale_vector_xyz(look, view + 0x20, 3.0f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { scale_vector_xyz(look, view + 0x20, 0.4f); } else { scale_vector_xyz(look, view + 0x20, 0.5f); diff --git a/src/overlays/shared/camera/follow_camera_update.c b/src/overlays/shared/camera/follow_camera_update.c index ad67ee07b7..eb001a9f19 100644 --- a/src/overlays/shared/camera/follow_camera_update.c +++ b/src/overlays/shared/camera/follow_camera_update.c @@ -306,6 +306,9 @@ f32 D_L18_00162768[2] = {0.017453292f, 0.02268928f}; void follow_camera_build_view(u8 *p) __asm__("FUN_L00_002e9010"); void follow_camera_build_view(u8 *camera) { + enum { + VIEW_BLEND_NO_REMAINING_FRAMES = 0 + }; u8 *follow_state_block; u8 *camera_state; u8 *reloaded_camera_state; @@ -425,7 +428,7 @@ void follow_camera_build_view(u8 *camera) { FUN_001f9bf8_2e9010(camera, camera, 1.0f); } } - if (*(s16 *)view_blend_and_smoothing_state != 0) { + if (*(s16 *)view_blend_and_smoothing_state != VIEW_BLEND_NO_REMAINING_FRAMES) { fast_dec_timer_s16(view_blend_and_smoothing_state); remaining_view_blend_frames = convert_integer_to_float(*(s16 *)view_blend_and_smoothing_state); diff --git a/src/overlays/shared/camera/grindrail_camera.c b/src/overlays/shared/camera/grindrail_camera.c index 461d71693d..52ad041c74 100644 --- a/src/overlays/shared/camera/grindrail_camera.c +++ b/src/overlays/shared/camera/grindrail_camera.c @@ -12,6 +12,12 @@ #include "sda.h" /* Camera blocks FUN_L01_00314e98 resets (camera + 0x70 and its preset row in l01_camera_preset_rows) */ +enum { + CAMERA_PRESET_KIND_RAIL_SEGMENT_SYNC = 0, + CAMERA_PRESET_KIND_MAPPED_PATHS = 2, + CAMERA_PRESET_KIND_GRINDRAIL_PATH = 3 +}; + typedef struct { Vec4 pos; /* 0x00 */ u8 pad10[0x30]; @@ -132,7 +138,7 @@ void reset_camera_state_and_prepare_preset_paths(Camera *destination_camera) { focus = &destination_camera->orbit->focus; focus->dist = 1.5f; focus->state = 0; - if (preset->kind == 3) { + if (preset->kind == CAMERA_PRESET_KIND_GRINDRAIL_PATH) { focus->dist = 0.5f; } control = &destination_camera->control; @@ -169,7 +175,7 @@ void reset_camera_state_and_prepare_preset_paths(Camera *destination_camera) { blend->unk8 = 0; blend->unkC = 0; blend->unk10 = 1; - if (preset->kind == 2 && preset->ready == 0) { + if (preset->kind == CAMERA_PRESET_KIND_MAPPED_PATHS && preset->ready == 0) { track_path = ((CameraPath *)l01_paths[preset->track_path]); target_path = (CameraPath *)l01_splines[preset->target].path; preset_path = ((CameraPath *)l01_paths[preset->path]); @@ -329,7 +335,7 @@ void update_camera_position_and_orientation_from_paths(Cam *camera_to_update) { float look_length; float pitch_step; - if (mode == 0) { + if (mode == CAMERA_PRESET_KIND_RAIL_SEGMENT_SYNC) { Path *path; float dist; @@ -353,7 +359,7 @@ void update_camera_position_and_orientation_from_paths(Cam *camera_to_update) { camera_to_update->pos[1], rail_point[1], &data->vel[1], rate, 0.175f, 0.0f); camera_to_update->pos[2] = cam_interp_values( camera_to_update->pos[2], rail_point[2], &data->vel[2], rate, 0.175f, 0.0f); - } else if (mode == 2) { + } else if (mode == CAMERA_PRESET_KIND_MAPPED_PATHS) { Path *pathA = ((Path *)l01_paths[path_index]); Path *pathD = (Path *)l01_splines_macro[camera_path_preset->target].path; Path *pathC = ((Path *)l01_paths[camera_path_preset->path]); @@ -487,7 +493,8 @@ void update_camera_position_and_orientation_from_paths(Cam *camera_to_update) { 20.0f, 1.0f, 0.0f); - if (current_level_index_macro == 0xE && camera_path_preset->kind == 0) { + if (current_level_index_macro == 0xE && + camera_path_preset->kind == CAMERA_PRESET_KIND_RAIL_SEGMENT_SYNC) { sample_path(path, delta, &segment, &fraction, lead, 0); } else { sample_path(path, delta, &segment, &fraction, lead, 1); @@ -566,7 +573,7 @@ void initialize_camera_transform_and_paths(Camera *destination_camera) { } camera_preset->unk36 = 0; - if (camera_preset->kind == 3) { + if (camera_preset->kind == CAMERA_PRESET_KIND_GRINDRAIL_PATH) { CameraPath *path; s32 next; path = ((CameraPath *)l01_paths[camera_preset->track_path]); diff --git a/src/overlays/shared/camera/hero_aligned_camera.c b/src/overlays/shared/camera/hero_aligned_camera.c index 4b96c7aa7f..044d019663 100644 --- a/src/overlays/shared/camera/hero_aligned_camera.c +++ b/src/overlays/shared/camera/hero_aligned_camera.c @@ -244,9 +244,9 @@ void update_hero_aligned_camera_position(char *camera_object) { int vehicle_mode; FUN_001f9bf8_002e9cc0(normalized_hero_up_axis, ((char *)hero_data->moby) + 0xE0, 1.0f); vehicle_mode = hero_data->vehicle_mode; - if (vehicle_mode == 2) { + if (vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { FUN_001f9a68_002e9cc0(camera_height_offset, normalized_hero_up_axis, 9.5f); - } else if (vehicle_mode == 1) { + } else if (vehicle_mode == HERO_VEHICLE_MODE_CLANK) { if (D_0015EDB3_002e9cc0) { FUN_001f9a68_002e9cc0(camera_height_offset, normalized_hero_up_axis, 1.2f); } else { @@ -267,9 +267,9 @@ void initialize_hero_aligned_camera_pose(char *camera_object) { u128 scaled_hero_up_axis; struct Hero *hero_state = &hero; FUN_001f9bf8_2e9dd0(&hero_up_axis, ((char *)hero_state->moby) + 0xE0, 1.0f); - if (hero_state->vehicle_mode == 2) { + if (hero_state->vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { FUN_001f9a68_2e9dd0(&scaled_hero_up_axis, &hero_up_axis, 9.5f); - } else if (hero_state->vehicle_mode == 1) { + } else if (hero_state->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { FUN_001f9a68_2e9dd0(&scaled_hero_up_axis, &hero_up_axis, 0.9f); } else { FUN_001f9a68_2e9dd0(&scaled_hero_up_axis, &hero_up_axis, 1.6f); @@ -418,6 +418,9 @@ void update_hero_aligned_camera_from_input(u8 *camera_object) { int camera_transition_update(u8 *, char *) __asm__("FUN_L00_002ea488"); int camera_transition_update(u8 *transition_camera_record, char *mode_check_object) { + enum { + CAMERA_REQUEST_BYPASS_MODE_MATCH = 0x51 + }; Q_2ea488 *q; char *active_transition_camera_record; char *r; @@ -434,7 +437,7 @@ int camera_transition_update(u8 *transition_camera_record, char *mode_check_obje g = &P; requested_camera_mode = g->i2284; if (requested_camera_mode == *(s16 *)(transition_camera_record + 0x86) || - requested_camera_mode == 0x51) { + requested_camera_mode == CAMERA_REQUEST_BYPASS_MODE_MATCH) { active_transition_camera_record = D_L00_00166E00_lui; checked_object_mode = *(s16 *)(mode_check_object + 0x86); if (checked_object_mode != 0 && checked_object_mode != 10 && checked_object_mode != 14 && diff --git a/src/overlays/shared/camera/hoverboard_camera.c b/src/overlays/shared/camera/hoverboard_camera.c index b8dd8692d6..e3a42e64c1 100644 --- a/src/overlays/shared/camera/hoverboard_camera.c +++ b/src/overlays/shared/camera/hoverboard_camera.c @@ -19,6 +19,11 @@ /* Sets up a moby's vector from the level table and clamps its height for the current state. */ /* Ported from rac1-decomp (src/overlays/shared/vendor_002CF2C0.c: func_L05_0032A868), where it is exact; names translated to the US level program. */ +enum { + CAMERA_ORBIT_MODE_FOLLOW = 0, + CAMERA_ORBIT_MODE_ORBITING = 1 +}; + void update_hero_follow_camera_focus(char *moby) __asm__("FUN_L05_00329358"); void update_hero_follow_camera_focus(char *moby) { @@ -276,7 +281,7 @@ void reset_hero_follow_camera_from_preset(Camera *camera_to_reset) { orbit->unk10 = 0.01f; orbit->unk14 = 0.2f; orbit->unk18 = 0; - orbit->mode = 0; + orbit->mode = CAMERA_ORBIT_MODE_FOLLOW; clear_u64_value(orbit); track = &camera_to_reset->orbit->track; clear_u64_value(track); @@ -329,8 +334,8 @@ void update_hero_follow_camera_orbit(Camera *hero_follow_camera) { f32 tilt; fast_vec_normalize(&up, &hero.gravity_dir, -1.0f); - if (orbit->mode == 0 && hero.vert_ramp_launch != 0) { - orbit->mode = 1; + if (orbit->mode == CAMERA_ORBIT_MODE_FOLLOW && hero.vert_ramp_launch != 0) { + orbit->mode = CAMERA_ORBIT_MODE_ORBITING; fast_vec_cross(&side, &hero.moby->rot_row2, &up); fast_vec_normalize(&side, &side, 1.0f); fast_vec_cross(&fwd, &up, &side); @@ -378,7 +383,7 @@ void update_hero_follow_camera_orbit(Camera *hero_follow_camera) { spring[8] = 0.005f; spring[11] = 0.2f; } - if (orbit->mode == 1) { + if (orbit->mode == CAMERA_ORBIT_MODE_ORBITING) { fast_vec_normalize(&side, &focus->side, hero_follow_camera->dist); build_look_at_matrix(&side, &side, &up, hero_follow_camera->yaw); fast_vec_cross(&fwd, &side, &up); @@ -392,7 +397,7 @@ void update_hero_follow_camera_orbit(Camera *hero_follow_camera) { hero_follow_camera->dist = FUN_001ebd78( &spring[5], hero_follow_camera->dist, spring[2], spring[8], spring[11], 0.0f); if (hero.vert_ramp_launch == 0) { - orbit->mode = 0; + orbit->mode = CAMERA_ORBIT_MODE_FOLLOW; fast_vec_scale(orbit, orbit, -1.0f); } } @@ -505,7 +510,7 @@ void update_orbit_camera_position(Camera_32B1F8 *camera) { spring = &orbit->spring; fast_vec_normalize(&down, up_axis, -1.0f); qcopy(&focus, &focus_state->pos); - if (orbit->mode == 0) { + if (orbit->mode == CAMERA_ORBIT_MODE_FOLLOW) { fast_vec_sub(&rel, pos = &camera->pos, &focus); probe_step = 0; along = fast_vec_dot(&rel, &focus_state->axis); diff --git a/src/overlays/shared/camera/init_camera_system.c b/src/overlays/shared/camera/init_camera_system.c index d215e8ccd5..be64ec9d36 100644 --- a/src/overlays/shared/camera/init_camera_system.c +++ b/src/overlays/shared/camera/init_camera_system.c @@ -336,19 +336,19 @@ void resolve_camera_movement_collisions(OvlQuad *camera_pos void resolve_camera_movement_collisions(OvlQuad *camera_position, float collision_radius) { OvlQuad step_delta[1]; float camera_movement_origin_snapshot[4] __attribute__((aligned(16))); - char *o = (char *)l00_camera_lui.unk180; - float *camera_movement_origin = (float *)(o + 0x64); + char *camera_record_at_entry = (char *)l00_camera_lui.unk180; + float *camera_movement_origin = (float *)(camera_record_at_entry + 0x64); int step_count, i, j; camera_movement_origin_snapshot[0] = camera_movement_origin[0]; camera_movement_origin_snapshot[1] = camera_movement_origin[1]; camera_movement_origin_snapshot[2] = camera_movement_origin[2]; ((int *)camera_movement_origin_snapshot)[3] = 0; - if (*(short *)(o + 0x8A) != 0) { + if (*(short *)(camera_record_at_entry + 0x8A) != 0) { if (D_L00_0016C06C == 0) { qcopy(&l00_camera_lui.pos, camera_position); } - *(short *)(o + 0x8A) = 0; + *(short *)(camera_record_at_entry + 0x8A) = 0; return; } fast_vec_sub(step_delta, camera_position, camera_movement_origin_snapshot); diff --git a/src/overlays/shared/camera/moby_controlled_camera.c b/src/overlays/shared/camera/moby_controlled_camera.c index b48e50b6a3..5498f35ca3 100644 --- a/src/overlays/shared/camera/moby_controlled_camera.c +++ b/src/overlays/shared/camera/moby_controlled_camera.c @@ -50,7 +50,7 @@ set_follow_camera_angle_blend_from_position(float, float, void *) __asm__("FUN_L extern char *D_L02_001B0AB0[]; extern char *D_L02_00167400_d __asm__("D_L02_00167400") NOT_SDA; -extern char *D_L02_0015EF50; +extern char *l02_moby_record_table __asm__("D_L02_0015EF50"); extern char *D_L02_001674DC NOT_SDA; extern char D_L02_00167410[] NOT_SDA; extern LevelCamera l02_camera_lui __asm__("D_L02_00167280") NOT_SDA; @@ -72,11 +72,11 @@ int test_moby_camera_control_activation(char *moby) __asm__("FUN_L02_002fb648"); int test_moby_camera_control_activation(char *moby) { char *special = D_L02_001674DC; - MobyCameraControl *camera_control_entry = - (MobyCameraControl *)(*(char **)(D_L02_0015EF50 + *(short *)(moby + 0x84) * 32 + 0x1c)); - char *target = camera_control_entry->target; - int *activation_path_record; - int hero_containment_result; + MobyCameraControl *camera_control_entry = (MobyCameraControl *)(*( + char **)(l02_moby_record_table + *(short *)(moby + 0x84) * 32 + 0x1c)); + char *target = camera_control_entry->target; + int *activation_path_record; + int hero_containment_result; if (special != 0 && special == target) { return 1; @@ -146,7 +146,7 @@ int test_moby_camera_target_angle_limits(char *moby, float residual_angle_limit_ float dot3; float den; - char *moby_record_table = D_L02_0015EF50; + char *moby_record_table = l02_moby_record_table; char *target_moby; moby_camera_control_entry = *(char **)(moby_record_table + *(short *)(moby + 0x84) * 32 + 0x1C); @@ -191,23 +191,23 @@ int test_moby_camera_target_angle_limits(char *moby, float residual_angle_limit_ void apply_moby_camera_control(char *moby) __asm__("FUN_L02_002fb9c8"); void apply_moby_camera_control(char *moby) { - MobyCameraControl *moby_camera_control_record = - (MobyCameraControl *)(*(char **)(D_L02_0015EF50 + *(short *)(moby + 0x84) * 32 + 0x1c)); - char *target; - unsigned short *group; - int id; - int index; - int duration; - int count; - int end; - int frames; - int active; - int hit; - float scale; - float angle; - float heading; - float amount; - float heading_vector[3]; + MobyCameraControl *moby_camera_control_record = (MobyCameraControl *)(*( + char **)(l02_moby_record_table + *(short *)(moby + 0x84) * 32 + 0x1c)); + char *target; + unsigned short *group; + int id; + int index; + int duration; + int count; + int end; + int frames; + int active; + int hit; + float scale; + float angle; + float heading; + float amount; + float heading_vector[3]; if (moby_camera_control_record->unk50 != 0) { moby_camera_control_record->unk20 = 0; @@ -279,7 +279,7 @@ void apply_moby_camera_control(char *moby) { angle = fast_arc_tan(*(float *)D_L02_00167400_d, *(float *)(D_L02_00167400_d + 4)); if (moby_camera_control_record->unk20 < 2) moby_camera_control_record->unk40 = - *(float *)(D_L02_0015EF50 + *(short *)(moby + 0x84) * 32 + 0x18); + *(float *)(l02_moby_record_table + *(short *)(moby + 0x84) * 32 + 0x18); else if (absolute_float(controller_state.analog[0]) >= 0.3f || absolute_float(controller_state.analog[1]) >= 0.3f) moby_camera_control_record->unk40 = angle; @@ -288,7 +288,7 @@ void apply_moby_camera_control(char *moby) { fast_add_rotations(heading, 3.1415927f); } if (moby_camera_control_record->unk3C == 4) { - heading = *(float *)(D_L02_0015EF50 + *(short *)(moby + 0x84) * 32 + 0x18); + heading = *(float *)(l02_moby_record_table + *(short *)(moby + 0x84) * 32 + 0x18); angle = fast_arc_tan(*(float *)D_L02_00167400_d, *(float *)(D_L02_00167400_d + 4)); if (fast_difference_between_rotations(heading, angle) > 1.5707964f) heading = fast_add_rotations(heading, 3.1415927f); @@ -451,7 +451,7 @@ int update_moby_camera_control(char *moby) __asm__("FUN_L02_002fc298"); int update_moby_camera_control(char *moby) { char *moby_camera_control_data = - *(char **)(D_L02_0015EF50 + *(short *)(moby + 0x84) * 32 + 0x1C); + *(char **)(l02_moby_record_table + *(short *)(moby + 0x84) * 32 + 0x1C); if (*(short *)(D_L02_00167400_lui + 0x86) == 0 && *(short *)(moby_camera_control_data + 0x20) >= 0) apply_moby_camera_control(moby); diff --git a/src/overlays/shared/camera/path_flythrough_camera.c b/src/overlays/shared/camera/path_flythrough_camera.c index fc2e9ee485..863466ac94 100644 --- a/src/overlays/shared/camera/path_flythrough_camera.c +++ b/src/overlays/shared/camera/path_flythrough_camera.c @@ -18,13 +18,13 @@ #include "rnc/overlay/shared/camera/path_flythrough_camera.h" #include "rnc/overlay/shared/rendering/effects/spawn_explosion.h" -extern char *D_L10_0015EF50; +extern char *l10_descriptor_table __asm__("D_L10_0015EF50"); void activate_descriptor(int i) __asm__("FUN_L10_002f5a50"); void activate_descriptor(int i) { unsigned char *descriptor_record; - descriptor_record = *(unsigned char **)(D_L10_0015EF50 + i * 0x20 + 0x1C); + descriptor_record = *(unsigned char **)(l10_descriptor_table + i * 0x20 + 0x1C); descriptor_record[0x38] = 1; descriptor_record[0x39] = 0; } @@ -34,24 +34,28 @@ extern int point_in_path_xy(float *, float *, int) __asm__("FUN_L00_00259740"); int check_descriptor_hero_trigger(char *moby) __asm__("FUN_L10_002f5a78"); int check_descriptor_hero_trigger(char *moby) { - unsigned char *e = *(unsigned char **)(D_L10_0015EF50 + *(short *)(moby + 0x84) * 32 + 0x1C); + unsigned char *trigger_descriptor_record = + *(unsigned char **)(l10_descriptor_table + *(short *)(moby + 0x84) * 32 + 0x1C); - if (*(int *)(e + 0x0C) >= 0) { - if (is_point_inside_clip_volume(&hero.motion.pos, *(int *)(e + 0x0C))) + if (*(int *)(trigger_descriptor_record + 0x0C) >= 0) { + if (is_point_inside_clip_volume(&hero.motion.pos, + *(int *)(trigger_descriptor_record + 0x0C))) return 1; - } else if (*(int *)(e + 0x10) >= 0) { - if (test_point_in_transformed_unit_cylinder(&hero.motion.pos, *(int *)(e + 0x10))) + } else if (*(int *)(trigger_descriptor_record + 0x10) >= 0) { + if (test_point_in_transformed_unit_cylinder(&hero.motion.pos, + *(int *)(trigger_descriptor_record + 0x10))) return 1; - } else if (*(int *)(e + 0x08) >= 0) { - if (test_point_in_transformed_unit_sphere((float *)(&hero.motion.pos), *(int *)(e + 0x08))) + } else if (*(int *)(trigger_descriptor_record + 0x08) >= 0) { + if (test_point_in_transformed_unit_sphere((float *)(&hero.motion.pos), + *(int *)(trigger_descriptor_record + 0x08))) return 1; - } else if (*(int *)(e + 0x14) >= 0) { - int i = *(int *)(e + 0x14); + } else if (*(int *)(trigger_descriptor_record + 0x14) >= 0) { + int i = *(int *)(trigger_descriptor_record + 0x14); if (point_in_path_xy((float *)(&hero.motion.pos), (float *)(((char *)l10_paths[i]) + 0x10), *(int *)l10_paths[i])) return 1; - } else if (e[0x38] != 0 && e[0x39] == 0) { + } else if (trigger_descriptor_record[0x38] != 0 && trigger_descriptor_record[0x39] == 0) { return 1; } return 0; @@ -84,13 +88,13 @@ extern struct { char *source; } D_L10_00167100; -extern VendorView_5f18 D_L10_0016CEC0; +extern VendorView_5f18 l10_camera_view __asm__("D_L10_0016CEC0"); void initialize_path_camera(struct UpdateCam *path_camera) __asm__("FUN_L10_002f5b58"); void initialize_path_camera(struct UpdateCam *path_camera) { - char *rec = *(char **)(D_L10_0015EF50 + path_camera->descriptor_index * 32 + 0x1C); - VendorCamRun_5f18 *run; + char *rec = *(char **)(l10_descriptor_table + path_camera->descriptor_index * 32 + 0x1C); + VendorCamRun_5f18 *run; VendorCamStops_5f18 *stops; f32 *fov; Vec4f *m1, *m2, *pos; @@ -117,7 +121,7 @@ void initialize_path_camera(struct UpdateCam *path_camera) { pos = &path_camera->pos; m1 = (Vec4f *)&path_camera->m1; m2 = (Vec4f *)&path_camera->m2; - stops->fov_end = fast_arc_tan(1.0f, D_L10_0016CEC0.tan_half_fov) * 2.0f; + stops->fov_end = fast_arc_tan(1.0f, l10_camera_view.tan_half_fov) * 2.0f; if (*(int *)(rec + 0x20) >= 0) { char *path = ((char *)l10_paths[*(int *)(rec + 0x20)]); int i = 0; @@ -189,15 +193,17 @@ void initialize_path_camera(struct UpdateCam *path_camera) { } extern char *D_L10_0015FFD8_5f18 __asm__("D_L10_0015FFD8"); -extern f32 D_L10_0015F3FC; -extern s32 D_L10_0015F404; -extern char D_L10_00167450[]; +extern f32 l10_path_camera_transition_amount __asm__("D_L10_0015F3FC"); +extern s32 l10_path_flythrough_active __asm__("D_L10_0015F404"); +extern char l10_path_camera_anchor_offset_basis[] __asm__("D_L10_00167450"); extern float D_L10_00167358 NOT_SDA; extern float D_0013F5E0_5f18[] __asm__("D_0013F5E0"); extern void debug_point_5f18(void *, float) __asm__("FUN_001e93e8"); -void FUN_L10_002f5f18(struct UpdateCam *cam) { - float dir[4]; +void update_path_flythrough_camera(struct UpdateCam *cam) __asm__("FUN_L10_002f5f18"); + +void update_path_flythrough_camera(struct UpdateCam *cam) { + float initial_aim_or_previous_position[4]; float offset[4]; float point[4]; float look_point[4]; @@ -212,17 +218,17 @@ void FUN_L10_002f5f18(struct UpdateCam *cam) { int i; saved = (char *)cam->saved_state; - rec = *(char **)(D_L10_0015EF50 + cam->descriptor_index * 32 + 0x1C); + rec = *(char **)(l10_descriptor_table + cam->descriptor_index * 32 + 0x1C); run = (VendorCamRun_5f18 *)(saved + 0x40); stops = (VendorCamStops_5f18 *)(saved + 0x58); if (run->started == 0) { - D_L10_0015F3FC += 0.05f; - if (D_L10_0015F3FC >= 1.0f) { + l10_path_camera_transition_amount += 0.05f; + if (l10_path_camera_transition_amount >= 1.0f) { char *start_path = ((char *)l10_paths[*(int *)(rec + 0x20)]); char *look_path = ((char *)l10_paths[*(int *)(rec + 0x24)]); - D_L10_0015F3FC = 1.0f; - D_L10_0015F404 = 1; + l10_path_camera_transition_amount = 1.0f; + l10_path_flythrough_active = 1; run->started = 1; qcopy(&cam->pos, start_path + 0x10); if (*(int *)(rec + 0x28) >= 0) { @@ -233,14 +239,14 @@ void FUN_L10_002f5f18(struct UpdateCam *cam) { offset[1] = ofs[1]; offset[2] = ofs[2]; offset[3] = 0.0f; - transform_vector_by_basis(offset, offset, D_L10_00167450); + transform_vector_by_basis(offset, offset, l10_path_camera_anchor_offset_basis); fast_vec_add(point, &anchor->pos, offset); - fast_vec_sub(dir, point, &cam->pos); + fast_vec_sub(initial_aim_or_previous_position, point, &cam->pos); } else { - fast_vec_sub(dir, look_path + 0x10, &cam->pos); + fast_vec_sub(initial_aim_or_previous_position, look_path + 0x10, &cam->pos); } fast_vec_scale(offset, D_0013F5E0_5f18, -1.0f); - fast_vec_normalize(&cam->m0, dir, 1.0f); + fast_vec_normalize(&cam->m0, initial_aim_or_previous_position, 1.0f); fast_vec_cross(&cam->m1, &cam->m0, offset); fast_vec_normalize(&cam->m1, &cam->m1, 1.0f); fast_vec_cross(&cam->m2, &cam->m1, &cam->m0); @@ -248,18 +254,18 @@ void FUN_L10_002f5f18(struct UpdateCam *cam) { return; } if (run->started == 2) { - D_L10_0015F3FC += 0.05f; - if (D_L10_0015F3FC >= 1.0f) { + l10_path_camera_transition_amount += 0.05f; + if (l10_path_camera_transition_amount >= 1.0f) { float ang; run->started = 3; - D_L10_0015F3FC = 1.0f; + l10_path_camera_transition_amount = 1.0f; ang = stops->fov_end * 0.5f; - D_L10_0016CEC0.tan_half_fov = fast_sin(ang) / fast_cos(ang); + l10_camera_view.tan_half_fov = fast_sin(ang) / fast_cos(ang); update_view_context(); *(u8 *)(rec + 0x39) = 1; D_L10_00167358 = 0.05f; cam->transition_state = 4; - D_L10_0015F404 = 0; + l10_path_flythrough_active = 0; if (*(int *)(rec + 0x4C) == 0) hero_set_state(0, 1); } @@ -268,12 +274,12 @@ void FUN_L10_002f5f18(struct UpdateCam *cam) { } else if (run->started == 3) { return; } else { - D_L10_0015F3FC -= 0.05f; - if (D_L10_0015F3FC < 0.0f) - D_L10_0015F3FC = 0.0f; + l10_path_camera_transition_amount -= 0.05f; + if (l10_path_camera_transition_amount < 0.0f) + l10_path_camera_transition_amount = 0.0f; } path = ((char *)l10_paths[*(int *)(rec + 0x20)]); - qcopy(dir, &cam->pos); + qcopy(initial_aim_or_previous_position, &cam->pos); done = FUN_L00_0025d808( path, &cam->pos.x, &run->seg, &run->t, 0, *(float *)(rec + 0x3C) * frame_time); if (run->timer != 0) { @@ -306,11 +312,11 @@ void FUN_L10_002f5f18(struct UpdateCam *cam) { total += *(float *)(path + (after * 16 + 0x1C)); ang = cosine_interpolate(stops->fov[i], stops->fov[i + 1], sum / total) * 0.017453292f * 0.5f; - D_L10_0016CEC0.tan_half_fov = fast_sin(ang) / fast_cos(ang); + l10_camera_view.tan_half_fov = fast_sin(ang) / fast_cos(ang); update_view_context(); } } - run->dist += fast_vec_dist(dir, &cam->pos); + run->dist += fast_vec_dist(initial_aim_or_previous_position, &cam->pos); if (*(int *)(rec + 0x28) >= 0) { struct Moby *anchor = (struct Moby *)(D_L10_0015FFD8_5f18 + *(int *)(rec + 0x28) * 256); float *ofs = (float *)(rec + 0x2C); @@ -318,7 +324,7 @@ void FUN_L10_002f5f18(struct UpdateCam *cam) { point[1] = ofs[1]; point[2] = ofs[2]; point[3] = 0.0f; - transform_vector_by_basis(point, point, D_L10_00167450); + transform_vector_by_basis(point, point, l10_path_camera_anchor_offset_basis); fast_vec_add(look_point, &anchor->pos, point); fast_vec_sub(offset, look_point, &cam->pos); } else { @@ -351,7 +357,7 @@ int evaluate_descriptor_eligibility(char *descriptor_owner, int evaluate_descriptor_eligibility(char *descriptor_owner, char *comparison_object) { unsigned char *descriptor_record = - *(unsigned char **)(D_L10_0015EF50 + *(short *)(descriptor_owner + 0x84) * 32 + 0x1C); + *(unsigned char **)(l10_descriptor_table + *(short *)(descriptor_owner + 0x84) * 32 + 0x1C); int x; int y; if (descriptor_record[0x39] != 0) { diff --git a/src/overlays/shared/camera/scripted_camera.c b/src/overlays/shared/camera/scripted_camera.c index 8013871544..80af3f9737 100644 --- a/src/overlays/shared/camera/scripted_camera.c +++ b/src/overlays/shared/camera/scripted_camera.c @@ -86,6 +86,10 @@ void set_camera_5_track_acceleration_yz(float camera_track_accel_y, float camera void jet_mount(V_2eaaa0 *pa, V_2eaaa0 *pb, s32 mode, s32 w, s32 x) __asm__("FUN_L00_002eaaa0"); void jet_mount(V_2eaaa0 *pa, V_2eaaa0 *pb, s32 mode, s32 transition_duration_frames, s32 x) { + enum { + JET_MOUNT_COSINE_POSE_TRANSITION = 2, + JET_MOUNT_SPHERICAL_TRANSITION = 3 + }; u8 *camera_record = find_camera_record_by_id(5); V_2eaaa0 requested_position, requested_rotation, saved_camera_position, saved_camera_rotation; u8 *camera_state; @@ -108,8 +112,8 @@ void jet_mount(V_2eaaa0 *pa, V_2eaaa0 *pb, s32 mode, s32 transition_duration_fra qcopy(camera_state + 0x90, &requested_rotation); *(s32 *)(transition_state + 0x40) = x; camera_record[0x88] = mode; - if (mode != 2) { - if (mode != 3) + if (mode != JET_MOUNT_COSINE_POSE_TRANSITION) { + if (mode != JET_MOUNT_SPHERICAL_TRANSITION) return; *(f32 *)(transition_state + 0x44) = 1.0f; *(f32 *)(transition_state + 0x48) = 0.0f; @@ -126,10 +130,13 @@ void jet_mount(V_2eaaa0 *pa, V_2eaaa0 *pb, s32 mode, s32 transition_duration_fra void jet_end_mount(int mode) __asm__("FUN_L00_002eac18"); void jet_end_mount(int mode) { + enum { + JET_END_MOUNT_REPOSITION_BEHIND_HERO = 0 + }; LevelCamera *camera_globals = &l00_camera_lui; char *current_follow_camera = ((char *)camera_globals->unk180); initialize_camera_record_handoff_defaults(); - if (mode == 0) { + if (mode == JET_END_MOUNT_REPOSITION_BEHIND_HERO) { float camera_up_offset[4] __attribute__((aligned(16))); float camera_backward_offset[4] __attribute__((aligned(16))); float hero_rotation_matrix[16] __attribute__((aligned(16))); diff --git a/src/overlays/shared/camera/swing_volume_camera.c b/src/overlays/shared/camera/swing_volume_camera.c index 3a3f06f6ad..7fb4235947 100644 --- a/src/overlays/shared/camera/swing_volume_camera.c +++ b/src/overlays/shared/camera/swing_volume_camera.c @@ -15,6 +15,14 @@ #include "rnc/overlay/shared/rendering/culling/test_point_in_transformed_unit_cylinder.h" #include "rnc/rendering/clip_volume.h" +enum { + SWING_CAMERA_TYPE_SLIDE_RELEASE_ANGLE_AT_END = 1, + SWING_CAMERA_TYPE_ONE_FRAME_SWING = 3, + SWING_CAMERA_TYPE_RETAIN_ON_CAMERA_REQUEST = 4, + SWING_CAMERA_TYPE_SNAP_ON_ENTRY = 5, + SWING_CAMERA_TYPE_SLIDE_KEEP_ANGLE_AT_END = 10 +}; + typedef float CameraVec[4] __attribute__((aligned(16))); /* Parameters of a swing camera. */ @@ -101,7 +109,8 @@ s32 volume_camera_swing_active(struct UpdateCam *swing_camera_record) { type = *(u16 *)¶ms->type; if (params->type == 2 && D_001413DC == 0x1A && params->timer > 0) { forced = 1; - } else if ((s16)type == 4 && hero_requested_camera_mode[0] == 3) { + } else if ((s16)type == SWING_CAMERA_TYPE_RETAIN_ON_CAMERA_REQUEST && + hero_requested_camera_mode[0] == 3) { forced = 0 < params->timer; } if (params->clip_volume >= 0 && @@ -129,6 +138,14 @@ s32 volume_camera_swing_active(struct UpdateCam *swing_camera_record) { void volume_camera_swing(struct UpdateCam *cam) __asm__("FUN_L00_002ec988"); void volume_camera_swing(struct UpdateCam *swing_camera_record) { + enum { + SWING_CAMERA_TYPE_REQUIRE_ZERO_FOLLOW_MODE = 6, + SWING_CAMERA_TYPE_REQUIRE_NONZERO_FOLLOW_MODE = 8, + SWING_CAMERA_TYPE_RELEASE_ANGLE_AT_END = 9 + }; + enum { + SWING_CAMERA_TYPE_SLIDE_RELEASE_ANGLE_ALLOW_AIRBORNE_ENTRY = 7 + }; CameraVec gravity_offset_or_yaw_direction; SwingCameraParams *params; struct UpdateCam *rec; @@ -145,10 +162,12 @@ void volume_camera_swing(struct UpdateCam *swing_camera_record) { f32 lateral_spring_blend_fraction; params = camera_descriptors[swing_camera_record->descriptor_index].params; - if (params->type == 8 && FOLLOW_CAM_STATE(current_follow_cam)->tail.mode == 0) { + if (params->type == SWING_CAMERA_TYPE_REQUIRE_NONZERO_FOLLOW_MODE && + FOLLOW_CAM_STATE(current_follow_cam)->tail.mode == 0) { return; } - if (params->type == 6 && FOLLOW_CAM_STATE(current_follow_cam)->tail.mode != 0) { + if (params->type == SWING_CAMERA_TYPE_REQUIRE_ZERO_FOLLOW_MODE && + FOLLOW_CAM_STATE(current_follow_cam)->tail.mode != 0) { return; } if (volume_camera_swing_active(swing_camera_record) == 0) { @@ -166,7 +185,7 @@ void volume_camera_swing(struct UpdateCam *swing_camera_record) { D_L00_00166DD8) >= 1.3962634f) { goto stop; } - if (params->l_buttons_end != 0 && params->type == 5 && + if (params->l_buttons_end != 0 && params->type == SWING_CAMERA_TYPE_SNAP_ON_ENTRY && (pad_held_words[0] & (PAD_L2 | PAD_L1))) { stop: if (params->timer != 0) { @@ -185,7 +204,7 @@ void volume_camera_swing(struct UpdateCam *swing_camera_record) { FOLLOW_CAM_STATE(((struct UpdateCam *)camera_globals->unk180))->follow.lateral_damping; } /* One word over type and timer: type 5 on its first frame snaps the camera. */ - if (*(s32 *)¶ms->type == 5) { + if (*(s32 *)¶ms->type == SWING_CAMERA_TYPE_SNAP_ON_ENTRY) { *(s32 *)¶ms->swing = 0; rec = current_follow_cam; rig = FOLLOW_CAM_STATE(rec); @@ -226,7 +245,7 @@ void volume_camera_swing(struct UpdateCam *swing_camera_record) { at_end = 0; total = convert_integer_to_float(scale_game_frames(200)); params->timer++; - if (params->type == 10) { + if (params->type == SWING_CAMERA_TYPE_SLIDE_KEEP_ANGLE_AT_END) { set_follow_camera_blend_output_flags(); FOLLOW_CAM_STATE(current_follow_cam)->tail.mode = 0x14D; } @@ -234,7 +253,7 @@ void volume_camera_swing(struct UpdateCam *swing_camera_record) { set_follow_camera_blend_output_flags(); FOLLOW_CAM_STATE(current_follow_cam)->tail.mode = 2; } - if (params->type == 2 || params->type == 4) { + if (params->type == 2 || params->type == SWING_CAMERA_TYPE_RETAIN_ON_CAMERA_REQUEST) { { FollowCamFlags *ctl = &FOLLOW_CAM_STATE(current_follow_cam)->tail.ctl; ctl->flags |= 3; @@ -244,7 +263,10 @@ void volume_camera_swing(struct UpdateCam *swing_camera_record) { params->timer = scale_game_frames(200); } FUN_L00_002e8620(); - } else if (params->type == 1 || params->type == 7 || params->type == 10 || params->type == 9) { + } else if (params->type == SWING_CAMERA_TYPE_SLIDE_RELEASE_ANGLE_AT_END || + params->type == SWING_CAMERA_TYPE_SLIDE_RELEASE_ANGLE_ALLOW_AIRBORNE_ENTRY || + params->type == SWING_CAMERA_TYPE_SLIDE_KEEP_ANGLE_AT_END || + params->type == SWING_CAMERA_TYPE_RELEASE_ANGLE_AT_END) { /* Moving the left stick skips to the end of the swing. */ struct PadState *pad = &controller_state; if (pad->analog[0] != 0.0f || pad->analog[1] != 0.0f) { @@ -260,7 +282,7 @@ void volume_camera_swing(struct UpdateCam *swing_camera_record) { at_end = 0; params->timer = 1; } - } else if (params->type == 3) { + } else if (params->type == SWING_CAMERA_TYPE_ONE_FRAME_SWING) { total = convert_integer_to_float(scale_game_frames(1)); if (params->timer > scale_game_frames(1)) { at_end = 1; @@ -278,12 +300,16 @@ void volume_camera_swing(struct UpdateCam *swing_camera_record) { fast_sin(camera_descriptors[swing_camera_record->descriptor_index].yaw); *(s32 *)&gravity_offset_or_yaw_direction[2] = 0; swing = params->swing * 0.017453292f * (params->timer / total); - if ((params->type != 1 && params->type != 7 && params->type != 9) || at_end == 0) { + if ((params->type != SWING_CAMERA_TYPE_SLIDE_RELEASE_ANGLE_AT_END && + params->type != SWING_CAMERA_TYPE_SLIDE_RELEASE_ANGLE_ALLOW_AIRBORNE_ENTRY && + params->type != SWING_CAMERA_TYPE_RELEASE_ANGLE_AT_END) || + at_end == 0) { set_follow_camera_angle_blend_from_direction( gravity_offset_or_yaw_direction, swing, params->pitch * 0.017453292f); } if (params->distance != 0.0f) { - if (params->type == 6 || params->type == 8) { + if (params->type == SWING_CAMERA_TYPE_REQUIRE_ZERO_FOLLOW_MODE || + params->type == SWING_CAMERA_TYPE_REQUIRE_NONZERO_FOLLOW_MODE) { follow_camera_set_distance(0, params->distance, 0.002f); FUN_L00_002e8490(params->distance + 1.36f); } else { @@ -292,14 +318,16 @@ void volume_camera_swing(struct UpdateCam *swing_camera_record) { } } if (params->height != 0.0f) { - if (params->type == 6 || params->type == 8) { + if (params->type == SWING_CAMERA_TYPE_REQUIRE_ZERO_FOLLOW_MODE || + params->type == SWING_CAMERA_TYPE_REQUIRE_NONZERO_FOLLOW_MODE) { follow_camera_set_height(params->height, 0.002f); } else { follow_camera_set_height(params->height, 0.003f); } } if (params->offset_scale != 0.0f) { - if (params->type == 6 || params->type == 8) { + if (params->type == SWING_CAMERA_TYPE_REQUIRE_ZERO_FOLLOW_MODE || + params->type == SWING_CAMERA_TYPE_REQUIRE_NONZERO_FOLLOW_MODE) { follow_camera_set_offset_scale(0, params->offset_scale, 0.002f); } else { follow_camera_set_offset_scale(0, params->offset_scale, 0.005f); @@ -338,7 +366,9 @@ void volume_camera_swing(struct UpdateCam *swing_camera_record) { lateral_spring_blend_fraction); } } - if (params->type == 1 || params->type == 7 || params->type == 10) { + if (params->type == SWING_CAMERA_TYPE_SLIDE_RELEASE_ANGLE_AT_END || + params->type == SWING_CAMERA_TYPE_SLIDE_RELEASE_ANGLE_ALLOW_AIRBORNE_ENTRY || + params->type == SWING_CAMERA_TYPE_SLIDE_KEEP_ANGLE_AT_END) { FUN_L00_002e8620(); follow_camera_start_slide(); follow_camera_set_up_spring(0.01f, 0.2f); @@ -355,7 +385,9 @@ s32 volume_camera_swing_check(struct UpdateCam *swing_camera_record) { return 0; if (params->type == 11 && D_001413F4 != 2) return 0; - if ((params->type == 1 || params->type == 10) && params->timer == 0) { + if ((params->type == SWING_CAMERA_TYPE_SLIDE_RELEASE_ANGLE_AT_END || + params->type == SWING_CAMERA_TYPE_SLIDE_KEEP_ANGLE_AT_END) && + params->timer == 0) { struct Hero *hero_data = &hero; if (hero_data->frames_off_ground.s != 0) { if (current_level_index != 14) diff --git a/src/overlays/shared/camera/target_tracking_camera.c b/src/overlays/shared/camera/target_tracking_camera.c index 1b61a454fc..6c55570f89 100644 --- a/src/overlays/shared/camera/target_tracking_camera.c +++ b/src/overlays/shared/camera/target_tracking_camera.c @@ -323,7 +323,7 @@ void update_target_tracking_camera(char *camera_object) { int hero_state = b->state.current; char *camera_position; int x, y; - if (hero_state == 0x2C) { + if (hero_state == HERO_STATE_GRAPPLE_SWING_ENTRY) { camera_position = camera_object + 0x30; x = *(int *)(camera_target_state + 8); y = ((int)b->swing_target_moby); diff --git a/src/overlays/shared/cutscenes/cutscene_trigger.c b/src/overlays/shared/cutscenes/cutscene_trigger.c index a888167ac7..2502d8cea1 100644 --- a/src/overlays/shared/cutscenes/cutscene_trigger.c +++ b/src/overlays/shared/cutscenes/cutscene_trigger.c @@ -60,7 +60,7 @@ extern int debug_print(void *, int, int) __asm__("FUN_001e93b0"); extern s32 D_0015ED84; extern u8 D_0015EDB0; -extern MobyList D_L01_0016CCE0; +extern MobyList fx_cutscene __asm__("D_L01_0016CCE0"); extern Effect D_L01_0017C8C0; extern char cutscene_camera_init_position_error_format[] __asm__("D_L01_0020B550"); extern int D_0015ED84; /* no foreign declaration */ @@ -74,11 +74,11 @@ void attach_cutscene_fixed_scale_manipulator(void) { s32 i; if (cutscene_mode == 2 && D_0015EDB0 != 0) { - for (i = 0; i < D_L01_0016CCE0.count; i++) { - int moby_type = D_L01_0016CCE0.list[i]->type; + for (i = 0; i < fx_cutscene.count; i++) { + int moby_type = fx_cutscene.list[i]->type; if ((moby_type == 0x398 || moby_type == 0x1BF) && D_L01_0017C8C0.active == 0) { - attach_manipulator(D_L01_0016CCE0.list[i], 0, &D_L01_0017C8C0); + attach_manipulator(fx_cutscene.list[i], 0, &D_L01_0017C8C0); D_L01_0017C8C0.z = D_L01_0017C8C0.y = D_L01_0017C8C0.x = 2.1f; } } @@ -112,7 +112,7 @@ void cutscene_trigger_update(char *moby) { return; } trigger_vars->unk2C = scale_game_frames(trigger_vars->unk2C); - MOBY(moby)->state = 1; + MOBY(moby)->state = CUTSCENE_TRIGGER_WAIT_FOR_TRIGGER; { int ff = 0xFF; MOBY(moby)->draw_dist = ff; @@ -122,14 +122,14 @@ void cutscene_trigger_update(char *moby) { case CUTSCENE_TRIGGER_WAIT_FOR_TRIGGER: { char *hero_position; if (l01_save_state.cleared[(short)MOBY(moby)->save_id] != 0) { - MOBY(moby)->state = 1; + MOBY(moby)->state = CUTSCENE_TRIGGER_WAIT_FOR_TRIGGER; break; } if ((*(int *)((((short)MOBY(moby)->save_id >> 5) << 2) + (D_0015ED84 << 8) + (char *)D_0014C190_257218) >> (MOBY(moby)->save_id & 0x1F)) & 1) { - MOBY(moby)->state = 1; + MOBY(moby)->state = CUTSCENE_TRIGGER_WAIT_FOR_TRIGGER; break; } hero_position = (char *)&hero.motion.pos; @@ -151,7 +151,7 @@ void cutscene_trigger_update(char *moby) { jet_mount(&o->pos, &o->rot, 0, 0, 0); } cutscene_active = 1; - MOBY(moby)->state = 2; + MOBY(moby)->state = CUTSCENE_TRIGGER_ACTIVE; MOBY(moby)->command = 1; { int o = trigger_vars->unk24 << 7; @@ -170,7 +170,7 @@ void cutscene_trigger_update(char *moby) { } request_hero_idle_state_for_vehicle_mode(); cutscene_active = 0; - MOBY(moby)->state = 3; + MOBY(moby)->state = CUTSCENE_TRIGGER_WAIT_FOR_REARM; MOBY(moby)->command = 0; } else { set_camera_position(trigger_vars); diff --git a/src/overlays/shared/cutscenes/qwark_rilgar.c b/src/overlays/shared/cutscenes/qwark_rilgar.c index 4e359cc6bc..522d8175dd 100644 --- a/src/overlays/shared/cutscenes/qwark_rilgar.c +++ b/src/overlays/shared/cutscenes/qwark_rilgar.c @@ -115,13 +115,13 @@ void qwark_rilgar_update(L03WatchMoby *moby) { return; } } - moby->state = 1; + moby->state = QWARK_RILGAR_WAIT_FOR_PLAYER_IN_REGION; break; case QWARK_RILGAR_WAIT_FOR_PLAYER_IN_REGION: if (watch_data->region_a != -1 && is_point_inside_clip_volume(&hero.motion.pos, watch_data->region_a)) { set_moby_dialogue_record_value(moby, 1); - moby->state = 2; + moby->state = QWARK_RILGAR_POST_REGION_TRIGGER; } break; case QWARK_RILGAR_POST_REGION_TRIGGER: diff --git a/src/overlays/shared/cutscenes/the_plumber.c b/src/overlays/shared/cutscenes/the_plumber.c index 5166460347..36476aa44f 100644 --- a/src/overlays/shared/cutscenes/the_plumber.c +++ b/src/overlays/shared/cutscenes/the_plumber.c @@ -151,6 +151,9 @@ void the_plumber_update(L01WatchMoby *plumber_moby) { PLUMBER_LEVEL_EIGHT_POST_DIALOGUE = 5, PLUMBER_LEVEL_EIGHT_DIALOGUE_FINISHED = 6 }; + enum { + PLUMBER_FALLBACK_DIALOGUE_INITIALIZED = 7 + }; L01WatchScratch look_tracking_vectors; L01WatchData *plumber_vars = (L01WatchData *)plumber_moby->data; float rate; @@ -175,20 +178,20 @@ void the_plumber_update(L01WatchMoby *plumber_moby) { return; } plumber_vars->p20 = (void *)plumber_level_one_dialogue_data; - plumber_moby->state = 1; + plumber_moby->state = PLUMBER_LEVEL_ONE_DIALOGUE; } else if (current_level_index == 8) { plumber_vars->p20 = (void *)plumber_level_eight_dialogue_data; - plumber_moby->state = 4; + plumber_moby->state = PLUMBER_LEVEL_EIGHT_DIALOGUE; } else { plumber_vars->p20 = (void *)plumber_fallback_dialogue_data; - plumber_moby->state = 7; + plumber_moby->state = PLUMBER_FALLBACK_DIALOGUE_INITIALIZED; } initialize_npc_dialogue(plumber_moby, plumber_vars); break; case PLUMBER_LEVEL_ONE_DIALOGUE: if (update_npc_dialogue(plumber_moby, plumber_vars)) { begin_dialogue_camera_transition(plumber_moby, 2.2f); - plumber_moby->state = 2; + plumber_moby->state = PLUMBER_LEVEL_ONE_POST_DIALOGUE; } break; case PLUMBER_LEVEL_ONE_POST_DIALOGUE: @@ -201,11 +204,11 @@ void the_plumber_update(L01WatchMoby *plumber_moby) { jet_reset_camera(&camera_record->pos, &camera_record->rot); } } - plumber_moby->state = 1; + plumber_moby->state = PLUMBER_LEVEL_ONE_DIALOGUE; if (plumber_vars->sub == 4) { unlock_planet(2); queue_planet_unlock_message(2); - plumber_moby->state = 3; + plumber_moby->state = PLUMBER_REMOVE; record_moby_context_bytes( (char *)plumber_moby + 0x20, 1, plumber_moby, 1, D_L01_001BAAA0); memcard_save_data(0, -1); @@ -216,7 +219,7 @@ void the_plumber_update(L01WatchMoby *plumber_moby) { return; case PLUMBER_LEVEL_EIGHT_DIALOGUE: if (update_npc_dialogue(plumber_moby, plumber_vars)) { - plumber_moby->state = 5; + plumber_moby->state = PLUMBER_LEVEL_EIGHT_POST_DIALOGUE; plumber_vars->b8 = 0; } break; @@ -227,9 +230,9 @@ void the_plumber_update(L01WatchMoby *plumber_moby) { D_0013F350_w.f80 = 130.5f; D_0013F350_w.f84 = 299.5f; D_0013F350_w.f88 = 46.0f; - plumber_moby->state = 6; + plumber_moby->state = PLUMBER_LEVEL_EIGHT_DIALOGUE_FINISHED; } else { - plumber_moby->state = 4; + plumber_moby->state = PLUMBER_LEVEL_EIGHT_DIALOGUE; } break; case PLUMBER_LEVEL_EIGHT_DIALOGUE_FINISHED: diff --git a/src/overlays/shared/cutscenes/update_cutscene_playback.c b/src/overlays/shared/cutscenes/update_cutscene_playback.c index fd86cb5853..fcc4644961 100644 --- a/src/overlays/shared/cutscenes/update_cutscene_playback.c +++ b/src/overlays/shared/cutscenes/update_cutscene_playback.c @@ -214,8 +214,8 @@ void handle_pause_input(void) { return; } area = current_level_index; - if (area == 15 && level_timer >= 8 && hero.vehicle_mode == 2 && HELD && - hero.state.current != 0x72) { + if (area == 15 && level_timer >= 8 && hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK && + HELD && hero.state.current != 0x72) { if (D_L00_00166E00->h86 == 0x13) return; mode_freeze_init(4, 0); @@ -391,7 +391,7 @@ void music_pause(int) __asm__("FUN_00216050"); extern int update_audio_stream_until_idle(int) __asm__("FUN_002168a8"); void fill_transfer_words(void *, int, int) __asm__("FUN_001f97e8"); void clear_active_help_record(void) __asm__("FUN_L00_002039a0"); -void FUN_L00_00232fe8(void); +void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); int start_cutscene_chunk_read(int) __asm__("FUN_L00_002451b8"); void update_world_object_animation(void) __asm__("FUN_00204790"); void sound_update(void) __asm__("FUN_0022ca50"); @@ -433,7 +433,7 @@ void start_scene(int scene_id) { D_L00_0015F400 = 0; hero_set_state(100, 2); hero.unk20A5 = 1; - FUN_L00_00232fe8(); + set_hero_item_moby_flag_bit0(); if (active_scene_trigger.moby) active_scene_trigger.moby->flags |= 1; if (D_L00_001B9CF0.unkEC) @@ -498,7 +498,7 @@ extern float D_L00_0016CAF0_lui __asm__("D_L00_0016CAF0") NOT_SDA; extern O_298b18 *D_L00_0015FFDC_298b18 __asm__("D_L00_0015FFDC"); extern C_298b18 D_L00_0016C860_298b18 __asm__("D_L00_0016C860") NOT_SDA; void select_level_vu_chain(void) __asm__("FUN_002335a0"); -void FUN_L00_002330d0(void); +void update_hero_item_moby_flags(void) __asm__("FUN_L00_002330d0"); void set_race_camera(void *, void *, int, int) __asm__("FUN_L00_00216f90"); void process_menu_entry(F_298b18 *, void *, int) __asm__("FUN_00216c48"); void music_set_active_track_value(int) __asm__("FUN_L00_00265880"); @@ -534,7 +534,7 @@ void finish_cutscene(void) { if (2.0f < hero_candidate_z && absolute_float(hero.motion.pos.f[2] - hero_candidate_z) < 4.5f) hero.motion.pos.f[2] = hero_candidate_z; hero.unk20A5 = 0; - FUN_L00_002330d0(); + update_hero_item_moby_flags(); if (D_L00_0016C860_298b18.x46) { f = probe_ground_height(D_L00_0016C860_298b18.v, 0, 0.5f); if (2.0f < f && absolute_float(D_L00_0016C860_298b18.x18 - f) < 2.0f) @@ -823,22 +823,22 @@ void hero_respawn() __asm__("FUN_L00_00211250"); void queue_scene_movie_with_game_language(s32 i) __asm__("FUN_L00_00299460"); void queue_scene_movie_with_game_language(s32 i) { - s32 a, b; + s32 scene_movie_sector, scene_movie_size; struct Hero *hero_ptr; if (i < 0) return; if (D_0015ED80) { - a = disc_table.unk18A0[i].sector; - b = disc_table.unk18A0[i].size; + scene_movie_sector = disc_table.unk18A0[i].sector; + scene_movie_size = disc_table.unk18A0[i].size; } else { - a = disc_table.unk1808[i].sector; - b = disc_table.unk1808[i].size; + scene_movie_sector = disc_table.unk1808[i].sector; + scene_movie_size = disc_table.unk1808[i].size; } hero_ptr = &hero; if (hero_ptr->health.hp == 0) { hero_respawn(); } else if (hero_ptr->fall_fade_pending == 0) { - prepare_movie_playback(a, b, game_language); + prepare_movie_playback(scene_movie_sector, scene_movie_size, game_language); } } @@ -846,17 +846,17 @@ void queue_scene_movie_with_game_language(s32 i) { void queue_language_zero_movie(s32 i) __asm__("FUN_L00_002994f8"); void queue_language_zero_movie(s32 i) { - s32 a, b; + s32 queued_movie_sector, queued_movie_size; if (i < 0) return; if (D_0015ED80) { - a = disc_table.unk1A50[i].sector; - b = disc_table.unk1A50[i].size; + queued_movie_sector = disc_table.unk1A50[i].sector; + queued_movie_size = disc_table.unk1A50[i].size; } else { - a = disc_table.unk1A28[i].sector; - b = disc_table.unk1A28[i].size; + queued_movie_sector = disc_table.unk1A28[i].sector; + queued_movie_size = disc_table.unk1A28[i].size; } - prepare_movie_playback(a, b, 0); + prepare_movie_playback(queued_movie_sector, queued_movie_size, 0); } /* Passes movie i (the alt table while D_0015ED80 is set) and the language to FUN_L00_002995d0. */ @@ -963,7 +963,7 @@ void count_vsync(void) __asm__("FUN_0012f1c8"); void movie_exit_to_gameplay(void) __asm__("FUN_L00_002997c8"); void movie_exit_to_gameplay(void) { - char buf[0x70] __attribute__((aligned(16))); + char gs_image_transfer_descriptor[0x70] __attribute__((aligned(16))); s32 large_count, small_count, gs_address, source, i, j; struct ActiveSceneTrigger *active; D_L00_0015F5D8 = 1; @@ -976,22 +976,22 @@ void movie_exit_to_gameplay(void) { small_count = D_0015ED80 != 0 ? 0xE : 0x11; i = 0; while (i < large_count) { - FUN_00122518_2997c8(buf, gs_address >> 8, 2, 1, 0, 0, 0x80, 0x80); + FUN_00122518_2997c8(gs_image_transfer_descriptor, gs_address >> 8, 2, 1, 0, 0, 0x80, 0x80); i++; gs_address += 0x10000; flush_cache(0); - FUN_001227d8_2997c8(buf, source); + FUN_001227d8_2997c8(gs_image_transfer_descriptor, source); source += 0xC000; sceGsSyncPath(0, 0); } gs_address = D_0015EE78_macro[0]; j = 0; while (j < small_count) { - FUN_00122518_2997c8(buf, gs_address >> 8, 1, 0, 0, 0, 0x40, 0x40); + FUN_00122518_2997c8(gs_image_transfer_descriptor, gs_address >> 8, 1, 0, 0, 0, 0x40, 0x40); j++; gs_address += 0x4000; flush_cache(0); - FUN_001227d8_2997c8(buf, source); + FUN_001227d8_2997c8(gs_image_transfer_descriptor, source); source += 0x4000; sceGsSyncPath(0, 0); } @@ -1138,6 +1138,10 @@ extern void FUN_0022ca50(void); void update_slideshow(void) __asm__("FUN_L00_00299c48"); void update_slideshow(void) { + enum { + SLIDESHOW_STATE_WAIT_FOR_TRANSITION = 0, + SLIDESHOW_STATE_TRANSITION = 1 + }; s32 skip_check; s32 i; s32 *src; @@ -1153,7 +1157,7 @@ void update_slideshow(void) { if ((u8)D_0013D1D0[2] != 'A') { skip_check = 0; } - if (slideshow.state == 0) { + if (slideshow.state == SLIDESHOW_STATE_WAIT_FOR_TRANSITION) { if (slideshow.frame >= slideshow_frame_thresholds[slideshow.slide] - 0x24) { if (cd_read_active[0] != 0) { update_audio_stream_until_idle(1); @@ -1167,9 +1171,9 @@ void update_slideshow(void) { goto end_show; } slideshow.timer = -1; - slideshow.state = 1; + slideshow.state = SLIDESHOW_STATE_TRANSITION; } - } else if (slideshow.state == 1) { + } else if (slideshow.state == SLIDESHOW_STATE_TRANSITION) { vu1_sync_chain(1); if (slideshow.timer < 0x20) { src = slideshow.src; @@ -1197,7 +1201,7 @@ void update_slideshow(void) { slideshow.frame = 0x32B4; } } - slideshow.state = 0; + slideshow.state = SLIDESHOW_STATE_WAIT_FOR_TRANSITION; slideshow.timer = -1; slideshow.slide++; slide = slideshow.slide % 20; diff --git a/src/overlays/shared/cutscenes/update_npc_dialogue.c b/src/overlays/shared/cutscenes/update_npc_dialogue.c index deee7e0327..e5ef1b549a 100644 --- a/src/overlays/shared/cutscenes/update_npc_dialogue.c +++ b/src/overlays/shared/cutscenes/update_npc_dialogue.c @@ -72,6 +72,11 @@ s32 update_npc_dialogue(struct Moby *moby, struct SceneTrigger *trigger) __asm__("FUN_L00_00266448"); s32 update_npc_dialogue(struct Moby *moby, struct SceneTrigger *trigger) { + enum { + MENU_CONDITION_PURCHASE_PRICE_MET = 1, + MENU_CONDITION_ALTERNATE_ITEM_AVAILABLE = 4, + MENU_CONDITION_BOLT_THRESHOLD_AND_COUNT_DIFFERENCE_MET = 6 + }; struct Hero *hero_ptr = &hero; struct SceneEntry *entry; s32 index; @@ -121,9 +126,9 @@ s32 update_npc_dialogue(struct Moby *moby, struct SceneTrigger *trigger) { entry = &trigger->entries[trigger->entry]; if (entry->flags & 8) { - if (entry->cost_kind == 1) + if (entry->cost_kind == MENU_CONDITION_PURCHASE_PRICE_MET) current_bolt_count -= D_L00_001C40B0[entry->cost_id].f0; - else if (entry->cost_kind == 4) + else if (entry->cost_kind == MENU_CONDITION_ALTERNATE_ITEM_AVAILABLE) alternate_item_available[entry->cost_id] = 0; } if (entry->scene == -1) { @@ -152,7 +157,8 @@ s32 update_npc_dialogue(struct Moby *moby, struct SceneTrigger *trigger) { /* a fresh block-local pointer (not `entry`) keeps retail's registers */ struct SceneEntry *unpaid = &trigger->entries[trigger->entry]; - if (unpaid->cost_kind == 1 || unpaid->cost_kind == 6) { + if (unpaid->cost_kind == MENU_CONDITION_PURCHASE_PRICE_MET || + unpaid->cost_kind == MENU_CONDITION_BOLT_THRESHOLD_AND_COUNT_DIFFERENCE_MET) { handle = queue_animation_update(2, 0x754E, initialize_bolt_counter_hud, diff --git a/src/overlays/shared/enemies/armed_transport.c b/src/overlays/shared/enemies/armed_transport.c index 95ab718d3e..913403455a 100644 --- a/src/overlays/shared/enemies/armed_transport.c +++ b/src/overlays/shared/enemies/armed_transport.c @@ -17,6 +17,18 @@ #include "rnc/overlay/shared/mobys/test_path_segment_strict_crossing.h" #include "rnc/overlay/shared/math/random/random_int_between.h" +enum { + ARMED_TRANSPORT_STATE_INITIALIZE = 0, + ARMED_TRANSPORT_STATE_WAIT_FOR_ACTIVATION = 1, + ARMED_TRANSPORT_STATE_FOLLOW_FIRST_PATH = 2, + ARMED_TRANSPORT_STATE_RELEASE_PASSENGERS = 3, + ARMED_TRANSPORT_STATE_ALIGN_SECOND_PATH = 4, + ARMED_TRANSPORT_STATE_FOLLOW_SECOND_PATH = 5, + ARMED_TRANSPORT_STATE_TRACK_TARGET = 6, + ARMED_TRANSPORT_STATE_SPAWN_DIRECTED_MOBY = 7, + ARMED_TRANSPORT_STATE_DYING = 8 +}; + typedef struct ArmedTransportVars { u8 pad0[0x20]; f32 health; @@ -160,17 +172,6 @@ void armed_transport_update(char *m) __asm__("FUN_L16_002e22d8"); /* Moby class 1356 */ void armed_transport_update(char *transport_moby) { - enum { - ARMED_TRANSPORT_STATE_INITIALIZE = 0, - ARMED_TRANSPORT_STATE_WAIT_FOR_ACTIVATION = 1, - ARMED_TRANSPORT_STATE_FOLLOW_FIRST_PATH = 2, - ARMED_TRANSPORT_STATE_RELEASE_PASSENGERS = 3, - ARMED_TRANSPORT_STATE_ALIGN_SECOND_PATH = 4, - ARMED_TRANSPORT_STATE_FOLLOW_SECOND_PATH = 5, - ARMED_TRANSPORT_STATE_TRACK_TARGET = 6, - ARMED_TRANSPORT_STATE_SPAWN_DIRECTED_MOBY = 7, - ARMED_TRANSPORT_STATE_DYING = 8 - }; L16TransportVector vector, rotation; ArmedTransportVars *transport_data = (ArmedTransportVars *)MOBY(transport_moby)->pvars; @@ -195,13 +196,13 @@ void armed_transport_update(char *transport_moby) { transport_data->unk170[0] = speed; transport_data->unk194 = MOBY(transport_moby)->pos.z; if (transport_data->path_index == -1) { - MOBY(transport_moby)->state = 6; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_TRACK_TARGET; break; } path = D_L16_001B0930[transport_data->path_index]; transport_data->unk170[1] = fast_vec_dist(path + 0x10, path + 0x20); qcopy(&MOBY(transport_moby)->pos, path + 0x10); - MOBY(transport_moby)->state = 1; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_WAIT_FOR_ACTIVATION; MOBY(transport_moby)->visible = 0; MOBY(transport_moby)->collision = 0; MOBY(transport_moby)->flags = (MOBY(transport_moby)->flags | 1) & 0xEFFF; @@ -215,7 +216,7 @@ void armed_transport_update(char *transport_moby) { point_in_path_xy(hero.motion.pos.f, D_L16_001B0930[transport_data->unkD4] + 0x10, *(int *)D_L16_001B0930[transport_data->unkD4]))) { - MOBY(transport_moby)->state = 2; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_FOLLOW_FIRST_PATH; MOBY(transport_moby)->flags &= 0xFFFE; MOBY(transport_moby)->visible = 1; MOBY(transport_moby)->collision = @@ -256,11 +257,11 @@ void armed_transport_update(char *transport_moby) { } if (advance_armed_transport_along_path(transport_moby, path)) { if (loaded) { - MOBY(transport_moby)->state = 3; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_RELEASE_PASSENGERS; } else if (transport_data->unkDC == -1) { - MOBY(transport_moby)->state = 6; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_TRACK_TARGET; } else { - MOBY(transport_moby)->state = 4; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_ALIGN_SECOND_PATH; } } break; @@ -288,9 +289,9 @@ void armed_transport_update(char *transport_moby) { } if (i == 3) { if (transport_data->unkDC != -1) { - MOBY(transport_moby)->state = 4; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_ALIGN_SECOND_PATH; } else { - MOBY(transport_moby)->state = 6; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_TRACK_TARGET; } } } @@ -306,7 +307,7 @@ void armed_transport_update(char *transport_moby) { frame_time_sq * 6.2831855f, frame_time * 6.2831855f); if (fast_difference_between_rotations(MOBY(transport_moby)->rot.z, heading) < 0.01f) { - MOBY(transport_moby)->state = 5; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_FOLLOW_SECOND_PATH; transport_data->path_point = 0; transport_data->unk16C = 0; } @@ -325,7 +326,7 @@ void armed_transport_update(char *transport_moby) { mark_moby_for_removal(transport_moby); return; } - MOBY(transport_moby)->state = 6; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_TRACK_TARGET; } break; case ARMED_TRANSPORT_STATE_TRACK_TARGET: { @@ -353,7 +354,7 @@ void armed_transport_update(char *transport_moby) { frame_time_sq * 1.5707964f, frame_time * 6.2831855f); if (fast_dec_timer((int *)(&transport_data->unk164)) && transport_data->unkB4 != 2) - MOBY(transport_moby)->state = 7; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_SPAWN_DIRECTED_MOBY; break; } case ARMED_TRANSPORT_STATE_SPAWN_DIRECTED_MOBY: @@ -367,7 +368,7 @@ void armed_transport_update(char *transport_moby) { vector.f, &transport_data->unk70, scale_game_frames(45)); - MOBY(transport_moby)->state = 6; + MOBY(transport_moby)->state = ARMED_TRANSPORT_STATE_TRACK_TARGET; transport_data->unk164 = scale_game_frames(180); break; case ARMED_TRANSPORT_STATE_DYING: { @@ -375,7 +376,8 @@ void armed_transport_update(char *transport_moby) { transport_data->unk194 -= dt + dt; MOBY(transport_moby)->rot.x += dt * 0.2617994f; - if (fast_dec_timer((int *)(&transport_data->unk160)) || hero.vehicle_mode == 2) { + if (fast_dec_timer((int *)(&transport_data->unk160)) || + hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { spawn_explosion(transport_moby, D_L16_0015F580, &MOBY(transport_moby)->pos, @@ -443,6 +445,9 @@ void armed_transport_update(char *transport_moby) { /* Update interaction ownership, damage responses and pursuit tracking. */ void update_armed_transport_damage_and_targeting(struct Moby *transport_moby) { + enum { + HIT_REACTION_STATUS_SKIP_DAMAGE_RESPONSE = 1 + }; L16Hit_e hit; ArmedTransportVars *transport_data = (ArmedTransportVars *)transport_moby->pvars; float zero; @@ -466,9 +471,11 @@ void update_armed_transport_damage_and_targeting(struct Moby *transport_moby) { hit_record = find_moby_hit(transport_moby, 0x330000, 0); response = hit_reaction( transport_moby, hit_record, &transport_data->health, 0, &hit.status, &hit.amount, 0, 4); - if (hit.status != 1 && transport_moby->state != 8) { + if (hit.status != HIT_REACTION_STATUS_SKIP_DAMAGE_RESPONSE && + transport_moby->state != ARMED_TRANSPORT_STATE_DYING) { transport_data->health -= hit.amount; - if (transport_data->health <= zero || (hero.vehicle_mode == 2 && hit.amount >= 2.0f)) + if (transport_data->health <= zero || + (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK && hit.amount >= 2.0f)) response = 1; if (response > 0) { if (response >= 3) { @@ -479,7 +486,7 @@ void update_armed_transport_damage_and_targeting(struct Moby *transport_moby) { } } else { FUN_0022da68_i(3, 0, transport_moby); - if (hero.vehicle_mode != 2) + if (hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK) FUN_0022da68_i(2, 0, transport_moby); { int *child = (int *)(&transport_data->unkC0), count = 3; @@ -490,7 +497,7 @@ void update_armed_transport_damage_and_targeting(struct Moby *transport_moby) { child++; } while (--count >= 0); } - transport_moby->state = 8; + transport_moby->state = ARMED_TRANSPORT_STATE_DYING; transport_data->unk160 = scale_game_frames(90); transport_data->unk67 = 120; } diff --git a/src/overlays/shared/enemies/armed_transport_rocket.c b/src/overlays/shared/enemies/armed_transport_rocket.c index 650280132b..2a27f34b6e 100644 --- a/src/overlays/shared/enemies/armed_transport_rocket.c +++ b/src/overlays/shared/enemies/armed_transport_rocket.c @@ -11,6 +11,10 @@ #include "rnc/math/random.h" #include "rnc/overlay/shared/enemies/blarg_elite_commando_rocket.h" +enum { + ARMED_TRANSPORT_ROCKET_STATE_FLYING = 0 +}; + extern char *create_moby(int); extern int trooper_play_sound(int, int, int, int) __asm__("FUN_L00_0028dc90"); extern void @@ -64,7 +68,7 @@ void armed_transport_rocket_update(char *rocket_moby) { *(int *)(rocket_data + 0x34) = 1; trooper_play_sound(5, 0, (int)rocket_moby, 0x54C); } - if (MOBY(rocket_moby)->state != 0) + if (MOBY(rocket_moby)->state != ARMED_TRANSPORT_ROCKET_STATE_FLYING) return; spawn_rocket_trail_spark(rocket_moby); fast_vec_sub(delta, rocket_data + 0x10, &MOBY(rocket_moby)->pos); @@ -92,7 +96,7 @@ void armed_transport_rocket_update(char *rocket_moby) { remaining = delta; if (collision_line(&MOBY(rocket_moby)->pos, next_position, 0, rocket_moby, 0) != 0 || fast_vec_length(remaining) < *(float *)(rocket_data + 0x24)) { - if (hero.vehicle_mode == 2) + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) play_entity_sound( (int)rocket_moby, 2.0f, &MOBY(rocket_moby)->pos, 3, 2.0f, 1.0f, 0, 1, 0); trooper_play_sound(4, 0, (int)rocket_moby, 0x54C); @@ -141,7 +145,7 @@ char *spawn_armed_transport_rocket(char *spawning_moby, MOBY(spawned_moby)->update_dist = 0xFF; MOBY(spawned_moby)->draw_dist = 0xFF; MOBY(spawned_moby)->visible = 1; - MOBY(spawned_moby)->state = 0; + MOBY(spawned_moby)->state = ARMED_TRANSPORT_ROCKET_STATE_FLYING; MOBY(spawned_moby)->spawn_frame = *(unsigned long *)(spawning_moby + 0x38); MOBY(spawned_moby)->scale = MOBY(spawned_moby)->scale * 3.0f; qcopy(&MOBY(spawned_moby)->pos, spawn_position); diff --git a/src/overlays/shared/enemies/billboard_projectile.c b/src/overlays/shared/enemies/billboard_projectile.c index c9489bf5eb..75654730fc 100644 --- a/src/overlays/shared/enemies/billboard_projectile.c +++ b/src/overlays/shared/enemies/billboard_projectile.c @@ -13,7 +13,7 @@ #include "rnc/overlay/shared/rendering/effects/spawn_type_10_particle.h" #include "rnc/overlay/shared/rendering/effects/update_three_phase_effect_particle.h" -extern char D_L01_00167240[]; +extern char camera_pos[] __asm__("D_L01_00167240"); extern char D_L01_001742E0[]; extern float D_L01_001742C0[]; @@ -36,7 +36,7 @@ void spawn_collision_particle_bursts(void) { float spawn_position[4]; float base_angle, b; int i; - fast_vec_sub(offset_vector, D_L01_00167240, D_L01_001742E0); + fast_vec_sub(offset_vector, camera_pos, D_L01_001742E0); base_angle = -fast_arc_tan(vector_length_xy(offset_vector), offset_vector[2]); fast_arc_tan(offset_vector[0], offset_vector[1]); for (i = 19; i >= 0; i--) { @@ -76,7 +76,7 @@ void billboard_projectile_update(char *moby) { TIMED_REMOVAL = 2 }; int *motion_lifetime_vars = ((int *)MOBY(moby)->pvars); - char *camera = D_L01_00167240; + char *camera = camera_pos; char hit[0x30]; float normal[4]; float distance; @@ -108,7 +108,7 @@ void billboard_projectile_update(char *moby) { } if (fast_dec_timer(motion_lifetime_vars)) { motion_lifetime_vars[0] = scale_game_frames(0x1e); - MOBY(moby)->state = 2; + MOBY(moby)->state = TIMED_REMOVAL; if (motion_lifetime_vars[4] != 0) motion_lifetime_vars[4] = 0; } diff --git a/src/overlays/shared/enemies/blarg_elite_commando.c b/src/overlays/shared/enemies/blarg_elite_commando.c index 3068c65005..5e6337434a 100644 --- a/src/overlays/shared/enemies/blarg_elite_commando.c +++ b/src/overlays/shared/enemies/blarg_elite_commando.c @@ -23,6 +23,23 @@ #include "rnc/overlay/shared/math/random/random_int_between.h" #include "rnc/overlay/shared/rendering/effects/update_three_phase_effect_particle.h" +enum { + COMMANDO_PURSUIT_MODE_DISABLED = 2 +}; + +enum { + COMMANDO_STATE_INITIALIZE = 0, + COMMANDO_STATE_RETURN_TO_INITIAL_POSITION = 1, + COMMANDO_STATE_IDLE = 2, + COMMANDO_STATE_MOVE_TO_PATROL_NODE = 3, + COMMANDO_STATE_PREPARE_ROCKET_FIRE = 4, + COMMANDO_STATE_FIRE_ROCKETS = 5, + COMMANDO_STATE_MOVE_TO_ATTACK_NODE = 7, + COMMANDO_STATE_KNOCKBACK_RECOVERY = 8, + COMMANDO_STATE_FATAL_FALL = 9, + COMMANDO_STATE_FOLLOW_PARENT_TRANSFORM = 10 +}; + typedef struct L16DamageData { u8 pad0[0x20]; float health; @@ -207,18 +224,6 @@ void blarg_elite_commando_update(char *m) __asm__("FUN_L16_002d2cf0"); /* Moby class 638 */ void blarg_elite_commando_update(char *commando_moby) { - enum { - COMMANDO_STATE_INITIALIZE = 0, - COMMANDO_STATE_RETURN_TO_INITIAL_POSITION = 1, - COMMANDO_STATE_IDLE = 2, - COMMANDO_STATE_MOVE_TO_PATROL_NODE = 3, - COMMANDO_STATE_PREPARE_ROCKET_FIRE = 4, - COMMANDO_STATE_FIRE_ROCKETS = 5, - COMMANDO_STATE_MOVE_TO_ATTACK_NODE = 7, - COMMANDO_STATE_KNOCKBACK_RECOVERY = 8, - COMMANDO_STATE_FATAL_FALL = 9, - COMMANDO_STATE_FOLLOW_PARENT_TRANSFORM = 10 - }; float target[4], scratch_vector[4], delta[4]; L16DamageData *commando_data = (L16DamageData *)MOBY(commando_moby)->pvars; char *source, *aim_target_moby; @@ -269,7 +274,7 @@ void blarg_elite_commando_update(char *commando_moby) { qcopy(&commando_data->unk2B0, position); } if (commando_data->unk128) { - MOBY(commando_moby)->state = 10; + MOBY(commando_moby)->state = COMMANDO_STATE_FOLLOW_PARENT_TRANSFORM; MOBY(commando_moby)->visible = 0; MOBY(commando_moby)->flags = (MOBY(commando_moby)->flags | 1) & 0xEFFF; MOBY(commando_moby)->collision = 0; @@ -310,21 +315,21 @@ void blarg_elite_commando_update(char *commando_moby) { if (((unsigned char *)commando_moby)[0x53] != 0) blend_moby_animation(commando_moby, 0, 0, scale_game_frames(10)); if (distance < 1.0f) - MOBY(commando_moby)->state = 2; + MOBY(commando_moby)->state = COMMANDO_STATE_IDLE; } break; case COMMANDO_STATE_IDLE: fast_dec_timer_s16(&commando_data->unk2DC); - if (commando_data->pursuit_mode != 2) { + if (commando_data->pursuit_mode != COMMANDO_PURSUIT_MODE_DISABLED) { if (commando_data->unk2DC == 0) { if (commando_data->unk120 >= 0) { - MOBY(commando_moby)->state = 7; + MOBY(commando_moby)->state = COMMANDO_STATE_MOVE_TO_ATTACK_NODE; commando_data->unk2DC = truncate_float_to_s32(scale_time(random_float_between(30.0f, 90.0f))); commando_data->unk300 = (commando_data->unk300 + 1) % 2; select_blarg_elite_commando_movement_animation(commando_moby); } else if (!random_integer_below(20)) { - MOBY(commando_moby)->state = 4; + MOBY(commando_moby)->state = COMMANDO_STATE_PREPARE_ROCKET_FIRE; if (((unsigned char *)commando_moby)[0x53] != 2) { blend_moby_animation(commando_moby, 2, 0, scale_game_frames(10)); } @@ -333,7 +338,7 @@ void blarg_elite_commando_update(char *commando_moby) { } else if (fast_dec_timer_s16(&commando_data->unk302)) { if (commando_data->unk120 >= 0) { commando_data->unk300 = (commando_data->unk300 + 1) % 2; - MOBY(commando_moby)->state = 3; + MOBY(commando_moby)->state = COMMANDO_STATE_MOVE_TO_PATROL_NODE; commando_data->unk302 = scale_game_frames(180); select_blarg_elite_commando_movement_animation(commando_moby); } @@ -345,13 +350,13 @@ void blarg_elite_commando_update(char *commando_moby) { (commando_data->unk300 * 16 + 0x10), 1); if (path_distance < 0.01f) { - MOBY(commando_moby)->state = 2; + MOBY(commando_moby)->state = COMMANDO_STATE_IDLE; if (((unsigned char *)commando_moby)[0x53] != 0) blend_moby_animation(commando_moby, 0, 0, scale_game_frames(10)); commando_data->unk302 = truncate_float_to_s32(scale_time(random_float_between(180.0f, 360.0f))); } else if (fast_dec_timer_s16(&commando_data->unk302)) { - MOBY(commando_moby)->state = 2; + MOBY(commando_moby)->state = COMMANDO_STATE_IDLE; if (((unsigned char *)commando_moby)[0x53] != 0) blend_moby_animation(commando_moby, 0, 0, scale_game_frames(10)); commando_data->unk302 = @@ -376,7 +381,7 @@ void blarg_elite_commando_update(char *commando_moby) { frame_time_sq * 12.566371f, frame_time * 12.566371f); if (((unsigned char *)commando_moby)[0x70] & 2) { - MOBY(commando_moby)->state = 5; + MOBY(commando_moby)->state = COMMANDO_STATE_FIRE_ROCKETS; if (((unsigned char *)commando_moby)[0x53] != 3) { blend_moby_animation(commando_moby, 3, 0, scale_game_frames(10)); } @@ -403,7 +408,7 @@ void blarg_elite_commando_update(char *commando_moby) { int count = commando_data->unk2DE + 1; commando_data->unk2DE = count; if ((short)count >= 3) { - MOBY(commando_moby)->state = 2; + MOBY(commando_moby)->state = COMMANDO_STATE_IDLE; if (((unsigned char *)commando_moby)[0x53] != 0) blend_moby_animation(commando_moby, 0, 0, scale_game_frames(10)); commando_data->unk2DC = scale_game_frames(60); @@ -418,7 +423,7 @@ void blarg_elite_commando_update(char *commando_moby) { 1); fast_dec_timer_s16(&commando_data->unk2DC); if (distance < 0.01f || commando_data->unk2DC == 0) { - MOBY(commando_moby)->state = 4; + MOBY(commando_moby)->state = COMMANDO_STATE_PREPARE_ROCKET_FIRE; if (((unsigned char *)commando_moby)[0x53] != 2) blend_moby_animation(commando_moby, 2, 0, scale_game_frames(30)); } @@ -431,7 +436,7 @@ void blarg_elite_commando_update(char *commando_moby) { case COMMANDO_STATE_KNOCKBACK_RECOVERY: if (((unsigned char *)commando_moby)[0x70] & 2) { idle: - MOBY(commando_moby)->state = 2; + MOBY(commando_moby)->state = COMMANDO_STATE_IDLE; if (((unsigned char *)commando_moby)[0x53] != 0) { ticks = 10; animate_idle: @@ -682,8 +687,8 @@ void start_blarg_elite_commando_return_to_initial_position(struct Moby *moby, int return_countdown_ticks) { L16DamageData *commando_data = (L16DamageData *)moby->pvars; - if (moby->state == 10) { - moby->state = 1; + if (moby->state == COMMANDO_STATE_FOLLOW_PARENT_TRANSFORM) { + moby->state = COMMANDO_STATE_RETURN_TO_INITIAL_POSITION; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(0x14)); } @@ -851,7 +856,7 @@ void emit_blarg_elite_commando_death_particles(void *moby) { void update_blarg_elite_commando_joint_aim(char *commando_moby) { float position[4], target[4], matrix[16], delta[4], aim[4], aimDelta[4], velocity[4]; L16DamageData *commando_data = (L16DamageData *)MOBY(commando_moby)->pvars; - if (commando_data->pursuit_mode != 2) { + if (commando_data->pursuit_mode != COMMANDO_PURSUIT_MODE_DISABLED) { float *savedTarget, *savedMatrix; float yaw, pitch; qcopy(position, &MOBY(commando_moby)->pos); @@ -916,7 +921,8 @@ void update_blarg_elite_commando_joint_aim(char *commando_moby) { void emit_blarg_elite_commando_joint_sparks(char *commando_moby) { float matrix[16], velocity[4], acceleration[4], scatter[4]; int i; - if (MOBY(commando_moby)->visible == 0 || MOBY(commando_moby)->state == 10) + if (MOBY(commando_moby)->visible == 0 || + MOBY(commando_moby)->state == COMMANDO_STATE_FOLLOW_PARENT_TRANSFORM) return; for (i = 0; i < 2; i++) { float speed, z; diff --git a/src/overlays/shared/enemies/blarg_elite_commando_rocket.c b/src/overlays/shared/enemies/blarg_elite_commando_rocket.c index 05cbfbfaa0..97fd7775ea 100644 --- a/src/overlays/shared/enemies/blarg_elite_commando_rocket.c +++ b/src/overlays/shared/enemies/blarg_elite_commando_rocket.c @@ -12,6 +12,10 @@ #include "sda.h" #include "rnc/overlay/shared/enemies/blarg_elite_commando_rocket_data/spawn_rocket_trail_spark.h" +enum { + BLARG_ELITE_COMMANDO_ROCKET_STATE_FLYING = 0 +}; + extern int scale_game_frames(int); extern float scale_time(float) __asm__("FUN_001f96b0"); @@ -83,14 +87,14 @@ void blarg_elite_commando_rocket_update(unsigned char *moby) { *(int *)(rocket_data + 0x10) = 1; } } - if (MOBY(moby)->state != 0) + if (MOBY(moby)->state != BLARG_ELITE_COMMANDO_ROCKET_STATE_FLYING) return; collision_setup_value = 1.0f; MOBY(moby)->rot.x = fast_add_rotations(MOBY(moby)->rot.x, D_0015ED6C * 6.2831855f); fast_vec_add(rocket_next_position, &MOBY(moby)->pos, rocket_data); fast_vec_scale(back, rocket_data, -2.0f); fast_vec_add(back, back, &MOBY(moby)->pos); - if (hero.vehicle_mode == 2 && random_integer_below(5) != 0) + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK && random_integer_below(5) != 0) collision_setup_value = 0.0f; make_hit_descriptor(col, moby, 0x10003, collision_setup_value, rocket_data); *(short *)(col + 0x1A) = MOBY(moby)->oclass; @@ -181,7 +185,7 @@ char *spawn_blarg_elite_commando_rocket(char *firing_commando_moby, ((unsigned char *)moby)[0x30] = 0xFF; MOBY(moby)->draw_dist = 0xFF; MOBY(moby)->visible = 1; - MOBY(moby)->state = 0; + MOBY(moby)->state = BLARG_ELITE_COMMANDO_ROCKET_STATE_FLYING; MOBY(moby)->spawn_frame = *(unsigned long *)(firing_commando_moby + 0x38); MOBY(moby)->scale = MOBY(moby)->scale * 3.0f; qcopy(&MOBY(moby)->pos, spawn_position); diff --git a/src/overlays/shared/enemies/blarg_helicopter.c b/src/overlays/shared/enemies/blarg_helicopter.c index 6127af81d0..4d75d18575 100644 --- a/src/overlays/shared/enemies/blarg_helicopter.c +++ b/src/overlays/shared/enemies/blarg_helicopter.c @@ -17,6 +17,15 @@ #include "rnc/overlay/shared/world/level_path.h" #include "rnc/math/random.h" +enum { + BLARG_HELICOPTER_INITIALIZE = 0, + BLARG_HELICOPTER_ACTIVATION_PATH = 1, + BLARG_HELICOPTER_PATROL_AND_ATTACK = 2, + BLARG_HELICOPTER_EXIT = 3, + BLARG_HELICOPTER_TIMED_REACTION = 4, + BLARG_HELICOPTER_DESTROY = 5 +}; + typedef float HVec49_2CDDC8[4] __attribute__((aligned(16))); typedef unsigned int HQuad49_2CDDC8 __attribute__((mode(TI))); @@ -201,12 +210,8 @@ void blarg_helicopter_update(HMob49 *moby) __asm__("FUN_L03_002cca00"); /* Moby classes 326, 631 */ void blarg_helicopter_update(HMob49 *moby) { enum { - BLARG_HELICOPTER_INITIALIZE = 0, - BLARG_HELICOPTER_ACTIVATION_PATH = 1, - BLARG_HELICOPTER_PATROL_AND_ATTACK = 2, - BLARG_HELICOPTER_EXIT = 3, - BLARG_HELICOPTER_TIMED_REACTION = 4, - BLARG_HELICOPTER_DESTROY = 5 + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 253, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 254 }; HData49 *data = moby->data; HWork49 helicopter_update_scratch; @@ -223,7 +228,8 @@ void blarg_helicopter_update(HMob49 *moby) { mark_moby_for_removal(moby); return; } - if (data->route_a.path_id == -1 || (moby->state != 0 && data->enabled != 1)) { + if (data->route_a.path_id == -1 || + (moby->state != BLARG_HELICOPTER_INITIALIZE && data->enabled != 1)) { if (data->child_index != -1) mark_moby_for_removal((HMob49 *)(D_L03_0015FFD8_c + (data->child_index << 8))); mark_moby_for_removal(moby); @@ -290,10 +296,10 @@ void blarg_helicopter_update(HMob49 *moby) { for (i = 0; i < path->count - 2; i++) path->points[i].length = fast_vec_dist(&path->points[i], &path->points[i + 1]); *(HQuad49_2CDDC8 *)moby->position = *(HQuad49_2CDDC8 *)path->points; - moby->state = 1; + moby->state = BLARG_HELICOPTER_ACTIVATION_PATH; break; } - moby->state = 2; + moby->state = BLARG_HELICOPTER_PATROL_AND_ATTACK; break; } case BLARG_HELICOPTER_ACTIVATION_PATH: { @@ -342,8 +348,8 @@ void blarg_helicopter_update(HMob49 *moby) { data->alternate = 0; qcopy(moby->position, data->route_a.path->points); data->route_a.index = 1; - moby->previous_state = 2; - moby->state = 4; + moby->previous_state = BLARG_HELICOPTER_PATROL_AND_ATTACK; + moby->state = BLARG_HELICOPTER_TIMED_REACTION; data->reaction_timer = scale_game_frames(15); break; } @@ -422,8 +428,9 @@ void blarg_helicopter_update(HMob49 *moby) { moby->rotation[2] = spring_turn(&data->yaw_velocity, moby->rotation[2], angle, 0.01f, 0.3f, 0.1f); projectile = data->projectile; - if (!projectile || projectile->class_id != 0x350 || projectile->state == 254 || - projectile->state == 253) { + if (!projectile || projectile->class_id != 0x350 || + projectile->state == MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END || + projectile->state == MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { moby_point_position(moby, 0, helicopter_update_scratch.movement); fast_vec_sub(helicopter_update_scratch.direction, helicopter_update_scratch.target.position, @@ -450,8 +457,8 @@ void blarg_helicopter_update(HMob49 *moby) { D_0015ED70 * 3.1415927f, D_0015ED70 * 6.2831855f, D_0015ED6C * 1.5707964f); - rotation_2D5FA8(data->gun_yaw_matrix + 4, 2, data->gun_yaw); - rotation_2D5FA8(data->gun_pitch_matrix + 4, 2, data->gun_pitch); + build_axis_rotation_quaternion(data->gun_yaw_matrix + 4, 2, data->gun_yaw); + build_axis_rotation_quaternion(data->gun_pitch_matrix + 4, 2, data->gun_pitch); data->projectile = 0; } else { moby_point_position(moby, 0, helicopter_update_scratch.movement); @@ -480,8 +487,8 @@ void blarg_helicopter_update(HMob49 *moby) { D_0015ED70 * 3.1415927f, D_0015ED70 * 6.2831855f, D_0015ED6C * 1.5707964f); - rotation_2D5FA8(data->gun_yaw_matrix + 4, 2, data->gun_yaw); - rotation_2D5FA8(data->gun_pitch_matrix + 4, 2, data->gun_pitch); + build_axis_rotation_quaternion(data->gun_yaw_matrix + 4, 2, data->gun_yaw); + build_axis_rotation_quaternion(data->gun_pitch_matrix + 4, 2, data->gun_pitch); } if (point > 0 && point < route->path->count - 1) { float node_distance = vector_distance_xy(&route->path->points[point], @@ -554,8 +561,8 @@ void blarg_helicopter_update(HMob49 *moby) { for (i = 0; i < path->count - 2; i++) path->points[i].length = fast_vec_dist(&path->points[i], &path->points[i + 1]); } - moby->previous_state = 3; - moby->state = 4; + moby->previous_state = BLARG_HELICOPTER_EXIT; + moby->state = BLARG_HELICOPTER_TIMED_REACTION; data->reaction_timer = scale_game_frames(15); break; } else if (is_point_inside_clip_volume(helicopter_update_scratch.target.position, @@ -640,8 +647,8 @@ void blarg_helicopter_update(HMob49 *moby) { route = data->alternate ? &data->route_b : &data->route_a; qcopy(moby->position, route->path->points); route->index = 1; - moby->previous_state = 2; - moby->state = 4; + moby->previous_state = BLARG_HELICOPTER_PATROL_AND_ATTACK; + moby->state = BLARG_HELICOPTER_TIMED_REACTION; data->reaction_timer = scale_game_frames(15); break; } @@ -856,6 +863,9 @@ void blarg_helicopter_update(HMob49 *moby) { /* Ported from rac1-decomp (src/overlays/shared/vendor_00292AC0.c: func_L03_002CF600), where it is exact; names translated to the US level program. */ void handle_blarg_helicopter_hits(char *helicopter_moby) { + enum { + HIT_REACTION_SKIP_DAMAGE = 1 + }; int hit_reaction_status; float fv; int hit_reaction_result; @@ -868,15 +878,17 @@ void handle_blarg_helicopter_hits(char *helicopter_moby) { hit_record = find_moby_hit(helicopter_moby, 0x330000, 0); hit_reaction_result = hit_reaction( helicopter_moby, hit_record, helicopter_data + 0x20, 0, &hit_reaction_status, &fv, 0, 4); - if (hit_reaction_status != 1 && MOBY(helicopter_moby)->state != 5) { + if (hit_reaction_status != HIT_REACTION_SKIP_DAMAGE && + MOBY(helicopter_moby)->state != BLARG_HELICOPTER_DESTROY) { float remaining_health = *(float *)(helicopter_data + 0x20) - fv; *(float *)(helicopter_data + 0x20) = remaining_health; if (hit_reaction_result == 1 || remaining_health <= 0.0f) { - MOBY(helicopter_moby)->state = 5; + MOBY(helicopter_moby)->state = BLARG_HELICOPTER_DESTROY; } else if (hit_reaction_result != 0xB) { *(unsigned char *)(helicopter_data + 0x67) = 0xB4; trooper_anim_update(helicopter_moby, (short *)(helicopter_data + 0x60)); - if (*(float *)(hit_record + 0x1C) == 5627.925f && MOBY(helicopter_moby)->state != 4) { + if (*(float *)(hit_record + 0x1C) == 5627.925f && + MOBY(helicopter_moby)->state != BLARG_HELICOPTER_TIMED_REACTION) { reaction_heading_angle = fast_arc_tan(MOBY(helicopter_moby)->pos.x - *(float *)(hit_record + 0), MOBY(helicopter_moby)->pos.y - *(float *)(hit_record + 4)); @@ -897,7 +909,7 @@ void handle_blarg_helicopter_hits(char *helicopter_moby) { *(float *)(helicopter_data + 0x214) = frame_time * 4.0f; *(short *)(helicopter_data + 0x206) = scale_game_frames(0x3C); MOBY(helicopter_moby)->command = MOBY(helicopter_moby)->state; - MOBY(helicopter_moby)->state = 4; + MOBY(helicopter_moby)->state = BLARG_HELICOPTER_TIMED_REACTION; allocate_voice_for_target_entry(1, 0, (int)helicopter_moby); } } diff --git a/src/overlays/shared/enemies/blarg_helicopter_spark.c b/src/overlays/shared/enemies/blarg_helicopter_spark.c index 98e5b1c748..16995b994d 100644 --- a/src/overlays/shared/enemies/blarg_helicopter_spark.c +++ b/src/overlays/shared/enemies/blarg_helicopter_spark.c @@ -125,7 +125,7 @@ void helicopter_spark_update(Moby *moby) { } else if (homing_spark_pvars->target->oclass == 0xE9) { voice_slot = (int *)(((char *)homing_spark_pvars->target->pvars) + 0x1B8); if (homing_spark_pvars->target->state == 0x40 || homing_spark_pvars->target->state == 1) { - moby->state = 2; + moby->state = SPARK_CLEANUP_AND_REMOVE; } } state = moby->state; @@ -266,7 +266,7 @@ void helicopter_spark_update(Moby *moby) { D_L03_00173F58 != 0 && (D_L03_00173F58 == ((Hero *)(D_0013E533 + 0xE1D))->moby || D_L03_00173F58->oclass == 0x1DF)) { - moby->state = 2; + moby->state = SPARK_CLEANUP_AND_REMOVE; } qcopy(&ray_end, &muzzle); ray_end.z += 2.0f; @@ -275,13 +275,13 @@ void helicopter_spark_update(Moby *moby) { D_L03_00173F58 != 0 && (D_L03_00173F58 == ((Hero *)(D_0013E533 + 0xE1D))->moby || D_L03_00173F58->oclass == 0x1DF)) { - moby->state = 2; + moby->state = SPARK_CLEANUP_AND_REMOVE; } if (collect_mobies_in_sphere(0.5f, &moby->pos, 0x10, moby, &hit) != 0 && D_L03_00173F58 != 0 && (D_L03_00173F58 == ((Hero *)(D_0013E533 + 0xE1D))->moby || D_L03_00173F58->oclass == 0x1DF)) { - moby->state = 2; + moby->state = SPARK_CLEANUP_AND_REMOVE; } } } @@ -289,7 +289,7 @@ void helicopter_spark_update(Moby *moby) { if (fast_dec_timer(&homing_spark_pvars->timer) != 0 || homing_spark_pvars->target == 0 || homing_spark_pvars->target->state == 0xFE || homing_spark_pvars->target->state == 0xFD) { - moby->state = 2; + moby->state = SPARK_CLEANUP_AND_REMOVE; } break; case SPARK_CLEANUP_AND_REMOVE: diff --git a/src/overlays/shared/enemies/blarg_paratrooper.c b/src/overlays/shared/enemies/blarg_paratrooper.c index fdb44c7c85..5e0e96a37c 100644 --- a/src/overlays/shared/enemies/blarg_paratrooper.c +++ b/src/overlays/shared/enemies/blarg_paratrooper.c @@ -137,7 +137,7 @@ extern void FUN_L00_00263ac8_c(float, void *, int, void *) __asm__("FUN_L00_002 extern void FUN_L00_0025a120_c(void *) __asm__("FUN_L00_0025a120"); extern void debug_print(char *, int) __asm__("FUN_001e93b0"); extern void FUN_L01_0026d930_c(void *) __asm__("FUN_L01_0026d930"); -extern void FUN_L00_00259028_c(void *, void *, void *, void *) __asm__("FUN_L00_00259028"); +extern void step_mover_2e3f20(void *, void *, void *, void *) __asm__("FUN_L00_00259028"); extern void FUN_L00_0025f730(void *, float); extern void FUN_L00_00258830_c(void *, void *, float, float, float, int) __asm__("FUN_L00_00258830"); @@ -155,11 +155,13 @@ extern void trooper_anim_update(void *, void *) __asm__("FUN_L00_0025d458"); extern void trooper_anim_finish(void *, void *) __asm__("FUN_L00_0025d538"); extern int activate_effect_l08(void *, void *, float, int, int, void *, int) __asm__("FUN_L00_0025ff38"); -extern float D_L08_00162180 __attribute__((sda)); +extern float l08_paratrooper_model_scale_multiplier __asm__("D_L08_00162180") __attribute__((sda)); extern float D_L08_00162184 __attribute__((sda)); -extern float D_L08_0016218C __attribute__((sda)); -extern float D_L08_00162190 __attribute__((sda)); -extern float D_L08_00162194 __attribute__((sda)); +extern float l08_paratrooper_recovery_knockback_xy_speed __asm__("D_L08_0016218C") + __attribute__((sda)); +extern float l08_paratrooper_death_knockback_z_speed __asm__("D_L08_00162190") __attribute__((sda)); +extern float l08_paratrooper_death_knockback_xy_speed __asm__("D_L08_00162194") + __attribute__((sda)); extern float D_L08_001621B0 __attribute__((sda)); /* Paratrooper: initializes its path and steering, patrols, attacks its target, @@ -288,10 +290,10 @@ void blarg_paratrooper_update(char *moby) { paratrooper_private_state->f1F4 = index + 2 * paratrooper_private_state->f20C; } } - FUN_L00_00259028_c(moby, - (char *)paratrooper_private_state + 0xD0, - path + 0x10 + paratrooper_private_state->f1F4 * 16, - pos); + step_mover_2e3f20(moby, + (char *)paratrooper_private_state + 0xD0, + path + 0x10 + paratrooper_private_state->f1F4 * 16, + pos); if (target && paratrooper_private_state->f164 != 2 && fast_dec_timer((char *)paratrooper_private_state + 0x1F0)) { paratrooper_private_state->f1F4 = select_point_index_by_distance( @@ -310,11 +312,11 @@ void blarg_paratrooper_update(char *moby) { paratrooper_private_state->fE0 = 0.0f; (*(unsigned char *)((char *)(moby) + 0x20)) = 3; } else { - FUN_L00_00259028_c(moby, - (char *)paratrooper_private_state + 0xD0, - ((char *)l08_paths[paratrooper_private_state->f1D4]) + 0x10 + - paratrooper_private_state->f1F4 * 16, - pos); + step_mover_2e3f20(moby, + (char *)paratrooper_private_state + 0xD0, + ((char *)l08_paths[paratrooper_private_state->f1D4]) + 0x10 + + paratrooper_private_state->f1F4 * 16, + pos); if ((*(unsigned char *)((char *)(moby) + 0x53)) != 2) blend_moby_animation(moby, 2, 0, random302618() % 4 + 7); } @@ -601,7 +603,13 @@ void blarg_paratrooper_update(char *moby) { /* Ported from rac1-decomp (src/overlays/shared/vendor_002D3DF8.c: func_L08_00303998), where it is exact; names translated to the US level program. */ void update_blarg_paratrooper_damage_and_state(char *moby) { - Paratrooper302618 *data; + enum { + PARATROOPER_HIT_REACTION_LETHAL = 1, + PARATROOPER_HIT_REACTION_DEATH_KNOCKBACK = 2, + PARATROOPER_HIT_REACTION_RECOVERY_KNOCKBACK = 3, + PARATROOPER_HIT_REACTION_NONE = 11 + }; + Paratrooper302618 *paratrooper_instance_state; char *target, *child, *attached, *chased; float pos[4] __attribute__((aligned(16))); float matrix[16] __attribute__((aligned(16))); @@ -609,43 +617,45 @@ void update_blarg_paratrooper_damage_and_state(char *moby) { int hit_state, reaction, turn, state; float angle, distance, height, dx, dy; - data = (Paratrooper302618 *)MOBY(moby)->pvars; + paratrooper_instance_state = (Paratrooper302618 *)MOBY(moby)->pvars; if (MOBY(moby)->state == 0) return; { float timer_scale = D_L08_001621B0 * frame_time; - ((Moby *)moby)->scale = *(float *)(((char *)MOBY(moby)->pclass) + 0x24) * D_L08_00162180; - data->unkF4 = timer_scale; + ((Moby *)moby)->scale = *(float *)(((char *)MOBY(moby)->pclass) + 0x24) * + l08_paratrooper_model_scale_multiplier; + paratrooper_instance_state->unkF4 = timer_scale; } - if (data->f1F8 == 0) { + if (paratrooper_instance_state->f1F8 == 0) { child = create_moby(0x401); - data->f1F8 = child; + paratrooper_instance_state->f1F8 = child; if (child != 0) { *(short *)(child + 0x32) = 0x40; - *(unsigned char *)(data->f1F8 + 0x30) = 0x40; - *(unsigned char *)(data->f1F8 + 0x31) = 1; - *(unsigned short *)(data->f1F8 + 0x34) |= 0x100; + *(unsigned char *)(paratrooper_instance_state->f1F8 + 0x30) = 0x40; + *(unsigned char *)(paratrooper_instance_state->f1F8 + 0x31) = 1; + *(unsigned short *)(paratrooper_instance_state->f1F8 + 0x34) |= 0x100; moby_point_position(moby, 4, pos); - qcopy(data->f1F8 + 0x10, pos); + qcopy(paratrooper_instance_state->f1F8 + 0x10, pos); } MOBY(moby)->flags |= 0x1000; } else { moby_point_position(moby, 4, pos); build_moby_bone_transform(moby, 4, matrix); - copy_matrix3x4(data->f1F8 + 0xc0, matrix); - attached = data->f1F8; + copy_matrix3x4(paratrooper_instance_state->f1F8 + 0xc0, matrix); + attached = paratrooper_instance_state->f1F8; qcopy(attached + 0x10, pos); update_entity(attached); } damage = 0.0f; target = find_moby_hit(moby, 0x330000, 0); - reaction = resolve_moby_hit_response(moby, target, &data->health, 0, &hit_state, &damage, 0, 4); + reaction = resolve_moby_hit_response( + moby, target, ¶trooper_instance_state->health, 0, &hit_state, &damage, 0, 4); if (hit_state != 1 && MOBY(moby)->state != 11) { { - float health = data->health - damage; - data->health = health; + float health = paratrooper_instance_state->health - damage; + paratrooper_instance_state->health = health; if (*(short *)(*(char **)(target + 0x20) + 0xa6) == 0x47) reaction = 3; if (health <= 0.0f) @@ -655,34 +665,34 @@ void update_blarg_paratrooper_damage_and_state(char *moby) { turn = truncate_float_to_s32(512.0f); { float pose_scale = D_L08_00162184 * frame_time_sq; - data->unk90 = turn; - data->unk98 = 0.5f; - data->unk94 = 9; - data->unk80 = pose_scale; + paratrooper_instance_state->unk90 = turn; + paratrooper_instance_state->unk98 = 0.5f; + paratrooper_instance_state->unk94 = 9; + paratrooper_instance_state->unk80 = pose_scale; } - data->unkAD = 0; + paratrooper_instance_state->unkAD = 0; if ((unsigned)reaction < 12) { switch (reaction) { case 0: - case 11: + case PARATROOPER_HIT_REACTION_NONE: break; case 9: case 10: - data->unk67 = 0xfa; + paratrooper_instance_state->unk67 = 0xfa; break; - case 3: + case PARATROOPER_HIT_REACTION_RECOVERY_KNOCKBACK: case 4: case 5: case 6: case 7: case 8: { - float pose_scale = D_L08_0016218C * frame_time; + float pose_scale = l08_paratrooper_recovery_knockback_xy_speed * frame_time; float timer_scale = frame_time * 3.0f; - data->unk88 = pose_scale; - data->unk8C = timer_scale; - data->unkC0 = 5.0f; - data->unkC4 = 10.0f; + paratrooper_instance_state->unk88 = pose_scale; + paratrooper_instance_state->unk8C = timer_scale; + paratrooper_instance_state->unkC0 = 5.0f; + paratrooper_instance_state->unkC4 = 10.0f; } { char *hit_moby = *(char **)(target + 0x20); @@ -692,31 +702,34 @@ void update_blarg_paratrooper_damage_and_state(char *moby) { angle = fast_arc_tan(dx, dy); *(u128 *)pos = *(u128 *)(target + 0x10); knock_angle = angle; - trooper_knockback_arc( - pos, &knock_angle, (float *)(&data->unk88), (float *)(&data->unk8C)); - trooper_start_knockback(moby, &data->unk70, knock_angle, 8, 1, 0); + trooper_knockback_arc(pos, + &knock_angle, + (float *)(¶trooper_instance_state->unk88), + (float *)(¶trooper_instance_state->unk8C)); + trooper_start_knockback( + moby, ¶trooper_instance_state->unk70, knock_angle, 8, 1, 0); MOBY(moby)->state = 10; - data->unk67 = 0x78; + paratrooper_instance_state->unk67 = 0x78; break; - case 1: - case 2: { + case PARATROOPER_HIT_REACTION_LETHAL: + case PARATROOPER_HIT_REACTION_DEATH_KNOCKBACK: { float push_limit = 16.0f; float pose_rate = D_L08_00162184; - float timer_rate = D_L08_00162194; - float angle_rate = D_L08_00162190; + float timer_rate = l08_paratrooper_death_knockback_xy_speed; + float angle_rate = l08_paratrooper_death_knockback_z_speed; float step, pose_scale, timer_scale, angle_scale; ((Moby *)moby)->flags &= 0xefff; step = frame_time; pose_scale = pose_rate * frame_time_sq; timer_scale = timer_rate * step; angle_scale = angle_rate * step; - data->unk98 = 0.25f; - data->unk8C = angle_scale; - data->unk80 = pose_scale; - data->unk88 = timer_scale; - data->unkC0 = 11.0f; - data->unkC4 = push_limit; - data->unk90 = 0x200; + paratrooper_instance_state->unk98 = 0.25f; + paratrooper_instance_state->unk8C = angle_scale; + paratrooper_instance_state->unk80 = pose_scale; + paratrooper_instance_state->unk88 = timer_scale; + paratrooper_instance_state->unkC0 = 11.0f; + paratrooper_instance_state->unkC4 = push_limit; + paratrooper_instance_state->unk90 = 0x200; } { char *hit_moby = *(char **)(target + 0x20); @@ -726,57 +739,66 @@ void update_blarg_paratrooper_damage_and_state(char *moby) { angle = fast_arc_tan(dx, dy); *(u128 *)pos = *(u128 *)(target + 0x10); second_knock_angle = angle; - trooper_knockback_arc( - pos, &second_knock_angle, (float *)(&data->unk88), (float *)(&data->unk8C)); - trooper_start_knockback(moby, &data->unk70, second_knock_angle, 12, 1, 0); + trooper_knockback_arc(pos, + &second_knock_angle, + (float *)(¶trooper_instance_state->unk88), + (float *)(¶trooper_instance_state->unk8C)); + trooper_start_knockback( + moby, ¶trooper_instance_state->unk70, second_knock_angle, 12, 1, 0); MOBY(moby)->state = 11; - data->unk67 = 0xf0; + paratrooper_instance_state->unk67 = 0xf0; spawn_randomized_bolt_drop(moby, 2, 3, 0, -1); break; default: break; } } - trooper_anim_update(moby, &data->unk60); + trooper_anim_update(moby, ¶trooper_instance_state->unk60); } MOBY(moby)->hit_slot = 0xff; - trooper_anim_finish(moby, &data->unk60); + trooper_anim_finish(moby, ¶trooper_instance_state->unk60); - if (data->unk38 != 0) { + if (paratrooper_instance_state->unk38 != 0) { angle = random_float_between(180.0f, 240.0f); angle = scale_time(angle); - data->unk1D8 = (short)truncate_float_to_s32(angle); - data->unk38 = 0; + paratrooper_instance_state->unk1D8 = (short)truncate_float_to_s32(angle); + paratrooper_instance_state->unk38 = 0; } - fast_dec_timer_s16((short *)(&data->unk1D8)); - if (data->unk1D8 != 0) - data->unk1DC = data->unk1E4 + 6.0f; + fast_dec_timer_s16((short *)(¶trooper_instance_state->unk1D8)); + if (paratrooper_instance_state->unk1D8 != 0) + paratrooper_instance_state->unk1DC = paratrooper_instance_state->unk1E4 + 6.0f; else - data->unk1DC = data->unk1E4; + paratrooper_instance_state->unk1DC = paratrooper_instance_state->unk1E4; if (random_integer_below(4) == 0) { { - char *path = ((char *)l08_paths[data->f1D0]); - reaction = activate_effect_l08( - moby, &data->unk120, data->unk1DC, 0, 0, path + 0x10, *(int *)path); + char *path = ((char *)l08_paths[paratrooper_instance_state->f1D0]); + reaction = activate_effect_l08(moby, + ¶trooper_instance_state->unk120, + paratrooper_instance_state->unk1DC, + 0, + 0, + path + 0x10, + *(int *)path); } if (reaction != 2) { - distance = vector_distance_xy(&MOBY(moby)->pos, &data->unk120); - if (data->unk1DC < distance || 3.0f < absolute_float(MOBY(moby)->pos.z - data->unk128)) - data->f164 = 2; + distance = vector_distance_xy(&MOBY(moby)->pos, ¶trooper_instance_state->unk120); + if (paratrooper_instance_state->unk1DC < distance || + 3.0f < absolute_float(MOBY(moby)->pos.z - paratrooper_instance_state->unk128)) + paratrooper_instance_state->f164 = 2; } } else { - chased = data->f160; + chased = paratrooper_instance_state->f160; if (chased != 0 && *(unsigned char *)(chased + 0x20) != 0xfe && *(unsigned char *)(chased + 0x20) != 0xfd) { - qcopy(&data->unk120, chased + 0x10); + qcopy(¶trooper_instance_state->unk120, chased + 0x10); } else { - data->f160 = 0; - data->f164 = 2; + paratrooper_instance_state->f160 = 0; + paratrooper_instance_state->f164 = 2; } } - if (*(int *)&data->f160 == 0) - data->f160 = (char *)hero.moby; + if (*(int *)¶trooper_instance_state->f160 == 0) + paratrooper_instance_state->f160 = (char *)hero.moby; state = MOBY(moby)->state; if (state == 0 || state == 5 || state == 7 || state == 4) { diff --git a/src/overlays/shared/enemies/blarg_ship_rocket.c b/src/overlays/shared/enemies/blarg_ship_rocket.c index 879edd34bf..2b3572841c 100644 --- a/src/overlays/shared/enemies/blarg_ship_rocket.c +++ b/src/overlays/shared/enemies/blarg_ship_rocket.c @@ -23,7 +23,7 @@ typedef struct { } L10SpriteData; extern int fast_tween_color(int, int, float) __asm__("FUN_001fa6e0"); -extern unsigned char *func_L00_00273E08_298940( +extern unsigned char *spawn_timed_hero_relative_particle( void *, int, unsigned char, int, int, int, int, float) __asm__("FUN_L00_00272f68"); void emit_moby_sprite_particles(char *moby) __asm__("FUN_L10_00298940"); @@ -54,14 +54,14 @@ void emit_moby_sprite_particles(char *moby) { color_blend_offset = convert_integer_to_float(scale_game_frames(0xFF) - sprite_data->c[i]); color_blend_offset = color_blend_offset / (float)scale_game_frames(0xFF); col = fast_tween_color(0x4040FFFF, 0x1040FFFF, absolute_float(0.5f - color_blend_offset)); - func_L00_00273E08_298940(d, - col, - truncate_float_to_s32(sprite_data->a[i]) & 0xFF, - 0x35, - 1, - 2, - 0, - sprite_data->d[i]); + spawn_timed_hero_relative_particle(d, + col, + truncate_float_to_s32(sprite_data->a[i]) & 0xFF, + 0x35, + 1, + 2, + 0, + sprite_data->d[i]); fast_vec_add(d, d, particle_position_step); } } diff --git a/src/overlays/shared/enemies/blarg_space_commando.c b/src/overlays/shared/enemies/blarg_space_commando.c index 0a5939fa25..c096d6b189 100644 --- a/src/overlays/shared/enemies/blarg_space_commando.c +++ b/src/overlays/shared/enemies/blarg_space_commando.c @@ -17,6 +17,22 @@ #include "rnc/mobys/animation/blend_moby_animation.h" /* Movement controller block at vars + 0xC0 (FUN_L01_0026d930 init, FUN_L00_00258b50 step). */ +enum { + BLARG_COMMANDO_STATE_INITIALIZE = 0, + BLARG_COMMANDO_STATE_SELECT_ACTION = 1, + BLARG_COMMANDO_STATE_RANGED_ATTACK_WINDUP = 2, + BLARG_COMMANDO_STATE_RANGED_ATTACK_RECOVERY = 3, + BLARG_COMMANDO_STATE_RANGED_ATTACK_COOLDOWN = 4, + BLARG_COMMANDO_STATE_MELEE_ATTACK = 5, + BLARG_COMMANDO_STATE_MELEE_RECOVERY = 6, + BLARG_COMMANDO_STATE_CHASE_TARGET = 11, + BLARG_COMMANDO_STATE_CHASE_MELEE_ATTACK = 12, + BLARG_COMMANDO_STATE_RETURN_HOME = 13, + BLARG_COMMANDO_STATE_APPROACH_ROUTE_DESTINATION = 14, + BLARG_COMMANDO_STATE_KNOCKBACK = 15, + BLARG_COMMANDO_STATE_DEATH_KNOCKBACK = 16 +}; + typedef struct { s32 unk0; f32 unk4; @@ -129,21 +145,6 @@ void blarg_space_commando_update(struct Moby *moby) __asm__("FUN_L06_002fdbd0"); /* Moby class 1068 */ void blarg_space_commando_update(struct Moby *moby) { - enum { - BLARG_COMMANDO_STATE_INITIALIZE = 0, - BLARG_COMMANDO_STATE_SELECT_ACTION = 1, - BLARG_COMMANDO_STATE_RANGED_ATTACK_WINDUP = 2, - BLARG_COMMANDO_STATE_RANGED_ATTACK_RECOVERY = 3, - BLARG_COMMANDO_STATE_RANGED_ATTACK_COOLDOWN = 4, - BLARG_COMMANDO_STATE_MELEE_ATTACK = 5, - BLARG_COMMANDO_STATE_MELEE_RECOVERY = 6, - BLARG_COMMANDO_STATE_CHASE_TARGET = 11, - BLARG_COMMANDO_STATE_CHASE_MELEE_ATTACK = 12, - BLARG_COMMANDO_STATE_RETURN_HOME = 13, - BLARG_COMMANDO_STATE_APPROACH_ROUTE_DESTINATION = 14, - BLARG_COMMANDO_STATE_KNOCKBACK = 15, - BLARG_COMMANDO_STATE_DEATH_KNOCKBACK = 16 - }; Moby1068Vars *blarg_commando_state = (Moby1068Vars *)moby->pvars; struct Moby *target; s32 *route; @@ -183,12 +184,12 @@ void blarg_space_commando_update(struct Moby *moby) { blarg_commando_state->ctl.unk24 = movement_max_horizontal_speed_gp * frame_time; blarg_commando_state->ctl.flags |= 8; qcopy(&blarg_commando_state->home, &moby->pos); - moby->state = 1; + moby->state = BLARG_COMMANDO_STATE_SELECT_ACTION; break; case BLARG_COMMANDO_STATE_SELECT_ACTION: if (blarg_commando_state->volume != -1 && blarg_commando_state->route != -1) { if (is_point_inside_clip_volume(&hero.motion.pos, blarg_commando_state->volume) != 0) { - moby->state = 14; + moby->state = BLARG_COMMANDO_STATE_APPROACH_ROUTE_DESTINATION; break; } if (vector_distance_xy(&moby->pos, &target->pos) > 7.0f) { @@ -207,19 +208,19 @@ void blarg_space_commando_update(struct Moby *moby) { moby->rot.z, fast_arc_tan(target->pos.x - moby->pos.x, target->pos.y - moby->pos.y)) < 0.17453292f) { - moby->state = 2; + moby->state = BLARG_COMMANDO_STATE_RANGED_ATTACK_WINDUP; if (moby->prev_seq != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } } } else { - moby->state = 5; + moby->state = BLARG_COMMANDO_STATE_MELEE_ATTACK; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } } } else if (blarg_commando_state->unk188 != 0) { - moby->state = 11; + moby->state = BLARG_COMMANDO_STATE_CHASE_TARGET; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(20)); } @@ -246,7 +247,7 @@ void blarg_space_commando_update(struct Moby *moby) { if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(18)); } - moby->state = 1; + moby->state = BLARG_COMMANDO_STATE_SELECT_ACTION; } } else { FUN_L00_00258278(moby, @@ -280,7 +281,7 @@ void blarg_space_commando_update(struct Moby *moby) { frame_time * 3.1415927f); if (moby->anim_flags & 2) { FUN_L06_002ff100_u(moby); - moby->state = 3; + moby->state = BLARG_COMMANDO_STATE_RANGED_ATTACK_RECOVERY; if (moby->prev_seq != 5) { blend_moby_animation(moby, 5, 0, scale_game_frames(10)); } @@ -289,13 +290,13 @@ void blarg_space_commando_update(struct Moby *moby) { case BLARG_COMMANDO_STATE_RANGED_ATTACK_RECOVERY: if (moby->anim_flags & 2) { if (blarg_commando_state->unk164 != 2) { - moby->state = 4; + moby->state = BLARG_COMMANDO_STATE_RANGED_ATTACK_COOLDOWN; if (moby->prev_seq != 4) { blend_moby_animation(moby, 4, 0, scale_game_frames(20)); } blarg_commando_state->timer = scale_game_frames(ranged_attack_cooldown_frames_gp); } else { - moby->state = 1; + moby->state = BLARG_COMMANDO_STATE_SELECT_ACTION; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(20)); } @@ -311,18 +312,18 @@ void blarg_space_commando_update(struct Moby *moby) { frame_time * 3.1415927f); if (fast_dec_timer(&blarg_commando_state->timer) != 0) { FUN_L06_002ff100_u(moby); - moby->state = 3; + moby->state = BLARG_COMMANDO_STATE_RANGED_ATTACK_RECOVERY; if (moby->prev_seq != 5) { blend_moby_animation(moby, 5, 0, scale_game_frames(5)); } } else if (vector_distance_xy(&moby->pos, &target->pos) < melee_attack_distance_threshold_gp) { - moby->state = 5; + moby->state = BLARG_COMMANDO_STATE_MELEE_ATTACK; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } } else if (blarg_commando_state->unk188 != 0) { - moby->state = 11; + moby->state = BLARG_COMMANDO_STATE_CHASE_TARGET; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(20)); } @@ -339,7 +340,7 @@ void blarg_space_commando_update(struct Moby *moby) { qcopy(&movement_input_or_output_or_melee_origin, &moby->pos); movement_input_or_output_or_melee_origin.f[2] += 0.3f; cur_frame = compute_interpolated_record_value(moby); - if (hero.vehicle_mode == 1 && cur_frame < 9.0f) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK && cur_frame < 9.0f) { moby->anim_speed = vehicle_melee_windup_animation_speed_gp; } if (cur_frame >= 9.0f && cur_frame <= 15.0f) { @@ -361,7 +362,7 @@ void blarg_space_commando_update(struct Moby *moby) { } qcopy(&blarg_commando_state->unk200, &position_or_movement_vector); if (moby->anim_flags & 2) { - moby->state = 6; + moby->state = BLARG_COMMANDO_STATE_MELEE_RECOVERY; moby->command = 1; if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(10)); @@ -402,15 +403,15 @@ void blarg_space_commando_update(struct Moby *moby) { near = 1; } if (blarg_commando_state->unk188 == 0) { - moby->state = 13; + moby->state = BLARG_COMMANDO_STATE_RETURN_HOME; } else if (near != 0) { - moby->state = 12; + moby->state = BLARG_COMMANDO_STATE_CHASE_MELEE_ATTACK; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } } else if (vector_distance_xy(&moby->pos, &target->pos) < melee_attack_distance_threshold_gp) { - moby->state = 12; + moby->state = BLARG_COMMANDO_STATE_CHASE_MELEE_ATTACK; if (moby->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } @@ -440,7 +441,7 @@ void blarg_space_commando_update(struct Moby *moby) { } qcopy(&blarg_commando_state->unk200, &position_or_movement_vector); if (moby->anim_flags & 2) { - moby->state = 11; + moby->state = BLARG_COMMANDO_STATE_CHASE_TARGET; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(20)); } @@ -470,7 +471,7 @@ void blarg_space_commando_update(struct Moby *moby) { blarg_commando_state->path, &moby->pos, &moby->pos, 0.75f); } if (fast_vec_dist(&blarg_commando_state->home, &moby->pos) < 1.0f) { - moby->state = 1; + moby->state = BLARG_COMMANDO_STATE_SELECT_ACTION; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(20)); } @@ -479,7 +480,7 @@ void blarg_space_commando_update(struct Moby *moby) { case BLARG_COMMANDO_STATE_KNOCKBACK: hit = step_moby_motion(moby, &blarg_commando_state->vel); if (hit & 0x40) { - moby->state = 1; + moby->state = BLARG_COMMANDO_STATE_SELECT_ACTION; if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -620,7 +621,7 @@ void process_blarg_space_commando_hits(char *moby) { hit_record = find_moby_hit(moby, 0x330000, 0); hit_response_index = resolve_moby_hit_response(moby, hit_record, commando_state + 0x20, 0, &hit, &dt, 0, 4); - if (hit != 1 && (unsigned char)MOBY(moby)->state != 0x10) { + if (hit != 1 && (unsigned char)MOBY(moby)->state != BLARG_COMMANDO_STATE_DEATH_KNOCKBACK) { if (current_level_index_gp == 0xA && hit_record != 0 && *(char **)(hit_record + 0x20) != 0 && *(short *)(*(char **)(hit_record + 0x20) + 0xA6) == 0x31A && D_0013D408[0x11] == 0) { @@ -646,7 +647,7 @@ void process_blarg_space_commando_hits(char *moby) { char *q; int knockback_frames; float b, a; - MOBY(moby)->state = 0xF; + MOBY(moby)->state = BLARG_COMMANDO_STATE_KNOCKBACK; q = commando_state + 0x60; knockback_frames = scale_game_frames(0x3C); a = nonfatal_knockback_horizontal_speed_gp * D_0015ED6C; @@ -670,7 +671,7 @@ void process_blarg_space_commando_hits(char *moby) { case FRAGMENTING_FATAL_HIT_RESPONSE: { char *q; float a, b; - MOBY(moby)->state = 0x10; + MOBY(moby)->state = BLARG_COMMANDO_STATE_DEATH_KNOCKBACK; q = commando_state + 0x60; a = fatal_knockback_horizontal_speed_gp * D_0015ED6C; b = fatal_knockback_vertical_speed_gp * D_0015ED6C; @@ -819,6 +820,10 @@ void spawn_blarg_space_commando_beam_sparks(char *moby) __asm__("FUN_L06_002ff97 extern void add_draw_callback(void *, void *) __asm__("FUN_001f4600"); void update_blarg_space_commando_beam(void *owner_moby) { + enum { + BEAM_SEGMENT_HIT_WITH_FADING_ENDPOINT = 0x10000, + BEAM_SEGMENT_HIT_WITH_FULL_WEIGHT_ENDPOINTS = 0x10001 + }; char *moby = owner_moby; FanData *beam_state = ((FanData *)MOBY(moby)->pvars); int frames; @@ -848,7 +853,7 @@ void update_blarg_space_commando_beam(void *owner_moby) { for (i = 0; i < 16; i++) { char *entry; - if (hero.vehicle_mode == 1) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { step = (beam_point_horizontal_speed_gp * frame_time) * 0.5f; } else { step = beam_point_horizontal_speed_gp * frame_time; @@ -886,9 +891,9 @@ void update_blarg_space_commando_beam(void *owner_moby) { point[1] = fast_sin(MOBY(moby)->rot.z); point[2] = 1.0f; point[3] = 5627.925f; - hit_type = 0x10000; + hit_type = BEAM_SEGMENT_HIT_WITH_FADING_ENDPOINT; if (1.0f <= *(float *)(entry + 0x23C) && 1.0f <= *(float *)(next_entry + 0x23C)) { - hit_type = 0x10001; + hit_type = BEAM_SEGMENT_HIT_WITH_FULL_WEIGHT_ENDPOINTS; } make_hit_descriptor(&shot, (struct Moby *)moby, hit_type, point, 1.0f); shot.oclass = MOBY(moby)->oclass; diff --git a/src/overlays/shared/enemies/bolt_thief_mine.c b/src/overlays/shared/enemies/bolt_thief_mine.c index 16820d0796..a070f9d659 100644 --- a/src/overlays/shared/enemies/bolt_thief_mine.c +++ b/src/overlays/shared/enemies/bolt_thief_mine.c @@ -13,6 +13,12 @@ #include "rnc/mobys/moby_spawn.h" #include "qcopy.h" +enum { + FLOAT_MINE_INITIALIZE = 0, + FLOAT_MINE_ACTIVE = 1, + FLOAT_MINE_WAIT_OFFSCREEN_RESPAWN = 2 +}; + typedef struct { struct Moby *link; float rest_z; @@ -68,11 +74,6 @@ void bolt_thief_mine_update(struct Moby *moby) __asm__("FUN_L14_002ff640"); /* Moby class 933 */ void bolt_thief_mine_update(struct Moby *moby) { - enum { - FLOAT_MINE_INITIALIZE = 0, - FLOAT_MINE_ACTIVE = 1, - FLOAT_MINE_WAIT_OFFSCREEN_RESPAWN = 2 - }; FloatMineVars *floating_mine_private_vars = (FloatMineVars *)moby->pvars; union { HitInfo info; @@ -93,9 +94,9 @@ void bolt_thief_mine_update(struct Moby *moby) { floating_mine_private_vars->spin[0] = random_float_between(0.010471975f, 0.020943951f); floating_mine_private_vars->spin[1] = random_float_between(0.006981317f, 0.013962634f); floating_mine_private_vars->spin[2] = random_float_between(0.0034906585f, 0.006981317f); - moby->state = 1; + moby->state = FLOAT_MINE_ACTIVE; } else if ((s8)floating_mine_private_vars->link->state < 0) { - moby->state = 1; + moby->state = FLOAT_MINE_ACTIVE; } break; case FLOAT_MINE_ACTIVE: { @@ -163,7 +164,7 @@ void bolt_thief_mine_update(struct Moby *moby) { -1, 0); if ((char *)moby < floating_mine_respawn_address_limit) { - moby->state = 2; + moby->state = FLOAT_MINE_WAIT_OFFSCREEN_RESPAWN; moby->flags |= 0x41; moby->hit_slot = 0xFF; moby->collision = 0; @@ -180,7 +181,7 @@ void bolt_thief_mine_update(struct Moby *moby) { qcopy(scratch.sphere, &moby->pos); scratch.sphere[3] = 3.0f; if (fast_bsphere_check(scratch.sphere, 64.0f) == -1) { - moby->state = 1; + moby->state = FLOAT_MINE_ACTIVE; moby->flags &= 0xFFBE; moby->collision = moby->pclass->collision; } @@ -218,7 +219,7 @@ unsigned char *spawn_bolt_thief_mine(unsigned char *spawning_moby, char *spawn_p *(float *)(spawned_vars + 0x18) = random_float_between(0.00349065848f, 0.00698131695f); qcopy(&MOBY(spawned_moby)->pos, spawn_position); MOBY(spawned_moby)->rot.z = MOBY(spawning_moby)->rot.z; - MOBY(spawned_moby)->state = 0; + MOBY(spawned_moby)->state = FLOAT_MINE_INITIALIZE; MOBY(spawned_moby)->update_dist = 0xFF; MOBY(spawned_moby)->draw_dist = 0xFF; MOBY(spawned_moby)->visible = 1; diff --git a/src/overlays/shared/enemies/bomb_spawner.c b/src/overlays/shared/enemies/bomb_spawner.c index 385e0c2fd7..ad69885be6 100644 --- a/src/overlays/shared/enemies/bomb_spawner.c +++ b/src/overlays/shared/enemies/bomb_spawner.c @@ -178,6 +178,13 @@ void bomb_spawner_update(struct Moby *moby) { SPAWNER_ACTIVATION_ENTER_SPAWN_ENABLED_AFTER_PROXIMITY_ALIAS = 5, SPAWNER_ACTIVATION_STAY_IN_PROXIMITY_WAIT = 6 }; + enum { + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xFD, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xFE + }; + enum { + HIT_STATUS_DAMAGE_PROCESSING_THRESHOLD = 2 + }; int used[4]; Vec4A_2bef68 launch_origin; Vec4A_2bef68 launch_velocity; @@ -217,14 +224,16 @@ void bomb_spawner_update(struct Moby *moby) { if (id == -1) continue; o = (struct Moby *)(D_L03_0015FFD8_macro + (id << 8)); - if (o != 0 && o->state != 0xFE && o->state != 0xFD) { + if (o != 0 && o->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + o->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { spawner_data->count++; } } { struct Moby *o; for (o = (struct Moby *)D_L03_0015FFE4_macro; o != 0; o = o->next) { - if (o->oclass == 0x221 && o->state != 0xFE && o->state != 0xFD) { + if (o->oclass == 0x221 && o->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + o->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { spawner_data->count++; } } @@ -255,7 +264,7 @@ void bomb_spawner_update(struct Moby *moby) { } r = (Hit_2C0330 *)find_moby_hit(moby, 0xC30000, 0); resolve_moby_hit_response(moby, r, &spawner_data->hp, 0, &damage_query_status, 0, 0, 4); - if (damage_query_status >= 2) { + if (damage_query_status >= HIT_STATUS_DAMAGE_PROCESSING_THRESHOLD) { float remaining_health = spawner_data->hp - r->f2C; spawner_data->hp = remaining_health; if (remaining_health > 0.0f) { @@ -263,7 +272,7 @@ void bomb_spawner_update(struct Moby *moby) { trooper_anim_update(moby, spawner_data->f60); } else { mark_moby_for_removal_cf(moby, 0, -1); - moby->state = 8; + moby->state = SPAWNER_DESTROY; spawner_data->b67 = 0x78; trooper_anim_update(moby, spawner_data->f60); } @@ -278,7 +287,8 @@ void bomb_spawner_update(struct Moby *moby) { if (id == -1) continue; o = (struct Moby *)(D_L03_0015FFD8_macro + (id << 8)); - if (o != 0 && o->state != 0xFE && o->state != 0xFD) { + if (o != 0 && o->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + o->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { mark_moby_for_removal(o); } } @@ -286,33 +296,33 @@ void bomb_spawner_update(struct Moby *moby) { spawner_data->b5A = 3; spawner_data->b58 = 8; spawner_data->b29 = 0; - moby->state = 1; + moby->state = SPAWNER_WAIT_FOR_PROXIMITY; break; } case SPAWNER_WAIT_FOR_PROXIMITY: if (near1) { switch (spawner_data->b84) { case SPAWNER_ACTIVATION_ENTER_SPAWN_ENABLED: - moby->state = 2; + moby->state = SPAWNER_SPAWN_ENABLED; break; case SPAWNER_ACTIVATION_ENTER_SHARED_SPAWN_ENABLED: - moby->state = 3; + moby->state = SPAWNER_SPAWN_ENABLED_SHARED; break; case SPAWNER_ACTIVATION_ENTER_SHARED_SPAWN_ENABLED_ALIAS: - moby->state = 7; + moby->state = SPAWNER_SPAWN_ENABLED_SHARED_ALIAS; break; case SPAWNER_ACTIVATION_SET_SPAWN_ENABLED: - moby->state = 2; + moby->state = SPAWNER_SPAWN_ENABLED; break; case SPAWNER_ACTIVATION_ENTER_SPAWN_ENABLED_AFTER_PROXIMITY: - moby->state = 5; + moby->state = SPAWNER_SPAWN_ENABLED_AFTER_PROXIMITY; break; case SPAWNER_ACTIVATION_ENTER_SPAWN_ENABLED_AFTER_PROXIMITY_ALIAS: - moby->state = 5; + moby->state = SPAWNER_SPAWN_ENABLED_AFTER_PROXIMITY; break; case SPAWNER_ACTIVATION_STAY_IN_PROXIMITY_WAIT: default: - moby->state = 1; + moby->state = SPAWNER_WAIT_FOR_PROXIMITY; break; } } @@ -368,7 +378,7 @@ void bomb_spawner_update(struct Moby *moby) { } case SPAWNER_RESET_TO_PROXIMITY_WAIT: default: - moby->state = 1; + moby->state = SPAWNER_WAIT_FOR_PROXIMITY; break; } if (spawn && cond && timerDone && room) { @@ -555,6 +565,9 @@ void bomb_spawner_update(struct Moby *moby) { char *spawn_class_221_moby( char *spawning_moby, float *pos, float *launch_velocity, short ang, int spawn_options) { + enum { + CLASS_221_INITIAL_STATE = 0 + }; char *spawned_moby; char *moby_pvars; spawned_moby = create_moby(0x221); @@ -571,7 +584,7 @@ char *spawn_class_221_moby( MOBY(spawned_moby)->update_dist = (*(unsigned char **)(moby_pvars + 0x10))[0x30]; MOBY(spawned_moby)->draw_dist = *(unsigned short *)(*(char **)(moby_pvars + 0x10) + 0x32); MOBY(spawned_moby)->visible = 1; - MOBY(spawned_moby)->state = 0; + MOBY(spawned_moby)->state = CLASS_221_INITIAL_STATE; MOBY(spawned_moby)->scale = *(float *)(((char *)MOBY(spawned_moby)->pclass) + 0x24) * 0.001f; *(int *)(moby_pvars + 0x1C) = spawn_options; diff --git a/src/overlays/shared/enemies/bomb_spawner_bomb.c b/src/overlays/shared/enemies/bomb_spawner_bomb.c index c8bb837a29..1009325561 100644 --- a/src/overlays/shared/enemies/bomb_spawner_bomb.c +++ b/src/overlays/shared/enemies/bomb_spawner_bomb.c @@ -19,6 +19,11 @@ #include "rnc/overlay/shared/rendering/effects/spawn_explosion.h" /* Class header fields the spawner copies into a fresh moby. */ +enum { + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xFD, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xFE +}; + typedef struct { u8 pad0[0xF]; u8 always_draw; /* 0x0F */ @@ -77,6 +82,9 @@ struct Moby *revive_spawner_pooled_child(struct Moby *spawner_moby, s32 oclass) __asm__("FUN_L03_002bec60"); struct Moby *revive_spawner_pooled_child(struct Moby *spawner_moby, Vec4 *at, s32 oclass) { + enum { + SPAWNER_CHILD_STATE_INITIAL = 0 + }; Vec4 pos; Vec4 *spawn_position_source; Spawner *spawner_data; @@ -104,7 +112,9 @@ struct Moby *revive_spawner_pooled_child(struct Moby *spawner_moby, Vec4 *at, s3 continue; } current_moby = &D_L03_0015FFD8_gp[pooled_child_moby_index]; - if (current_moby != NULL && current_moby->state != 0xFE && current_moby->state != 0xFD) { + if (current_moby != NULL && + current_moby->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + current_moby->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { spawner_data->live++; continue; } @@ -118,7 +128,7 @@ struct Moby *revive_spawner_pooled_child(struct Moby *spawner_moby, Vec4 *at, s3 found = 1; qcopy(¤t_moby->pos, spawn_position_source); current_moby->pos.w = 0.0f; - current_moby->state = 0; + current_moby->state = SPAWNER_CHILD_STATE_INITIAL; current_moby->command = 0; spawned_moby_class = (SpawnClass *)current_moby->pclass; flags = spawned_moby_class->flags; @@ -169,8 +179,9 @@ struct Moby *revive_spawner_pooled_child(struct Moby *spawner_moby, Vec4 *at, s3 } } for (current_moby = D_L03_0015FFE4; current_moby != NULL; current_moby = current_moby->next) { - if (current_moby->oclass == 0x221 && current_moby->state != 0xFE && - current_moby->state != 0xFD) { + if (current_moby->oclass == 0x221 && + current_moby->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + current_moby->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { spawner_data->live++; } } @@ -188,7 +199,12 @@ void bomb_spawner_bomb_update(struct Moby *moby) __asm__("FUN_L03_002c4718"); /* Drifts and bounces off walls (state 0), lands and spawns its child moby (1), then shrinks while the child grows (2). */ /* Moby class 545 */ void bomb_spawner_bomb_update(struct Moby *moby) { - float *vars; + enum { + SPAWNER_BOMB_STATE_MOVING = 0, + SPAWNER_BOMB_STATE_SPAWN_CHILD = 1, + SPAWNER_BOMB_STATE_SHRINKING = 2 + }; + float *bomb_runtime; Vec4 *pos; struct Moby *other; Vec4 old_pos; @@ -200,54 +216,54 @@ void bomb_spawner_bomb_update(struct Moby *moby) { if (moby == NULL) return; - vars = (float *)moby->pvars; - if (vars == NULL) + bomb_runtime = (float *)moby->pvars; + if (bomb_runtime == NULL) return; pos = (Vec4 *)&moby->pos; - fast_dec_timer(vars + 8); + fast_dec_timer(bomb_runtime + 8); qcopy(&old_pos, pos); switch (moby->state) { - case 0: { + case SPAWNER_BOMB_STATE_MOVING: { moby->scale += (moby->pclass->scale - moby->scale) * (frame_scale * 0.05f); - fast_vec_add(pos, pos, vars); - fast_vec_normalize(&next_pos, vars, 0.2f); + fast_vec_add(pos, pos, bomb_runtime); + fast_vec_normalize(&next_pos, bomb_runtime, 0.2f); fast_vec_add(&next_pos, &next_pos, pos); old_disable = moby->collision_disable; old_collision = moby->collision; - old_owner_disable = (*(struct Moby **)(vars + 4))->collision_disable; - old_owner_collision = (*(struct Moby **)(vars + 4))->collision; + old_owner_disable = (*(struct Moby **)(bomb_runtime + 4))->collision_disable; + old_owner_collision = (*(struct Moby **)(bomb_runtime + 4))->collision; moby->collision_disable = -1; - (*(struct Moby **)(vars + 4))->collision_disable = -1; + (*(struct Moby **)(bomb_runtime + 4))->collision_disable = -1; moby->collision = 0; - (*(struct Moby **)(vars + 4))->collision = 0; + (*(struct Moby **)(bomb_runtime + 4))->collision = 0; if (collision_line(&old_pos, &next_pos, 4, moby, 0)) { fast_vec_sub(&next_pos, &D_L03_00173F40.point, &next_pos); fast_vec_normalize(&next_pos, &next_pos, 0.215f); fast_vec_add(pos, pos, &next_pos); if (D_L03_00173F40.moby == 0) { - reflect_vector(vars, vars, &D_L03_00173F40.normal_x); + reflect_vector(bomb_runtime, bomb_runtime, &D_L03_00173F40.normal_x); angle = vector_length_xy(&D_L03_00173F40.normal_x); if (fast_arc_tan(D_L03_00173F40.normal_z, angle) < 0.6981317f && collision_hit_material() == -1) { - fast_vec_scale(vars, vars, 0.5f); - if (fast_vec_length(vars) < 0.025f) { - moby->state = 1; + fast_vec_scale(bomb_runtime, bomb_runtime, 0.5f); + if (fast_vec_length(bomb_runtime) < 0.025f) { + moby->state = SPAWNER_BOMB_STATE_SPAWN_CHILD; goto first_collision_timer; } } } else if (((struct Moby *)D_L03_00173F40.moby)->oclass != 0x221) { - reflect_vector(vars, vars, &D_L03_00173F40.normal_x); + reflect_vector(bomb_runtime, bomb_runtime, &D_L03_00173F40.normal_x); angle = vector_length_xy(&D_L03_00173F40.normal_x); if (fast_arc_tan(D_L03_00173F40.normal_z, angle) < 0.6981317f && collision_hit_material() == -1) - fast_vec_scale(vars, vars, 1.2f); + fast_vec_scale(bomb_runtime, bomb_runtime, 1.2f); } else { - vars[2] *= FUN_002132a8(0.9f, 1.1f); + bomb_runtime[2] *= FUN_002132a8(0.9f, 1.1f); } first_collision_timer: - if (*(int *)(vars + 8) == 0) { + if (*(int *)(bomb_runtime + 8) == 0) { FUN_0022da68(0, 0, moby); - *(int *)(vars + 8) = 12; + *(int *)(bomb_runtime + 8) = 12; } } if (coll_sphere(0.2f, (Vec4 *)&moby->pos, 4, moby)) { @@ -255,30 +271,32 @@ void bomb_spawner_bomb_update(struct Moby *moby) { fast_vec_normalize(&next_pos, &next_pos, 0.015f); fast_vec_add((Vec4 *)&moby->pos, &D_L03_00173F40.pad30, &next_pos); if (D_L03_00173F40.moby == 0) { - reflect_vector(vars, vars, &D_L03_00173F40.normal_x); + reflect_vector(bomb_runtime, bomb_runtime, &D_L03_00173F40.normal_x); angle = vector_length_xy(&D_L03_00173F40.normal_x); if (fast_arc_tan(D_L03_00173F40.normal_z, angle) < 0.6981317f && collision_hit_material() == -1) { - fast_vec_scale(vars, vars, 0.5f); - if (fast_vec_length(vars) < 0.025f) - moby->state = 1; + fast_vec_scale(bomb_runtime, bomb_runtime, 0.5f); + if (fast_vec_length(bomb_runtime) < 0.025f) + moby->state = SPAWNER_BOMB_STATE_SPAWN_CHILD; } } else if (((struct Moby *)D_L03_00173F40.moby)->oclass != 0x221) { - reflect_vector(vars, vars, &D_L03_00173F40.normal_x); + reflect_vector(bomb_runtime, bomb_runtime, &D_L03_00173F40.normal_x); angle = vector_length_xy(&D_L03_00173F40.normal_x); if (fast_arc_tan(D_L03_00173F40.normal_z, angle) < 0.6981317f && collision_hit_material() == -1) - fast_vec_scale(vars, vars, 1.2f); + fast_vec_scale(bomb_runtime, bomb_runtime, 1.2f); } else { - vars[2] *= FUN_002132a8(0.9f, 1.1f); + bomb_runtime[2] *= FUN_002132a8(0.9f, 1.1f); } - if (*(int *)(vars + 8) == 0) { + if (*(int *)(bomb_runtime + 8) == 0) { FUN_0022da68(0, 0, moby); - *(int *)(vars + 8) = 12; + *(int *)(bomb_runtime + 8) = 12; } } for (other = D_L03_0015FFE4; other != NULL; other = other->next) { - if (other == moby || (int)other == 0 || other->state == 0xfe || other->state == 0xfd) + if (other == moby || (int)other == 0 || + other->state == MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END || + other->state == MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) continue; fast_vec_sub(&delta, (Vec4 *)&moby->pos, &other->pos); delta.f[2] = 0.0f; @@ -288,41 +306,42 @@ void bomb_spawner_bomb_update(struct Moby *moby) { fast_vec_add((Vec4 *)&moby->pos, (Vec4 *)&moby->pos, &delta); } } - if (fast_dec_timer_s16(vars + 5)) - moby->state = 2; - moby->rot.x = normalize_angle(vars[0]); - moby->rot.y = normalize_angle(vars[1]); + if (fast_dec_timer_s16(bomb_runtime + 5)) + moby->state = SPAWNER_BOMB_STATE_SHRINKING; + moby->rot.x = normalize_angle(bomb_runtime[0]); + moby->rot.y = normalize_angle(bomb_runtime[1]); moby->collision_disable = old_disable; - (*(struct Moby **)(vars + 4))->collision_disable = old_owner_disable; + (*(struct Moby **)(bomb_runtime + 4))->collision_disable = old_owner_disable; moby->collision = old_collision; - (*(struct Moby **)(vars + 4))->collision = old_owner_collision; - vars[2] -= frame_time_sq * 9.8f; + (*(struct Moby **)(bomb_runtime + 4))->collision = old_owner_collision; + bomb_runtime[2] -= frame_time_sq * 9.8f; moby->rot.x += frame_scale * 0.01f; moby->rot.y += frame_scale * 0.02f; break; } - case 1: { + case SPAWNER_BOMB_STATE_SPAWN_CHILD: { float height = probe_ground_height(pos, 0, 0.5f); moby->pos.w = 0.0f; moby->pos.z = height + 0.2f; next_pos.q = *(u128 *)pos; - *(struct Moby **)(vars + 6) = - revive_spawner_pooled_child(*(struct Moby **)(vars + 4), &next_pos, -1); - moby->state = 2; + *(struct Moby **)(bomb_runtime + 6) = + revive_spawner_pooled_child(*(struct Moby **)(bomb_runtime + 4), &next_pos, -1); + moby->state = SPAWNER_BOMB_STATE_SHRINKING; break; } - case 2: { + case SPAWNER_BOMB_STATE_SHRINKING: { struct Moby *other; float rate = frame_scale * 0.05f; moby->scale -= moby->scale * rate; - other = *(struct Moby **)(vars + 6); - if (other != NULL && (*(int *)(vars + 7) & 4)) + other = *(struct Moby **)(bomb_runtime + 6); + if (other != NULL && (*(int *)(bomb_runtime + 7) & 4)) other->scale += (other->pclass->scale - other->scale) * rate; if (moby->scale < moby->pclass->scale * (frame_scale * 0.05f)) { moby->scale = 0.0001f; - other = *(struct Moby **)(vars + 6); - if (other == NULL || other->state == 0xfe || other->state == 0xfd || - !(*(int *)(vars + 7) & 4) || other->pclass->scale - 0.01f <= other->scale) + other = *(struct Moby **)(bomb_runtime + 6); + if (other == NULL || other->state == MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END || + other->state == MOBY_STATE_REMOVAL_BELOW_INSTANCE_END || + !(*(int *)(bomb_runtime + 7) & 4) || other->pclass->scale - 0.01f <= other->scale) goto remove_moby; } } diff --git a/src/overlays/shared/enemies/bomber_jet_projectile.c b/src/overlays/shared/enemies/bomber_jet_projectile.c index d77d966071..3586a5e1ba 100644 --- a/src/overlays/shared/enemies/bomber_jet_projectile.c +++ b/src/overlays/shared/enemies/bomber_jet_projectile.c @@ -54,7 +54,8 @@ typedef struct { extern int collect_mobies_in_sphere(float, void *, int, void *, void *) __asm__("FUN_L00_001f2868"); extern int spawn_glow_particle(void *, void *, void *, float, int, int, int, int, int) __asm__("FUN_L00_002ac910"); extern void spawn_effect(void *, void *, int, int, int, int, int, int) __asm__("FUN_L00_00269958"); -extern void FUN_L00_0026a4c8(void *, void *, int, int, int, float); +extern void +spawn_particle_alt_9768(void *, void *, int, int, int, float) __asm__("FUN_L00_0026a4c8"); extern void spawn_particle(void *, void *, int, int, float, int, int, int, int, float) __asm__("FUN_L00_0026a9f0"); extern void spawn_shrinking_effect_particle_with_gravity_and_secondary_spawns( void *, void *, int, int, float, int, int, int, int) __asm__("FUN_L00_0026bb70"); @@ -64,7 +65,7 @@ extern Cols l01_explosive_projectile_secondary_color_palette __asm__("D_L01_0020 extern struct Moby *D_L01_001742D8 NOT_SDA; extern char *ents_macro __asm__("D_L01_0015FFD8") MACRO_ADDR; extern char D_0013E533[]; -extern char D_L01_00167240[]; +extern char camera_pos[] __asm__("D_L01_00167240"); extern float D_0015ED6C MACRO_ADDR; extern float D_L01_0015F5D0 MACRO_ADDR; extern int cutscene_active_macro __asm__("D_L01_0015F404") MACRO_ADDR; @@ -96,6 +97,10 @@ void explosive_projectile_update(struct Moby *moby) __asm__("FUN_L01_002f6a30"); /* Moby class 686 */ void explosive_projectile_update(struct Moby *moby) { + enum { + EXPLOSIVE_PROJECTILE_STATE_FLYING = 0, + EXPLOSIVE_PROJECTILE_STATE_BURST = 1 + }; Vec_2F7E08 old_pos; Vec_2F7E08 smoke_pos; Data *projectile_vars; @@ -169,11 +174,11 @@ void explosive_projectile_update(struct Moby *moby) { if (fast_vec_dist(&projectile_vars->target, &(*(Vec_2F7E08 *)&moby->pos)) < projectile_vars->f38) { qcopy(&(*(Vec_2F7E08 *)&moby->pos), &projectile_vars->target); - moby->state = 1; + moby->state = EXPLOSIVE_PROJECTILE_STATE_BURST; } - if (moby->state != 0) { + if (moby->state != EXPLOSIVE_PROJECTILE_STATE_FLYING) { size_scale = 8.0f; - camera_distance = fast_vec_dist(D_L01_00167240, &(*(Vec_2F7E08 *)&moby->pos)); + camera_distance = fast_vec_dist(camera_pos, &(*(Vec_2F7E08 *)&moby->pos)); if (cutscene_active_macro != 0) { size_scale = 4.0f; } @@ -199,7 +204,7 @@ void explosive_projectile_update(struct Moby *moby) { } } } - view_distance = fast_vec_dist(&(*(Vec_2F7E08 *)&moby->pos), D_L01_00167240); + view_distance = fast_vec_dist(&(*(Vec_2F7E08 *)&moby->pos), camera_pos); max_rings = 5; if (cutscene_active_macro != 0) { max_rings = 2; @@ -257,7 +262,7 @@ void explosive_projectile_update(struct Moby *moby) { fast_vec_normalize(&flash_emission_vector, &flash_emission_vector, size_scale * (random_float_between(0.0f, 3.0f) * D_0015ED6C)); - FUN_L00_0026a4c8( + spawn_particle_alt_9768( &(*(Vec_2F7E08 *)&moby->pos), &flash_emission_vector, start_colors.c[random_integer_below(6)], @@ -393,7 +398,7 @@ void explosive_projectile_update(struct Moby *moby) { (*(void **)&((struct Moby *)ents_macro)[projectile_vars->ids[link]].pvars); if (target->h4 == 0 && target->timer == 0 && is_point_inside_clip_volume(((char *)&D_0013F3D0), target->vol) != 0 && - is_point_inside_clip_volume(D_L01_00167240, target->vol) != 0) { + is_point_inside_clip_volume(camera_pos, target->vol) != 0) { target->timer = scale_game_frames(random_int_between(0x3C, 0xB4)); } } diff --git a/src/overlays/shared/enemies/frog.c b/src/overlays/shared/enemies/frog.c index 9ae5ecdf99..ac30a43815 100644 --- a/src/overlays/shared/enemies/frog.c +++ b/src/overlays/shared/enemies/frog.c @@ -21,6 +21,23 @@ #include "rnc/overlay/shared/enemies/frog_data/spawn_moby_directional_spark_bursts_2.h" #include "rnc/overlay/shared/enemies/frog_data/spawn_moby_directional_spark_bursts.h" +enum { + FROG_STATE_INITIALIZE = 0, + FROG_STATE_WAIT_WITH_CHILD = 1, + FROG_STATE_WAIT_TO_FOLLOW_PATH = 3, + FROG_STATE_FOLLOW_PATH = 4, + FROG_STATE_JUMP_TO_HOME = 5, + FROG_STATE_AIRBORNE_MOTION = 6, + FROG_STATE_LANDING_ANIMATION = 7, + FROG_STATE_WANDER = 8, + FROG_STATE_APPROACH_TARGET = 9, + FROG_STATE_BLINKING_APPROACH_TARGET = 10, + FROG_STATE_APPROACH_PAUSE = 11, + FROG_STATE_ATTACK = 12, + FROG_STATE_RETURN_HOME = 13, + FROG_STATE_SUCK_CANNON_HELD = 16 +}; + typedef struct FrogVars { u8 pad0[0x29]; s8 unk29; @@ -184,14 +201,14 @@ extern float D_0015ED70 MACRO_ADDR; extern int *D_L06_001B0C30[]; extern int D_L06_0015F5C4 MACRO_ADDR; extern int D_L06_0015FDF8 MACRO_ADDR; -extern int D_L06_00161C10 __attribute__((sda)); -extern int D_L06_00161C14 __attribute__((sda)); -extern short D_L06_00161BF0[1] __attribute__((sda)); -extern char D_0013F3D0[]; -extern f32 D_L06_0015F580[] MACRO_ADDR; -extern struct Moby *D_L06_0015FFD8_e94f0 __asm__("D_L06_0015FFD8"); -extern u8 D_001413F4_e94f0[] __asm__("D_001413F4"); -extern struct Moby *D_001413D0_lui __asm__("D_001413D0") NOT_SDA; +extern int l06_frog_updates_disabled __asm__("D_L06_00161C10") __attribute__((sda)); +extern int l06_frog_frame_slot_assignment_count __asm__("D_L06_00161C14") __attribute__((sda)); +extern short D_L06_00161BF0[1] __attribute__((sda)); +extern char D_0013F3D0[]; +extern f32 D_L06_0015F580[] MACRO_ADDR; +extern struct Moby *D_L06_0015FFD8_e94f0 __asm__("D_L06_0015FFD8"); +extern u8 D_001413F4_e94f0[] __asm__("D_001413F4"); +extern struct Moby *D_001413D0_lui __asm__("D_001413D0") NOT_SDA; extern float frog_facing_rotation_blend_factor_gp __asm__("D_L06_00161C00") __attribute__((sda)); extern f32 D_0015ED6C; extern u128 D_L06_001745E0 NOT_SDA; @@ -249,89 +266,89 @@ void frog_update(unsigned char *moby) { float B[4] __attribute__((aligned(16))); float C[4] __attribute__((aligned(16))); float D[4] __attribute__((aligned(16))); - FrogVars *data; + FrogVars *frog_instance_vars; unsigned char *target; int mode; - data = (FrogVars *)MOBY(moby)->pvars; - if (D_L06_00161C10 != 0) { + frog_instance_vars = (FrogVars *)MOBY(moby)->pvars; + if (l06_frog_updates_disabled != 0) { return; } mode = D_L06_0015F5C4; if (mode == 2 && ((MOBY(moby)->flags ^ 1) & 1)) { - data->unk1EA = 1; + frog_instance_vars->unk1EA = 1; MOBY(moby)->flags |= 0x41; - } else if (mode == 0 && data->unk1EA != 0) { - data->unk1EA = 0; + } else if (mode == 0 && frog_instance_vars->unk1EA != 0) { + frog_instance_vars->unk1EA = 0; MOBY(moby)->flags &= 0xFFBE; } if (MOBY(moby)->state != 0x10) { if (*(int *)&D_L06_0015FDF8 != 0) { - if (data->unk242 == 0) + if (frog_instance_vars->unk242 == 0) return; } else { - if (data->unk242 != 0) + if (frog_instance_vars->unk242 != 0) return; } } - FUN_L00_00263ac8(2.1f, (int)moby, 1, (unsigned char *)(&data->unk250)); + FUN_L00_00263ac8(2.1f, (int)moby, 1, (unsigned char *)(&frog_instance_vars->unk250)); update_frog_health_respawn_and_target(moby); if (MOBY(moby)->visible != 0 && fast_vec_dist(&MOBY(moby)->pos, D_L06_00167540) < 14.0f) { FUN_L00_0025a120(moby); MOBY(moby)->shadow_range = 0xB; } - target = data->unk1C0; + target = frog_instance_vars->unk1C0; switch (MOBY(moby)->state) { - case 0: { + case FROG_STATE_INITIALIZE: { float wait; - int spawn_count = D_L06_00161C14; - int divisor = data->unk240; - data->unk20A = spawn_count % 8; - D_L06_00161C14 = spawn_count + 1; + int spawn_count = l06_frog_frame_slot_assignment_count; + int divisor = frog_instance_vars->unk240; + frog_instance_vars->unk20A = spawn_count % 8; + l06_frog_frame_slot_assignment_count = spawn_count + 1; if (divisor != 0) { MOBY(moby)->unkB4 = MOBY(moby)->unkB4 / divisor; } MOBY(moby)->flags |= 0x100; - data->unk58 = truncate_float_to_s32(8.0f); - data->unk5A = truncate_float_to_s32(3.2f); - qcopy(&data->unk210, &MOBY(moby)->pos); - qcopy(&data->unk230, &MOBY(moby)->pos); - qcopy(&data->unk220, moby + 0x40); - data->path_point = 0; + frog_instance_vars->unk58 = truncate_float_to_s32(8.0f); + frog_instance_vars->unk5A = truncate_float_to_s32(3.2f); + qcopy(&frog_instance_vars->unk210, &MOBY(moby)->pos); + qcopy(&frog_instance_vars->unk230, &MOBY(moby)->pos); + qcopy(&frog_instance_vars->unk220, moby + 0x40); + frog_instance_vars->path_point = 0; wait = random_float_between(0.5f, 3.0f); - data->unk130 = D_0015ED70 * 20.0f; - data->unk148 = 0; - data->unk134 = 0; - data->unk140 = 0x200; - data->unk244 = wait; - data->unk248 = random_angle_radians(); - data->unkD0 = D_L06_00161BF0; - data->unk29 = 1; - if (data->unk200 != 0) { + frog_instance_vars->unk130 = D_0015ED70 * 20.0f; + frog_instance_vars->unk148 = 0; + frog_instance_vars->unk134 = 0; + frog_instance_vars->unk140 = 0x200; + frog_instance_vars->unk244 = wait; + frog_instance_vars->unk248 = random_angle_radians(); + frog_instance_vars->unkD0 = D_L06_00161BF0; + frog_instance_vars->unk29 = 1; + if (frog_instance_vars->unk200 != 0) { char *child; MOBY(moby)->state = 1; child = create_moby(0x1F4); - data->child = child; + frog_instance_vars->child = child; if (child == 0) { mark_moby_for_removal(moby); return; } *(long *)(child + 0x38) = ((long)MOBY(moby)->spawn_frame); - *(unsigned short *)(data->child + 0x34) |= 0x4002; + *(unsigned short *)(frog_instance_vars->child + 0x34) |= 0x4002; { - char *child = data->child; + char *child = frog_instance_vars->child; qcopy(child + 0x10, &MOBY(moby)->pos); qcopy(child + 0x40, moby + 0x40); *(short *)(child + 0x32) = 0x40; } - (data->child)[0x31] = 1; - update_entity(data->child); + (frog_instance_vars->child)[0x31] = 1; + update_entity(frog_instance_vars->child); MOBY(moby)->flags |= 0x41; - } else if (data->unk202 != 0) { + } else if (frog_instance_vars->unk202 != 0) { MOBY(moby)->state = 0xF; MOBY(moby)->collision = 0; MOBY(moby)->flags = (MOBY(moby)->flags | 0x41) & 0xEFFF; - } else if (data->path_index >= 0) { + } else if (frog_instance_vars->path_index >= 0) { MOBY(moby)->state = 3; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, 0); @@ -347,7 +364,7 @@ void frog_update(unsigned char *moby) { } break; } - case 1: + case FROG_STATE_WAIT_WITH_CHILD: if (vector_distance_xy(&MOBY(moby)->pos, target + 0x10) < 4.0f) { MOBY(moby)->flags &= 0xFFBE; destroy_frog_child_moby(moby); @@ -356,59 +373,67 @@ void frog_update(unsigned char *moby) { blend_moby_animation(moby, 4, 0, scale_game_frames(5)); } break; - case 3: + case FROG_STATE_WAIT_TO_FOLLOW_PATH: fast_vec_sub(A, target + 0x10, &MOBY(moby)->pos); probe_frog_local_z_collision((char *)moby); blend_frog_rotation_to_facing_frame((char *)moby, (float *)D_L06_00174600, A); - if (vector_distance_xy(((char *)&D_0013F3D0), &MOBY(moby)->pos) < data->unk24C) { + if (vector_distance_xy(((char *)&D_0013F3D0), &MOBY(moby)->pos) < + frog_instance_vars->unk24C) { MOBY(moby)->state = 4; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(5)); } break; - case 4: { + case FROG_STATE_FOLLOW_PATH: { int *path; int point_count; - qcopy(B, (char *)D_L06_001B0C30[data->path_index] + data->path_point * 16 + 0x10); + qcopy(B, + (char *)D_L06_001B0C30[frog_instance_vars->path_index] + + frog_instance_vars->path_point * 16 + 0x10); fast_vec_sub(A, B, &MOBY(moby)->pos); probe_frog_local_z_collision((char *)moby); blend_frog_rotation_to_facing_frame((char *)moby, (float *)D_L06_00174600, A); - fast_vec_normalize(C, moby + 0xC0, data->unk1E4 * D_0015ED6C_gp); + fast_vec_normalize(C, moby + 0xC0, frog_instance_vars->unk1E4 * D_0015ED6C_gp); FUN_L06_002e9b60_c(moby, C, 0, 0.3f, 0.3f); transform_vector_by_basis(A, A, moby + 0xC0); if (vector_length_xy(A) < 0.5f) { float return_speed; - float dist; - path = D_L06_001B0C30[data->path_index]; + float home_distance_xy; + path = D_L06_001B0C30[frog_instance_vars->path_index]; point_count = *path; - if (data->path_point < point_count - 2) { - data->path_point = data->path_point + 1; + if (frog_instance_vars->path_point < point_count - 2) { + frog_instance_vars->path_point = frog_instance_vars->path_point + 1; return; } - qcopy(&data->unk210, (char *)path + point_count * 16); - qcopy(&data->unk230, &data->unk210); - dist = vector_distance_xy(&MOBY(moby)->pos, &data->unk210); - return_speed = dist / (float)scale_game_frames(30); - data->unk138 = return_speed; - data->unk13C = - FUN_L00_0025abf0(&MOBY(moby)->pos, &data->unk210, 0, return_speed, -data->unk130); - data->unk15D = 3; - data->unk144 = 5; - trooper_start_knockback(moby, - &data->motion, - 2, - 1, - 0, - fast_arc_tan(data->unk210[0] - MOBY(moby)->pos.x, - data->unk210[1] - MOBY(moby)->pos.y)); + qcopy(&frog_instance_vars->unk210, (char *)path + point_count * 16); + qcopy(&frog_instance_vars->unk230, &frog_instance_vars->unk210); + home_distance_xy = vector_distance_xy(&MOBY(moby)->pos, &frog_instance_vars->unk210); + return_speed = home_distance_xy / (float)scale_game_frames(30); + frog_instance_vars->unk138 = return_speed; + frog_instance_vars->unk13C = FUN_L00_0025abf0(&MOBY(moby)->pos, + &frog_instance_vars->unk210, + 0, + return_speed, + -frog_instance_vars->unk130); + frog_instance_vars->unk15D = 3; + frog_instance_vars->unk144 = 5; + trooper_start_knockback( + moby, + &frog_instance_vars->motion, + 2, + 1, + 0, + fast_arc_tan(frog_instance_vars->unk210[0] - MOBY(moby)->pos.x, + frog_instance_vars->unk210[1] - MOBY(moby)->pos.y)); MOBY(moby)->state = 5; } break; } - case 5: + case FROG_STATE_JUMP_TO_HOME: set_vector_unit_z(A); - blend_frog_rotation_to_facing_frame((char *)moby, A, (float *)(&data->motion)); - if (step_moby_motion(moby, &data->motion) & 1) { + blend_frog_rotation_to_facing_frame( + (char *)moby, A, (float *)(&frog_instance_vars->motion)); + if (step_moby_motion(moby, &frog_instance_vars->motion) & 1) { MOBY(moby)->state = 7; if (MOBY(moby)->prev_seq != 3) blend_moby_animation(moby, 3, 0, 1); @@ -416,8 +441,8 @@ void frog_update(unsigned char *moby) { MOBY(moby)->pos.z = probe_ground_height(&MOBY(moby)->pos, 0, 0.5f); } break; - case 6: { - int hit = step_moby_motion(moby, &data->motion); + case FROG_STATE_AIRBORNE_MOTION: { + int hit = step_moby_motion(moby, &frog_instance_vars->motion); if (hit & 1) { MOBY(moby)->state = 7; if (MOBY(moby)->prev_seq != 3) @@ -431,75 +456,77 @@ void frog_update(unsigned char *moby) { } break; } - case 7: + case FROG_STATE_LANDING_ANIMATION: if (MOBY(moby)->anim_flags & 2) { MOBY(moby)->state = 8; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(5)); } break; - case 8: + case FROG_STATE_WANDER: if (MOBY(moby)->visible != 0) { - if (fast_vec_dist(&MOBY(moby)->pos, &data->unk230) < 0.05f || - fast_dec_timer((int *)(&data->unk1FC)) != 0) { + if (fast_vec_dist(&MOBY(moby)->pos, &frog_instance_vars->unk230) < 0.05f || + fast_dec_timer((int *)(&frog_instance_vars->unk1FC)) != 0) { float angle = random_angle_radians(); float radius = random_float_between(0.5f, 2.0f); A[0] = fast_cos(angle) * radius; A[1] = fast_sin(angle) * radius; A[2] = 0.0f; - fast_vec_add(&data->unk230, &data->unk210, A); - data->unk1FC = + fast_vec_add(&frog_instance_vars->unk230, &frog_instance_vars->unk210, A); + frog_instance_vars->unk1FC = scale_game_frames(truncate_float_to_s32(random_float_between(45.0f, 75.0f))); } - fast_vec_sub(C, &data->unk230, &MOBY(moby)->pos); + fast_vec_sub(C, &frog_instance_vars->unk230, &MOBY(moby)->pos); probe_frog_local_z_collision((char *)moby); blend_frog_rotation_to_facing_frame((char *)moby, (float *)D_L06_00174600, C); - fast_vec_normalize(B, moby + 0xC0, data->unk1E4 * D_0015ED6C_gp); + fast_vec_normalize(B, moby + 0xC0, frog_instance_vars->unk1E4 * D_0015ED6C_gp); FUN_L06_002e9b60_c(moby, B, 1, 0.3f, 0.3f); } - if (data->unk1C4 != 2 && random_integer_below(9) == 0) { - data->turn_angle = - random_float_between(-data->turn_range_degrees, data->turn_range_degrees) * + if (frog_instance_vars->unk1C4 != 2 && random_integer_below(9) == 0) { + frog_instance_vars->turn_angle = + random_float_between(-frog_instance_vars->turn_range_degrees, + frog_instance_vars->turn_range_degrees) * 0.017453292f; MOBY(moby)->state = 9; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, 0); - } else if (data->unk1E8 != 0) { - data->turn_angle = - random_float_between(-data->turn_range_degrees, data->turn_range_degrees) * + } else if (frog_instance_vars->unk1E8 != 0) { + frog_instance_vars->turn_angle = + random_float_between(-frog_instance_vars->turn_range_degrees, + frog_instance_vars->turn_range_degrees) * 0.017453292f; MOBY(moby)->state = 10; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, 0); } break; - case 9: { + case FROG_STATE_APPROACH_TARGET: { float angle = fast_add_rotations(fast_arc_tan(*(float *)(target + 0x10) - MOBY(moby)->pos.x, *(float *)(target + 0x14) - MOBY(moby)->pos.y), - data->turn_angle); + frog_instance_vars->turn_angle); B[0] = fast_cos(angle); B[1] = fast_sin(angle); B[2] = 0.0f; probe_frog_local_z_collision((char *)moby); blend_frog_rotation_to_facing_frame((char *)moby, (float *)D_L06_00174600, B); - fast_vec_normalize(A, moby + 0xC0, data->unk1E4 * D_0015ED6C_gp); + fast_vec_normalize(A, moby + 0xC0, frog_instance_vars->unk1E4 * D_0015ED6C_gp); FUN_L06_002e9b60_c(moby, A, 1, 0.3f, 0.3f); if (vector_distance_xy(&MOBY(moby)->pos, target + 0x10) < 2.0f) { MOBY(moby)->state = 0xC; if (MOBY(moby)->prev_seq != 5) blend_moby_animation(moby, 5, 4, scale_game_frames(10)); - } else if (data->unk1C4 == 2) { + } else if (frog_instance_vars->unk1C4 == 2) { MOBY(moby)->state = 0xD; } break; } - case 10: { + case FROG_STATE_BLINKING_APPROACH_TARGET: { int near; float angle = fast_add_rotations(fast_arc_tan(*(float *)(target + 0x10) - MOBY(moby)->pos.x, *(float *)(target + 0x14) - MOBY(moby)->pos.y), - data->turn_angle); + frog_instance_vars->turn_angle); qcopy(C, &MOBY(moby)->pos); B[0] = fast_cos(angle); B[1] = fast_sin(angle); @@ -507,13 +534,13 @@ void frog_update(unsigned char *moby) { near = 0; probe_frog_local_z_collision((char *)moby); blend_frog_rotation_to_facing_frame((char *)moby, (float *)D_L06_00174600, B); - fast_vec_normalize(A, moby + 0xC0, data->unk1E4 * D_0015ED6C_gp); + fast_vec_normalize(A, moby + 0xC0, frog_instance_vars->unk1E4 * D_0015ED6C_gp); FUN_L06_002e9b60_c(moby, A, 1, 0.3f, 0.3f); - if (FUN_L00_00261b48(data->unk1EC, &MOBY(moby)->pos, target + 0x10, D) != 0 && - fast_vec_dist(&MOBY(moby)->pos, D) < data->unk244) { + if (FUN_L00_00261b48(frog_instance_vars->unk1EC, &MOBY(moby)->pos, target + 0x10, D) != 0 && + fast_vec_dist(&MOBY(moby)->pos, D) < frog_instance_vars->unk244) { near = 1; } - if (data->unk1E8 == 0) { + if (frog_instance_vars->unk1E8 == 0) { MOBY(moby)->state = 0xD; } else if (near) { MOBY(moby)->state = 0xB; @@ -526,14 +553,14 @@ void frog_update(unsigned char *moby) { } break; } - case 11: + case FROG_STATE_APPROACH_PAUSE: if (MOBY(moby)->anim_flags & 2) { MOBY(moby)->state = 0xA; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(20)); } break; - case 12: { + case FROG_STATE_ATTACK: { float wait; B[0] = fast_cos(fast_arc_tan(*(float *)(target + 0x10) - MOBY(moby)->pos.x, *(float *)(target + 0x14) - MOBY(moby)->pos.y)); @@ -544,7 +571,10 @@ void frog_update(unsigned char *moby) { wait = compute_interpolated_record_value(moby); if (MOBY(moby)->seq == MOBY(moby)->prev_seq && wait >= 10.0f && wait <= 15.0f && *(int *)(((char *)&camera_secondary_mode)) != 0x51) { - fast_vec_normalize(A, moby + 0xC0, (data->unk1E4 + data->unk1E4) * D_0015ED6C_gp); + fast_vec_normalize(A, + moby + 0xC0, + (frog_instance_vars->unk1E4 + frog_instance_vars->unk1E4) * + D_0015ED6C_gp); FUN_L06_002e9b60_c(moby, A, 1, 0.3f, 0.3f); collect_mobies_in_sphere_at_moby_point(moby, 0, 1, 0.333f, 1.0f, 1.0f, 0, 1, 0); return; @@ -557,28 +587,28 @@ void frog_update(unsigned char *moby) { } break; } - case 13: - fast_vec_sub(B, &data->unk210, &MOBY(moby)->pos); + case FROG_STATE_RETURN_HOME: + fast_vec_sub(B, &frog_instance_vars->unk210, &MOBY(moby)->pos); probe_frog_local_z_collision((char *)moby); blend_frog_rotation_to_facing_frame((char *)moby, (float *)D_L06_00174600, B); - fast_vec_normalize(A, moby + 0xC0, data->unk1E4 * D_0015ED6C_gp); + fast_vec_normalize(A, moby + 0xC0, frog_instance_vars->unk1E4 * D_0015ED6C_gp); FUN_L06_002e9b60_c(moby, A, 1, 0.3f, 0.3f); - if (vector_distance_xy(&MOBY(moby)->pos, &data->unk210) < 2.0f) { + if (vector_distance_xy(&MOBY(moby)->pos, &frog_instance_vars->unk210) < 2.0f) { MOBY(moby)->state = 8; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); - } else if (data->unk1C4 != 2) { + } else if (frog_instance_vars->unk1C4 != 2) { MOBY(moby)->state = 9; - } else if (data->unk1E8 != 0) { + } else if (frog_instance_vars->unk1E8 != 0) { MOBY(moby)->state = 0xA; } break; - case 16: - if (FUN_L00_002dc9f0(moby, &data->motion) != 0) { + case FROG_STATE_SUCK_CANNON_HELD: + if (FUN_L00_002dc9f0(moby, &frog_instance_vars->motion) != 0) { MOBY(moby)->state = 8; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); - data->unkC8 = 0; + frog_instance_vars->unkC8 = 0; } break; } @@ -590,6 +620,15 @@ void update_frog_health_respawn_and_target(struct Moby *moby) { HIT_RESULT_REMOVE_OR_RESPAWN = 2, HIT_RESULT_NO_RESPONSE = 11 }; + enum { + FROG_TARGET_MODE_AUTOMATIC_TARGET = 0, + HIT_STATUS_DAMAGE_SUPPRESSED = 1, + FROG_TARGET_MODE_EXPLICIT_TARGET = 1, + FROG_TARGET_MODE_NO_PURSUIT_TARGET = 2 + }; + enum { + FROG_STATE_RESPAWN = 0xF + }; struct RespawnVars *frog_state; struct MobyHit *hit; int kind; @@ -610,7 +649,7 @@ void update_frog_health_respawn_and_target(struct Moby *moby) { damage = 0.0f; hit = find_moby_hit(moby, 0x330000, 0); code = resolve_moby_hit_response(moby, hit, &frog_state->health, 0, &kind, &damage, 0, 4); - if (kind != 1 && moby->state != 0xE) { + if (kind != HIT_STATUS_DAMAGE_SUPPRESSED && moby->state != 0xE) { frog_state->health = frog_state->health - damage; if (frog_state->health <= 0.0f) { code = 1; @@ -636,7 +675,7 @@ void update_frog_health_respawn_and_target(struct Moby *moby) { frog_state->lives = frog_state->lives - 1; frog_state->health = frog_state->max_health; qcopy(&moby->pos, &frog_state->spawn_pos); - moby->state = 0xF; + moby->state = FROG_STATE_RESPAWN; moby->collision = 0; moby->flags = (moby->flags & 0xEFFF) | 0x41; break; @@ -665,7 +704,7 @@ void update_frog_health_respawn_and_target(struct Moby *moby) { } if (frog_state->target_id != -1) { struct Moby *target = &D_L06_0015FFD8_e94f0[frog_state->target_id]; - frog_state->target_mode = 1; + frog_state->target_mode = FROG_TARGET_MODE_EXPLICIT_TARGET; frog_state->target = target; qcopy(&frog_state->target_pos, &target->pos); } else if (D_001413F4_e94f0[0] == 1) { @@ -673,16 +712,16 @@ void update_frog_health_respawn_and_target(struct Moby *moby) { select_hero_or_gadgebot_target( (char *)moby, (char **)&frog_state->target, frog_state->range); if (frog_state->target == 0) { - frog_state->target_mode = 2; + frog_state->target_mode = FROG_TARGET_MODE_NO_PURSUIT_TARGET; } else { int *path = D_L06_001B0C30[frog_state->path]; if (point_in_path_xy(&frog_state->target->pos, path + 4, *path) == 0 || (frog_state->target->oclass == 0x359 && 2.0f < vector_distance_xy(&moby->pos, &frog_state->target->pos))) { frog_state->target = 0; - frog_state->target_mode = 2; + frog_state->target_mode = FROG_TARGET_MODE_NO_PURSUIT_TARGET; } else { - frog_state->target_mode = 0; + frog_state->target_mode = FROG_TARGET_MODE_AUTOMATIC_TARGET; } } } @@ -692,7 +731,7 @@ void update_frog_health_respawn_and_target(struct Moby *moby) { if (activate_effect_l08(moby, goal, frog_state->range, 0, 0, path + 4, *path) != 2) { if (frog_state->range < vector_distance_xy(&frog_state->spawn_pos, goal) || 3.0f < absolute_float(moby->pos.z - frog_state->target_pos.z)) { - frog_state->target_mode = 2; + frog_state->target_mode = FROG_TARGET_MODE_NO_PURSUIT_TARGET; } } } @@ -938,17 +977,18 @@ int update_moby_grab_state(struct Moby *moby) __asm__("FUN_L06_002ea5e0"); int update_moby_grab_state(struct Moby *moby) { int grab_check_result = process_moby_suck_cannon_suction(moby); if (grab_check_result != 0) { - if (moby->state == 8 || moby->state == 9 || moby->state == 0xC || moby->state == 0xD || - moby->state == 0x10) { - if (moby->state != 0x10) { + if (moby->state == FROG_STATE_WANDER || moby->state == FROG_STATE_APPROACH_TARGET || + moby->state == FROG_STATE_ATTACK || moby->state == FROG_STATE_RETURN_HOME || + moby->state == FROG_STATE_SUCK_CANNON_HELD) { + if (moby->state != FROG_STATE_SUCK_CANNON_HELD) { moby->command = moby->state; - moby->state = 0x10; + moby->state = FROG_STATE_SUCK_CANNON_HELD; } } else { grab_check_result = 0; } - } else if (moby->state == 0x10) { - moby->state = 8; + } else if (moby->state == FROG_STATE_SUCK_CANNON_HELD) { + moby->state = FROG_STATE_WANDER; if (moby->prev_seq != 0) { blend_moby_animation((MobyAnim *)moby, 0, 0, scale_game_frames(10)); } @@ -962,12 +1002,12 @@ int update_moby_suck_cannon_storage_state(unsigned char *moby) __asm__("FUN_L06_ int update_moby_suck_cannon_storage_state(unsigned char *moby) { int suck_cannon_store_result = store_moby_in_suck_cannon(moby); if (suck_cannon_store_result != 0) { - if (MOBY(moby)->state != 0x10) { + if (MOBY(moby)->state != FROG_STATE_SUCK_CANNON_HELD) { MOBY(moby)->command = MOBY(moby)->state; - MOBY(moby)->state = 0x10; + MOBY(moby)->state = FROG_STATE_SUCK_CANNON_HELD; } - } else if (MOBY(moby)->state == 0x10) { - MOBY(moby)->state = 8; + } else if (MOBY(moby)->state == FROG_STATE_SUCK_CANNON_HELD) { + MOBY(moby)->state = FROG_STATE_WANDER; if (MOBY(moby)->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -982,9 +1022,9 @@ s32 cancel_moby_suction_and_save_state(unsigned char *moby) { s32 helper_result; helper_result = cancel_suck_cannon_suction(moby); previous_state = MOBY(moby)->state; - if (previous_state != 0x10) { + if (previous_state != FROG_STATE_SUCK_CANNON_HELD) { MOBY(moby)->command = previous_state; - MOBY(moby)->state = 0x10; + MOBY(moby)->state = FROG_STATE_SUCK_CANNON_HELD; } return helper_result; } diff --git a/src/overlays/shared/enemies/gadgebot.c b/src/overlays/shared/enemies/gadgebot.c index 21d262c97f..4c5cf7a4a4 100644 --- a/src/overlays/shared/enemies/gadgebot.c +++ b/src/overlays/shared/enemies/gadgebot.c @@ -25,6 +25,22 @@ #include "rnc/overlay/shared/enemies/gadgebot_spawn_pad.h" #include "rnc/overlay/shared/math/random/random_int_between.h" +enum { + GADGEBOT_ABSORPTION_DISABLED = 2 +}; + +enum { + GADGEBOT_INITIALIZE = 0, + GADGEBOT_WAIT_FOR_SPAWN_PAD = 1, + GADGEBOT_WANDER_NEAR_HOME = 2, + GADGEBOT_FOLLOW_HERO = 3, + GADGEBOT_STAND_AND_FACE_HERO = 4, + GADGEBOT_SEEK_AND_ATTACK_TARGET = 5, + GADGEBOT_SEEK_INTERACTION_TARGET = 7, + GADGEBOT_ABSORB_INTO_OWNER = 8, + GADGEBOT_UPDATE_KNOCKBACK = 9 +}; + #define GB_FLAG (*(unsigned char *)0x15EDB3) #define PVARS(p) (*(char **)((p) + 0x78)) #define S16(p, current_target) (*(short *)((p) + (current_target))) @@ -297,17 +313,6 @@ void gadgebot_update(GbMoby *moby) __asm__("FUN_L06_002f0040"); /* Moby classes 857, 1906 */ void gadgebot_update(GbMoby *moby) { - enum { - GADGEBOT_INITIALIZE = 0, - GADGEBOT_WAIT_FOR_SPAWN_PAD = 1, - GADGEBOT_WANDER_NEAR_HOME = 2, - GADGEBOT_FOLLOW_HERO = 3, - GADGEBOT_STAND_AND_FACE_HERO = 4, - GADGEBOT_SEEK_AND_ATTACK_TARGET = 5, - GADGEBOT_SEEK_INTERACTION_TARGET = 7, - GADGEBOT_ABSORB_INTO_OWNER = 8, - GADGEBOT_UPDATE_KNOCKBACK = 9 - }; enum { GADGEBOT_ATTACK_SEEK_AND_APPROACH_TARGET = 1, GADGEBOT_ATTACK_STRIKE = 2, @@ -352,35 +357,38 @@ void gadgebot_update(GbMoby *moby) { hero_distance = vector_distance_xy(moby->pos, hero.motion.pos.f); dz = absolute_float(moby->pos[2] - hero.ground_point.f[2]); *(OvlQuad *)save1 = *(OvlQuad *)save0 = *(OvlQuad *)moby->pos; - if (moby->state != 1) { + if (moby->state != GADGEBOT_WAIT_FOR_SPAWN_PAD) { FUN_L06_002f3640_u(moby); if (hero_distance < 16.0f && absolute_float(moby->pos[2] - hero.motion.pos.f[2]) < 1.5f) { int ok = 0; - if (moby->state == 2 || moby->state == 5 || moby->state == 3 || moby->state == 6 || - moby->state == 7 || moby->state == 4) { + if (moby->state == GADGEBOT_WANDER_NEAR_HOME || + moby->state == GADGEBOT_SEEK_AND_ATTACK_TARGET || + moby->state == GADGEBOT_FOLLOW_HERO || moby->state == 6 || + moby->state == GADGEBOT_SEEK_INTERACTION_TARGET || + moby->state == GADGEBOT_STAND_AND_FACE_HERO) { ok = 1; } if (ok) { l06_gadgebot_command_range_stats.unk2C++; switch (D_00141610[0]) { case GADGEBOT_COMMAND_FOLLOW_HERO: - if (moby->state != 3) { - moby->state = 3; + if (moby->state != GADGEBOT_FOLLOW_HERO) { + moby->state = GADGEBOT_FOLLOW_HERO; moby->sub = 0; } break; case GADGEBOT_COMMAND_SEEK_AND_ATTACK_TARGET: - if (moby->state != 5) { - moby->state = 5; + if (moby->state != GADGEBOT_SEEK_AND_ATTACK_TARGET) { + moby->state = GADGEBOT_SEEK_AND_ATTACK_TARGET; moby->sub = 0; } break; case GADGEBOT_COMMAND_STAND_AND_FACE_HERO: - moby->state = 4; + moby->state = GADGEBOT_STAND_AND_FACE_HERO; break; case GADGEBOT_COMMAND_SEEK_INTERACTION_TARGET: moby->sub = 0; - moby->state = 7; + moby->state = GADGEBOT_SEEK_INTERACTION_TARGET; break; } } @@ -390,7 +398,7 @@ void gadgebot_update(GbMoby *moby) { if (gadgebot_vars->unk101 == 0) { attach_manipulator((char *)moby, 0, &gadgebot_vars->unk100); } - if (moby->state != 1) { + if (moby->state != GADGEBOT_WAIT_FOR_SPAWN_PAD) { approach_value(&gadgebot_vars->unk308, 2.3f, frame_scale * 0.1f); } else { approach_value(&gadgebot_vars->unk308, 1.0f, frame_scale * 0.1f); @@ -440,7 +448,7 @@ void gadgebot_update(GbMoby *moby) { } gadgebot_vars->unk28C = random_angle_radians(); gadgebot_vars->unk27C = -1; - moby->state = 1; + moby->state = GADGEBOT_WAIT_FOR_SPAWN_PAD; moby->unk94 = 0; break; } @@ -473,9 +481,9 @@ void gadgebot_update(GbMoby *moby) { } moby->flags = (moby->flags & 0xFFBE) | 0x1000; moby->unk94 = moby->cls->unk10; - moby->state = 3; + moby->state = GADGEBOT_FOLLOW_HERO; } else { - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { moby->flags |= 0x41; gadgebot_vars->unk170->flags |= 0x41; moby->flags &= 0xEFFF; @@ -543,12 +551,12 @@ void gadgebot_update(GbMoby *moby) { if (referenced_moby->cls_id == 0x3F7 && referenced_moby->state != 4 && is_point_inside_clip_volume(((GbMoby *)hero.moby)->pos, *tb) != 0 && is_point_inside_clip_volume(moby->pos, *tb) == 0) { - moby->state = 4; + moby->state = GADGEBOT_STAND_AND_FACE_HERO; *(OvlQuad *)moby->pos = *(OvlQuad *)vector_and_hit_scratch; break; } } - if (moby->state != 4) { + if (moby->state != GADGEBOT_STAND_AND_FACE_HERO) { switch (moby->sub) { case GADGEBOT_FOLLOW_INITIALIZE: moby->sub = 1; @@ -645,7 +653,7 @@ void gadgebot_update(GbMoby *moby) { } } if (flags & 0x20) { - moby->state = 4; + moby->state = GADGEBOT_STAND_AND_FACE_HERO; *(OvlQuad *)moby->pos = *(OvlQuad *)temporary_position; } if (hero_distance < 0.8f || hit != 0 || dz > 1.75f) { @@ -786,7 +794,7 @@ void gadgebot_update(GbMoby *moby) { movement_displacement_output, 1.0f) & 0x20) { - moby->state = 4; + moby->state = GADGEBOT_STAND_AND_FACE_HERO; *(OvlQuad *)moby->pos = *(OvlQuad *)save0; } if (vector_distance_xy(moby->pos, gadgebot_vars->target->pos) < 1.5f) { @@ -856,7 +864,7 @@ void gadgebot_update(GbMoby *moby) { } if (fast_dec_timer(&gadgebot_vars->unk194) != 0 && gadgebot_vars->target_searched != 0 && gadgebot_vars->target == 0) { - moby->state = 3; + moby->state = GADGEBOT_FOLLOW_HERO; moby->sub = 0; } else if (gadgebot_vars->target_searched != 0 && gadgebot_vars->target == 0) { gadgebot_vars->target_searched = 0; @@ -899,12 +907,12 @@ void gadgebot_update(GbMoby *moby) { movement_displacement_output, 1.0f) & 0x20) { - moby->state = 4; + moby->state = GADGEBOT_STAND_AND_FACE_HERO; *(OvlQuad *)moby->pos = *(OvlQuad *)save0; } } else if (gadgebot_vars->target_searched != 0) { moby->sub = 0; - moby->state = 3; + moby->state = GADGEBOT_FOLLOW_HERO; } break; case 2: @@ -957,7 +965,7 @@ void gadgebot_update(GbMoby *moby) { cart_burst(moby, moby->pos, -1, 0.5f, 13.0f); qcopy(moby->pos, gadgebot_vars->unkE0); - moby->state = 4; + moby->state = GADGEBOT_STAND_AND_FACE_HERO; for (i = 0; i < 10; i++) { float effect_scale_factor = random_float_between(0.1f, 1.0f); int cr = random_int_between(0x40, 0xFF); @@ -998,11 +1006,11 @@ void gadgebot_update(GbMoby *moby) { } break; } - interaction_result = FUN_L06_002f32f0_u(moby, moby->state != 7); + interaction_result = FUN_L06_002f32f0_u(moby, moby->state != GADGEBOT_SEEK_INTERACTION_TARGET); if (interaction_result == 2) { return; } - if (moby->state != 1) { + if (moby->state != GADGEBOT_WAIT_FOR_SPAWN_PAD) { float saved_control_f10; float saved_control_f24; @@ -1049,7 +1057,7 @@ void gadgebot_update(GbMoby *moby) { gadgebot_vars->unk284 = 0.0f; qcopy(moby->pos, vector_and_hit_scratch); } - if (moby->state != 9) { + if (moby->state != GADGEBOT_UPDATE_KNOCKBACK) { float ground_height; if (interaction_result == 0) { @@ -1108,7 +1116,7 @@ void gadgebot_update(GbMoby *moby) { moby->pos[0] > 1021.0f || moby->pos[1] < 2.0f || moby->pos[1] > 1021.0f || moby->pos[2] < 2.0f || moby->pos[2] > 1021.0f) { qcopy(moby->pos, gadgebot_vars->unkE0); - moby->state = 4; + moby->state = GADGEBOT_STAND_AND_FACE_HERO; return; } } @@ -1150,25 +1158,25 @@ float score_gadgebot_target_candidate(char *moby, char *b, int target_kind) __asm__("FUN_L06_002f2148"); -float score_gadgebot_target_candidate(char *moby, char *b, int target_kind) { - float r = vector_distance_xy(&MOBY(moby)->pos, b + 0x10); - float t = - fast_difference_between_rotations(l06_camera.yaw, - fast_arc_tan(*(float *)(b + 0x10) - MOBY(moby)->pos.x, - *(float *)(b + 0x14) - MOBY(moby)->pos.y)); - float u = - fast_difference_between_rotations(MOBY(moby)->rot.z, - fast_arc_tan(*(float *)(b + 0x10) - MOBY(moby)->pos.x, - *(float *)(b + 0x14) - MOBY(moby)->pos.y)); - r = r + u * 10.0f; - r = r + t * 3.0f; - if (((unsigned char *)b)[0x31] == 0) { - r += 10.0f; +float score_gadgebot_target_candidate(char *moby, char *candidate_moby, int target_kind) { + float candidate_score = vector_distance_xy(&MOBY(moby)->pos, candidate_moby + 0x10); + float t = fast_difference_between_rotations( + l06_camera.yaw, + fast_arc_tan(*(float *)(candidate_moby + 0x10) - MOBY(moby)->pos.x, + *(float *)(candidate_moby + 0x14) - MOBY(moby)->pos.y)); + float u = fast_difference_between_rotations( + MOBY(moby)->rot.z, + fast_arc_tan(*(float *)(candidate_moby + 0x10) - MOBY(moby)->pos.x, + *(float *)(candidate_moby + 0x14) - MOBY(moby)->pos.y)); + candidate_score = candidate_score + u * 10.0f; + candidate_score = candidate_score + t * 3.0f; + if (((unsigned char *)candidate_moby)[0x31] == 0) { + candidate_score += 10.0f; } if (target_kind == 9) { - r += 100.0f; + candidate_score += 100.0f; } - return r; + return candidate_score; } /* Shared level-06/10 routine: gathers candidate mobies, scores them against the target list and writes the slot tables. */ @@ -1178,6 +1186,10 @@ float score_gadgebot_target_candidate(char *moby, char *b, int target_kind) { by score, each target goes to its best-scoring mobys, and their approach angles are spread apart. */ void assign_gadgebot_attack_targets(void) { + enum { + GADGEBOT_TARGET_KIND_UNAVAILABLE = 0, + GADGEBOT_TARGET_KIND_ATTACKABLE = 5 + }; char *mobys[50]; char end[16]; char start[16]; @@ -1219,10 +1231,10 @@ void assign_gadgebot_attack_targets(void) { float range; float score; int kind; - kind = 0; + kind = GADGEBOT_TARGET_KIND_UNAVAILABLE; if (*(char **)(candidate + 0x24) != 0) kind = *(short *)(*(char **)(candidate + 0x24) + 0x46); - if (kind != 5) + if (kind != GADGEBOT_TARGET_KIND_ATTACKABLE) continue; range = 12.0f; if (S16(vars, 0x198) != 0) @@ -1400,7 +1412,7 @@ void select_nearest_gadgebot_interaction_target(void *moby_arg) { !(0.2f < absolute_float(moby->pos[2] - candidate->pos[2])) && !(1.5f < absolute_float(moby->pos[2] - candidate->pos[2]))) { if ((candidate->cls_id != 0x400 && candidate->cls_id != 0x516) || - candidate->state != 2) { + candidate->state != GADGEBOT_ABSORPTION_DISABLED) { if (candidate->cls_id != 0x515 || *(int *)candidate->vars != -1) { best = vector_distance_xy(moby->pos, candidate->pos); gadgebot_vars->target = candidate; @@ -1557,7 +1569,7 @@ int process_gadgebot_interaction_candidate( case MOBY_CLASS_GADGEBOT_ABSORPTION_TARGET: if (flag != 0) return 0; - if (MOBY(moby)->state == 2) + if (MOBY(moby)->state == GADGEBOT_ABSORPTION_DISABLED) return 0; if (!(vector_distance_xy(ctx + 0x10, candidate_position) < 1.0f)) return 0; @@ -1611,7 +1623,8 @@ void handle_gadgebot_hit_knockback(unsigned char *moby) __asm__("FUN_L06_002f364 void handle_gadgebot_hit_knockback(unsigned char *moby) { char *state = ((char *)MOBY(moby)->pvars); - if (MOBY(moby)->state != 9 && MOBY(moby)->seq != 2 && MOBY(moby)->prev_seq != 2) { + if (MOBY(moby)->state != GADGEBOT_UPDATE_KNOCKBACK && MOBY(moby)->seq != 2 && + MOBY(moby)->prev_seq != 2) { char *target = find_moby_hit(moby, 0x330001, 0); if (target != 0) { Q hit_vector_copy; @@ -1638,7 +1651,7 @@ void handle_gadgebot_hit_knockback(unsigned char *moby) { *(float *)(state + 0xCC) = doubled_frame_time; } FUN_0022da68(2, 0, moby); - MOBY(moby)->state = 9; + MOBY(moby)->state = GADGEBOT_UPDATE_KNOCKBACK; } } } @@ -1686,11 +1699,12 @@ void update_gadgebot_glow_effects(char *moby) { } moby_vars = ((char *)MOBY(moby)->pvars); tint = 0x3228AAAA; - if (MOBY(moby)->state == 3 || MOBY(moby)->state == 6) { + if (MOBY(moby)->state == GADGEBOT_FOLLOW_HERO || MOBY(moby)->state == 6) { tint = 0x3228AA28; - } else if (MOBY(moby)->state == 5 || MOBY(moby)->state == 9) { + } else if (MOBY(moby)->state == GADGEBOT_SEEK_AND_ATTACK_TARGET || + MOBY(moby)->state == GADGEBOT_UPDATE_KNOCKBACK) { tint = 0x322828AA; - } else if (MOBY(moby)->state == 7) { + } else if (MOBY(moby)->state == GADGEBOT_SEEK_INTERACTION_TARGET) { tint = 0x32AA2828; } diff --git a/src/overlays/shared/enemies/gadgebot_spawn_container.c b/src/overlays/shared/enemies/gadgebot_spawn_container.c index 6ab438f20a..845eee438e 100644 --- a/src/overlays/shared/enemies/gadgebot_spawn_container.c +++ b/src/overlays/shared/enemies/gadgebot_spawn_container.c @@ -13,6 +13,12 @@ #include "rnc/overlay/shared/math/random/random_int_between.h" #include "rnc/overlay/shared/props.h" +enum { + GADGEBOT_CONTAINER_ACTIVATE = 0, + GADGEBOT_CONTAINER_PULSE_AND_HANDLE_HITS = 1, + GADGEBOT_CONTAINER_WAIT_FOR_REMOVAL = 2 +}; + typedef struct { float corner[4][4]; int color[4]; @@ -144,7 +150,7 @@ void destroy_gadgebot_spawn_container(void *moby_ptr, void *target_ptr) { } } MOBY(moby)->collision = 0; - MOBY(moby)->state = 2; + MOBY(moby)->state = GADGEBOT_CONTAINER_WAIT_FOR_REMOVAL; MOBY(moby)->flags |= 1; MOBY(moby)->command = (unsigned char)scale_game_frames(15); } @@ -174,11 +180,6 @@ void gadgebot_spawn_container_update(unsigned char *moby) __asm__("FUN_L06_002d8 /* Moby class 302 */ void gadgebot_spawn_container_update(unsigned char *moby) { - enum { - GADGEBOT_CONTAINER_ACTIVATE = 0, - GADGEBOT_CONTAINER_PULSE_AND_HANDLE_HITS = 1, - GADGEBOT_CONTAINER_WAIT_FOR_REMOVAL = 2 - }; char *hit_record = find_moby_hit(moby, 0x10000, 0); float raised_position_snapshot[4]; int frame_count_snapshot; @@ -187,7 +188,7 @@ void gadgebot_spawn_container_update(unsigned char *moby) { MOBY(moby)->hit_slot = 0xFF; switch (MOBY(moby)->state) { case GADGEBOT_CONTAINER_ACTIVATE: - MOBY(moby)->state = 1; + MOBY(moby)->state = GADGEBOT_CONTAINER_PULSE_AND_HANDLE_HITS; break; case GADGEBOT_CONTAINER_PULSE_AND_HANDLE_HITS: frame_count_snapshot = level_frame_count; diff --git a/src/overlays/shared/enemies/ground_melee_enemy.c b/src/overlays/shared/enemies/ground_melee_enemy.c index 27a97ea414..fd68ffa342 100644 --- a/src/overlays/shared/enemies/ground_melee_enemy.c +++ b/src/overlays/shared/enemies/ground_melee_enemy.c @@ -24,6 +24,21 @@ /* Ground enemy update: damage reaction, leash and wake checks, then its chase / attack / return state machine. */ /* Ported from rac1-decomp (src/overlays/shared/vendor_002C6B30.c: func_L09_002E39E0), where it is exact; names translated to the US level program. */ +enum { + GROUND_ENEMY_STATE_INITIALIZE = 0, + GROUND_ENEMY_STATE_IDLE = 1, + GROUND_ENEMY_STATE_ALERT_TURN = 2, + GROUND_ENEMY_STATE_CHASE = 3, + GROUND_ENEMY_STATE_MELEE_ATTACK = 4, + GROUND_ENEMY_STATE_RETURN_HOME = 5, + GROUND_ENEMY_STATE_HURT_KNOCKBACK = 6, + GROUND_ENEMY_STATE_RECOVER_TO_IDLE = 0x7, + GROUND_ENEMY_STATE_HURT_RECOVERY = 9, + GROUND_ENEMY_STATE_BLOCKED_RETURN_HOME = 12, + GROUND_ENEMY_STATE_LEASHED_FORWARD_WALK = 13, + GROUND_ENEMY_STATE_FATAL_KNOCKBACK = 99 +}; + typedef struct Moby Moby; typedef struct Hero Hero; @@ -162,10 +177,10 @@ int moby_hold_state_if_grabbed(struct Moby *a) __asm__("FUN_L01_002f1c78"); int moby_hold_state_if_grabbed(struct Moby *suction_moby) { int suction_result = process_moby_suck_cannon_suction(suction_moby); if (suction_result == 0) { - if (suction_moby->state == 0x7) - suction_moby->state = 1; + if (suction_moby->state == GROUND_ENEMY_STATE_RECOVER_TO_IDLE) + suction_moby->state = GROUND_ENEMY_STATE_IDLE; } else { - suction_moby->state = 0x7; + suction_moby->state = GROUND_ENEMY_STATE_RECOVER_TO_IDLE; } return suction_result; } @@ -198,20 +213,6 @@ void ground_melee_enemy_update(Moby *moby) __asm__("FUN_L09_002e27d8"); /* Moby class 193 */ void ground_melee_enemy_update(Moby *moby) { - enum { - GROUND_ENEMY_STATE_INITIALIZE = 0, - GROUND_ENEMY_STATE_IDLE = 1, - GROUND_ENEMY_STATE_ALERT_TURN = 2, - GROUND_ENEMY_STATE_CHASE = 3, - GROUND_ENEMY_STATE_MELEE_ATTACK = 4, - GROUND_ENEMY_STATE_RETURN_HOME = 5, - GROUND_ENEMY_STATE_HURT_KNOCKBACK = 6, - GROUND_ENEMY_STATE_RECOVER_TO_IDLE = 7, - GROUND_ENEMY_STATE_HURT_RECOVERY = 9, - GROUND_ENEMY_STATE_BLOCKED_RETURN_HOME = 12, - GROUND_ENEMY_STATE_LEASHED_FORWARD_WALK = 13, - GROUND_ENEMY_STATE_FATAL_KNOCKBACK = 99 - }; V_2E39E0 previous; Target_2E39E0 query; V_2E39E0 step; @@ -224,7 +225,8 @@ void ground_melee_enemy_update(Moby *moby) { int expired; float ground; - if (moby->state != 99 && moby->state != 7) { + if (moby->state != GROUND_ENEMY_STATE_FATAL_KNOCKBACK && + moby->state != GROUND_ENEMY_STATE_RECOVER_TO_IDLE) { Hit_2E39E0 *hit; damage = 0.0f; hit = find_moby_hit(moby, 0x330000, 0); @@ -274,7 +276,7 @@ void ground_melee_enemy_update(Moby *moby) { else explode_2E39E0(moby, 0, -1); moby->collision = 0; - moby->state = 99; + moby->state = GROUND_ENEMY_STATE_FATAL_KNOCKBACK; ground_enemy_vars->f117 = 120; effects_start_2E39E0(moby, ground_enemy_vars->effects); } else { @@ -290,7 +292,7 @@ void ground_melee_enemy_update(Moby *moby) { 0); ground_enemy_vars->f170 = 5.0f; ground_enemy_vars->f174 = 10.0f; - moby->state = 6; + moby->state = GROUND_ENEMY_STATE_HURT_KNOCKBACK; ground_enemy_vars->f117 = 250; ground_enemy_vars->cooldown = scale_game_frames(60); effects_start_2E39E0(moby, ground_enemy_vars->effects); @@ -333,7 +335,7 @@ void ground_melee_enemy_update(Moby *moby) { switch (moby->state) { case GROUND_ENEMY_STATE_INITIALIZE: qcopy(&ground_enemy_vars->home, &moby->pos); - moby->state = 1; + moby->state = GROUND_ENEMY_STATE_IDLE; ground_enemy_vars->f29 = 0; ground_enemy_vars->health = 1.0f; ground_enemy_vars->f24 = 1; @@ -356,7 +358,7 @@ void ground_melee_enemy_update(Moby *moby) { fast_vec_sub(&step, &query, &moby->pos); if ((kind < 2 || fast_vec_length(&step) < ground_enemy_vars->range + 4.0f) && absolute_float(moby->pos.z - query.z) < 8.0f && !random_integer_below(19)) { - moby->state = 2; + moby->state = GROUND_ENEMY_STATE_ALERT_TURN; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(random_int_between(10, 13))); } else if (moby->command == 1 && !random_integer_below(19)) { @@ -365,7 +367,7 @@ void ground_melee_enemy_update(Moby *moby) { ground_enemy_vars->side = ground_enemy_vars->side_deg * 0.017453292f; ground_enemy_vars->side_timer = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - moby->state = 3; + moby->state = GROUND_ENEMY_STATE_CHASE; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(random_int_between(10, 13))); moby->command = 0; @@ -391,7 +393,7 @@ void ground_melee_enemy_update(Moby *moby) { ground_enemy_vars->side = ground_enemy_vars->side_deg * 0.017453292f; ground_enemy_vars->side_timer = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - moby->state = 3; + moby->state = GROUND_ENEMY_STATE_CHASE; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(random_int_between(10, 13))); moby->command = 0; @@ -401,7 +403,7 @@ void ground_melee_enemy_update(Moby *moby) { ground_enemy_vars->side = ground_enemy_vars->side_deg * 0.017453292f; ground_enemy_vars->side_timer = scale_game_frames((int)random_float_between(30.0f, 90.0f)); - moby->state = 3; + moby->state = GROUND_ENEMY_STATE_CHASE; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(random_int_between(10, 13))); moby->command = 0; @@ -437,18 +439,18 @@ void ground_melee_enemy_update(Moby *moby) { } fast_vec_sub(&away, &query, &ground_enemy_vars->home); if ((flags & 4) || (vector_distance_xy(&moby->pos, &query) < 1.5f && !(flags & 2))) { - moby->state = 4; + moby->state = GROUND_ENEMY_STATE_MELEE_ATTACK; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(random_int_between(10, 13))); } else if (ground_enemy_vars->f190 < frame_time || 1.0f < steep || (flags & 2)) { ground_enemy_vars->home_timer = scale_game_frames(50); - moby->state = 5; + moby->state = GROUND_ENEMY_STATE_RETURN_HOME; } else if (fast_vec_length(&away) < ground_enemy_vars->range + 4.0f && absolute_float(moby->pos.z - query.z) < 8.0f) { if (moby->group != 0xFF) FUN_L01_0026e090(moby->group, 1); } else if (moby->command != 1) { - moby->state = 5; + moby->state = GROUND_ENEMY_STATE_RETURN_HOME; } moby->command = 0; break; @@ -474,7 +476,7 @@ void ground_melee_enemy_update(Moby *moby) { spawn_nearby_effect(query.who, moby, 1, &goal, &step, 1.0f); } if ((moby->anim_flags & 2) && vector_distance_xy(&moby->pos, &query) > 1.5f) { - moby->state = 3; + moby->state = GROUND_ENEMY_STATE_CHASE; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(random_int_between(10, 13))); } @@ -507,7 +509,7 @@ void ground_melee_enemy_update(Moby *moby) { fast_vec_add(&goal, &moby->pos, &step); flags = move_w(moby, &ground_enemy_vars->steer, &goal, &step, 1.0f); if (vector_distance_xy(&moby->pos, &ground_enemy_vars->home) < 2.0f) { - moby->state = 1; + moby->state = GROUND_ENEMY_STATE_IDLE; if (moby->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(random_int_between(10, 13))); } @@ -515,17 +517,17 @@ void ground_melee_enemy_update(Moby *moby) { if (expired && fast_vec_length(&away) < ground_enemy_vars->range) { if (moby->group != 0xFF) FUN_L01_0026e090(moby->group, 1); - moby->state = 3; + moby->state = GROUND_ENEMY_STATE_CHASE; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(random_int_between(10, 13))); } else if (expired && moby->command == 1) { - moby->state = 3; + moby->state = GROUND_ENEMY_STATE_CHASE; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(random_int_between(10, 13))); } else if (flags & 2) { moby->pos.x = previous.x; moby->pos.y = previous.y; - moby->state = 12; + moby->state = GROUND_ENEMY_STATE_BLOCKED_RETURN_HOME; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(random_int_between(10, 13))); } @@ -534,7 +536,7 @@ void ground_melee_enemy_update(Moby *moby) { } case GROUND_ENEMY_STATE_HURT_KNOCKBACK: if (step_moby_motion(moby, ground_enemy_vars->motion) & 1) { - moby->state = 9; + moby->state = GROUND_ENEMY_STATE_HURT_RECOVERY; if (moby->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(random_int_between(10, 13))); return; @@ -546,7 +548,7 @@ void ground_melee_enemy_update(Moby *moby) { break; case GROUND_ENEMY_STATE_RECOVER_TO_IDLE: if (recover_2E39E0(moby, ground_enemy_vars->motion)) { - moby->state = 1; + moby->state = GROUND_ENEMY_STATE_IDLE; if (moby->prev_seq != 2) blend_moby_animation(moby, 2, 0, 0); ground_enemy_vars->fC8 = 0; @@ -554,7 +556,7 @@ void ground_melee_enemy_update(Moby *moby) { break; case GROUND_ENEMY_STATE_HURT_RECOVERY: if (compute_interpolated_record_value(moby) > 29.0f) { - moby->state = 3; + moby->state = GROUND_ENEMY_STATE_CHASE; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(random_int_between(10, 13))); return; @@ -597,15 +599,15 @@ void ground_melee_enemy_update(Moby *moby) { flags = move_w(moby, &ground_enemy_vars->steer, &goal, &step, 1.0f); fast_vec_sub(&away, &query, &ground_enemy_vars->home); if ((flags & 4) || (vector_distance_xy(&moby->pos, &query) < 1.5f && steep <= 1.0f)) { - moby->state = 4; + moby->state = GROUND_ENEMY_STATE_MELEE_ATTACK; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(random_int_between(10, 13))); } else if (steep <= 1.0f && !(flags & 2)) { - moby->state = 5; + moby->state = GROUND_ENEMY_STATE_RETURN_HOME; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(random_int_between(10, 13))); } else if ((flags & 2) && expired) { - moby->state = 1; + moby->state = GROUND_ENEMY_STATE_IDLE; if (moby->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(random_int_between(10, 13))); } else if (moby->anim_flags & 2) { @@ -656,7 +658,7 @@ void ground_melee_enemy_update(Moby *moby) { if (ground_enemy_vars->anchor == 0 || vector_distance_xy(&moby->pos, &ground_enemy_vars->anchor->pos) > convert_integer_to_float(ground_enemy_vars->leash)) { - moby->state = 5; + moby->state = GROUND_ENEMY_STATE_RETURN_HOME; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(random_int_between(10, 13))); } diff --git a/src/overlays/shared/enemies/hero_seeking_mine.c b/src/overlays/shared/enemies/hero_seeking_mine.c index a7803ca4ab..b9036a48ba 100644 --- a/src/overlays/shared/enemies/hero_seeking_mine.c +++ b/src/overlays/shared/enemies/hero_seeking_mine.c @@ -67,6 +67,12 @@ void hero_seeking_mine_update(char *moby) __asm__("FUN_L15_002a2488"); /* Moby class 77 */ void hero_seeking_mine_update(char *moby) { + enum { + GROUP_MOBY_STATE_RESET = 0, + GROUP_MOBY_STATE_RISING = 2, + GROUP_MOBY_STATE_HERO_SEEKING = 3, + GROUP_MOBY_STATE_BURST = 4 + }; float va[4]; float pb[4]; char *group_moby_data; @@ -120,16 +126,16 @@ void hero_seeking_mine_update(char *moby) { } } state = ((unsigned char *)moby)[0x20]; - if (state == 2) + if (state == GROUP_MOBY_STATE_RISING) goto s2; - if (state < 3) { - if (state == 0) + if (state < GROUP_MOBY_STATE_HERO_SEEKING) { + if (state == GROUP_MOBY_STATE_RESET) goto s0; return; } - if (state == 3) + if (state == GROUP_MOBY_STATE_HERO_SEEKING) goto s3; - if (state == 4) + if (state == GROUP_MOBY_STATE_BURST) goto s4; return; @@ -190,6 +196,9 @@ void hero_seeking_mine_update(char *moby) { } void draw_group_moby_effect_quads(unsigned char *moby) { + enum { + GROUP_MOBY_STATE_INACTIVE = 1 + }; EffectQuad effect_quad; float angles[4] __attribute__((aligned(16))); float rotation[12] __attribute__((aligned(16))); @@ -219,7 +228,7 @@ void draw_group_moby_effect_quads(unsigned char *moby) { do { unsigned char *group_member_moby = (unsigned char *)((int)l15_moby_array + ((*group_moby_entry & 0x7fff) << 8)); - if (MOBY(group_member_moby)->state != 1) { + if (MOBY(group_member_moby)->state != GROUP_MOBY_STATE_INACTIVE) { clear_u64_value(angles); angles[2] = fast_arc_tan(l15_camera.pos.f[0] - MOBY(group_member_moby)->pos.x, l15_camera.pos.f[1] - MOBY(group_member_moby)->pos.y); diff --git a/src/overlays/shared/enemies/horny_toad.c b/src/overlays/shared/enemies/horny_toad.c index b7760cf8d4..9a39e4bd89 100644 --- a/src/overlays/shared/enemies/horny_toad.c +++ b/src/overlays/shared/enemies/horny_toad.c @@ -20,6 +20,10 @@ #include "rnc/rendering/debug/debug_menu.h" #include "rnc/overlay/shared/math/quad.h" +enum { + MOBY_STATE_SUCK_CANNON_ACTIVE = 0x9 +}; + typedef struct HornyToadVars { u8 pad0[0x1f4]; f32 unk1F4[4]; @@ -136,13 +140,16 @@ extern float horny_toad_target_animation_start_index_gp __asm__("D_L00_00161984" __attribute__((sda)); extern short D_L00_00161960 __attribute__((sda)); -extern s32 D_L00_0015F5C4_2d5160 __asm__("D_L00_0015F5C4"); -extern f32 D_L00_00161970_gp __asm__("D_L00_00161970") __attribute__((sda)); -extern f32 D_L00_00161974_gp __asm__("D_L00_00161974") __attribute__((sda)); -extern f32 D_L00_00161978_gp __asm__("D_L00_00161978") __attribute__((sda)); -extern f32 D_L00_0016197C_gp __asm__("D_L00_0016197C") __attribute__((sda)); -extern f32 D_L00_00161988_gp __asm__("D_L00_00161988") __attribute__((sda)); -extern f32 D_L00_0016198C_gp __asm__("D_L00_0016198C") __attribute__((sda)); +extern s32 D_L00_0015F5C4_2d5160 __asm__("D_L00_0015F5C4"); +extern f32 l00_horny_toad_knockback_gravity __asm__("D_L00_00161970") __attribute__((sda)); +extern f32 l00_horny_toad_knockback_horizontal_deceleration __asm__("D_L00_00161974") + __attribute__((sda)); +extern f32 l00_horny_toad_knockback_horizontal_speed __asm__("D_L00_00161978") __attribute__((sda)); +extern f32 l00_horny_toad_knockback_vertical_speed __asm__("D_L00_0016197C") __attribute__((sda)); +extern f32 l00_horny_toad_knockback_landing_animation_frame __asm__("D_L00_00161988") + __attribute__((sda)); +extern f32 l00_horny_toad_knockback_apex_animation_frame __asm__("D_L00_0016198C") + __attribute__((sda)); extern unsigned char *D_L00_001B04B0_2d5160[] __asm__("D_L00_001B04B0"); extern void hit_reaction(void *, void *, void *, s32, s32 *, f32 *, s32, s32) __asm__("FUN_L00_0025a478"); @@ -190,6 +197,9 @@ void horny_toad_update(Moby *moby) { HORNY_TOAD_RECOVER_FROM_REACTION = 11, HORNY_TOAD_DYING = 12 }; + enum { + MOBY_STATE_MARKED_FOR_REMOVAL = 0xFE + }; ToadVars *horny_toad_vars; Moby *target; ToadVec reference_point_or_movement_endpoint; @@ -233,10 +243,10 @@ void horny_toad_update(Moby *moby) { ToadPath *path = toad_paths[horny_toad_vars->path]; qcopy(horny_toad_vars->home, path->pts[path->count - 1]); qcopy((*(ToadVec *)&moby->pos), path->pts[0]); - moby->state = 3; + moby->state = HORNY_TOAD_WAIT_TO_FOLLOW_PATH; } else if (horny_toad_vars->follow_moby >= 0) { qcopy(horny_toad_vars->home, (*(ToadVec *)&moby->pos)); - moby->state = 1; + moby->state = HORNY_TOAD_FACE_FOLLOW_MOBY; if (moby->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } else { @@ -244,19 +254,20 @@ void horny_toad_update(Moby *moby) { return; } } else { - moby->state = 5; + moby->state = HORNY_TOAD_ROAM; } break; } case HORNY_TOAD_RUN_MOVEMENT_SEQUENCE: if (FUN_L00_002dc9f0_2d4610(moby, horny_toad_vars->unk70) != 0) { - moby->state = 5; + moby->state = HORNY_TOAD_ROAM; horny_toad_vars->unk138 = 0; } break; case HORNY_TOAD_FACE_FOLLOW_MOBY: { Moby *followed_moby = (Moby *)(moby_table + (horny_toad_vars->follow_moby << 8)); - if (followed_moby != 0 && followed_moby->state != 0xFE && followed_moby->state != 0xFD) { + if (followed_moby != 0 && followed_moby->state != MOBY_STATE_MARKED_FOR_REMOVAL && + followed_moby->state != 0xFD) { approach_angle( &moby->rot.z, fast_arc_tan((*(ToadVec *)&followed_moby->pos)[0] - (*(ToadVec *)&moby->pos)[0], @@ -266,7 +277,7 @@ void horny_toad_update(Moby *moby) { frame_time_sq * 12.566371f, frame_time * 12.566371f); } else { - moby->state = 8; + moby->state = HORNY_TOAD_RETURN_HOME; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } @@ -277,14 +288,14 @@ void horny_toad_update(Moby *moby) { (unsigned char *)moby, toad_paths[horny_toad_vars->path]->pts[horny_toad_vars->path_point], 0.5f) < 1.0f) { - moby->state = 1; + moby->state = HORNY_TOAD_FACE_FOLLOW_MOBY; if (moby->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } break; case HORNY_TOAD_WAIT_TO_FOLLOW_PATH: if (horny_toad_vars->unk1C4 != 2) { - moby->state = 4; + moby->state = HORNY_TOAD_FOLLOW_PATH; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } @@ -296,12 +307,12 @@ void horny_toad_update(Moby *moby) { if (horny_toad_vars->path_point < path->count - 1) { horny_toad_vars->path_point++; } else { - moby->state = 5; + moby->state = HORNY_TOAD_ROAM; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } } else if (horny_toad_vars->unk1C4 != 2) { - moby->state = 6; + moby->state = HORNY_TOAD_APPROACH_AND_FACE_TARGET; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } @@ -317,7 +328,7 @@ void horny_toad_update(Moby *moby) { update_object_wander_movement((char *)moby, (char *)horny_toad_vars->unk240, 0.5f, 0.5f); if (horny_toad_vars->unk1C4 != 2) { horny_toad_vars->unk1FC = random_float_between(-20.0f, 20.0f) * 0.017453292f; - moby->state = 6; + moby->state = HORNY_TOAD_APPROACH_AND_FACE_TARGET; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } @@ -330,14 +341,14 @@ void horny_toad_update(Moby *moby) { fast_arc_tan((*(ToadVec *)&target->pos)[0] - (*(ToadVec *)&moby->pos)[0], (*(ToadVec *)&target->pos)[1] - (*(ToadVec *)&moby->pos)[1])) < 0.17453292f) { - moby->state = 7; + moby->state = HORNY_TOAD_PLAY_TARGET_ANIMATION; if (moby->prev_seq != 5) blend_moby_animation(moby, 5, (int)horny_toad_target_animation_start_index_gp, scale_game_frames(10)); } else if (horny_toad_vars->unk1C4 == 2) { - moby->state = 8; + moby->state = HORNY_TOAD_RETURN_HOME; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } @@ -347,7 +358,7 @@ void horny_toad_update(Moby *moby) { collect_mobies_in_sphere_at_moby_point(moby, 0.333f, 1.0f, 1.0f, 0, 1, 0, 1, 0); } else if (moby->anim_flags & 2) { if (horny_toad_vars->unk1C4 == 2) { - moby->state = 8; + moby->state = HORNY_TOAD_RETURN_HOME; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } else if (vector_distance_xy((*(ToadVec *)&moby->pos), (*(ToadVec *)&target->pos)) > @@ -357,7 +368,7 @@ void horny_toad_update(Moby *moby) { fast_arc_tan((*(ToadVec *)&target->pos)[0] - (*(ToadVec *)&moby->pos)[0], (*(ToadVec *)&target->pos)[1] - (*(ToadVec *)&moby->pos)[1])) > 0.17453292f) { - moby->state = 6; + moby->state = HORNY_TOAD_APPROACH_AND_FACE_TARGET; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } @@ -366,11 +377,11 @@ void horny_toad_update(Moby *moby) { case HORNY_TOAD_RETURN_HOME: if (move_horny_toad_toward_position((unsigned char *)moby, horny_toad_vars->home, 0.5f) < 1.5f) { - moby->state = 5; + moby->state = HORNY_TOAD_ROAM; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } else if (horny_toad_vars->unk1C4 != 2) { - moby->state = 6; + moby->state = HORNY_TOAD_APPROACH_AND_FACE_TARGET; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } @@ -409,11 +420,11 @@ void horny_toad_update(Moby *moby) { } if (moby->anim_flags & 2) { if (horny_toad_vars->unk1C4 != 2) { - moby->state = 6; + moby->state = HORNY_TOAD_APPROACH_AND_FACE_TARGET; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); } else if (horny_toad_vars->unk276 == 0) { - moby->state = 8; + moby->state = HORNY_TOAD_RETURN_HOME; if (moby->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(20)); } @@ -422,7 +433,7 @@ void horny_toad_update(Moby *moby) { } case HORNY_TOAD_RECOVER_FROM_REACTION: if (step_moby_motion(moby, horny_toad_vars->unk70) & 0x140) { - moby->state = 5; + moby->state = HORNY_TOAD_ROAM; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -436,11 +447,12 @@ void horny_toad_update(Moby *moby) { } break; } - if (moby->state != 11 && moby->state != 12 && moby->state != 9) { + if (moby->state != HORNY_TOAD_RECOVER_FROM_REACTION && moby->state != HORNY_TOAD_DYING && + moby->state != HORNY_TOAD_RUN_MOVEMENT_SEQUENCE) { approach_value(probe_ground_height((*(ToadVec *)&moby->pos), 0, 0.5f), frame_time * 7.0f, &(*(ToadVec *)&moby->pos)[2]); - if (moby->state != 4) { + if (moby->state != HORNY_TOAD_FOLLOW_PATH) { resolve_point_path_segment_xy_clearance( horny_toad_vars->unk1E0, 0.25f, (*(ToadVec *)&moby->pos), (*(ToadVec *)&moby->pos)); } @@ -460,6 +472,9 @@ void horny_toad_update(Moby *moby) { void process_horny_toad_hit_reaction(unsigned char *m) __asm__("FUN_L00_002d5160"); void process_horny_toad_hit_reaction(unsigned char *toad_moby) { + enum { + HIT_RESPONSE_NO_HIT = 1 + }; unsigned char *toad_vars = *(unsigned char **)(toad_moby + 0x78); unsigned char *hit; s32 hit_response_status; @@ -484,17 +499,18 @@ void process_horny_toad_hit_reaction(unsigned char *toad_moby) { damage = 0.0f; hit = find_moby_hit(toad_moby, 0x330000, 0); hit_reaction(toad_moby, hit, toad_vars + 0x20, 0, &hit_response_status, &damage, 0, 4); - if (hit_response_status != 1 && MOBY(toad_moby)->state != 12 && damage != 0.0f) { + if (hit_response_status != HIT_RESPONSE_NO_HIT && MOBY(toad_moby)->state != 12 && + damage != 0.0f) { /* Fakematch: register pins give retail's choices: 41 in $t0, the frame time and later 0.75 in $f4, the squared frame time first in $f0. */ register s32 hit_state __asm__("$8") = 0x29; register f32 frame_time_reg __asm__("$f4") = frame_time; register f32 knockback_scale __asm__("$f4"); register f32 frame_time_sq_reg __asm__("$f0") = D_0015ED70; - forceX = D_L00_00161970_gp * frame_time_sq_reg; - forceY = D_L00_00161974_gp * frame_time_sq_reg; - forceZ = D_L00_00161978_gp * frame_time_reg; - forceW = D_L00_0016197C_gp * frame_time_reg; + forceX = l00_horny_toad_knockback_gravity * frame_time_sq_reg; + forceY = l00_horny_toad_knockback_horizontal_deceleration * frame_time_sq_reg; + forceZ = l00_horny_toad_knockback_horizontal_speed * frame_time_reg; + forceW = l00_horny_toad_knockback_vertical_speed * frame_time_reg; health = *(f32 *)(toad_vars + 0x20) - damage; toad_vars[0xAD] = 0; duration = frame_time + frame_time; @@ -513,8 +529,8 @@ void process_horny_toad_hit_reaction(unsigned char *toad_moby) { trooper_knockback_arc(hit_knockback_vector, &angle, toad_vars + 0x88, toad_vars + 0x8C); trooper_start_knockback( toad_moby, toad_vars + 0x70, angle, FUN_L00_00257b50_2d5160(2) + 6, 1, 0); - reactionC0 = D_L00_0016198C_gp; - reactionC4 = D_L00_00161988_gp; + reactionC0 = l00_horny_toad_knockback_apex_animation_frame; + reactionC4 = l00_horny_toad_knockback_landing_animation_frame; *(f32 *)(toad_vars + 0xC0) = reactionC0; *(f32 *)(toad_vars + 0xC4) = reactionC4; MOBY(toad_moby)->state = 12; @@ -625,10 +641,10 @@ int process_suck_cannon_suction_and_update_moby_state(char *a) __asm__("FUN_L00_ int process_suck_cannon_suction_and_update_moby_state(char *moby) { int suction_result = process_moby_suck_cannon_suction(moby); if (suction_result == 0) { - if (MOBY(moby)->state == 0x9) + if (MOBY(moby)->state == MOBY_STATE_SUCK_CANNON_ACTIVE) MOBY(moby)->state = 0x5; } else { - MOBY(moby)->state = 0x9; + MOBY(moby)->state = MOBY_STATE_SUCK_CANNON_ACTIVE; } return suction_result; } @@ -640,7 +656,7 @@ int cancel_suck_cannon_suction_and_set_moby_state_9(char *moby) __asm__("FUN_L00 int cancel_suck_cannon_suction_and_set_moby_state_9(char *moby) { int helper_result = cancel_suck_cannon_suction(moby); - MOBY(moby)->state = 0x9; + MOBY(moby)->state = MOBY_STATE_SUCK_CANNON_ACTIVE; return helper_result; } @@ -664,9 +680,13 @@ s32 get_moby_private_data_d0_address(T6 *moby) { void collect_moby_and_clear_path_keys(struct Moby *moby) __asm__("FUN_L00_002d5830"); void collect_moby_and_clear_path_keys(struct Moby *moby) { + enum { + PICKUP_MOBY_AVAILABLE = 1, + PICKUP_MOBY_COLLECTED = 2 + }; KeyVars *key_vars = (KeyVars *)moby->pvars; s32 i; - if (moby->state != 1) { + if (moby->state != PICKUP_MOBY_AVAILABLE) { return; } D_L00_001BA5D0.killed[(s16)moby->save_id] = moby->mission + 2; @@ -674,7 +694,7 @@ void collect_moby_and_clear_path_keys(struct Moby *moby) { D_0014C050[current_level_index][moby->mission] == 0xFF)) { D_L00_001BB230.killed[(s16)moby->save_id] = moby->mission + 2; } - moby->state = 2; + moby->state = PICKUP_MOBY_COLLECTED; moby->command = 1; moby->glow_color = 0x80208020; allocate_voice_for_target_entry(0, 0, moby); diff --git a/src/overlays/shared/enemies/large_amoeboid.c b/src/overlays/shared/enemies/large_amoeboid.c index 4f24519436..00ebd75d25 100644 --- a/src/overlays/shared/enemies/large_amoeboid.c +++ b/src/overlays/shared/enemies/large_amoeboid.c @@ -23,6 +23,23 @@ #include "rnc/overlay/shared/enemies/large_amoeboid_data/spawn_amoeboid_burst_sparks_2.h" #include "rnc/overlay/shared/enemies/large_amoeboid_data/spawn_amoeboid_burst_sparks.h" +enum { + LARGE_AMOEBOID_INITIALIZE = 0, + LARGE_AMOEBOID_TRY_ACQUIRE_TARGET_PATH = 1, + LARGE_AMOEBOID_MOVE_TOWARD_STORED_POSITION = 2, + LARGE_AMOEBOID_WAIT_FOR_PATH_ACQUISITION_ANIMATION_END = 3, + LARGE_AMOEBOID_FOLLOW_PATH_TO_TARGET = 4, + LARGE_AMOEBOID_RETURN_TO_STORED_POSITION = 5, + LARGE_AMOEBOID_LUNGE_AT_TARGET = 6, + LARGE_AMOEBOID_WAIT_FOR_ANIMATION_BEFORE_RESUMING_PATH = 7, + LARGE_AMOEBOID_PROCESS_KNOCKBACK = 8, + LARGE_AMOEBOID_WAIT_FOR_ANIMATION_BEFORE_RESTARTING_PATH = 9, + LARGE_AMOEBOID_WAIT_FOR_ACTIVATION_VOLUME = 13, + LARGE_AMOEBOID_PROCESS_SUCK_CANNON_INTERACTION = 14, + LARGE_AMOEBOID_MOVE_DIRECTLY_TOWARD_TARGET = 15, + LARGE_AMOEBOID_WAIT_WHILE_BLOCKED = 16 +}; + typedef struct LargeAmoeboidVars { u8 pad0[0x20]; f32 health; @@ -103,7 +120,7 @@ typedef struct { char pA8[0x58]; } Ent; -extern char D_L01_00167240[]; +extern char camera_pos[] __asm__("D_L01_00167240"); float absolute_float(float input) __asm__("func_001F99C0"); extern void FUN_0020c828(void *); extern int func_L00_001EFFF0_t(void *, void *, int, void *, void *) __asm__("FUN_001efa68"); @@ -153,8 +170,10 @@ extern void trooper_start_knockback(void *, void *, float, int, int, int) __asm__("FUN_L00_0025c558"); extern float D_0013F420[]; extern int D_001413D0[]; -extern const float D_L01_001619A0_gp __asm__("D_L01_001619A0") __attribute__((sda)); -extern const float D_L01_001619A4_gp __asm__("D_L01_001619A4") __attribute__((sda)); +extern const float l01_smaller_amoeboid_knockback_xy_scale __asm__("D_L01_001619A0") + __attribute__((sda)); +extern const float l01_smaller_amoeboid_knockback_z_scale __asm__("D_L01_001619A4") + __attribute__((sda)); extern const float frame_time_macro __asm__("D_0015ED6C"); extern short *l01_moby_index_lists_by_group[] __asm__("D_L01_001ABCC0"); @@ -220,22 +239,6 @@ void large_amoeboid_update(unsigned char *moby) __asm__("FUN_L01_002edca0"); /* Moby classes 572, 865, 866 */ void large_amoeboid_update(unsigned char *moby) { - enum { - LARGE_AMOEBOID_INITIALIZE = 0, - LARGE_AMOEBOID_TRY_ACQUIRE_TARGET_PATH = 1, - LARGE_AMOEBOID_MOVE_TOWARD_STORED_POSITION = 2, - LARGE_AMOEBOID_WAIT_FOR_PATH_ACQUISITION_ANIMATION_END = 3, - LARGE_AMOEBOID_FOLLOW_PATH_TO_TARGET = 4, - LARGE_AMOEBOID_RETURN_TO_STORED_POSITION = 5, - LARGE_AMOEBOID_LUNGE_AT_TARGET = 6, - LARGE_AMOEBOID_WAIT_FOR_ANIMATION_BEFORE_RESUMING_PATH = 7, - LARGE_AMOEBOID_PROCESS_KNOCKBACK = 8, - LARGE_AMOEBOID_WAIT_FOR_ANIMATION_BEFORE_RESTARTING_PATH = 9, - LARGE_AMOEBOID_WAIT_FOR_ACTIVATION_VOLUME = 13, - LARGE_AMOEBOID_PROCESS_SUCK_CANNON_INTERACTION = 14, - LARGE_AMOEBOID_MOVE_DIRECTLY_TOWARD_TARGET = 15, - LARGE_AMOEBOID_WAIT_WHILE_BLOCKED = 16 - }; enum { LARGE_AMOEBOID_LARGE_VARIANT = 0x23c, LARGE_AMOEBOID_MEDIUM_VARIANT = 0x361, @@ -257,7 +260,7 @@ void large_amoeboid_update(unsigned char *moby) { return; } FUN_L00_00263ac8(2.9f, moby, 0, &large_amoeboid_vars->unk270); - if (MOBY(moby)->visible != 0 && fast_vec_dist(&MOBY(moby)->pos, D_L01_00167240) < 28.0f) { + if (MOBY(moby)->visible != 0 && fast_vec_dist(&MOBY(moby)->pos, camera_pos) < 28.0f) { FUN_L00_0025a120(moby); MOBY(moby)->shadow_range = 0x16; } @@ -719,7 +722,7 @@ void process_amoeboid_hits_and_update_targeting(char *moby) { } resolve_moby_hit_response(moby, hit_record, &moby_vars->health, 0, &flag, &amount, 0, 4); if (flag != 1 && amount != 0.0f && MOBY(moby)->state != 0xB && MOBY(moby)->state != 0xA && - MOBY(moby)->state != 8) { + MOBY(moby)->state != LARGE_AMOEBOID_PROCESS_KNOCKBACK) { size_multiplier = 0.8f; allocate_voice_for_target_entry(0, 0, moby); hit_decrement = 1.0f; @@ -745,8 +748,8 @@ void process_amoeboid_hits_and_update_targeting(char *moby) { k = frame_time_macro; seven = 7.0f; *(float *)(q + 0x88) = moby_vars->size_scale * size_multiplier; - *(float *)(q + 0x78) = D_L01_001619A0_gp * k; - *(float *)(q + 0x7C) = D_L01_001619A4_gp * k; + *(float *)(q + 0x78) = l01_smaller_amoeboid_knockback_xy_scale * k; + *(float *)(q + 0x7C) = l01_smaller_amoeboid_knockback_z_scale * k; *(int *)(q + 0x84) = *(int *)(q + 0x84) | 4; *(float *)(q + 0xB0) = seven; *(float *)(q + 0xB4) = 13.0f; @@ -768,8 +771,8 @@ void process_amoeboid_hits_and_update_targeting(char *moby) { k = frame_time_macro; seven = 7.0f; *(float *)(q + 0x88) = moby_vars->size_scale * size_multiplier; - *(float *)(q + 0x78) = D_L01_001619A0_gp * k; - *(float *)(q + 0x7C) = D_L01_001619A4_gp * k; + *(float *)(q + 0x78) = l01_smaller_amoeboid_knockback_xy_scale * k; + *(float *)(q + 0x7C) = l01_smaller_amoeboid_knockback_z_scale * k; *(int *)(q + 0x84) = *(int *)(q + 0x84) | 4; *(float *)(q + 0xB0) = seven; *(float *)(q + 0xB4) = 13.0f; @@ -797,7 +800,7 @@ void process_amoeboid_hits_and_update_targeting(char *moby) { } MOBY(moby)->hit_slot = 0xFF; removal_height_entry_index = moby_vars->unk258; - if (removal_height_entry_index != 0 && MOBY(moby)->state != 0 && + if (removal_height_entry_index != 0 && MOBY(moby)->state != LARGE_AMOEBOID_INITIALIZE && MOBY(moby)->pos.z < *(float *)(removal_height_entry_index * 0x1190 + pool_draw_tiles + 8)) { clear_u64_value(&scratch_vector); spawn_amoeboid_burst_sparks((unsigned char *)moby, (float *)&scratch_vector); @@ -859,6 +862,9 @@ void process_amoeboid_hits_and_update_targeting(char *moby) { } char *activate_smaller_amoeboid(void *source_moby) { + enum { + LARGE_AMOEBOID_DORMANT = 12 + }; struct Moby *source_amoeboid = source_moby; short *list; char *entities; @@ -891,7 +897,8 @@ char *activate_smaller_amoeboid(void *source_moby) { group_index_or_list_entry = index; index &= 0x7FFF; smaller_amoeboid = (struct Moby *)(entities + (index << 8)); - if (smaller_amoeboid->state != 12 || smaller_amoeboid->oclass != next_class) + if (smaller_amoeboid->state != LARGE_AMOEBOID_DORMANT || + smaller_amoeboid->oclass != next_class) goto advance; { /* Retail reads both pvars pointers and update_dist before writing the entity. */ @@ -1089,13 +1096,13 @@ int process_amoeboid_suck_cannon_suction(struct Moby *moby) { if (suction_result != 0) { if (moby->oclass != 0x362) { return 0; - } else if (moby->state == 8) { + } else if (moby->state == LARGE_AMOEBOID_PROCESS_KNOCKBACK) { return 0; } else { - moby->state = 0xE; + moby->state = LARGE_AMOEBOID_PROCESS_SUCK_CANNON_INTERACTION; } - } else if (moby->state == 0xE) { - moby->state = 1; + } else if (moby->state == LARGE_AMOEBOID_PROCESS_SUCK_CANNON_INTERACTION) { + moby->state = LARGE_AMOEBOID_TRY_ACQUIRE_TARGET_PATH; } return suction_result; } @@ -1109,10 +1116,10 @@ int moby_hold_state_if_found(struct Moby *a) __asm__("FUN_L01_002efaf8"); int moby_hold_state_if_found(struct Moby *target_moby) { int suck_cannon_store_result = store_moby_in_suck_cannon(target_moby); if (suck_cannon_store_result == 0) { - if (target_moby->state == 0xe) - target_moby->state = 1; + if (target_moby->state == LARGE_AMOEBOID_PROCESS_SUCK_CANNON_INTERACTION) + target_moby->state = LARGE_AMOEBOID_TRY_ACQUIRE_TARGET_PATH; } else { - target_moby->state = 0xe; + target_moby->state = LARGE_AMOEBOID_PROCESS_SUCK_CANNON_INTERACTION; } return suck_cannon_store_result; } @@ -1124,7 +1131,7 @@ int cancel_suck_cannon_suction_and_set_state_14(struct Moby *moby) __asm__("FUN_ int cancel_suck_cannon_suction_and_set_state_14(struct Moby *moby) { int helper_result = cancel_suck_cannon_suction(moby); - moby->state = 0xe; + moby->state = LARGE_AMOEBOID_PROCESS_SUCK_CANNON_INTERACTION; return helper_result; } diff --git a/src/overlays/shared/enemies/paratrooper_fire_bolt.c b/src/overlays/shared/enemies/paratrooper_fire_bolt.c index 12f8c44e8a..cb3378fb6e 100644 --- a/src/overlays/shared/enemies/paratrooper_fire_bolt.c +++ b/src/overlays/shared/enemies/paratrooper_fire_bolt.c @@ -14,6 +14,11 @@ /* Ported from rac1-decomp (src/overlays/shared/vendor_002D3DF8.c: func_L08_00308650), where it is exact; names translated to the US level program. */ +enum { + FIRE_BOLT_STATE_FLYING = 1, + FIRE_BOLT_STATE_BURST_AND_REMOVE = 2 +}; + extern char *create_moby(int); char *spawn_paratrooper_projectile(char *initial_velocity, @@ -36,7 +41,7 @@ char *spawn_paratrooper_projectile(char *initial_velocity, MOBY(spawned_moby)->draw_dist = 0x7E; moby_data = ((char *)MOBY(spawned_moby)->pvars); MOBY(spawned_moby)->visible = 1; - MOBY(spawned_moby)->state = 1; + MOBY(spawned_moby)->state = FIRE_BOLT_STATE_FLYING; qcopy(&MOBY(spawned_moby)->pos, spawn_position); qcopy(moby_data, initial_velocity); *(int *)(moby_data + 0x18) = scale_game_frames(lifetime_frames); @@ -64,10 +69,6 @@ void fire_bolt_update(char *fire_bolt) __asm__("FUN_L08_00307298"); /* Moby class 1292 */ void fire_bolt_update(char *fire_bolt) { - enum { - FIRE_BOLT_STATE_FLYING = 1, - FIRE_BOLT_STATE_BURST_AND_REMOVE = 2 - }; char *bolt_data = *(char **)(fire_bolt + 0x78); float previous_position[4]; float sc[4]; diff --git a/src/overlays/shared/enemies/path_or_ballistic_debris.c b/src/overlays/shared/enemies/path_or_ballistic_debris.c index b816fd5cf3..bcfc8b9bb9 100644 --- a/src/overlays/shared/enemies/path_or_ballistic_debris.c +++ b/src/overlays/shared/enemies/path_or_ballistic_debris.c @@ -19,6 +19,11 @@ #include "qcopy.h" #include "rnc/overlay/shared/rendering/effects/update_three_phase_effect_particle.h" +enum { + DEBRIS_STATE_FOLLOW_PATH = 0, + DEBRIS_STATE_BALLISTIC = 1 +}; + extern float D_0015ED60; extern s32 coll_sphere(f32, void *, s32, void *) __asm__("FUN_L00_001f0d60"); extern int sample_path(void *, void *, void *, void *, int, float) __asm__("FUN_L00_0025d808"); @@ -76,7 +81,7 @@ void path_or_ballistic_debris_update(struct Moby *moby) { void *points; f32 speed; - if (moby->state == 0) { + if (moby->state == DEBRIS_STATE_FOLLOW_PATH) { points = l14_splines[debris_private_vars->path].path; qcopy(&probe, &moby->pos); sample_path(points, @@ -342,7 +347,7 @@ void emit_debris_trail_particles(Moby *moby) { particle_initial_velocity.f[1] = debris_motion_state->f1C; particle_initial_velocity.f[2] = 0.0f; particle_initial_velocity.f[3] = 1.0f; - if (moby->state == 0) { + if (moby->state == DEBRIS_STATE_FOLLOW_PATH) { fast_vec_normalize(&emission_axis_offset, &*(Vec4_2E17B8 *)&moby->rot_row2, 0.95f); } else { fast_vec_normalize(&emission_axis_offset, &*(Vec4_2E17B8 *)&moby->rot_row2, 1.15f); @@ -353,7 +358,7 @@ void emit_debris_trail_particles(Moby *moby) { emission_position_offset.f[1] = fast_sin(moby->rot.z) * 0.3f; emission_position_offset.f[2] = 0.0f; fast_vec_add(&pos, &pos, &emission_position_offset); - if (moby->state == 1) { + if (moby->state == DEBRIS_STATE_BALLISTIC) { pos.f[0] += randf_sym(0.0f, 0.1f); pos.f[1] += randf_sym(0.0f, 0.1f); } diff --git a/src/overlays/shared/enemies/plasmabot.c b/src/overlays/shared/enemies/plasmabot.c index ff549d47eb..8ac217a5d3 100644 --- a/src/overlays/shared/enemies/plasmabot.c +++ b/src/overlays/shared/enemies/plasmabot.c @@ -33,6 +33,27 @@ /* Ported from rac1-decomp (src/overlays/shared/vendor_002B2A28.c: func_L14_002B44B8), where it is exact; names translated to the US level program. */ +enum { + PLASMABOT_INITIALIZE = 0, + PLASMABOT_WAIT_TO_START_PATH_TRAVERSAL = 1, + PLASMABOT_START_PATH_TRAVERSAL = 2, + PLASMABOT_FOLLOW_PATH_FORWARD = 3, + PLASMABOT_AIM_AT_TARGET = 4, + PLASMABOT_WAIT_ANIMATION_BEFORE_AIM_SWEEP = 5, + PLASMABOT_SWEEP_AIM_AND_TRACE_LINE = 6, + PLASMABOT_WAIT_ANIMATION_BEFORE_AIM = 7, + PLASMABOT_FOLLOW_PATH_BACKWARD = 8, + PLASMABOT_RETURN_TO_PATH_START = 9, + PLASMABOT_WAIT_ANIMATION_BEFORE_RESUMING_AIM = 10, + PLASMABOT_FALL_THEN_EXPLODE = 11, + PLASMABOT_SPAWN_DEBRIS_AND_REMOVE = 12, + PLASMABOT_FACE_TARGET_AND_WAIT = 13 +}; + +enum { + HIT_KIND_SKIP_DAMAGE_AND_REACTION = 1 +}; + typedef struct PlasmabotVars { u8 pad0[0x20]; f32 health; @@ -188,7 +209,7 @@ void scale_and_apply_plasmabot_planar_velocity(char *moby) { /* steers the pitch angle of a moby toward a target and updates the joint */ /* Ported from rac1-decomp (src/overlays/shared/vendor_002B2A28.c: func_L14_002B4A00), where it is exact; names translated to the US level program. */ -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); void update_plasmabot_aim_joint_rotation(char *moby, float x) __asm__("FUN_L14_002b37b0"); @@ -210,7 +231,7 @@ void update_plasmabot_aim_joint_rotation(char *moby, float x) { k, frame_time * 6.2831854820251465f); } - FUN_L00_001fff28(&moby_vars->unk130, 2, *(float *)&moby_vars->unk270); + build_axis_rotation_quaternion(&moby_vars->unk130, 2, *(float *)&moby_vars->unk270); } /* Ported from rac1-decomp (src/overlays/shared/vendor_002B2A28.c: func_L14_002B4AE0), where it is exact; names translated to the US level program. */ @@ -334,22 +355,6 @@ void plasmabot_update(char *moby) __asm__("FUN_L14_002b17d8"); /* Moby class 28 */ void plasmabot_update(char *moby) { - enum { - PLASMABOT_INITIALIZE = 0, - PLASMABOT_WAIT_TO_START_PATH_TRAVERSAL = 1, - PLASMABOT_START_PATH_TRAVERSAL = 2, - PLASMABOT_FOLLOW_PATH_FORWARD = 3, - PLASMABOT_AIM_AT_TARGET = 4, - PLASMABOT_WAIT_ANIMATION_BEFORE_AIM_SWEEP = 5, - PLASMABOT_SWEEP_AIM_AND_TRACE_LINE = 6, - PLASMABOT_WAIT_ANIMATION_BEFORE_AIM = 7, - PLASMABOT_FOLLOW_PATH_BACKWARD = 8, - PLASMABOT_RETURN_TO_PATH_START = 9, - PLASMABOT_WAIT_ANIMATION_BEFORE_RESUMING_AIM = 10, - PLASMABOT_FALL_THEN_EXPLODE = 11, - PLASMABOT_SPAWN_DEBRIS_AND_REMOVE = 12, - PLASMABOT_FACE_TARGET_AND_WAIT = 13 - }; PlasmabotVars *plasmabot_update_private_vars; char *plasmabot_aim_target_moby; int state; @@ -794,7 +799,8 @@ void plasmabot_update(char *moby) { } } state = ((unsigned char *)moby)[0x20]; - if (!(state >= 4 && state <= 7) && state != 1) { + if (!(state >= PLASMABOT_AIM_AT_TARGET && state <= PLASMABOT_WAIT_ANIMATION_BEFORE_AIM) && + state != PLASMABOT_WAIT_TO_START_PATH_TRAVERSAL) { update_plasmabot_aim_quaternion(moby, 0, MOBY(moby)->rot.z); update_plasmabot_aim_joint_rotation(moby, MOBY(moby)->rot.z); } @@ -1108,7 +1114,7 @@ void process_plasmabot_hit_reaction(struct Moby *moby) { hit_info = 0; } reaction_outcome = hit_reaction(moby, hit_info, &state->health, 0, &hit_kind, &damage, 0, 4); - if (hit_kind != 1 && ((unsigned char *)moby)[0x20] != 0xB) { + if (hit_kind != HIT_KIND_SKIP_DAMAGE_AND_REACTION && ((unsigned char *)moby)[0x20] != 0xB) { state->health -= damage; if (state->health <= 0.0f) reaction_outcome = 1; @@ -1125,7 +1131,7 @@ void process_plasmabot_hit_reaction(struct Moby *moby) { int stagger_duration_frames; float frame_duration, stagger_motion_z, k; release_beam_slot_by_id(moby); - moby->state = 0xA; + moby->state = PLASMABOT_WAIT_ANIMATION_BEFORE_RESUMING_AIM; stagger_duration_frames = scale_game_frames(0x3C); frame_duration = frame_time; stagger_motion_z = plasmabot_stagger_motion_z_scale_gp * frame_duration; @@ -1149,9 +1155,9 @@ void process_plasmabot_hit_reaction(struct Moby *moby) { case HIT_REACTION_DEATH: { float y; if (*(int *)(hit_info + 0x24) & 0x800000) { - moby->state = 0xC; + moby->state = PLASMABOT_SPAWN_DEBRIS_AND_REMOVE; } else { - moby->state = 0xB; + moby->state = PLASMABOT_FALL_THEN_EXPLODE; } moby->flags &= 0xEFFF; { @@ -1257,7 +1263,7 @@ float update_plasmabot_aim_quaternion(char *moby, int flag, float target_angle) yaw_easing_coefficient, frame_time * 6.2831854820251465f); } - FUN_L00_001fff28(&state->unk170, 2, state->unk268); + build_axis_rotation_quaternion(&state->unk170, 2, state->unk268); if (flag) { float owner_aim_position[4]; float owner_aim_offset[4]; @@ -1281,7 +1287,7 @@ float update_plasmabot_aim_quaternion(char *moby, int flag, float target_angle) frame_time_sq * 12.566370964050293f, frame_time * 6.2831854820251465f); cp = pitch_quaternion; - FUN_L00_001fff28(cp, 1, *(float *)&state->unk280); + build_axis_rotation_quaternion(cp, 1, *(float *)&state->unk280); multiply_quaternions(&state->unk170, &state->unk170, cp); } return fast_difference_between_rotations(turn, state->unk268); @@ -1322,7 +1328,7 @@ int check_listed_plasmabots_not_starting_path_traversal(unsigned char *source_mo return 1; do { char *moby = D_L14_0015FFD8 + ((*moby_list_entry & 0x7FFF) << 8); - if (MOBY(moby)->oclass == 0x1C && MOBY(moby)->state == 2) + if (MOBY(moby)->oclass == 0x1C && MOBY(moby)->state == PLASMABOT_START_PATH_TRAVERSAL) return 0; } while ((short)*moby_list_entry++ >= 0); return 1; diff --git a/src/overlays/shared/enemies/plasmabot_death_debris.c b/src/overlays/shared/enemies/plasmabot_death_debris.c index f51715f734..d7de1045ce 100644 --- a/src/overlays/shared/enemies/plasmabot_death_debris.c +++ b/src/overlays/shared/enemies/plasmabot_death_debris.c @@ -220,7 +220,7 @@ typedef struct { } GlowQuad_bfa8; extern GlowVec_bfa8 l01_moby_offset_quad_source_corners[4] __asm__("D_L01_0020B9D0"); -extern char D_L01_00167240[]; +extern char camera_pos[] __asm__("D_L01_00167240"); extern GlowVec_bfa8 D_0013F5E0[]; extern f32 moby_quad_c0_offset_scale_gp __asm__("D_L01_00162064") __attribute__((sda)); @@ -273,7 +273,7 @@ void draw_moby_offset_textured_quad(char *moby) { fast_vec_add(&local.basis.offset, &local.basis.offset, &local.basis.partial); basis_axis_or_source_corner = &local.basis.mat0; fast_vec_add(&local.basis.point, &local.basis.offset, &MOBY(moby)->pos); - fast_vec_sub(basis_axis_or_source_corner, D_L01_00167240, &local.basis.point); + fast_vec_sub(basis_axis_or_source_corner, camera_pos, &local.basis.point); fast_vec_normalize(basis_axis_or_source_corner, basis_axis_or_source_corner, one); basis_axis_or_quad_corner = &local.basis.mat1; fast_vec_cross(basis_axis_or_quad_corner, basis_axis_or_source_corner, D_0013F5E0); diff --git a/src/overlays/shared/enemies/plasmabot_hatch.c b/src/overlays/shared/enemies/plasmabot_hatch.c index 53d9dcb12f..98e79b3de6 100644 --- a/src/overlays/shared/enemies/plasmabot_hatch.c +++ b/src/overlays/shared/enemies/plasmabot_hatch.c @@ -10,6 +10,17 @@ #include "rnc/mobys/animation/set_moby_animation.h" #include "qcopy.h" +enum { + HATCH_WAIT_ACTIVATION = 0, + HATCH_WAIT_ACTIVATION_DELAY = 1, + HATCH_WAIT_ACTIVATION_ANIMATION = 2, + HATCH_WAIT_ACTIVATION_GATE_CLEAR = 3, + HATCH_IDLE_AFTER_ACTIVATION_GATE_CLEAR = 4, + HATCH_WAIT_ANIMATION_BEFORE_RESET_DELAY = 5, + HATCH_WAIT_RESET_DELAY = 6, + HATCH_WAIT_RESET_ANIMATION = 7 +}; + extern u8 *D_L14_00167500 NOT_SDA; extern char *D_L14_ffd0_e_macro[] __asm__("D_L14_0015FFD0") MACRO_ADDR; @@ -17,18 +28,8 @@ void plasmabot_hatch_update(struct Moby *moby) __asm__("FUN_L14_002d96e0"); /* Moby class 250 */ void plasmabot_hatch_update(struct Moby *moby) { - enum { - HATCH_WAIT_ACTIVATION = 0, - HATCH_WAIT_ACTIVATION_DELAY = 1, - HATCH_WAIT_ACTIVATION_ANIMATION = 2, - HATCH_WAIT_ACTIVATION_GATE_CLEAR = 3, - HATCH_IDLE_AFTER_ACTIVATION_GATE_CLEAR = 4, - HATCH_WAIT_ANIMATION_BEFORE_RESET_DELAY = 5, - HATCH_WAIT_RESET_DELAY = 6, - HATCH_WAIT_RESET_ANIMATION = 7 - }; char *hatch_private_vars = (char *)moby->pvars; - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { moby->collision = 0; } else { moby->collision = moby->pclass->collision; @@ -36,45 +37,45 @@ void plasmabot_hatch_update(struct Moby *moby) { switch (moby->state) { case HATCH_WAIT_ACTIVATION: if (*(s32 *)hatch_private_vars != 0 && *(s16 *)(D_L14_00167500 + 0x86) == 0x14) { - moby->state = 1; + moby->state = HATCH_WAIT_ACTIVATION_DELAY; *(s32 *)(hatch_private_vars + 8) = scale_game_frames(*(s32 *)(hatch_private_vars + 4)); } break; case HATCH_WAIT_ACTIVATION_DELAY: if (fast_dec_timer(hatch_private_vars + 8) != 0) { - moby->state = 2; + moby->state = HATCH_WAIT_ACTIVATION_ANIMATION; set_moby_animation(moby, 1, 0); } break; case HATCH_WAIT_ACTIVATION_ANIMATION: if ((moby->anim_flags & 2) != 0) { - moby->state = 3; + moby->state = HATCH_WAIT_ACTIVATION_GATE_CLEAR; set_moby_animation(moby, 2, 0); } break; case HATCH_WAIT_ACTIVATION_GATE_CLEAR: if (*(s16 *)(D_L14_00167500 + 0x86) != 0x14) { set_moby_animation(moby, 0, 0); - moby->state = 4; + moby->state = HATCH_IDLE_AFTER_ACTIVATION_GATE_CLEAR; } break; case HATCH_IDLE_AFTER_ACTIVATION_GATE_CLEAR: break; case HATCH_WAIT_ANIMATION_BEFORE_RESET_DELAY: if ((moby->anim_flags & 2) != 0) { - moby->state = 6; + moby->state = HATCH_WAIT_RESET_DELAY; set_moby_animation(moby, 2, 0); } break; case HATCH_WAIT_RESET_DELAY: if (fast_dec_timer(hatch_private_vars + 8) != 0) { set_moby_animation(moby, 3, 0); - moby->state = 7; + moby->state = HATCH_WAIT_RESET_ANIMATION; } break; case HATCH_WAIT_RESET_ANIMATION: if ((moby->anim_flags & 2) != 0) { - moby->state = 0; + moby->state = HATCH_WAIT_ACTIVATION; set_moby_animation(moby, 0, 0); } break; @@ -106,11 +107,11 @@ int refresh_plasmabot_hatch_reset_delay(int i) { struct Moby *moby = (unsigned char *)(D_L14_ffd0_e_macro[2] + i * 256); int *hatch_vars = ((int *)moby->pvars); int hatch_reset_delay_active = 0; - if (moby->state == 0) { - moby->state = 5; + if (moby->state == HATCH_WAIT_ACTIVATION) { + moby->state = HATCH_WAIT_ANIMATION_BEFORE_RESET_DELAY; set_moby_animation(moby, 1, 0); } else { - hatch_reset_delay_active = moby->state == 6; + hatch_reset_delay_active = moby->state == HATCH_WAIT_RESET_DELAY; } hatch_vars[2] = scale_game_frames(0x3C); return hatch_reset_delay_active; diff --git a/src/overlays/shared/enemies/sand_mouse.c b/src/overlays/shared/enemies/sand_mouse.c index 6c8168f4cb..426b2459ad 100644 --- a/src/overlays/shared/enemies/sand_mouse.c +++ b/src/overlays/shared/enemies/sand_mouse.c @@ -25,6 +25,18 @@ #include "rnc/overlay/shared/enemies/sand_mouse_data/sand_mouse_update.h" #include "rnc/world/collision/collision_line.h" +enum { + SAND_MOUSE_INITIALIZE = 0, + SAND_MOUSE_WAIT_FOR_HERO_IN_VOLUME = 1, + SAND_MOUSE_WAIT_FOR_PARENT_READY = 2, + SAND_MOUSE_MOVE_TOWARD_HERO = 3, + SAND_MOUSE_BEGIN_FOLLOW_HERO = 4, + SAND_MOUSE_FOLLOW_HERO = 5, + SAND_MOUSE_FADE_OUT_AND_RESET_HOME = 6, + SAND_MOUSE_DAMP_VELOCITY_BEFORE_RETURN = 19, + SAND_MOUSE_RETURN_TO_PARENT = 20 +}; + typedef struct { float a[4]; } Vs __attribute__((aligned(16))); @@ -356,7 +368,7 @@ void update_hover_moby_steering(struct Moby *moby, char *movement_state) { struct Moby *target; fast_vec_sub(&velocity_adjustment, movement_state, &moby->pos); - if (moby->state == 6) + if (moby->state == SAND_MOUSE_FADE_OUT_AND_RESET_HOME) reference_distance = vector_distance_xy(&moby->pos, movement_state + 0x30); else reference_distance = vector_distance_xy(&moby->pos, &hero.motion.pos); @@ -421,7 +433,7 @@ void update_hover_moby_steering(struct Moby *moby, char *movement_state) { velocity_adjustment.f[2] *= frame_scale * -0.100000024f + 1.0f; fast_vec_add( ((f32 *)(movement_state + 0x10)), ((f32 *)(movement_state + 0x10)), &velocity_adjustment); - if (moby->state == 6) + if (moby->state == SAND_MOUSE_FADE_OUT_AND_RESET_HOME) clamp_vector_length( ((f32 *)(movement_state + 0x10)), ((f32 *)(movement_state + 0x10)), frame_time * 2.7f); hit = move_moby_with_collision_integer_radius(moby, @@ -466,7 +478,7 @@ void update_hover_moby_steering(struct Moby *moby, char *movement_state) { } } collision_done: - if (moby->state == 6 || !(reference_distance < 1.1f)) + if (moby->state == SAND_MOUSE_FADE_OUT_AND_RESET_HOME || !(reference_distance < 1.1f)) return; near = 1.1f - reference_distance; direction_yaw = @@ -486,17 +498,6 @@ void sand_mouse_update(struct Moby *moby) __asm__("FUN_L01_002e3f20"); /* Moby class 437 */ void sand_mouse_update(struct Moby *moby) { - enum { - SAND_MOUSE_INITIALIZE = 0, - SAND_MOUSE_WAIT_FOR_HERO_IN_VOLUME = 1, - SAND_MOUSE_WAIT_FOR_PARENT_READY = 2, - SAND_MOUSE_MOVE_TOWARD_HERO = 3, - SAND_MOUSE_BEGIN_FOLLOW_HERO = 4, - SAND_MOUSE_FOLLOW_HERO = 5, - SAND_MOUSE_FADE_OUT_AND_RESET_HOME = 6, - SAND_MOUSE_DAMP_VELOCITY_BEFORE_RETURN = 19, - SAND_MOUSE_RETURN_TO_PARENT = 20 - }; Data *sand_mouse_vars; float va[4]; float vb[4]; @@ -510,7 +511,7 @@ void sand_mouse_update(struct Moby *moby) { return; } if (sand_mouse_vars->parent != -1) { - if (moby->state >= 5) { + if (moby->state >= SAND_MOUSE_FOLLOW_HERO) { ((Data *)((struct Moby *)ents)[sand_mouse_vars->parent].pvars)->target[0] = fast_arc_tan(moby->pos.x - ((struct Moby *)ents)[sand_mouse_vars->parent].pos.x, moby->pos.y - ((struct Moby *)ents)[sand_mouse_vars->parent].pos.y); @@ -577,7 +578,7 @@ void sand_mouse_update(struct Moby *moby) { mover_2e3f20.unk48 = scale_game_frames(4); mover_2e3f20.unk28 = 3.1415927f; } - moby->state = 1; + moby->state = SAND_MOUSE_WAIT_FOR_HERO_IN_VOLUME; moby->draw_dist = 0; break; case SAND_MOUSE_WAIT_FOR_HERO_IN_VOLUME: @@ -623,10 +624,10 @@ void sand_mouse_update(struct Moby *moby) { set_hero_animation(0, 0, (float)scale_game_frames(6)); if (sand_mouse_vars->parent != -1) { ((struct Moby *)ents)[sand_mouse_vars->parent].command = 5; - moby->state = 2; + moby->state = SAND_MOUSE_WAIT_FOR_PARENT_READY; } else { moby->draw_dist = 0xFF; - moby->state = 3; + moby->state = SAND_MOUSE_MOVE_TOWARD_HERO; } } } @@ -636,14 +637,14 @@ void sand_mouse_update(struct Moby *moby) { case SAND_MOUSE_WAIT_FOR_PARENT_READY: if (sand_mouse_vars->parent != -1) { if (((struct Moby *)ents)[sand_mouse_vars->parent].state == 5) { - moby->state = 3; + moby->state = SAND_MOUSE_MOVE_TOWARD_HERO; sand_mouse_vars->timer = 0; moby->draw_dist = 0xFF; } } else { sand_mouse_vars->timer = 0; moby->draw_dist = 0xFF; - moby->state = 3; + moby->state = SAND_MOUSE_MOVE_TOWARD_HERO; } break; case SAND_MOUSE_MOVE_TOWARD_HERO: @@ -660,7 +661,7 @@ void sand_mouse_update(struct Moby *moby) { 6) || vector_distance_xy(((float *)&moby->pos), hero_2e3f20->pos) < 1.0f) { qzero(sand_mouse_vars->vel); - moby->state = 4; + moby->state = SAND_MOUSE_BEGIN_FOLLOW_HERO; sand_mouse_vars->timer = scale_game_frames(0x78); } if (vector_distance_xy(((float *)&moby->pos), sand_mouse_vars->home) > 0.4f && @@ -677,7 +678,7 @@ void sand_mouse_update(struct Moby *moby) { if (sand_mouse_vars->parent != -1) { ((struct Moby *)ents)[sand_mouse_vars->parent].flags &= 0xFFBE; } - moby->state = 5; + moby->state = SAND_MOUSE_FOLLOW_HERO; if (hero_2e3f20->helper != 0 && hero_2e3f20->helper->oclass == 0x1B1 && hero_2e3f20->helper->state != 0xFE && hero_2e3f20->helper->state != 0xFD) { sand_mouse_vars->b48 = 0xFF; @@ -697,7 +698,7 @@ void sand_mouse_update(struct Moby *moby) { } qzero(sand_mouse_vars->vel); sand_mouse_vars->timer = sand_mouse_fade_duration_frames_gp; - moby->state = 6; + moby->state = SAND_MOUSE_FADE_OUT_AND_RESET_HOME; if (sand_mouse_vars->parent != -1) { ((struct Moby *)ents)[sand_mouse_vars->parent].command = 5; } @@ -710,7 +711,7 @@ void sand_mouse_update(struct Moby *moby) { qcopy(((float *)&moby->pos), sand_mouse_vars->home); qcopy(sand_mouse_vars->target, sand_mouse_vars->home); qzero(sand_mouse_vars->vel); - moby->state = 0x13; + moby->state = SAND_MOUSE_DAMP_VELOCITY_BEFORE_RETURN; moby->flags &= 0xFDFF; } else { int cr; @@ -761,7 +762,7 @@ void sand_mouse_update(struct Moby *moby) { qzero(sand_mouse_vars->vel); qcopy(sand_mouse_vars->target, ((float *)&((struct Moby *)ents)[sand_mouse_vars->parent].pos)); - moby->state = 0x14; + moby->state = SAND_MOUSE_RETURN_TO_PARENT; } break; case SAND_MOUSE_RETURN_TO_PARENT: { @@ -785,7 +786,7 @@ void sand_mouse_update(struct Moby *moby) { blend_moby_animation(moby, 0, 0, scale_game_frames(6)); } ((struct Moby *)ents)[sand_mouse_vars->parent].command = 1; - moby->state = 1; + moby->state = SAND_MOUSE_WAIT_FOR_HERO_IN_VOLUME; moby->draw_dist = 0; } } break; diff --git a/src/overlays/shared/enemies/sandmouse.c b/src/overlays/shared/enemies/sandmouse.c index aad8140528..0acfdea342 100644 --- a/src/overlays/shared/enemies/sandmouse.c +++ b/src/overlays/shared/enemies/sandmouse.c @@ -19,6 +19,17 @@ #include "rnc/overlay/shared/world/collision.h" #include "rnc/overlay/shared/game/level_save_state.h" +enum { + SANDMOUSE_STATE_INITIALIZE = 0, + SANDMOUSE_STATE_WAIT_FOR_ACTIVATION = 1, + SANDMOUSE_STATE_WAIT_FOR_LINK = 2, + SANDMOUSE_STATE_MOVE_TO_GOAL = 3, + SANDMOUSE_STATE_BEGIN_FOLLOW_HERO_AND_FIRE = 4, + SANDMOUSE_STATE_FOLLOW_HERO_AND_FIRE = 5, + SANDMOUSE_STATE_FADE_OUT = 6, + SANDMOUSE_STATE_RESET = 7 +}; + extern void mark_moby_for_removal(void *) __asm__("FUN_0020c828"); /* offset a position by two camera-relative vectors, then raise z by 1 */ @@ -72,6 +83,9 @@ struct Moby *select_sandmouse_projectile_target(struct Moby *moby, f32 nearYaw, f32 nearPitch) { + enum { + TARGET_KIND_LOCK_ON = 5 + }; f32 tp[4]; struct Moby *best = 0; f32 bestScore = 1.0e9f; @@ -90,7 +104,7 @@ struct Moby *select_sandmouse_projectile_target(struct Moby *moby, if (candidate_moby == 0 || candidate_moby->pclass == 0) continue; candidate_target_kind = ((TargetClass *)candidate_moby->pclass)->kind; - if (candidate_target_kind != 5 || hp == 0 || !(0.0f < *hp)) + if (candidate_target_kind != TARGET_KIND_LOCK_ON || hp == 0 || !(0.0f < *hp)) continue; candidate_distance = fast_vec_dist(from, &candidate_moby->pos); if (!(candidate_distance < range)) @@ -296,7 +310,7 @@ void update_sandmouse_hover_movement(struct Moby *moby, struct HoverVars *hover_ struct HoverTuning *hover_tuning; fast_vec_sub(&steering_correction, hover_vars, &moby->pos); - if (moby->state == 6) { + if (moby->state == SANDMOUSE_STATE_FADE_OUT) { reference_distance = vector_distance_xy(&moby->pos, &hover_vars->unk30); } else { reference_distance = vector_distance_xy(&moby->pos, &hero.motion.pos); @@ -346,7 +360,7 @@ void update_sandmouse_hover_movement(struct Moby *moby, struct HoverVars *hover_ } steering_correction.f[2] *= frame_scale * -0.100000024f + 1.0f; fast_vec_add(&hover_vars->vel, &hover_vars->vel, &steering_correction); - if (moby->state == 6) { + if (moby->state == SANDMOUSE_STATE_FADE_OUT) { clamp_vector_length(&hover_vars->vel, &hover_vars->vel, frame_time * 2.7f); } hover_tuning = &D_L01_001DEB38; @@ -491,9 +505,9 @@ extern char D_L01_0020BA30[] NOT_SDA; extern float fast_vec_dist(void *, void *); extern int debug_print() __asm__("FUN_001e93b0"); extern int FUN_L00_00257b90(int, int); -extern int FUN_L00_00259028(void *, void *, void *, void *); -extern s32 collision_line(void *, void *, s32, void *, s32); -extern s32 rand(void); +extern int step_mover_2e3f20(void *, void *, void *, void *) __asm__("FUN_L00_00259028"); +extern s32 collision_line(void *, void *, s32, void *, s32); +extern s32 rand(void); extern short sandmouse_follow_duration_frames_gp __asm__("D_L01_00162098") __attribute__((sda)); extern short sandmouse_projectile_count_limit_gp __asm__("D_L01_0016209C") __attribute__((sda)); extern short sandmouse_fade_duration_frames_gp __asm__("D_L01_001620A4") __attribute__((sda)); @@ -527,16 +541,6 @@ void sandmouse_update(Moby *m) __asm__("FUN_L01_0030df40"); /* Moby class 1818 */ void sandmouse_update(Moby *sandmouse_moby) { - enum { - SANDMOUSE_STATE_INITIALIZE = 0, - SANDMOUSE_STATE_WAIT_FOR_ACTIVATION = 1, - SANDMOUSE_STATE_WAIT_FOR_LINK = 2, - SANDMOUSE_STATE_MOVE_TO_GOAL = 3, - SANDMOUSE_STATE_BEGIN_FOLLOW_HERO_AND_FIRE = 4, - SANDMOUSE_STATE_FOLLOW_HERO_AND_FIRE = 5, - SANDMOUSE_STATE_FADE_OUT = 6, - SANDMOUSE_STATE_RESET = 7 - }; Pv *sandmouse_vars; f32 goal_bearing_yaw; int dv; @@ -547,7 +551,7 @@ void sandmouse_update(Moby *sandmouse_moby) { if (sandmouse_vars == 0) return; if (sandmouse_vars->link != -1) { - if (sandmouse_moby->state >= 5) { + if (sandmouse_moby->state >= SANDMOUSE_STATE_FOLLOW_HERO_AND_FIRE) { *(f32 *)LNK(sandmouse_vars->link)->pvars = fast_arc_tan(sandmouse_moby->pos.x - LNK(sandmouse_vars->link)->pos.x, sandmouse_moby->pos.y - LNK(sandmouse_vars->link)->pos.y); @@ -561,7 +565,7 @@ void sandmouse_update(Moby *sandmouse_moby) { LNK(sandmouse_vars->link)->collision = 0; } } - if (sandmouse_moby->state >= 3) { + if (sandmouse_moby->state >= SANDMOUSE_STATE_MOVE_TO_GOAL) { if (big_head_cheat_enabled != 0) { if (*((u8 *)sandmouse_vars + 0x91) == 0) { attach_manipulator(sandmouse_moby, 5, (u8 *)sandmouse_vars + 0x90); @@ -620,7 +624,7 @@ void sandmouse_update(Moby *sandmouse_moby) { D_L01_001DEB38_lui.unk44 = frame_time * 11.519173f; D_L01_001DEB38_lui.unk48 = scale_game_frames(4); D_L01_001DEB38_lui.unk28 = 3.1415927f; - sandmouse_moby->state = 1; + sandmouse_moby->state = SANDMOUSE_STATE_WAIT_FOR_ACTIVATION; sandmouse_moby->draw_dist = 0; break; case SANDMOUSE_STATE_WAIT_FOR_ACTIVATION: @@ -682,13 +686,13 @@ void sandmouse_update(Moby *sandmouse_moby) { set_hero_animation((float)scale_game_frames(6), 0, 0); if (sandmouse_vars->link != -1) { LNK(sandmouse_vars->link)->command = 5; - sandmouse_moby->state = 2; + sandmouse_moby->state = SANDMOUSE_STATE_WAIT_FOR_LINK; } else { sandmouse_moby->draw_dist = 0xFF; if (sandmouse_moby->prev_seq != 0) { blend_moby_animation(sandmouse_moby, 0, 0, scale_game_frames(10)); } - sandmouse_moby->state = 3; + sandmouse_moby->state = SANDMOUSE_STATE_MOVE_TO_GOAL; } } } @@ -699,7 +703,7 @@ void sandmouse_update(Moby *sandmouse_moby) { if (sandmouse_moby->prev_seq != 0) { blend_moby_animation(sandmouse_moby, 0, 0, scale_game_frames(10)); } - sandmouse_moby->state = 3; + sandmouse_moby->state = SANDMOUSE_STATE_MOVE_TO_GOAL; sandmouse_vars->timer = 0; sandmouse_moby->draw_dist = 0xFF; } @@ -713,7 +717,7 @@ void sandmouse_update(Moby *sandmouse_moby) { sandmouse_vars->slot = allocate_voice_for_target_entry(1, 4, (struct VoiceTarget *)sandmouse_moby); } - sandmouse_moby->state = 3; + sandmouse_moby->state = SANDMOUSE_STATE_MOVE_TO_GOAL; } break; case SANDMOUSE_STATE_MOVE_TO_GOAL: { @@ -744,7 +748,7 @@ void sandmouse_update(Moby *sandmouse_moby) { frame_time_sq * 3.1415927f, frame_time * 11.519173f); sandmouse_vars->vel.f[2] = 0; - movement_result_flags = FUN_L00_00259028( + movement_result_flags = step_mover_2e3f20( sandmouse_moby, &D_L01_001DEB38_lui, sandmouse_vars, &sandmouse_vars->vel); } if ((movement_result_flags & 6) != 0 || @@ -753,7 +757,7 @@ void sandmouse_update(Moby *sandmouse_moby) { blend_moby_animation(sandmouse_moby, 2, 0, scale_game_frames(10)); } qzero(&sandmouse_vars->vel); - sandmouse_moby->state = 4; + sandmouse_moby->state = SANDMOUSE_STATE_BEGIN_FOLLOW_HERO_AND_FIRE; sandmouse_vars->timer = scale_game_frames(0x78); } if (sandmouse_moby->anim_flags & 2) { @@ -778,7 +782,7 @@ void sandmouse_update(Moby *sandmouse_moby) { if (sandmouse_vars->link != -1) { LNK(sandmouse_vars->link)->flags &= 0xFFBE; } - sandmouse_moby->state = 5; + sandmouse_moby->state = SANDMOUSE_STATE_FOLLOW_HERO_AND_FIRE; break; case SANDMOUSE_STATE_FOLLOW_HERO_AND_FIRE: { char *v = VOICE(sandmouse_vars->slot); @@ -821,7 +825,7 @@ void sandmouse_update(Moby *sandmouse_moby) { } sandmouse_vars->slot = -1; allocate_voice_for_target_entry(2, 0, (struct VoiceTarget *)sandmouse_moby); - sandmouse_moby->state = 6; + sandmouse_moby->state = SANDMOUSE_STATE_FADE_OUT; if (sandmouse_vars->link != -1) { LNK(sandmouse_vars->link)->command = 5; } @@ -842,7 +846,7 @@ void sandmouse_update(Moby *sandmouse_moby) { qcopy(&sandmouse_moby->pos, &sandmouse_vars->a30); qcopy(sandmouse_vars, &sandmouse_vars->a30); qzero(&sandmouse_vars->vel); - sandmouse_moby->state = 7; + sandmouse_moby->state = SANDMOUSE_STATE_RESET; sandmouse_moby->flags &= 0xFDFF; } else { Vec4 pos; @@ -905,13 +909,13 @@ void sandmouse_update(Moby *sandmouse_moby) { blend_moby_animation(sandmouse_moby, 0, 0, scale_game_frames(6)); } LNK(sandmouse_vars->link)->command = 1; - sandmouse_moby->state = 1; + sandmouse_moby->state = SANDMOUSE_STATE_WAIT_FOR_ACTIVATION; sandmouse_moby->draw_dist = 0; break; case 8: break; } - if (sandmouse_moby->state >= 2) { + if (sandmouse_moby->state >= SANDMOUSE_STATE_WAIT_FOR_LINK) { jet_animate(sandmouse_moby, 0.3f); ((void (*)(void *, void *))emit_sandmouse_particles)(sandmouse_moby, sandmouse_vars); } diff --git a/src/overlays/shared/enemies/sandmouse_house.c b/src/overlays/shared/enemies/sandmouse_house.c index ccf6348854..547beda85e 100644 --- a/src/overlays/shared/enemies/sandmouse_house.c +++ b/src/overlays/shared/enemies/sandmouse_house.c @@ -32,7 +32,7 @@ void sandmouse_house_update(unsigned char *moby) { return; house_vars = ((char *)MOBY(moby)->pvars); if (house_vars != 0) { - if (MOBY(moby)->state != 0) { + if (MOBY(moby)->state != SANDMOUSE_HOUSE_INITIALIZE) { if (D_0013D4C5 != 0) { if (hero.items[2].item_id == 5) { float yaw_response_scale = D_0015ED70_lui; @@ -51,7 +51,7 @@ void sandmouse_house_update(unsigned char *moby) { if (MOBY(moby)->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(0)); } - MOBY(moby)->state = 1; + MOBY(moby)->state = SANDMOUSE_HOUSE_WAIT_FOR_INITIAL_COMMAND; *(float *)house_vars = MOBY(moby)->rot.z; break; case SANDMOUSE_HOUSE_WAIT_FOR_INITIAL_COMMAND: @@ -59,7 +59,7 @@ void sandmouse_house_update(unsigned char *moby) { if (MOBY(moby)->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } - MOBY(moby)->state = 2; + MOBY(moby)->state = SANDMOUSE_HOUSE_WAIT_FOR_INITIAL_COMMAND_ANIMATION_END; } break; case SANDMOUSE_HOUSE_WAIT_FOR_INITIAL_COMMAND_ANIMATION_END: @@ -67,7 +67,7 @@ void sandmouse_house_update(unsigned char *moby) { if (MOBY(moby)->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(3)); } - MOBY(moby)->state = 3; + MOBY(moby)->state = SANDMOUSE_HOUSE_WAIT_FOR_FOLLOWUP_COMMAND; } break; case SANDMOUSE_HOUSE_WAIT_FOR_FOLLOWUP_COMMAND: @@ -75,12 +75,12 @@ void sandmouse_house_update(unsigned char *moby) { if (MOBY(moby)->prev_seq != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(3)); } - MOBY(moby)->state = 4; + MOBY(moby)->state = SANDMOUSE_HOUSE_WAIT_FOR_FOLLOWUP_COMMAND_ANIMATION_END; } else if (MOBY(moby)->command == 7 || MOBY(moby)->command == 1) { if (MOBY(moby)->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(3)); } - MOBY(moby)->state = 7; + MOBY(moby)->state = SANDMOUSE_HOUSE_RESTORE_INITIAL_ANIMATION; } break; case SANDMOUSE_HOUSE_WAIT_FOR_FOLLOWUP_COMMAND_ANIMATION_END: @@ -88,7 +88,7 @@ void sandmouse_house_update(unsigned char *moby) { if (MOBY(moby)->prev_seq != 4) { blend_moby_animation(moby, 4, 0, scale_game_frames(3)); } - MOBY(moby)->state = 5; + MOBY(moby)->state = SANDMOUSE_HOUSE_WAIT_FOR_POST_FOLLOWUP_COMMAND; } break; case SANDMOUSE_HOUSE_WAIT_FOR_POST_FOLLOWUP_COMMAND: @@ -97,7 +97,7 @@ void sandmouse_house_update(unsigned char *moby) { if (MOBY(moby)->prev_seq != 5) { blend_moby_animation(moby, 5, 0, scale_game_frames(3)); } - MOBY(moby)->state = 6; + MOBY(moby)->state = SANDMOUSE_HOUSE_WAIT_FOR_POST_FOLLOWUP_COMMAND_ANIMATION_END; } break; case SANDMOUSE_HOUSE_WAIT_FOR_POST_FOLLOWUP_COMMAND_ANIMATION_END: @@ -106,12 +106,12 @@ void sandmouse_house_update(unsigned char *moby) { if (MOBY(moby)->prev_seq != 6) { blend_moby_animation(moby, 6, 0, scale_game_frames(3)); } - MOBY(moby)->state = 7; + MOBY(moby)->state = SANDMOUSE_HOUSE_RESTORE_INITIAL_ANIMATION; } else { if (MOBY(moby)->prev_seq != 2) { blend_moby_animation(moby, 2, 0, scale_game_frames(3)); } - MOBY(moby)->state = 3; + MOBY(moby)->state = SANDMOUSE_HOUSE_WAIT_FOR_FOLLOWUP_COMMAND; } } break; @@ -120,7 +120,7 @@ void sandmouse_house_update(unsigned char *moby) { if (MOBY(moby)->prev_seq != 0) { blend_moby_animation(moby, 0, 0, scale_game_frames(3)); } - MOBY(moby)->state = 1; + MOBY(moby)->state = SANDMOUSE_HOUSE_WAIT_FOR_INITIAL_COMMAND; } break; case 8: diff --git a/src/overlays/shared/enemies/scoutbot.c b/src/overlays/shared/enemies/scoutbot.c index c38f68e7d1..0e2c8b0f8f 100644 --- a/src/overlays/shared/enemies/scoutbot.c +++ b/src/overlays/shared/enemies/scoutbot.c @@ -21,6 +21,17 @@ #include "rnc/overlay/shared/world/level_path.h" #include "rnc/overlay/shared/math/quad.h" +enum { + SCOUTBOT_STATE_INITIALIZE = 0, + SCOUTBOT_STATE_IDLE = 1, + SCOUTBOT_STATE_APPROACH_TARGET = 2, + SCOUTBOT_STATE_RETURN_HOME = 3, + SCOUTBOT_STATE_ATTACK = 4, + SCOUTBOT_STATE_WAIT_FOR_VOICE = 6, + SCOUTBOT_STATE_MOVE_TO_WANDER_GOAL = 7, + SCOUTBOT_STATE_EXPLODE_AND_REMOVE = 0x63 +}; + typedef struct ScoutbotVars { u8 pad0[0x20]; f32 unk20[4]; @@ -150,10 +161,10 @@ func_L00_00260FB0_f(char *, void *, float, int, int, void *, int) __asm__("FUN_L extern void scale_vector_002d3878(float, void *) __asm__("FUN_L00_0025f730"); extern void draw_geometry_quad(void *, void *, int) __asm__("FUN_001f7d30"); extern float D_L08_00161894_lui __asm__("D_L08_00161894") NOT_SDA; -extern u32 D_00151878_gp __asm__("D_00151878") __attribute__((sda)); -extern u32 D_0015187C_gp __asm__("D_0015187C") __attribute__((sda)); -extern u32 D_00151880_gp __asm__("D_00151880") __attribute__((sda)); -extern u32 D_00151884_gp __asm__("D_00151884") __attribute__((sda)); +extern u32 scoutbot_target_beam_vertex_0_color __asm__("D_00151878") __attribute__((sda)); +extern u32 scoutbot_target_beam_vertex_1_color __asm__("D_0015187C") __attribute__((sda)); +extern u32 scoutbot_target_beam_vertex_2_color __asm__("D_00151880") __attribute__((sda)); +extern u32 scoutbot_target_beam_vertex_3_color __asm__("D_00151884") __attribute__((sda)); void draw_target_beam(struct Moby *moby) __asm__("FUN_L08_002d3878"); extern float scoutbot_probe_correction_target_position[] __asm__("D_L08_00174670"); @@ -176,16 +187,6 @@ void scoutbot_update(Moby *moby) __asm__("FUN_L08_002d2af0"); /* Moby class 252 */ void scoutbot_update(Moby *moby) { - enum { - SCOUTBOT_STATE_INITIALIZE = 0, - SCOUTBOT_STATE_IDLE = 1, - SCOUTBOT_STATE_APPROACH_TARGET = 2, - SCOUTBOT_STATE_RETURN_HOME = 3, - SCOUTBOT_STATE_ATTACK = 4, - SCOUTBOT_STATE_WAIT_FOR_VOICE = 6, - SCOUTBOT_STATE_MOVE_TO_WANDER_GOAL = 7, - SCOUTBOT_STATE_EXPLODE_AND_REMOVE = 0x63 - }; Data_3DF8 *scoutbot_instance_vars = (struct Data_3DF8 *)moby->pvars; float target_pos[4]; float offset[4]; @@ -218,7 +219,7 @@ void scoutbot_update(Moby *moby) { if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 0); } - moby->state = 1; + moby->state = SCOUTBOT_STATE_IDLE; qcopy(scoutbot_instance_vars->home, &moby->pos); if (probe_ground_height(&moby->pos, 0, 0.5f) > moby->pos.z - 10.0f) { scoutbot_instance_vars->home[2] = probe_ground_height(&moby->pos, 0, 0.5f); @@ -237,7 +238,7 @@ void scoutbot_update(Moby *moby) { if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, 6); } - moby->state = 2; + moby->state = SCOUTBOT_STATE_APPROACH_TARGET; } else if (moby->anim_flags & 2) { float heading = random_angle_radians(); float radius = random_float_between(0.0f, 3.0f); @@ -249,7 +250,7 @@ void scoutbot_update(Moby *moby) { if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, 6); } - moby->state = 7; + moby->state = SCOUTBOT_STATE_MOVE_TO_WANDER_GOAL; } break; case SCOUTBOT_STATE_MOVE_TO_WANDER_GOAL: { @@ -265,7 +266,7 @@ void scoutbot_update(Moby *moby) { if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 3); } - moby->state = 1; + moby->state = SCOUTBOT_STATE_IDLE; } break; } @@ -280,7 +281,7 @@ void scoutbot_update(Moby *moby) { if (vector_distance_xy(&moby->pos, &scoutbot_instance_vars->current_target->pos) < 3.0f && absolute_float(scoutbot_instance_vars->current_target->pos.z - moby->pos.z) < 2.0f) { scoutbot_instance_vars->voice = allocate_voice_for_target_entry(0, 0, moby); - moby->state = 6; + moby->state = SCOUTBOT_STATE_WAIT_FOR_VOICE; } else if (vector_distance_xy(target_pos, scoutbot_instance_vars->home) > 15.0f || absolute_float(scoutbot_instance_vars->home[2] - target_pos[2]) > 4.0f) { scoutbot_instance_vars->f200 = 4.0f; @@ -288,7 +289,7 @@ void scoutbot_update(Moby *moby) { if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, 6); } - moby->state = 3; + moby->state = SCOUTBOT_STATE_RETURN_HOME; } break; } @@ -308,7 +309,7 @@ void scoutbot_update(Moby *moby) { if (moby->prev_seq != 0) { blend_moby_animation(moby, 0, 0, 3); } - moby->state = 1; + moby->state = SCOUTBOT_STATE_IDLE; } break; } @@ -348,7 +349,7 @@ void scoutbot_update(Moby *moby) { if (moby->prev_seq != 2) { blend_moby_animation(moby, 2, 0, 3); } - moby->state = 3; + moby->state = SCOUTBOT_STATE_RETURN_HOME; } break; } @@ -360,7 +361,7 @@ void scoutbot_update(Moby *moby) { if (moby->prev_seq != 3) { blend_moby_animation(moby, 3, 0, 3); } - moby->state = 4; + moby->state = SCOUTBOT_STATE_ATTACK; } break; } @@ -403,7 +404,7 @@ void scoutbot_update(Moby *moby) { if (moby->state != 5 && (signed char)moby->state >= 0) { int col = 0x7F20FF20; - if (moby->state == 4 || moby->state == 6) { + if (moby->state == SCOUTBOT_STATE_ATTACK || moby->state == SCOUTBOT_STATE_WAIT_FOR_VOICE) { col = 0x7F2828A0; } moby->glow_color = colorlerp_3DF8(moby->glow_color, col, 0.1f); @@ -430,7 +431,7 @@ void update_scoutbot_health_and_target(struct Moby *moby) { if (hit_reaction_code < 12) { if (hit_reaction_code >= 0) { FUN_L00_00257470(moby, 0, -1); - moby->state = 0x63; + moby->state = SCOUTBOT_STATE_EXPLODE_AND_REMOVE; } } } @@ -453,9 +454,9 @@ void update_scoutbot_health_and_target(struct Moby *moby) { } void draw_target_beam(struct Moby *moby) { - ScoutbotVars *data = (ScoutbotVars *)moby->pvars; + ScoutbotVars *scoutbot_private_vars = (ScoutbotVars *)moby->pvars; Packet_002d3878 pk; - Vec_002d3878 matrix[3], direction, pos, delta, angles; + Vec_002d3878 matrix[3], direction, beam_origin_position, delta, angles; float length; u64 tag; Vec_002d3878 *points; @@ -464,10 +465,10 @@ void draw_target_beam(struct Moby *moby) { float *vertex; int i; tag = get_effect_texture(14); - pk.color[0] = D_00151878_gp; - pk.color[1] = D_0015187C_gp; - pk.color[2] = D_00151880_gp; - pk.color[3] = D_00151884_gp; + pk.color[0] = scoutbot_target_beam_vertex_0_color; + pk.color[1] = scoutbot_target_beam_vertex_1_color; + pk.color[2] = scoutbot_target_beam_vertex_2_color; + pk.color[3] = scoutbot_target_beam_vertex_3_color; pk.tag[1] = tag; pk.tag[2] = 0xff9000000260ULL; pk.tag[0] = 5; @@ -480,31 +481,32 @@ void draw_target_beam(struct Moby *moby) { pk.uv[5] = 1.0f; pk.uv[6] = 1.0f; pk.uv[7] = 1.0f; - moby_point_position(moby, 2, &pos); - fast_vec_sub(&delta, data->unk218 + 0x10, &pos); + moby_point_position(moby, 2, &beam_origin_position); + fast_vec_sub(&delta, scoutbot_private_vars->unk218 + 0x10, &beam_origin_position); scale_vector_002d3878(3.0f, &delta); - delta.v[2] = (*(float *)(data->unk218 + 0x18) + 0.25f) - pos.v[2]; + delta.v[2] = + (*(float *)(scoutbot_private_vars->unk218 + 0x18) + 0.25f) - beam_origin_position.v[2]; delta.v[3] = 1.0f; length = fast_vec_length(&delta); clear_u64_value(&angles); angles.v[1] = -fast_arc_tan(vector_length_xy(&delta), delta.v[2]); angles.v[2] = fast_arc_tan(delta.v[0], delta.v[1]); euler_rotation_matrix(matrix, &angles); - qcopy(&direction, &pos); + qcopy(&direction, &beam_origin_position); direction.v[3] = 1.0f; clear_u64_value(&pk.vertices[0]); pk.vertices[0].v[2] = D_L08_00161894_lui; pk.vertices[0].v[3] = 1.0f; - qcopy(&pk.vertices[1], &data->unk1D0); - pk.vertices[1].v[0] = length * data->unk1D0[3]; + qcopy(&pk.vertices[1], &scoutbot_private_vars->unk1D0); + pk.vertices[1].v[0] = length * scoutbot_private_vars->unk1D0[3]; pk.vertices[1].v[2] += -0.25f; pk.vertices[1].v[3] = 1.0f; clear_u64_value(&pk.vertices[2]); pk.vertices[2].v[2] = 0.0f; pk.vertices[2].v[3] = 1.0f; - qcopy(&pk.vertices[3], &data->unk1D0); - pk.vertices[3].v[0] = length * data->unk1D0[3]; + qcopy(&pk.vertices[3], &scoutbot_private_vars->unk1D0); + pk.vertices[3].v[0] = length * scoutbot_private_vars->unk1D0[3]; pk.vertices[3].v[2] += 0.25f; pk.vertices[3].v[3] = 1.0f; draw_geometry_quad(pk.vertices, matrix, 1); @@ -521,20 +523,20 @@ void draw_target_beam(struct Moby *moby) { } draw_geometry_quad(pk.vertices, matrix, 1); - qcopy(&pk.vertices[0], &data->unk1D0); - pk.vertices[0].v[0] = length * data->unk1D0[3]; + qcopy(&pk.vertices[0], &scoutbot_private_vars->unk1D0); + pk.vertices[0].v[0] = length * scoutbot_private_vars->unk1D0[3]; pk.vertices[0].v[2] += -0.25f; pk.vertices[0].v[3] = 1.0f; - qcopy(&pk.vertices[1], &data->unk1E0); - pk.vertices[1].v[0] = length * data->unk1E0[3]; + qcopy(&pk.vertices[1], &scoutbot_private_vars->unk1E0); + pk.vertices[1].v[0] = length * scoutbot_private_vars->unk1E0[3]; pk.vertices[1].v[2] += -0.25f; pk.vertices[1].v[3] = 1.0f; - qcopy(&pk.vertices[2], &data->unk1D0); - pk.vertices[2].v[0] = length * data->unk1D0[3]; + qcopy(&pk.vertices[2], &scoutbot_private_vars->unk1D0); + pk.vertices[2].v[0] = length * scoutbot_private_vars->unk1D0[3]; pk.vertices[2].v[2] += 0.25f; pk.vertices[2].v[3] = 1.0f; - qcopy(&pk.vertices[3], &data->unk1E0); - pk.vertices[3].v[0] = length * data->unk1E0[3]; + qcopy(&pk.vertices[3], &scoutbot_private_vars->unk1E0); + pk.vertices[3].v[0] = length * scoutbot_private_vars->unk1E0[3]; pk.vertices[3].v[2] += 0.25f; pk.vertices[3].v[3] = 1.0f; draw_geometry_quad(pk.vertices, matrix, 1); @@ -552,20 +554,20 @@ void draw_target_beam(struct Moby *moby) { } draw_geometry_quad(pk.vertices, matrix, 1); - qcopy(&pk.vertices[0], &data->unk1E0); - pk.vertices[0].v[0] = length * data->unk1E0[3]; + qcopy(&pk.vertices[0], &scoutbot_private_vars->unk1E0); + pk.vertices[0].v[0] = length * scoutbot_private_vars->unk1E0[3]; pk.vertices[0].v[2] += -0.25f; pk.vertices[0].v[3] = 1.0f; clear_u64_value(&pk.vertices[1]); - pk.vertices[1].v[0] = length * data->unk1D0[3] * 3.0f; + pk.vertices[1].v[0] = length * scoutbot_private_vars->unk1D0[3] * 3.0f; pk.vertices[1].v[2] += D_L08_00161894_lui; pk.vertices[1].v[3] = 1.0f; - qcopy(&pk.vertices[2], &data->unk1E0); - pk.vertices[2].v[0] = length * data->unk1E0[3]; + qcopy(&pk.vertices[2], &scoutbot_private_vars->unk1E0); + pk.vertices[2].v[0] = length * scoutbot_private_vars->unk1E0[3]; pk.vertices[2].v[2] += 0.25f; pk.vertices[2].v[3] = 1.0f; clear_u64_value(&pk.vertices[3]); - pk.vertices[3].v[0] = length * data->unk1D0[3] * 3.0f; + pk.vertices[3].v[0] = length * scoutbot_private_vars->unk1D0[3] * 3.0f; pk.vertices[3].v[2] = 0.0f; pk.vertices[3].v[3] = 1.0f; draw_geometry_quad(pk.vertices, matrix, 1); @@ -646,7 +648,7 @@ void *enter_scoutbot_return_home_state(struct Moby *moby) __asm__("FUN_L08_002d4 void *enter_scoutbot_return_home_state(struct Moby *moby) { void *suction_cancel_status = cancel_suck_cannon_suction(moby); ScoutbotVars *scoutbot_data = (ScoutbotVars *)moby->pvars; - moby->state = 3; + moby->state = SCOUTBOT_STATE_RETURN_HOME; scoutbot_data->unk200 = 4.0f; scoutbot_data->unk208 = 0.5f; if ((unsigned char)((char)moby->prev_seq) != 2) { diff --git a/src/overlays/shared/enemies/seeker.c b/src/overlays/shared/enemies/seeker.c index 2045197cf0..2685ff7126 100644 --- a/src/overlays/shared/enemies/seeker.c +++ b/src/overlays/shared/enemies/seeker.c @@ -17,6 +17,17 @@ #include "rnc/mobys/resolve_moby_hit_response.h" /* Per-instance variables of the oClass 52 moby (moby->pvars). */ +enum { + SEEKER_STATE_INITIALIZE = 0, + SEEKER_STATE_IDLE_HOVER = 1, + SEEKER_STATE_CHASE = 2, + SEEKER_STATE_CHASE_ANIMATION_WAIT = 3, + SEEKER_STATE_TIMED_CHASE = 4, + SEEKER_STATE_HURT_KNOCKBACK = 5, + SEEKER_STATE_FATAL_KNOCKBACK = 6, + SEEKER_STATE_EXPLODE = 7 +}; + typedef struct { u8 pad0[0x20]; f32 unk20; @@ -93,14 +104,7 @@ void seeker_update(struct Moby *moby) __asm__("FUN_L09_002c5990"); /* Moby class 52 */ void seeker_update(struct Moby *moby) { enum { - SEEKER_STATE_INITIALIZE = 0, - SEEKER_STATE_IDLE_HOVER = 1, - SEEKER_STATE_CHASE = 2, - SEEKER_STATE_CHASE_ANIMATION_WAIT = 3, - SEEKER_STATE_TIMED_CHASE = 4, - SEEKER_STATE_HURT_KNOCKBACK = 5, - SEEKER_STATE_FATAL_KNOCKBACK = 6, - SEEKER_STATE_EXPLODE = 7 + SEEKER_DISPATCH_MODE_SKIP_STATE_UPDATE = 2 }; Moby52Vars *seeker_instance_vars = (Moby52Vars *)moby->pvars; struct Moby *target; @@ -122,7 +126,7 @@ void seeker_update(struct Moby *moby) { moby->shadow_range = 0x17; } mode = seeker_state_dispatch_mode; - if (mode == 2) { + if (mode == SEEKER_DISPATCH_MODE_SKIP_STATE_UPDATE) { return; } switch (moby->state) { @@ -142,7 +146,7 @@ void seeker_update(struct Moby *moby) { seeker_instance_vars->unkD8 = 0.5f; seeker_instance_vars->unkD0 = truncate_float_to_s32(512.0f); seeker_instance_vars->speed = frame_time * 7.75f; - moby->state = 1; + moby->state = SEEKER_STATE_IDLE_HOVER; if (moby->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } @@ -174,7 +178,7 @@ void seeker_update(struct Moby *moby) { seeker_instance_vars->voice = allocate_voice_for_target_entry(1, 4, moby); } seeker_instance_vars->moving = 1; - moby->state = 2; + moby->state = SEEKER_STATE_CHASE; } break; case SEEKER_STATE_CHASE_ANIMATION_WAIT: @@ -183,7 +187,7 @@ void seeker_update(struct Moby *moby) { FUN_L01_0026e090(moby->group, 1); } seeker_instance_vars->moving = 1; - moby->state = 4; + moby->state = SEEKER_STATE_TIMED_CHASE; if (seeker_instance_vars->voice == -1) { seeker_instance_vars->voice = allocate_voice_for_target_entry(1, 4, moby); } @@ -252,8 +256,8 @@ void seeker_update(struct Moby *moby) { } FUN_L00_00258830(moby, &vel, 0, 0.0f, 0.5f, 0.0f); } - if (target_distance_xy < 6.0f && moby->state == 2) { - moby->state = 3; + if (target_distance_xy < 6.0f && moby->state == SEEKER_STATE_CHASE) { + moby->state = SEEKER_STATE_CHASE_ANIMATION_WAIT; if (moby->prev_seq != 3) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } @@ -269,7 +273,7 @@ void seeker_update(struct Moby *moby) { seeker_instance_vars->voice = allocate_voice_for_target_entry(1, 4, moby); } seeker_instance_vars->moving = 1; - moby->state = 4; + moby->state = SEEKER_STATE_TIMED_CHASE; if (seeker_instance_vars->timer == 0) { seeker_instance_vars->timer = scale_game_frames(180); } @@ -433,6 +437,9 @@ void update_seeker_damage_and_target(Moby *moby) { RESPONSE_REACTION_ONLY = 9, RESPONSE_NO_REACTION = 11 }; + enum { + SEEKER_TARGET_STATUS_LOST = 2 + }; char hit_pos[16]; int hit; float damage; @@ -445,13 +452,13 @@ void update_seeker_damage_and_target(Moby *moby) { int lost_state; seeker_vars = (struct Data *)moby->pvars; - if (moby->state == 0) { + if (moby->state == SEEKER_STATE_INITIALIZE) { return; } moby->scale = moby->scale + ((((Cls *)moby->pclass)->scale * D_L09_0016140C) - moby->scale) * 0.1f; if (fast_dec_timer(&seeker_vars->timer) == 2) { - moby->state = 7; + moby->state = SEEKER_STATE_EXPLODE; return; } if (seeker_vars->timer == scale_game_frames(0xA) || @@ -467,7 +474,7 @@ void update_seeker_damage_and_target(Moby *moby) { source = find_moby_hit(moby, 0x330000, 0); response = resolve_moby_hit_response(moby, source, &seeker_vars->health, 0, &hit, &damage, 0, 4); - if (hit != 1 && moby->state != 6) { + if (hit != 1 && moby->state != SEEKER_STATE_FATAL_KNOCKBACK) { seeker_vars->health = seeker_vars->health - damage; if (seeker_vars->health <= 0.0f) { response = 1; @@ -500,7 +507,7 @@ void update_seeker_damage_and_target(Moby *moby) { *(Q_2C73D0 *)hit_pos = source->pos; func_L00_0025BBA0_2C73D0(hit_pos, &knock_angle, &seeker_vars->f88, &seeker_vars->f8C); func_L00_0025D5B0_2C73D0(moby, seeker_vars->f70, knock_angle, 4, 1, 0); - moby->state = 5; + moby->state = SEEKER_STATE_HURT_KNOCKBACK; if (moby->group != 0xFF) { func_L01_0026F040_2C73D0(moby->group, 1); } @@ -521,7 +528,7 @@ void update_seeker_damage_and_target(Moby *moby) { hit_pos, &knock_angle_fatal, &seeker_vars->f88, &seeker_vars->f8C); func_L00_0025D5B0_2C73D0(moby, seeker_vars->f70, knock_angle_fatal, 4, 1, 0); mark_moby_for_removal_cf(moby, 0, -1); - moby->state = 6; + moby->state = SEEKER_STATE_FATAL_KNOCKBACK; seeker_vars->reactTime = 0xF0; break; case RESPONSE_NONE: @@ -546,7 +553,7 @@ void update_seeker_damage_and_target(Moby *moby) { seeker_vars->reach = 24.0f; goal = seeker_vars->target; target_selection_status = func_L00_00260D30_2C73D0(moby, goal, 24.0f); - lost_state = 2; + lost_state = SEEKER_TARGET_STATUS_LOST; } else { Path *path; seeker_vars->reach = 12.0f; @@ -554,7 +561,7 @@ void update_seeker_damage_and_target(Moby *moby) { goal = seeker_vars->target; target_selection_status = activate_effect_l08(moby, goal, 12.0f, 0, 0, path->pts, path->count); - lost_state = 2; + lost_state = SEEKER_TARGET_STATUS_LOST; } if (target_selection_status != lost_state && seeker_vars->retreat == 0) { if (seeker_vars->reach < vector_distance_xy(&moby->pos, goal)) { diff --git a/src/overlays/shared/enemies/sentrybot.c b/src/overlays/shared/enemies/sentrybot.c index 6a4ad0f9f7..ddcc79da98 100644 --- a/src/overlays/shared/enemies/sentrybot.c +++ b/src/overlays/shared/enemies/sentrybot.c @@ -23,6 +23,32 @@ #include "rnc/overlay/shared/enemies/sentrybot_data/update_sentrybot_hit_response_and_target_visibility.h" #include "rnc/overlay/shared/mobys/animation_start.h" +enum { + SENTRYBOT_INITIALIZE = 0, + SENTRYBOT_WAIT_FOR_LINKED_MOBY = 1, + SENTRYBOT_PATROL_IDLE = 2, + SENTRYBOT_PATROL_PAUSE = 3, + SENTRYBOT_PATROL_MOVE = 4, + SENTRYBOT_DEACTIVATE_LINKED_MOBYS_AFTER_ANIMATION = 5, + SENTRYBOT_TURN_NEGATIVE_HEADING_DELTA = 6, + SENTRYBOT_TURN_POSITIVE_HEADING_DELTA = 7, + SENTRYBOT_TURN_AROUND = 8, + SENTRYBOT_RETURN_HOME = 9, + SENTRYBOT_WAIT_FOR_ANIMATION_THEN_PATROL_IDLE = 10, + SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION = 11, + SENTRYBOT_ALERT_IDLE = 12, + SENTRYBOT_PATROL_MOVE_FAST = 13, + SENTRYBOT_APPROACH_LINKED_MOBY = 14, + SENTRYBOT_ACTIVATE_LINKED_MOBY = 15, + SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_NEGATIVE_JOINT_AIM = 16, + SENTRYBOT_EMIT_WITH_NEGATIVE_JOINT_AIM = 17, + SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_POSITIVE_JOINT_AIM = 18, + SENTRYBOT_EMIT_WITH_POSITIVE_JOINT_AIM = 19, + SENTRYBOT_RETURN_HOME_FAST = 20, + SENTRYBOT_RECOVERABLE_KNOCKBACK = 21, + SENTRYBOT_DEATH_KNOCKBACK = 23 +}; + typedef struct { char pad0[0x2084]; int f2084; @@ -247,36 +273,14 @@ void sentrybot_update(unsigned char *moby) __asm__("FUN_L15_002979d8"); /* Moby class 44 */ void sentrybot_update(unsigned char *moby) { - enum { - SENTRYBOT_INITIALIZE = 0, - SENTRYBOT_WAIT_FOR_LINKED_MOBY = 1, - SENTRYBOT_PATROL_IDLE = 2, - SENTRYBOT_PATROL_PAUSE = 3, - SENTRYBOT_PATROL_MOVE = 4, - SENTRYBOT_DEACTIVATE_LINKED_MOBYS_AFTER_ANIMATION = 5, - SENTRYBOT_TURN_NEGATIVE_HEADING_DELTA = 6, - SENTRYBOT_TURN_POSITIVE_HEADING_DELTA = 7, - SENTRYBOT_TURN_AROUND = 8, - SENTRYBOT_RETURN_HOME = 9, - SENTRYBOT_WAIT_FOR_ANIMATION_THEN_PATROL_IDLE = 10, - SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION = 11, - SENTRYBOT_ALERT_IDLE = 12, - SENTRYBOT_PATROL_MOVE_FAST = 13, - SENTRYBOT_APPROACH_LINKED_MOBY = 14, - SENTRYBOT_ACTIVATE_LINKED_MOBY = 15, - SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_NEGATIVE_JOINT_AIM = 16, - SENTRYBOT_EMIT_WITH_NEGATIVE_JOINT_AIM = 17, - SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_POSITIVE_JOINT_AIM = 18, - SENTRYBOT_EMIT_WITH_POSITIVE_JOINT_AIM = 19, - SENTRYBOT_RETURN_HOME_FAST = 20, - SENTRYBOT_RECOVERABLE_KNOCKBACK = 21, - SENTRYBOT_DEATH_KNOCKBACK = 23 - }; enum { SENTRYBOT_ANIM_TURN_NEGATIVE_HEADING_DELTA = 10, SENTRYBOT_ANIM_TURN_POSITIVE_HEADING_DELTA = 11, SENTRYBOT_ANIM_TURN_AROUND = 12 }; + enum { + SENTRYBOT_TARGET_MODE_SUPPRESS_DIRECT_EMISSION = 2 + }; float va[4]; float vb[4]; float emission_origin[4]; @@ -317,7 +321,8 @@ void sentrybot_update(unsigned char *moby) { } } update_sentrybot_hit_response_and_target_visibility(moby, flag); - if (flag != 0 && MOBY(moby)->state != 0x15 && MOBY(moby)->state != 0x17) { + if (flag != 0 && MOBY(moby)->state != SENTRYBOT_RECOVERABLE_KNOCKBACK && + MOBY(moby)->state != SENTRYBOT_DEATH_KNOCKBACK) { MOBY(moby)->collision = 0; MOBY(moby)->flags = (MOBY(moby)->flags | 0x41) & 0xEFFF; return; @@ -337,9 +342,10 @@ void sentrybot_update(unsigned char *moby) { fast_dec_timer_s16(&sentrybot_instance_data->attention_timer); if (sentrybot_instance_data->alert_timer != 0 && sentrybot_instance_data->alarm_moby_index != -1) { - char *o = (char *)((sentrybot_instance_data->alarm_moby_index << 8) + (int)l15_moby_array); - if (*(int *)(*(char **)(o + 0x78) + 8) != 0) - set_sentrybot_alarm_duration(o, 0xB4); + char *linked_alarm_moby = + (char *)((sentrybot_instance_data->alarm_moby_index << 8) + (int)l15_moby_array); + if (*(int *)(*(char **)(linked_alarm_moby + 0x78) + 8) != 0) + set_sentrybot_alarm_duration(linked_alarm_moby, 0xB4); } if (MOBY(moby)->command == 0) sentrybot_instance_data->unk15F = 0; @@ -359,13 +365,13 @@ void sentrybot_update(unsigned char *moby) { if (sentrybot_instance_data->unk148 < 5) sentrybot_instance_data->unk148 = 5; sentrybot_instance_data->unk144 = 1; - MOBY(moby)->state = 2; + MOBY(moby)->state = SENTRYBOT_PATROL_IDLE; MOBY(moby)->flags |= 0x1000; { int i; for (i = 0; i < 4; i++) { if (sentrybot_instance_data->linked_moby[i] != -1) { - MOBY(moby)->state = 1; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_LINKED_MOBY; break; } } @@ -377,7 +383,7 @@ void sentrybot_update(unsigned char *moby) { for (i = 0; i < 4; i++) { if (((unsigned char *)((sentrybot_instance_data->linked_moby[i] << 8) + (int)l15_moby_array))[0x20] >= 2) { - MOBY(moby)->state = 2; + MOBY(moby)->state = SENTRYBOT_PATROL_IDLE; break; } } @@ -388,12 +394,12 @@ void sentrybot_update(unsigned char *moby) { if (sentrybot_instance_data->unk114 != 2) { MOBY(moby)->command = 1; if (sentrybot_instance_data->unk15F != 0) { - MOBY(moby)->state = 0x10; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_NEGATIVE_JOINT_AIM; if (MOBY(moby)->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } else { sentrybot_instance_data->unk15F = 1; - MOBY(moby)->state = 0xB; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION; sentrybot_instance_data->unk15C = 0x10; sentrybot_instance_data->unk15D = 3; if (MOBY(moby)->prev_seq != 1) @@ -417,12 +423,12 @@ void sentrybot_update(unsigned char *moby) { sentrybot_instance_data->unk144 = 0; MOBY(moby)->command = 1; if (sentrybot_instance_data->unk15F != 0) { - MOBY(moby)->state = 0xD; + MOBY(moby)->state = SENTRYBOT_PATROL_MOVE_FAST; if (MOBY(moby)->prev_seq != 0xE) blend_moby_animation(moby, 0xE, 0, scale_game_frames(10)); } else { sentrybot_instance_data->unk15F = 1; - MOBY(moby)->state = 0xB; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION; sentrybot_instance_data->unk15C = 0xD; sentrybot_instance_data->unk15D = 0xE; if (MOBY(moby)->prev_seq != 1) @@ -447,13 +453,13 @@ void sentrybot_update(unsigned char *moby) { (float *)(sentrybot_instance_data->attention_target + 0x10), (void *)0xA, (void *)0xF); - } else if (MOBY(moby)->state == 2) { + } else if (MOBY(moby)->state == SENTRYBOT_PATROL_IDLE) { if (sentrybot_instance_data->unk124 != -1) { if (sentrybot_instance_data->unk144 == 0 || can_sentrybot_advance_patrol(moby) != 0) { sentrybot_instance_data->unk14C = scale_game_frames(sentrybot_instance_data->unk148); - MOBY(moby)->state = 3; + MOBY(moby)->state = SENTRYBOT_PATROL_PAUSE; } } else if (sentrybot_instance_data->unk158 != 0 && hero.state.current == 0x59) { if (sentrybot_instance_data->unk150 != -1 || @@ -461,7 +467,7 @@ void sentrybot_update(unsigned char *moby) { (sentrybot_instance_data->unk154 == 0 && random_integer_below(0x78) == 0)) { sentrybot_instance_data->unk15D = 0; sentrybot_instance_data->unk15C = 2; - MOBY(moby)->state = 5; + MOBY(moby)->state = SENTRYBOT_DEACTIVATE_LINKED_MOBYS_AFTER_ANIMATION; if (MOBY(moby)->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } @@ -469,7 +475,7 @@ void sentrybot_update(unsigned char *moby) { begin_sentrybot_turn_toward_heading( moby, sentrybot_instance_data, 2, 0, sentrybot_instance_data->home_yaw); } - } else if (MOBY(moby)->state == 3) { + } else if (MOBY(moby)->state == SENTRYBOT_PATROL_PAUSE) { if (fast_dec_timer(&sentrybot_instance_data->unk14C) != 0) { if (sentrybot_instance_data->unk144 != 0) { sentrybot_instance_data->patrol_point = @@ -491,19 +497,19 @@ void sentrybot_update(unsigned char *moby) { if (sentrybot_instance_data->unk114 != 2) { MOBY(moby)->command = 1; if (sentrybot_instance_data->unk15F != 0) { - MOBY(moby)->state = 0x10; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_NEGATIVE_JOINT_AIM; if (MOBY(moby)->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } else { sentrybot_instance_data->unk15F = 1; - MOBY(moby)->state = 0xB; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION; sentrybot_instance_data->unk15C = 0x10; sentrybot_instance_data->unk15D = 3; if (MOBY(moby)->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } } else if (MOBY(moby)->anim_flags & 2) { - MOBY(moby)->state = 2; + MOBY(moby)->state = SENTRYBOT_PATROL_IDLE; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); sentrybot_instance_data->unk196 = scale_game_frames(0x168); @@ -546,12 +552,12 @@ void sentrybot_update(unsigned char *moby) { sentrybot_instance_data->unkD0[1] - MOBY(moby)->pos.y)) < 0.5235988f) { MOBY(moby)->command = 1; if (sentrybot_instance_data->unk15F != 0) { - MOBY(moby)->state = 0x10; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_NEGATIVE_JOINT_AIM; if (MOBY(moby)->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } else { sentrybot_instance_data->unk15F = 1; - MOBY(moby)->state = 0xB; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION; sentrybot_instance_data->unk15C = 0x10; sentrybot_instance_data->unk15D = 3; if (MOBY(moby)->prev_seq != 1) @@ -602,19 +608,19 @@ void sentrybot_update(unsigned char *moby) { (float *)((char *)D_L15_001B0AB0[sentrybot_instance_data->unk124] + (sentrybot_instance_data->patrol_point * 0x10 + 0x10)), sp)) { - MOBY(moby)->state = 2; + MOBY(moby)->state = SENTRYBOT_PATROL_IDLE; sentrybot_instance_data->unk144 = 1; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else if (sentrybot_instance_data->unk114 != 2) { MOBY(moby)->command = 1; if (sentrybot_instance_data->unk15F != 0) { - MOBY(moby)->state = 0x10; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_NEGATIVE_JOINT_AIM; if (MOBY(moby)->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } else { sentrybot_instance_data->unk15F = 1; - MOBY(moby)->state = 0xB; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION; sentrybot_instance_data->unk15C = 0x10; sentrybot_instance_data->unk15D = 3; if (MOBY(moby)->prev_seq != 1) @@ -632,12 +638,12 @@ void sentrybot_update(unsigned char *moby) { sentrybot_instance_data->unk14C = scale_game_frames(0x3C); MOBY(moby)->command = 1; if (sentrybot_instance_data->unk15F != 0) { - MOBY(moby)->state = 0xD; + MOBY(moby)->state = SENTRYBOT_PATROL_MOVE_FAST; if (MOBY(moby)->prev_seq != 0xE) blend_moby_animation(moby, 0xE, 0, scale_game_frames(10)); } else { sentrybot_instance_data->unk15F = 1; - MOBY(moby)->state = 0xB; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION; sentrybot_instance_data->unk15C = 0xD; sentrybot_instance_data->unk15D = 0xE; if (MOBY(moby)->prev_seq != 1) @@ -656,7 +662,7 @@ void sentrybot_update(unsigned char *moby) { sentrybot_instance_data->unk154 == 0) { sentrybot_instance_data->unk15C = MOBY(moby)->state; sentrybot_instance_data->unk15D = 0xD; - MOBY(moby)->state = 5; + MOBY(moby)->state = SENTRYBOT_DEACTIVATE_LINKED_MOBYS_AFTER_ANIMATION; if (MOBY(moby)->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } @@ -681,19 +687,19 @@ void sentrybot_update(unsigned char *moby) { (float *)((char *)D_L15_001B0AB0[sentrybot_instance_data->unk124] + (sentrybot_instance_data->patrol_point * 0x10 + 0x10)), sp)) { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = SENTRYBOT_ALERT_IDLE; sentrybot_instance_data->unk144 = 1; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else if (sentrybot_instance_data->unk114 != 2 && sentrybot_instance_data->unk15B == 0) { MOBY(moby)->command = 1; if (sentrybot_instance_data->unk15F != 0) { - MOBY(moby)->state = 0x10; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_NEGATIVE_JOINT_AIM; if (MOBY(moby)->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } else { sentrybot_instance_data->unk15F = 1; - MOBY(moby)->state = 0xB; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION; sentrybot_instance_data->unk15C = 0x10; sentrybot_instance_data->unk15D = 3; if (MOBY(moby)->prev_seq != 1) @@ -702,14 +708,15 @@ void sentrybot_update(unsigned char *moby) { } else if (sentrybot_instance_data->alert_timer != 0) { sentrybot_instance_data->unk14C = scale_game_frames(0x3C); } else { - MOBY(moby)->state = 9; + MOBY(moby)->state = SENTRYBOT_RETURN_HOME; if (MOBY(moby)->prev_seq != 0xD) blend_moby_animation(moby, 0xD, 0, scale_game_frames(10)); if (sentrybot_instance_data->alarm_moby_index != -1) { - char *o = (char *)((sentrybot_instance_data->alarm_moby_index << 8) + - (int)l15_moby_array); - if (*(int *)(*(char **)(o + 0x78) + 8) != 0) - set_sentrybot_alarm_duration(o, scale_game_frames(0x1E)); + char *linked_alarm_moby = + (char *)((sentrybot_instance_data->alarm_moby_index << 8) + + (int)l15_moby_array); + if (*(int *)(*(char **)(linked_alarm_moby + 0x78) + 8) != 0) + set_sentrybot_alarm_duration(linked_alarm_moby, scale_game_frames(0x1E)); } } break; @@ -765,7 +772,7 @@ void sentrybot_update(unsigned char *moby) { (void *)0x10, (void *)3); } else { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = SENTRYBOT_ALERT_IDLE; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } @@ -779,7 +786,7 @@ void sentrybot_update(unsigned char *moby) { } if (MOBY(moby)->anim_flags & 2) { if (hero.state.current == 0x65) { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = SENTRYBOT_ALERT_IDLE; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else { @@ -790,7 +797,7 @@ void sentrybot_update(unsigned char *moby) { 0x78) + 8) == 0 && can_sentrybot_approach_linked_moby(moby) != 0) { - MOBY(moby)->state = 0xE; + MOBY(moby)->state = SENTRYBOT_APPROACH_LINKED_MOBY; if (MOBY(moby)->prev_seq != 0xE) blend_moby_animation(moby, 0xE, 0, scale_game_frames(0x14)); } else if (sentrybot_instance_data->unk15C == 0x10) { @@ -821,7 +828,7 @@ void sentrybot_update(unsigned char *moby) { fast_vec_normalize(va, va, fast_vec_length(va) - 1.5f); fast_vec_add(va, va, &MOBY(moby)->pos); if (move_sentrybot_toward_point((char *)moby, va, frame_time * 4.0f)) { - MOBY(moby)->state = 0xF; + MOBY(moby)->state = SENTRYBOT_ACTIVATE_LINKED_MOBY; if (MOBY(moby)->prev_seq != 9) blend_moby_animation(moby, 9, 0, scale_game_frames(10)); } @@ -850,11 +857,11 @@ void sentrybot_update(unsigned char *moby) { alert_visible_group_sentrybots(moby); if (MOBY(moby)->anim_flags & 2) { if (hero.state.current == 0x65) { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = SENTRYBOT_ALERT_IDLE; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else { - MOBY(moby)->state = 0x13; + MOBY(moby)->state = SENTRYBOT_EMIT_WITH_POSITIVE_JOINT_AIM; sentrybot_instance_data->unk19E = 0; if (MOBY(moby)->prev_seq != 6) blend_moby_animation(moby, 6, 0, scale_game_frames(10)); @@ -867,11 +874,11 @@ void sentrybot_update(unsigned char *moby) { alert_visible_group_sentrybots(moby); if (MOBY(moby)->anim_flags & 2) { if (hero.state.current == 0x65) { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = SENTRYBOT_ALERT_IDLE; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else { - MOBY(moby)->state = 0x11; + MOBY(moby)->state = SENTRYBOT_EMIT_WITH_NEGATIVE_JOINT_AIM; sentrybot_instance_data->unk19E = 0; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); @@ -913,7 +920,7 @@ void sentrybot_update(unsigned char *moby) { } if (MOBY(moby)->anim_flags & 2) { if (hero.state.current == 0x65) { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = SENTRYBOT_ALERT_IDLE; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else if (sentrybot_instance_data->alarm_moby_index != -1 && @@ -923,7 +930,7 @@ void sentrybot_update(unsigned char *moby) { 0x78) + 8) == 0 && can_sentrybot_approach_linked_moby(moby) != 0) { - MOBY(moby)->state = 0xE; + MOBY(moby)->state = SENTRYBOT_APPROACH_LINKED_MOBY; if (MOBY(moby)->prev_seq != 0xE) blend_moby_animation(moby, 0xE, 0, scale_game_frames(0x14)); } else if (fast_difference_between_rotations( @@ -937,11 +944,11 @@ void sentrybot_update(unsigned char *moby) { (void *)0x10, (void *)3); } else if (sentrybot_instance_data->unk114 == 2) { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = SENTRYBOT_ALERT_IDLE; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else { - MOBY(moby)->state = 0x10; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_NEGATIVE_JOINT_AIM; if (MOBY(moby)->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } @@ -983,7 +990,7 @@ void sentrybot_update(unsigned char *moby) { } if (MOBY(moby)->anim_flags & 2) { if (hero.state.current == 0x65) { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = SENTRYBOT_ALERT_IDLE; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else if (sentrybot_instance_data->alarm_moby_index != -1 && @@ -993,7 +1000,7 @@ void sentrybot_update(unsigned char *moby) { 0x78) + 8) == 0 && can_sentrybot_approach_linked_moby(moby) != 0) { - MOBY(moby)->state = 0xE; + MOBY(moby)->state = SENTRYBOT_APPROACH_LINKED_MOBY; if (MOBY(moby)->prev_seq != 0xE) blend_moby_animation(moby, 0xE, 0, scale_game_frames(0x14)); } else if (fast_difference_between_rotations( @@ -1007,11 +1014,11 @@ void sentrybot_update(unsigned char *moby) { (void *)0x12, (void *)5); } else if (sentrybot_instance_data->unk114 == 2) { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = SENTRYBOT_ALERT_IDLE; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else { - MOBY(moby)->state = 0x12; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_POSITIVE_JOINT_AIM; if (MOBY(moby)->prev_seq != 5) blend_moby_animation(moby, 5, 0, scale_game_frames(10)); } @@ -1020,35 +1027,39 @@ void sentrybot_update(unsigned char *moby) { break; case SENTRYBOT_ALERT_IDLE: if (hero.state.current == 0x65) { - MOBY(moby)->state = 9; + MOBY(moby)->state = SENTRYBOT_RETURN_HOME; if (MOBY(moby)->prev_seq != 0xD) blend_moby_animation(moby, 0xD, 0, scale_game_frames(10)); if (sentrybot_instance_data->alarm_moby_index != -1) { - char *o = (char *)((sentrybot_instance_data->alarm_moby_index << 8) + - (int)l15_moby_array); - if (*(int *)(*(char **)(o + 0x78) + 8) != 0) - set_sentrybot_alarm_duration(o, -1); + char *linked_alarm_moby = + (char *)((sentrybot_instance_data->alarm_moby_index << 8) + + (int)l15_moby_array); + if (*(int *)(*(char **)(linked_alarm_moby + 0x78) + 8) != 0) + set_sentrybot_alarm_duration(linked_alarm_moby, -1); } } else { int mode = sentrybot_instance_data->unk114; - if (mode != 2 && sentrybot_instance_data->unk15B == 0) { + if (mode != SENTRYBOT_TARGET_MODE_SUPPRESS_DIRECT_EMISSION && + sentrybot_instance_data->unk15B == 0) { begin_sentrybot_turn_toward_point((char *)moby, sentrybot_instance_data, (float *)(&sentrybot_instance_data->unkD0), (void *)0x10, (void *)3); } else if (sentrybot_instance_data->alert_timer == 0) { - MOBY(moby)->state = 9; + MOBY(moby)->state = SENTRYBOT_RETURN_HOME; if (MOBY(moby)->prev_seq != 0xD) blend_moby_animation(moby, 0xD, 0, scale_game_frames(10)); if (sentrybot_instance_data->alarm_moby_index != -1) { - char *o = (char *)((sentrybot_instance_data->alarm_moby_index << 8) + - (int)l15_moby_array); - if (*(int *)(*(char **)(o + 0x78) + 8) != 0) - set_sentrybot_alarm_duration(o, scale_game_frames(0x1E)); + char *linked_alarm_moby = + (char *)((sentrybot_instance_data->alarm_moby_index << 8) + + (int)l15_moby_array); + if (*(int *)(*(char **)(linked_alarm_moby + 0x78) + 8) != 0) + set_sentrybot_alarm_duration(linked_alarm_moby, scale_game_frames(0x1E)); } } else if (sentrybot_instance_data->has_line_of_sight != 0) { - if (mode != 2 && sentrybot_instance_data->unk15B == 0) { + if (mode != SENTRYBOT_TARGET_MODE_SUPPRESS_DIRECT_EMISSION && + sentrybot_instance_data->unk15B == 0) { begin_sentrybot_turn_toward_point((char *)moby, sentrybot_instance_data, (float *)(target + 0x10), @@ -1071,12 +1082,12 @@ void sentrybot_update(unsigned char *moby) { sentrybot_instance_data->unk14C = scale_game_frames(0x3C); MOBY(moby)->command = 1; if (sentrybot_instance_data->unk15F != 0) { - MOBY(moby)->state = 0xD; + MOBY(moby)->state = SENTRYBOT_PATROL_MOVE_FAST; if (MOBY(moby)->prev_seq != 0xE) blend_moby_animation(moby, 0xE, 0, scale_game_frames(10)); } else { sentrybot_instance_data->unk15F = 1; - MOBY(moby)->state = 0xB; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION; sentrybot_instance_data->unk15C = 0xD; sentrybot_instance_data->unk15D = 0xE; if (MOBY(moby)->prev_seq != 1) @@ -1092,18 +1103,19 @@ void sentrybot_update(unsigned char *moby) { if (collision_hit_material() == -1 && sentrybot_instance_data->home_pos[2] - 5.0f < MOBY(moby)->pos.z) { if (hero.state.current == 0x65) { - MOBY(moby)->state = 0xC; + MOBY(moby)->state = SENTRYBOT_ALERT_IDLE; if (MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); } else { MOBY(moby)->command = 1; if (sentrybot_instance_data->unk15F != 0) { - MOBY(moby)->state = 0x10; + MOBY(moby)->state = + SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_NEGATIVE_JOINT_AIM; if (MOBY(moby)->prev_seq != 3) blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } else { sentrybot_instance_data->unk15F = 1; - MOBY(moby)->state = 0xB; + MOBY(moby)->state = SENTRYBOT_WAIT_FOR_TRANSITION_ANIMATION; sentrybot_instance_data->unk15C = 0x10; sentrybot_instance_data->unk15D = 3; if (MOBY(moby)->prev_seq != 1) @@ -1226,7 +1238,7 @@ int begin_sentrybot_turn_toward_heading( moby_data->unk15C = next_state; moby_data->unk15D = next_animation; if (heading_delta > 2.0943952f || heading_delta < -2.0943952f) { - MOBY(moby)->state = 8; + MOBY(moby)->state = SENTRYBOT_TURN_AROUND; stored_heading_delta = moby_data->turn_delta; if (stored_heading_delta > 0.0f) { moby_data->turn_delta = stored_heading_delta + -6.2831855f; @@ -1236,13 +1248,13 @@ int begin_sentrybot_turn_toward_heading( } } else if (heading_delta < -0.7853982f) { - MOBY(moby)->state = 6; + MOBY(moby)->state = SENTRYBOT_TURN_NEGATIVE_HEADING_DELTA; if (MOBY(moby)->prev_seq != 0xA) { blend_moby_animation(moby, 0xA, 0, scale_game_frames(10)); } } else if (heading_delta > 0.7853982f) { - MOBY(moby)->state = 7; + MOBY(moby)->state = SENTRYBOT_TURN_POSITIVE_HEADING_DELTA; if (MOBY(moby)->prev_seq != 0xB) { blend_moby_animation(moby, 0xB, 0, scale_game_frames(10)); } @@ -1555,6 +1567,9 @@ void update_sentrybot_hit_response_and_target_visibility(void *sentrybot_moby, i SENTRYBOT_FIRST_CHANNEL_BLEND_TARGET_HIT_RESPONSE = 10, SENTRYBOT_NO_KNOCKBACK_START_RESPONSE = 11 }; + enum { + HIT_STATUS_SKIP_REACTION = 1 + }; unsigned char *moby = sentrybot_moby; SentrybotVars *sentrybot_data = (SentrybotVars *)MOBY(moby)->pvars; char *hit; @@ -1570,14 +1585,14 @@ void update_sentrybot_hit_response_and_target_visibility(void *sentrybot_moby, i int group; unsigned char seen; - if (MOBY(moby)->state == 0) + if (MOBY(moby)->state == SENTRYBOT_INITIALIZE) return; MOBY(moby)->scale = *(float *)(((char *)MOBY(moby)->pclass) + 0x24) * sentrybot_class_scale_multiplier_gp; impact = 0.0f; hit = FUN_L00_0025a420(moby, 0x330000, 0); code = resolve_moby_hit_response(moby, hit, &sentrybot_data->health, 0, &kind, &impact, 0, 4); - if (kind != 1 && MOBY(moby)->state != 0x17) { + if (kind != HIT_STATUS_SKIP_REACTION && MOBY(moby)->state != SENTRYBOT_DEATH_KNOCKBACK) { if ((unsigned char)D_001413F4[0] == 0) alert_visible_group_sentrybots(moby); sentrybot_data->health -= impact; @@ -1638,7 +1653,7 @@ void update_sentrybot_hit_response_and_target_visibility(void *sentrybot_moby, i &sentrybot_data->knockback.horizontal_speed, &sentrybot_data->knockback.vertical_speed); trooper_start_knockback(moby, &sentrybot_data->knockback, 7, 1, 0, angle); - MOBY(moby)->state = 0x15; + MOBY(moby)->state = SENTRYBOT_RECOVERABLE_KNOCKBACK; MOBY(moby)->command = 2; sentrybot_data->unk67 = 0x78; break; @@ -1677,7 +1692,7 @@ void update_sentrybot_hit_response_and_target_visibility(void *sentrybot_moby, i &sentrybot_data->knockback.horizontal_speed, &sentrybot_data->knockback.vertical_speed); trooper_start_knockback(moby, &sentrybot_data->knockback, 8, 1, 0, fall_angle); - MOBY(moby)->state = 0x17; + MOBY(moby)->state = SENTRYBOT_DEATH_KNOCKBACK; MOBY(moby)->command = 2; sentrybot_data->unk67 = 0xF0; break; @@ -1717,7 +1732,8 @@ void update_sentrybot_hit_response_and_target_visibility(void *sentrybot_moby, i if ((fast_difference_between_rotations(MOBY(moby)->rot.z, target_angle) < 1.5707964f && (sentrybot_target_visibility_height_check_gate[0] == 0 || absolute_float(MOBY(moby)->pos.z - sentrybot_data->unkD0[2]) < 4.0f)) || - MOBY(moby)->state == 0x10 || MOBY(moby)->state == 0x11) { + MOBY(moby)->state == SENTRYBOT_WAIT_FOR_ANIMATION_THEN_EMIT_WITH_NEGATIVE_JOINT_AIM || + MOBY(moby)->state == SENTRYBOT_EMIT_WITH_NEGATIVE_JOINT_AIM) { seen = sentrybot_data->has_line_of_sight; } if (sentrybot_data->unk114 == 1) @@ -1768,6 +1784,9 @@ void draw_sentrybot_effect_quads(char *moby) { /* Marks the moby as killed in the level's spawn tables and releases the voice slot it still owns. */ void mark_moby_killed_and_release_owned_voice(int addr) { + enum { + MOBY_KILLED = 2 + }; struct Moby *moby = (struct Moby *)addr; s32 slot; moby->collision = 0; @@ -1785,7 +1804,7 @@ void mark_moby_killed_and_release_owned_voice(int addr) { } } moby->command = 0xFF; - moby->state = 2; + moby->state = MOBY_KILLED; } /* Ported from rac1-decomp (src/overlays/shared/vendor_00298BB8.c: func_L15_002CCE50), where it is exact; names translated to the US level program. */ @@ -1821,9 +1840,15 @@ void set_sentrybot_alarm_duration(char *moby, int duration_frames) { /* Ported from rac1-decomp (src/overlays/shared/vendor_00298BB8.c: func_L15_002CCF30), where it is exact; names translated to the US level program. */ void prepare_sentrybot_alarm(unsigned char *moby) { + enum { + SENTRYBOT_ALARM_PREPARING = 2 + }; + enum { + SENTRYBOT_ALARM_AWAITING_PREPARATION = 1 + }; char *alarm_moby_data = ((char *)MOBY(moby)->pvars); - if (MOBY(moby)->state == 1) { - MOBY(moby)->state = 2; + if (MOBY(moby)->state == SENTRYBOT_ALARM_AWAITING_PREPARATION) { + MOBY(moby)->state = SENTRYBOT_ALARM_PREPARING; if (MOBY(moby)->prev_seq != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } diff --git a/src/overlays/shared/enemies/sentrybot_alarm.c b/src/overlays/shared/enemies/sentrybot_alarm.c index 66fe1f1aaa..bb1b2ac95d 100644 --- a/src/overlays/shared/enemies/sentrybot_alarm.c +++ b/src/overlays/shared/enemies/sentrybot_alarm.c @@ -36,7 +36,7 @@ extern int D_0015ED84; extern int interpolate_color_2a3138(float, int, int) __asm__("FUN_001fa6e0"); -extern int D_L15_00161AB4 __attribute__((sda)); +extern int l15_sentrybot_alarm_effect_update_stamp __asm__("D_L15_00161AB4") __attribute__((sda)); extern int D_L15_00161AB8 __attribute__((sda)); extern short D_L15_00161ABC_gp __asm__("D_L15_00161ABC") __attribute__((sda)); void update_sentrybot_alarm_effect(void *moby) __asm__("FUN_L15_002cbc30"); @@ -55,15 +55,21 @@ extern short sentrybot_alarm_voice_owner_gp __asm__("D_L15_00161AC8") __attribut int activate_first_inactive_group_moby(int moby_group_index, void *pos) __asm__("FUN_L15_002a2868"); int activate_first_inactive_group_moby(int moby_group_index, void *pos) { + enum { + GROUP_MOBY_STATE_INACTIVE = 1 + }; + enum { + GROUP_MOBY_STATE_ACTIVATING = 2 + }; short *group_moby_entry = (short *)D_L15_001ABE40[moby_group_index]; struct Hero *hero_data = &hero; do { unsigned char *listed_moby = (unsigned char *)l15_moby_array + ((*(unsigned short *)group_moby_entry & 0x7FFF) << 8); unsigned char state = MOBY(listed_moby)->state; - if (state == 1) { + if (state == GROUP_MOBY_STATE_INACTIVE) { char *activated_moby_data; - MOBY(listed_moby)->state = 2; + MOBY(listed_moby)->state = GROUP_MOBY_STATE_ACTIVATING; if (MOBY(listed_moby)->prev_seq != 0) blend_moby_animation(listed_moby, 0, 0, 0); MOBY(listed_moby)->flags |= 1; @@ -90,18 +96,34 @@ void sentrybot_alarm_update(unsigned char *moby) __asm__("FUN_L15_002cb4c8"); /* Moby class 408 */ void sentrybot_alarm_update(unsigned char *moby) { + enum { + SENTRYBOT_ALARM_STATE_INITIALIZE = 0, + SENTRYBOT_ALARM_STATE_STANDBY_PULSE = 1, + SENTRYBOT_ALARM_STATE_STANDBY_RETURN_TRANSITION = 2, + SENTRYBOT_ALARM_STATE_WAIT_FOR_ALARM_TRIGGER = 3, + SENTRYBOT_ALARM_STATE_ALARM_START_TRANSITION = 4, + SENTRYBOT_ALARM_STATE_ACTIVE_PULSE = 5, + SENTRYBOT_ALARM_STATE_WAIT_FOR_GROUP_RELEASE_TRIGGER = 6, + SENTRYBOT_ALARM_STATE_GROUP_RELEASE_START_TRANSITION = 7, + SENTRYBOT_ALARM_STATE_RELEASE_GROUP_MOBYS = 8, + SENTRYBOT_ALARM_STATE_GROUP_RELEASE_STOP_TRANSITION = 9, + SENTRYBOT_ALARM_STATE_ALARM_STOP_TRANSITION = 10 + }; + enum { + SENTRYBOT_ALARM_MODE_GROUP_RELEASE_ONLY = 2 + }; float position[4]; float step; int color; int mode; - int *data = ((int *)MOBY(moby)->pvars); + int *alarm_state = ((int *)MOBY(moby)->pvars); switch (MOBY(moby)->state) { - case 0: - mode = data[0]; - D_L15_00161AB4 = 0; + case SENTRYBOT_ALARM_STATE_INITIALIZE: + mode = alarm_state[0]; + l15_sentrybot_alarm_effect_update_stamp = 0; D_L15_00161AB8 = 0; *(int *)&D_L15_00161ABC_gp = 0; - if (mode == 2) { + if (mode == SENTRYBOT_ALARM_MODE_GROUP_RELEASE_ONLY) { MOBY(moby)->state = 6; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, 0); @@ -111,16 +133,17 @@ void sentrybot_alarm_update(unsigned char *moby) { blend_moby_animation(moby, 2, 0, 0); } break; - case 1: + case SENTRYBOT_ALARM_STATE_STANDBY_PULSE: color = interpolate_color_2a3138( - (fast_sin(*(float *)(data + 5)) + 1.0f) * 0.5f, 0x801414bc, 0x801414dc); + (fast_sin(*(float *)(alarm_state + 5)) + 1.0f) * 0.5f, 0x801414bc, 0x801414dc); step = frame_time; MOBY(moby)->glow_color = color; - *(float *)(data + 5) = fast_add_rotations(*(float *)(data + 5), step * 6.2831855f); - if (data[2] == 0) + *(float *)(alarm_state + 5) = + fast_add_rotations(*(float *)(alarm_state + 5), step * 6.2831855f); + if (alarm_state[2] == 0) goto update; if (D_L15_0015F5C4 != 2) { - if (data[0] == 1) { + if (alarm_state[0] == 1) { MOBY(moby)->state = 6; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(30)); @@ -129,15 +152,15 @@ void sentrybot_alarm_update(unsigned char *moby) { } } break; - case 2: + case SENTRYBOT_ALARM_STATE_STANDBY_RETURN_TRANSITION: if (MOBY(moby)->anim_flags & 2) { MOBY(moby)->state = 3; if (MOBY(moby)->prev_seq != 2) blend_moby_animation(moby, 2, 0, scale_game_frames(10)); } break; - case 3: - if (data[2] == 0) + case SENTRYBOT_ALARM_STATE_WAIT_FOR_ALARM_TRIGGER: + if (alarm_state[2] == 0) goto update; if (D_L15_0015F5C4 != 2) { MOBY(moby)->state = 4; @@ -145,11 +168,11 @@ void sentrybot_alarm_update(unsigned char *moby) { blend_moby_animation(moby, 3, 0, scale_game_frames(10)); } break; - case 4: + case SENTRYBOT_ALARM_STATE_ALARM_START_TRANSITION: if (MOBY(moby)->anim_flags & 2) { - if (data[2] == 0 || D_L15_0015F5C4 == 2) + if (alarm_state[2] == 0 || D_L15_0015F5C4 == 2) goto stop_animation; - if (data[0] == 1) { + if (alarm_state[0] == 1) { MOBY(moby)->state = 7; if (MOBY(moby)->prev_seq != 5) blend_moby_animation(moby, 5, 0, scale_game_frames(10)); @@ -165,59 +188,60 @@ void sentrybot_alarm_update(unsigned char *moby) { blend_moby_animation(moby, 8, 0, scale_game_frames(10)); MOBY(moby)->state = 10; break; - case 5: + case SENTRYBOT_ALARM_STATE_ACTIVE_PULSE: if ((MOBY(moby)->anim_flags & 2) && MOBY(moby)->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); color = interpolate_color_2a3138( - (fast_sin(*(float *)(data + 5)) + 1.0f) * 0.5f, 0x801414dc, 0x8004048c); + (fast_sin(*(float *)(alarm_state + 5)) + 1.0f) * 0.5f, 0x801414dc, 0x8004048c); step = frame_time; MOBY(moby)->glow_color = color; - *(float *)(data + 5) = fast_add_rotations(*(float *)(data + 5), step * 12.566371f); - if (fast_dec_timer(data + 6) || D_L15_0015F5C4 == 2) { + *(float *)(alarm_state + 5) = + fast_add_rotations(*(float *)(alarm_state + 5), step * 12.566371f); + if (fast_dec_timer(alarm_state + 6) || D_L15_0015F5C4 == 2) { set_sentrybot_alarm_duration((char *)moby, 0); - data[2] = 0; + alarm_state[2] = 0; if (MOBY(moby)->prev_seq != 8) blend_moby_animation(moby, 8, 0, scale_game_frames(10)); MOBY(moby)->state = 10; } break; - case 6: - if (data[2] == 0) + case SENTRYBOT_ALARM_STATE_WAIT_FOR_GROUP_RELEASE_TRIGGER: + if (alarm_state[2] == 0) goto update; MOBY(moby)->state = 7; if (MOBY(moby)->prev_seq != 5) blend_moby_animation(moby, 5, 0, scale_game_frames(10)); break; - case 7: + case SENTRYBOT_ALARM_STATE_GROUP_RELEASE_START_TRANSITION: if (MOBY(moby)->anim_flags & 2) { MOBY(moby)->state = 8; if (MOBY(moby)->prev_seq != 6) blend_moby_animation(moby, 6, 0, scale_game_frames(10)); } break; - case 8: { + case SENTRYBOT_ALARM_STATE_RELEASE_GROUP_MOBYS: { float *pos = (float *)&MOBY(moby)->pos; float *hero_pos = hero.motion.pos.f; if (vector_distance_xy(pos, hero_pos) < 16.0f && D_L15_0015F5C4 != 2 && - fast_dec_timer(data + 3)) { + fast_dec_timer(alarm_state + 3)) { qcopy(position, pos); position[2] += 1.0f; if (collision_line(position, hero_pos + 20, 2, 0, 0) == 0 && - activate_first_inactive_group_moby(data[1], pos)) - data[3] = data[4]; + activate_first_inactive_group_moby(alarm_state[1], pos)) + alarm_state[3] = alarm_state[4]; } - if (fast_dec_timer(data + 6) || D_L15_0015F5C4 == 2) { + if (fast_dec_timer(alarm_state + 6) || D_L15_0015F5C4 == 2) { set_sentrybot_alarm_duration((char *)moby, 0); - data[2] = 0; + alarm_state[2] = 0; MOBY(moby)->state = 9; if (MOBY(moby)->prev_seq != 7) blend_moby_animation(moby, 7, 0, scale_game_frames(10)); } break; } - case 9: + case SENTRYBOT_ALARM_STATE_GROUP_RELEASE_STOP_TRANSITION: if (MOBY(moby)->anim_flags & 2) { - if (data[0] == 2) { + if (alarm_state[0] == 2) { MOBY(moby)->state = 6; if (MOBY(moby)->prev_seq != 4) blend_moby_animation(moby, 4, 0, scale_game_frames(10)); @@ -228,7 +252,7 @@ void sentrybot_alarm_update(unsigned char *moby) { } } break; - case 10: + case SENTRYBOT_ALARM_STATE_ALARM_STOP_TRANSITION: if (MOBY(moby)->anim_flags & 2) { MOBY(moby)->state = 2; if (MOBY(moby)->prev_seq != 1) @@ -236,11 +260,11 @@ void sentrybot_alarm_update(unsigned char *moby) { } break; } - if (data[2] != 0) + if (alarm_state[2] != 0) D_L15_00161AB8 = 1; update: - if (D_L15_00161AB4 != D_L15_0015F5CC) { - D_L15_00161AB4 = D_L15_0015F5CC; + if (l15_sentrybot_alarm_effect_update_stamp != D_L15_0015F5CC) { + l15_sentrybot_alarm_effect_update_stamp = D_L15_0015F5CC; update_sentrybot_alarm_effect(moby); D_L15_00161AB8 = 0; } diff --git a/src/overlays/shared/enemies/sentrybot_projectile.c b/src/overlays/shared/enemies/sentrybot_projectile.c index 7f6d4429e8..d3f61adc4a 100644 --- a/src/overlays/shared/enemies/sentrybot_projectile.c +++ b/src/overlays/shared/enemies/sentrybot_projectile.c @@ -9,6 +9,10 @@ #include "qcopy.h" #include "rnc/math/fast_math.h" +enum { + SENTRYBOT_PROJECTILE_STATE_FLYING = 0 +}; + extern char *spawn_source_attached_fading_effect_particle( char *src, int col, int w, int v, float x) __asm__("FUN_L00_0026daa0"); extern char *create_moby(int); @@ -37,7 +41,7 @@ void sentrybot_projectile_update(unsigned char *moby) { mark_moby_for_removal(moby); return; } - if (MOBY(moby)->state != 0) + if (MOBY(moby)->state != SENTRYBOT_PROJECTILE_STATE_FLYING) return; MOBY(moby)->rot.x = fast_add_rotations(MOBY(moby)->rot.x, frame_time * 6.2831855f); fast_vec_add(next_position, &MOBY(moby)->pos, moby_vars); @@ -74,7 +78,7 @@ char *spawn_sentrybot_projectile(char *source_moby, float *direction_vector, cha MOBY(spawned_moby)->update_dist = 0xFF; MOBY(spawned_moby)->draw_dist = 0xFF; MOBY(spawned_moby)->visible = 1; - MOBY(spawned_moby)->state = 0; + MOBY(spawned_moby)->state = SENTRYBOT_PROJECTILE_STATE_FLYING; MOBY(spawned_moby)->spawn_frame = ((long)MOBY(source_moby)->spawn_frame); MOBY(spawned_moby)->scale = MOBY(spawned_moby)->scale * 20.0f; qcopy(&MOBY(spawned_moby)->pos, spawn_position); diff --git a/src/overlays/shared/enemies/smoke_trail_projectile.c b/src/overlays/shared/enemies/smoke_trail_projectile.c index 3e067ff001..6e11719393 100644 --- a/src/overlays/shared/enemies/smoke_trail_projectile.c +++ b/src/overlays/shared/enemies/smoke_trail_projectile.c @@ -89,10 +89,10 @@ void smoke_trail_projectile_update(char *moby) { hit_descriptor.b18 = 0; record_moby_hit(*(void **)(collision_result + 0x18), &hit_descriptor); } - MOBY(moby)->state = 2; + MOBY(moby)->state = BURST_AND_REMOVE; } if (fast_dec_timer(moby_vars + 0x14) != 0) - MOBY(moby)->state = 2; + MOBY(moby)->state = BURST_AND_REMOVE; break; case BURST_AND_REMOVE: cart_burst(moby, &MOBY(moby)->pos, -1, 0.25f, 13.0f); diff --git a/src/overlays/shared/enemies/spawner.c b/src/overlays/shared/enemies/spawner.c index b59d5d89b3..301333d7de 100644 --- a/src/overlays/shared/enemies/spawner.c +++ b/src/overlays/shared/enemies/spawner.c @@ -19,6 +19,12 @@ #include "rnc/overlay/shared/enemies/spawner_egg.h" #include "rnc/overlay/shared/math/random.h" +enum { + SPAWNER_STATE_INITIALIZE = 0, + SPAWNER_STATE_SPAWN = 1, + SPAWNER_STATE_EXPLODE = 2 +}; + typedef struct SpawnerVars { u8 pad0[0x20]; f32 unk20; @@ -102,7 +108,7 @@ void process_spawner_hit_record(struct Moby *moby, char *spawner_vars) { FUN_L00_0025d458_c(moby, spawner_vars + 0x60); } else { FUN_L00_00257470_c(moby, 0, -1); - moby->state = 2; + moby->state = SPAWNER_STATE_EXPLODE; spawner_vars[0x67] = 0x78; FUN_L00_0025d458_c(moby, spawner_vars + 0x60); } @@ -141,11 +147,6 @@ void spawner_update(char *moby) __asm__("FUN_L09_0030ab80"); /* Moby class 1885 */ void spawner_update(char *moby) { - enum { - SPAWNER_STATE_INITIALIZE = 0, - SPAWNER_STATE_SPAWN = 1, - SPAWNER_STATE_EXPLODE = 2 - }; SpawnerVars *spawner_vars = (SpawnerVars *)MOBY(moby)->pvars; float target[4]; float launch_velocity[4]; @@ -159,7 +160,7 @@ void spawner_update(char *moby) { while (get_first_moby_in_group(&moby_to_remove, spawner_vars->unk94, 0, 0) == 0) { mark_moby_for_removal((void *)moby_to_remove); } - MOBY(moby)->state = 1; + MOBY(moby)->state = SPAWNER_STATE_SPAWN; return; } case SPAWNER_STATE_SPAWN: { diff --git a/src/overlays/shared/enemies/spawner_egg.c b/src/overlays/shared/enemies/spawner_egg.c index 6ae19dbffd..2e878685e6 100644 --- a/src/overlays/shared/enemies/spawner_egg.c +++ b/src/overlays/shared/enemies/spawner_egg.c @@ -261,7 +261,7 @@ void spawner_egg_update(struct Moby *moby) { } } if (fast_dec_timer_s16(&bubble_vars->life) != 0) { - moby->state = 2; + moby->state = SPAWNER_EGG_STATE_SHRINKING; } moby->rot.x = normalize_angle(bubble_vars->vel.f[0]); moby->rot.y = normalize_angle(bubble_vars->vel.f[1]); @@ -276,7 +276,7 @@ void spawner_egg_update(struct Moby *moby) { moby->pos.w = 0.0f; step.q = ((Vec4 *)&moby->pos)->q; bubble_vars->held = respawn_spawner_child(bubble_vars->owner, &step); - moby->state = 2; + moby->state = SPAWNER_EGG_STATE_SHRINKING; break; case SPAWNER_EGG_STATE_SHRINKING: rate = frame_scale * 0.05f; diff --git a/src/overlays/shared/enemies/spiderbot.c b/src/overlays/shared/enemies/spiderbot.c index 6b89e566ce..15fa0a460a 100644 --- a/src/overlays/shared/enemies/spiderbot.c +++ b/src/overlays/shared/enemies/spiderbot.c @@ -96,13 +96,13 @@ void spiderbot_update(unsigned char *moby) { MOBY(moby)->anim_speed = moby_data->unk30 / 1.5f; moby_data->unk28 = moby_data->unk28 * 0.017453292f; if (moby_data->unk20 == 0) { - MOBY(moby)->state = 1; + MOBY(moby)->state = SPIDERBOT_CIRCULAR_MOTION; moby_data->unk2C = MOBY(moby)->rot.z; } else if (moby_data->unk20 >= 3) { - MOBY(moby)->state = 2; + MOBY(moby)->state = SPIDERBOT_ARC_OSCILLATION; moby_data->unk2C = MOBY(moby)->rot.z; } else { - MOBY(moby)->state = 3; + MOBY(moby)->state = SPIDERBOT_LINEAR_OSCILLATION; } break; case SPIDERBOT_CIRCULAR_MOTION: { diff --git a/src/overlays/shared/enemies/walker_update_gait.c b/src/overlays/shared/enemies/walker_update_gait.c index acd6d5c52f..cea7984e92 100644 --- a/src/overlays/shared/enemies/walker_update_gait.c +++ b/src/overlays/shared/enemies/walker_update_gait.c @@ -47,7 +47,7 @@ int walker_gait_mask(float *gait_record, float interval_value) { return result_mask; } -void FUN_L00_001fff28(void *, s32, f32); +void build_axis_rotation_quaternion(void *, s32, f32) __asm__("FUN_L00_001fff28"); void reset_walker_gait_helpers(u8 *gait_data) __asm__("FUN_L00_002a1538"); void reset_walker_gait_helpers(u8 *gait_data) { @@ -57,9 +57,9 @@ void reset_walker_gait_helpers(u8 *gait_data) { for (i = 0; i < 2; i++) { u8 *gait_region_base = gait_data + i * 0xB0; if (gait_region_base[0x161] != 0) - FUN_L00_001fff28(gait_helper_record_base + i * 0xB0, 2, 0.0f); + build_axis_rotation_quaternion(gait_helper_record_base + i * 0xB0, 2, 0.0f); if (gait_region_base[0x121] != 0) - FUN_L00_001fff28(gait_helper_record_130_base + i * 0xB0, 2, 0.0f); + build_axis_rotation_quaternion(gait_helper_record_130_base + i * 0xB0, 2, 0.0f); *(s32 *)(gait_region_base + 0x104) = 0; *(s32 *)(gait_region_base + 0xFC) = 0; } diff --git a/src/overlays/shared/game/initialize_level_transition_with_audio.c b/src/overlays/shared/game/initialize_level_transition_with_audio.c index 5fb8f1f457..0465ed0b2a 100644 --- a/src/overlays/shared/game/initialize_level_transition_with_audio.c +++ b/src/overlays/shared/game/initialize_level_transition_with_audio.c @@ -14,6 +14,9 @@ #include "rnc/world/loaders/parse_space_scene_chunk.h" #include "rnc/audio/voices/sound_update.h" #include "rnc/overlay/shared/hero/set_hero_animation.h" + +void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); + #include "rnc/overlay/shared/mobys.h" #include "rnc/overlay/shared/streaming.h" #include "rnc/overlay/shared/ui/help/help_request.h" @@ -116,6 +119,9 @@ int sce_gs_sync_v(int) __asm__("FUN_00122298"); void initialize_level_transition_with_audio(int audio_selection_mode) __asm__("FUN_L00_0028e9c8"); void initialize_level_transition_with_audio(int audio_selection_mode) { + enum { + AUDIO_SELECTION_MODE_ALWAYS_FADE = 0 + }; O_28e9c8 *moby; int secondary_track_index, base_audio_selection_index, audio_stream_table_index, alternate_audio_stream_table_index, shared_table_offset; @@ -136,13 +142,13 @@ void initialize_level_transition_with_audio(int audio_selection_mode) { D_L00_0015F400 = 0; hero_set_state(100, 2); D_001413F5_lui = 1; - FUN_L00_00232fe8(); + set_hero_item_moby_flag_bit0(); D_0013E030_28e9c8.x0->flags |= 1; for (moby = D_L00_0015FFDC_28e9c8; moby->st != 0xFF; moby++) { if (!(moby->st & 0x80) && (moby->type == 0x4A || moby->type == 0xCB)) moby->flags |= 0x80; } - if (audio_selection_mode == 0) { + if (audio_selection_mode == AUDIO_SELECTION_MODE_ALWAYS_FADE) { base_audio_selection_index = D_0013E030_28e9c8.x26; audio_stream_table_index = base_audio_selection_index + 1; secondary_track_index = base_audio_selection_index + 6; diff --git a/src/overlays/shared/game/run_level_main_loop.c b/src/overlays/shared/game/run_level_main_loop.c index c8dd3b2e2e..d3413c8032 100644 --- a/src/overlays/shared/game/run_level_main_loop.c +++ b/src/overlays/shared/game/run_level_main_loop.c @@ -98,6 +98,10 @@ void run_level_main_loop(void) { LEVEL_MODE_GAME_STATE_UPDATE = 6, LEVEL_MODE_TIMED_BUFFER_SEQUENCE = 7 }; + enum { + PAL_MODE_DISABLED = 0, + PROFILER_MODE_DISABLED = 0 + }; int i; int saved_level_mode; int quit; @@ -227,7 +231,8 @@ void run_level_main_loop(void) { } memcard_update_state(); run_state_handler(); - if (memory_card_state.state >= 3 || memory_card_state.pending_state >= 0) { + if (memory_card_state.state >= MEMCARD_REQUEST_FORMAT || + memory_card_state.pending_state >= MEMCARD_QUERY_INFO) { if (D_L00_001B9CF0.unk13C == 0) { int rotation_period_frames = 55; float size; @@ -258,24 +263,25 @@ void run_level_main_loop(void) { noop_main_callback(level_frame_callback_args, 0x10); vu1_sync_chain(1); D_L00_0015F5D0 = convert_integer_to_float(*(volatile int *)0x10000800) / - (pal_mode != 0 ? 11520.0f : 9600.0f); - if (D_L00_0015F5C4 == 0 && g_debug_menu.profiler_mode != 0) { + (pal_mode != PAL_MODE_DISABLED ? 11520.0f : 9600.0f); + if (D_L00_0015F5C4 == 0 && g_debug_menu.profiler_mode != PROFILER_MODE_DISABLED) { noop_main_callback(); } if (hero.fall_fade_pending == 0) { int mode = D_L00_0015F5C4; - if (mode == 0 || mode == 2) { + if (mode == LEVEL_MODE_DEBUG_FLAG_GATED_UPDATE || + mode == LEVEL_MODE_DEBUG_PROFILER_RENDER) { int frame_timer_threshold = 9600; - if (pal_mode != 0) { + if (pal_mode != PAL_MODE_DISABLED) { frame_timer_threshold = 11520; } if (frame_timer_threshold < *(volatile int *)0x10000800) { - if (mode == 0) { + if (mode == LEVEL_MODE_DEBUG_FLAG_GATED_UPDATE) { register_audio_stream_callback(); handle_pause_input(); - } else if (mode == 2 && D_L00_0016C8B0 == 0) { + } else if (mode == LEVEL_MODE_DEBUG_PROFILER_RENDER && D_L00_0016C8B0 == 0) { register_audio_stream_callback(); update_cutscene_playback(); } diff --git a/src/overlays/shared/game/unlock_planet.c b/src/overlays/shared/game/unlock_planet.c index c1dd42487c..79e5961a97 100644 --- a/src/overlays/shared/game/unlock_planet.c +++ b/src/overlays/shared/game/unlock_planet.c @@ -30,6 +30,11 @@ int select_moby_combat_target(char *query_moby, float best) __asm__("FUN_L00_0025fcb8"); int select_moby_combat_target(char *query_moby, char *target_output, float best) { + enum { + COMBAT_TARGET_STATUS_DEFAULT_HERO = 0, + COMBAT_TARGET_STATUS_ALTERNATE_MOBY = 1, + COMBAT_TARGET_STATUS_HERO_EXCLUDED = 2 + }; struct Hero *hero_data = &hero_lui; char *selected_moby; char *candidate_moby; @@ -39,10 +44,10 @@ int select_moby_combat_target(char *query_moby, char *target_output, float best) float candidate_distance_score; selected_moby = ((char *)hero_data->moby); - target_selection_status = 0; + target_selection_status = COMBAT_TARGET_STATUS_DEFAULT_HERO; if (hero_data->state.control_mode == 0x18 || hero_data->state.current == 0x72) { selected_moby = 0; - target_selection_status = 2; + target_selection_status = COMBAT_TARGET_STATUS_HERO_EXCLUDED; } for (i = 1; i <= D_L00_001B0830_lui[0]; i++) { candidate_moby = moby_table + (D_L00_001B0830_lui[i] << 8); @@ -61,7 +66,7 @@ int select_moby_combat_target(char *query_moby, char *target_output, float best) if (candidate_distance_score < best) { selected_moby = candidate_moby; best = candidate_distance_score; - target_selection_status = 1; + target_selection_status = COMBAT_TARGET_STATUS_ALTERNATE_MOBY; } } for (j = 0; j < 20; j++) { @@ -81,7 +86,7 @@ int select_moby_combat_target(char *query_moby, char *target_output, float best) if (candidate_distance_score < best) { selected_moby = candidate_moby; best = candidate_distance_score; - target_selection_status = 1; + target_selection_status = COMBAT_TARGET_STATUS_ALTERNATE_MOBY; } } if (selected_moby != 0) { @@ -118,6 +123,11 @@ int FUN_L00_0025ff38(char *query_moby, float *target_region_vertices, int nv) { + enum { + FOLLOW_TARGET_STATUS_DEFAULT_HERO = 0, + FOLLOW_TARGET_STATUS_ALTERNATE_MOBY = 1, + FOLLOW_TARGET_STATUS_HERO_EXCLUDED = 2 + }; struct Hero *hero_data = &hero_lui; char *selected_moby; char *indexed_candidate; @@ -130,22 +140,22 @@ int FUN_L00_0025ff38(char *query_moby, float candidate_distance_score; selected_moby = (char *)hero_data->moby; - target_selection_status = 0; + target_selection_status = FOLLOW_TARGET_STATUS_DEFAULT_HERO; if (hero_data->state.control_mode == 0x18 || hero_data->state.current == 0x72) { selected_moby = 0; - target_selection_status = 2; + target_selection_status = FOLLOW_TARGET_STATUS_HERO_EXCLUDED; } else if (exclusion_list_bound > 0) { for (k = 0; k < exclusion_list_bound - 1; k++) { if (is_point_inside_clip_volume(&hero_lui.motion.pos, list[k]) != 0) { selected_moby = 0; - target_selection_status = 2; + target_selection_status = FOLLOW_TARGET_STATUS_HERO_EXCLUDED; break; } } } else if (target_region_vertices != 0 && nv > 0) { if (point_in_path_xy(&hero_lui.motion.pos, target_region_vertices, nv) == 0) { selected_moby = 0; - target_selection_status = 2; + target_selection_status = FOLLOW_TARGET_STATUS_HERO_EXCLUDED; } } for (i = 1; i <= D_L00_001B0830_lui[0]; i++) { @@ -179,7 +189,7 @@ int FUN_L00_0025ff38(char *query_moby, } if (ok) { selected_moby = indexed_candidate; - target_selection_status = 1; + target_selection_status = FOLLOW_TARGET_STATUS_ALTERNATE_MOBY; best = candidate_distance_score; } } @@ -213,7 +223,7 @@ int FUN_L00_0025ff38(char *query_moby, } if (ok) { selected_moby = listed_candidate; - target_selection_status = 1; + target_selection_status = FOLLOW_TARGET_STATUS_ALTERNATE_MOBY; best = candidate_distance_score; } } @@ -440,12 +450,12 @@ void grant_inventory_item(int id, int flag) { } } if (flag != 0) { - int t = item_defs_lui[id].slot; - if (t == 0) { + int item_slot = item_defs_lui[id].slot; + if (item_slot == 0) { D_00141408 = id; - } else if (t == 3) { + } else if (item_slot == 3) { D_00141414 = id; - } else if (t == 2) { + } else if (item_slot == 2) { D_00141410 = id; } } diff --git a/src/overlays/shared/hero/create_class_5c3_moby.c b/src/overlays/shared/hero/create_class_5c3_moby.c index 4b4bd73371..b7a1ef442d 100644 --- a/src/overlays/shared/hero/create_class_5c3_moby.c +++ b/src/overlays/shared/hero/create_class_5c3_moby.c @@ -18,6 +18,9 @@ char *create_class_5c3_moby(int source_item_moby, float initial_rotation_z, float initial_rotation_y) { + enum { + CLASS_5C3_STATE_INITIAL = 0 + }; char *moby = (char *)create_moby(0x5C3); if (moby != 0) { char *moby_vars = ((char *)MOBY(moby)->pvars); @@ -26,7 +29,7 @@ char *create_class_5c3_moby(int source_item_moby, MOBY(moby)->visible = 1; MOBY(moby)->rot.z = initial_rotation_z; MOBY(moby)->rot.y = initial_rotation_y; - MOBY(moby)->state = 0; + MOBY(moby)->state = CLASS_5C3_STATE_INITIAL; *(int *)moby_vars = source_item_moby; qcopy(&MOBY(moby)->pos, initial_position); *(float *)(moby_vars + 0x10) = frame_time * 30.0f * 0.7f; diff --git a/src/overlays/shared/hero/hero_frame_update.c b/src/overlays/shared/hero/hero_frame_update.c index 49c4af1228..3202a8bcb2 100644 --- a/src/overlays/shared/hero/hero_frame_update.c +++ b/src/overlays/shared/hero/hero_frame_update.c @@ -25,6 +25,19 @@ /* Looks up the value of the current help record, or 0/0x54 in the special cases. */ /* Ported from rac1-decomp (src/overlays/shared/help_002274A8.c: func_L01_002274A8), where it is exact; names translated to the US level program. */ +enum { + GROUND_MATERIAL_WATER = 0, + GROUND_MATERIAL_MAGNETIC = 2 +}; + +enum { + GROUND_MATERIAL_SINK_TRIGGER = 0xD +}; + +enum { + CUTSCENE_MODE_INACTIVE = 0 +}; + extern int hero_slot_item_id(int) __asm__("FUN_L00_0020d498"); extern unsigned char D_0013E533[]; @@ -113,11 +126,11 @@ void hero_frame_update(void) { hero_update(); update_hero_ground_material_effects(); update_hero_state_machine(); - if (hero.vehicle_mode == 0) + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) return; update_hero_delayed_voice_requests(); update_hero_easing_records(); - if (hero.vehicle_mode == 0) + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) return; update_hero_vehicle_moby(); update_hero_scalar_pulse(); @@ -242,7 +255,7 @@ void update_hero_frame(void) { } hero_state_base->unk1EB2 = 0; hero_state_base->unk1EB0 = 0; - if (hero_state_base->vehicle_mode != 0) { + if (hero_state_base->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { hero_frame_update(); return; } @@ -251,7 +264,7 @@ void update_hero_frame(void) { update_hero_ground_material_effects(); update_hero_ledge_probe(); update_hero_state_machine(); - if (hero_state_base->vehicle_mode != 0) { + if (hero_state_base->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { return; } update_hero_delayed_voice_requests(); @@ -342,10 +355,10 @@ void update_hero_ground_material_effects(void) { hero_ptr->unk308 = 0; if (saved_ground_type == -1) return; - if (saved_ground_type == 2) { + if (saved_ground_type == GROUND_MATERIAL_MAGNETIC) { if (hero_ptr->frames_off_ground.s == 0 || hero_ptr->ground_distance < 0.3f) { hero_ptr->on_magnet_ground = 1; - if (hero_ptr->vehicle_mode == 0) { + if (hero_ptr->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { char *item_slot_1_moby = (char *)hero_ptr->items[1].moby; if (item_slot_1_moby != 0 && MOBY(item_slot_1_moby)->oclass == 0xAD) hero_ptr->unk308 = 1; @@ -358,7 +371,7 @@ void update_hero_ground_material_effects(void) { q->water_depth = 0.2f; q->water_surface_z = q->ground_z.f + 0.2f; } - if (saved_ground_type == 0) { + if (saved_ground_type == GROUND_MATERIAL_WATER) { struct Hero *q = &hero; q->water_depth = q->water_surface_z - q->ground_z.f; if (q->water_depth < 0.85f) { @@ -387,7 +400,7 @@ void update_hero_ground_material_effects(void) { struct Hero *q = &hero; q->selector_4 = 1; } - if (saved_ground_type == 0xD) { + if (saved_ground_type == GROUND_MATERIAL_SINK_TRIGGER) { struct Hero *q = &hero; q->selector_13 = 1; } @@ -454,7 +467,7 @@ void update_hero_ledge_probe(void) { if (hero.ledge_probe_cooldown != 0) return; allowed = 0; - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if ((hero.state.control_mode == 4 && (hero.past_jump_apex != 0 || hero.motion.velocity.f[2] < frame_time * 3.5f)) || hero.state.control_mode == 2 || hero.state.current == 8 || hero.state.current == 0x1A || @@ -722,7 +735,7 @@ extern void release_and_clear_hero_voice_slots(void) __asm__("FUN_L00_00206c08") extern void cancel_hero_item_animation(void) __asm__("FUN_L00_0020e698"); extern void hero_update_items() __asm__("FUN_L00_00210748"); extern void clear_hero_queued_animation(void) __asm__("FUN_L00_00232628"); -extern void FUN_L00_00232fe8(void); +extern void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); extern void clear_moby_transform_history(char *o) __asm__("FUN_L00_00262840"); extern void update_hero_collision_dimensions(void) __asm__("FUN_L01_00231ae0"); @@ -739,7 +752,7 @@ void enter_hero_vehicle_mode_and_set_moby(int vehicle_mode, int initial_state, i *(int *)&hero_state_base->moby = *(int *)&hero_state_base->unkA88; clear_moby_transform_history(&hero_state_base->trail.pos); hero_state_base->moby->collision_disable = -1; - FUN_L00_00232fe8(); + set_hero_item_moby_flag_bit0(); release_and_clear_hero_voice_slots(); reset_hero_easing_records(); *(char *)&hero_state_base->vehicle_mode = vehicle_mode; @@ -755,7 +768,7 @@ void enter_hero_vehicle_mode_and_set_moby(int vehicle_mode, int initial_state, i FUN_L00_00257024(((void *)hero_state_base->moby)); apply_hero_and_item_scale_sequence(); hero_state_base->unk22CC = initial_state; - if (vehicle_mode == 1) { + if (vehicle_mode == HERO_VEHICLE_MODE_CLANK) { *(unsigned short *)&hero_state_base->health.unk22B0 = *(unsigned short *)&hero_state_base->health; hero_state_base->health.hp = hero_state_base->health.vehicle_mode_hp; @@ -837,7 +850,7 @@ s32 process_hero_hit_response(s32 apply_state_and_motion_response) { if (G.invulnerable_frames != 0) { return 0; } - if (cutscene_mode != 0) { + if (cutscene_mode != CUTSCENE_MODE_INACTIVE) { return 0; } G.damage_source_moby = 0; @@ -1181,7 +1194,7 @@ void update_hero_ground_contact_and_gravity(void) { } hero.ground_sound_class = collision_sound_class; hero.ground_type = collision_hit_material(); - if (hero.ground_type == 0) { + if (hero.ground_type == GROUND_MATERIAL_WATER) { hero.water_surface_z = resolve_camera_surface_height(D_L01_001742E0, (u8 *)&hero.water_surface_normal); if (hero.motion.pos.f[2] < hero.water_surface_z && hero.in_water_frames <= 0) { @@ -1196,7 +1209,7 @@ void update_hero_ground_contact_and_gravity(void) { } hero.ground_sound_class = collision_sound_class; } - if (hero.ground_type == 0xD) { + if (hero.ground_type == GROUND_MATERIAL_SINK_TRIGGER) { hero.water_surface_z = HH.point.f[2]; ground_ray_start.f[2] = HH.point.f[2] - 0.01f; if (FUN_001efa68_c(&ground_ray_start, &collision_ray_end, 4, (s32)hero.moby, 0) == 0) { @@ -1230,7 +1243,8 @@ void update_hero_ground_contact_and_gravity(void) { } if (hero.ground_distance < 0.02f) { hero.frames_off_ground.s = 0; - if (hero.ground_slope.f <= 0.87266463f || hero.gravity_mode == 1 || + if (hero.ground_slope.f <= 0.87266463f || + hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.state.control_mode == 0x16) { hero.air_frames.s = 0; hero.last_landed_moby = HH.moby; @@ -1323,9 +1337,9 @@ typedef union { f32 f[4]; } V_233940; -extern void FUN_L00_002347c0(void); -extern void FUN_L00_00233810(void *, void *, f32); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void resolve_hero_pending_path_clearance(void) __asm__("FUN_L00_002347c0"); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern s32 coll_sphere(void *, s32, s32, f32) __asm__("FUN_L00_001f0d60"); extern s32 coll3_233940(void *, f32) __asm__("FUN_L00_001f3170"); extern u128_233940 D_L01_001742F0[] NOT_SDA; @@ -1345,15 +1359,15 @@ s32 resolve_hero_position_with_collision_queries(s32 mode) { qcopy(&pre_collision_position, &hero.motion.pos.q); clear_u64_value(&collision_query_offset); if (hero.path_constrain_pending != 0) { - FUN_L00_002347c0(); + resolve_hero_pending_path_clearance(); hero.path_constrain_pending = 0; } if (hero.state.control_mode != 0x11) { - if (hero.gravity_mode != 0 || hero.unk1F8 != 0) { - if (hero.gravity_mode == 1 || hero.unk1F8 != 0) { - FUN_L00_00233810(&collision_query_offset, &collision_query_offset, 0.6f); + if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN || hero.unk1F8 != 0) { + if (hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.unk1F8 != 0) { + add_hero_up_offset(&collision_query_offset, &collision_query_offset, 0.6f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &collision_query_offset, &collision_query_offset, -hero.capsule_bottom); } } else { @@ -1366,7 +1380,7 @@ s32 resolve_hero_position_with_collision_queries(s32 mode) { mask = 0xD24; } for (i = 0; i < 8; i++) { - if (hero.gravity_mode != 0) { + if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN) { if (!coll_sphere(&hero.motion.pos.q, mask, ((s32)hero.moby), frame_scale * 0.4f)) break; } else if (hero.state.control_mode == 0x11) { @@ -1497,7 +1511,7 @@ void update_hero_timers_and_vehicle_transitions(void) { hero.stick_held_frames++; } if (hero.vehicle_toggle_timer != 0 && fast_dec_timer_s16(&hero.vehicle_toggle_timer) != 0 && - hero.health.hp != 0 && cutscene_mode == 0) { + hero.health.hp != 0 && cutscene_mode == CUTSCENE_MODE_INACTIVE) { if (hero.vehicle_mode == 3) { exit_hero_vehicle_mode_and_restore_moby(); if (pad_pressed_within(0x80, scale_game_frames(0x12), 0)) { diff --git a/src/overlays/shared/hero/hero_handle_jump_press.c b/src/overlays/shared/hero/hero_handle_jump_press.c index cea5e1470e..68c809210e 100644 --- a/src/overlays/shared/hero/hero_handle_jump_press.c +++ b/src/overlays/shared/hero/hero_handle_jump_press.c @@ -195,7 +195,7 @@ int hero_handle_jump_press(void) { (void *)0x1F000, input_history_window_padding + input_history_separation_limit, input_history_separation_limit)) { - next_state = 0xB; + next_state = HERO_STATE_HIGH_JUMP; found: hero_set_state(next_state, 1); return 1; @@ -207,7 +207,7 @@ int hero_handle_jump_press(void) { if (hero_slot_item_id(3) == 2 && D_0013D4C2_lui != 0 && hero.pack_disabled == 0) { if ((2.5f < hero.wall_probe_distance || hero.wall_normal_pitch < 0.7853982f) && 0.7f < hero.stick_magnitude && frame_time * 0.9f < hero.motion.forward_speed) { - next_state = 0xA; + next_state = HERO_STATE_PACK_JUMP; goto found; } } @@ -216,15 +216,15 @@ int hero_handle_jump_press(void) { frame_time * 0.9f < hero.motion.forward_speed) { if (hero.long_jump_lockout) return 1; - next_state = 0x10; + next_state = HERO_STATE_PACK_LONG_JUMP; goto found; } if (hero_slot_item_id(3) == 3 && hero.pack_disabled == 0) { - next_state = 0xD; + next_state = HERO_STATE_JUMP_WITH_TRANSFORM_TRAIL; goto found; } if (hero_slot_item_id(3) == 2 && hero.pack_disabled == 0 && D_0013D4C2_lui) { - next_state = 0xF; + next_state = HERO_STATE_JUMP_WITH_VELOCITY_KEY_PROFILE; goto found; } hero_set_state_2(7, 1); diff --git a/src/overlays/shared/hero/hero_idle_sequence.c b/src/overlays/shared/hero/hero_idle_sequence.c index e9137d636a..53ba5ce23a 100644 --- a/src/overlays/shared/hero/hero_idle_sequence.c +++ b/src/overlays/shared/hero/hero_idle_sequence.c @@ -93,7 +93,8 @@ int hero_idle_sequence(int a) __asm__("FUN_L00_00205000"); int hero_idle_sequence(int allow_item_idle_sequence) { struct Hero *vehicle_mode_owner = &hero; int vehicle_mode = vehicle_mode_owner->vehicle_mode; - if (vehicle_mode == 2 || (vehicle_mode < 3 ? vehicle_mode == 1 : vehicle_mode == 3)) { + if (vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK || + (vehicle_mode < 3 ? vehicle_mode == HERO_VEHICLE_MODE_CLANK : vehicle_mode == 3)) { return 0; } { @@ -155,13 +156,17 @@ extern s32 D_001403E0[]; int get_hero_easing_moby_by_kind(int ease_kind) __asm__("FUN_L00_00205110"); int get_hero_easing_moby_by_kind(int ease_kind) { + enum { + HERO_EASE_KIND_SLOT_THREE_SECONDARY_MOBY = 1, + HERO_EASE_KIND_SLOT_ZERO_PRIMARY_MOBY = 5 + }; if (ease_kind == 0 || ease_kind == 2 || ease_kind == 3 || ease_kind == 4) { return D_001413D0[0]; } - if (ease_kind == 1) { + if (ease_kind == HERO_EASE_KIND_SLOT_THREE_SECONDARY_MOBY) { return hero_slot_three_secondary_moby[0]; } - if (ease_kind == 5) { + if (ease_kind == HERO_EASE_KIND_SLOT_ZERO_PRIMARY_MOBY) { return D_001403E0[0]; } return 0; @@ -501,7 +506,7 @@ void update_hero_glow_and_extra_manipulators(void) { } moby->glow_color = (alpha << 24) | (blue << 16) | (green << 8) | red; manip_owner = &hero; - if (manip_owner->vehicle_mode != 0) + if (manip_owner->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) return; if (fast_dec_timer_s16(&HERO_EXTRA->delay) && moby->prev_seq == 1) { min_delay = scale_game_frames(50); @@ -916,7 +921,7 @@ void update_hero_in_vehicle_mode(void) { } } reveal_map_around_position(&hero.motion.pos); - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { struct Hero *g = &hero; if (D_0015EDB3_macro) *(f32 *)((char *)&D_L00_0017B85C_lui + 0x210) = 1.4f * D_0015EE18_gp; @@ -1544,7 +1549,7 @@ void apply_hero_and_item_scale_sequence(void) { ((unsigned char *)G->moby) + 0xC0, ((unsigned char *)G->moby) + 0xC0, sequence_scale); fast_vec_scale( ((unsigned char *)G->moby) + 0xD0, ((unsigned char *)G->moby) + 0xD0, sequence_scale); - if (G->vehicle_mode == 0) { + if (G->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { for (i = 0; i < 7; i++) { for (j = 0; j < 3; j++) { struct Hero *hero_state = &hero; @@ -1552,7 +1557,8 @@ void apply_hero_and_item_scale_sequence(void) { if (j == 1) item_moby = *(unsigned char **)&hero_state->items[i].moby2; item_scale = sequence_scale; - if (i == 0 && hero_state->vehicle_mode == 0 && 1.0f < sequence_scale) + if (i == 0 && hero_state->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT && + 1.0f < sequence_scale) item_scale = 1.0f; if (item_moby) { fast_vec_scale(item_moby + 0xC0, item_moby + 0xC0, item_scale); @@ -1661,7 +1667,7 @@ void draw_hero_glow_quads(void) { } return; } - if (vehicle_mode == 0) { + if (vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if ((hero_slot_item_id(3) == 3 || hero_slot_item_id(3) == 2) && P.h22D8 == 0) { P.v1D80.f[2] += 0.015f; draw_offset_textured_effect_quad(&P.v1D80, 0x280000C0, 0.057f, 0.08f); @@ -1671,13 +1677,13 @@ void draw_hero_glow_quads(void) { draw_offset_textured_effect_quad(&P.v1DD0[i], P.i1E50[i], P.f1E70[i], P.f1E90[i]); return; } - if (vehicle_mode == 2) { + if (vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { P.v1D80.f[2] -= 0.07f; draw_offset_textured_effect_quad(&P.v1D80, 0x300000C0, 0.25f, 0.08f); P.v1D80.f[2] += 0.07f; return; } - if (vehicle_mode == 1) { + if (vehicle_mode == HERO_VEHICLE_MODE_CLANK) { k = 0.07f; if (P.h22FC) k = 0.101500004529953f; @@ -1707,7 +1713,12 @@ extern G_00208038 D_0013F350_00208038 __asm__("D_0013F350"); void enqueue_hero_glow_draw_callback_once(void) __asm__("FUN_L00_00207d00"); /* Appends v, b, x and y to the list in ((char *)&hero) and calls FUN_L00_00207d00. */ -void FUN_L00_00208038(u128 *glow_position, int b, float x, float y) { +void enqueue_hero_glow_quad(u128 *glow_position, + int b, + float x, + float y) __asm__("FUN_L00_00208038"); + +void enqueue_hero_glow_quad(u128 *glow_position, int b, float x, float y) { G_00208038 *hero_glow_queue_owner = &D_0013F350_00208038; short n = hero_glow_queue_owner->n; u128 *pos = hero_glow_queue_owner->pos; @@ -1901,8 +1912,10 @@ void update_hero_and_equipped_item_glows(void) { } } -extern void FUN_L00_00232fe8(void); -extern void FUN_L00_002330d0(void); +extern void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); + +extern void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); +extern void update_hero_item_moby_flags(void) __asm__("FUN_L00_002330d0"); extern void apply_hero_vertical_oscillation(void) __asm__("FUN_L00_002078a8"); extern void apply_hero_rotation_oscillation(void) __asm__("FUN_L00_002079e8"); extern void offset_hero_position_against_gravity(void *, void *, float) __asm__("FUN_L00_002336e8"); @@ -1917,9 +1930,9 @@ void update_hero_moby(void) { hero.moby->hit_slot = 0xFF; if (hero.unk20A5) { - FUN_L00_00232fe8(); + set_hero_item_moby_flag_bit0(); } else { - FUN_L00_002330d0(); + update_hero_item_moby_flags(); } qcopy(&hero.moby->pos, &hero.motion.pos); apply_hero_vertical_oscillation(); @@ -1963,7 +1976,7 @@ void update_hero_moby(void) { extern void set_hero_moby_flag_bit0(void) __asm__("FUN_L00_00233210"); extern void clear_hero_moby_flag_bit0(void) __asm__("FUN_L00_00233248"); -extern void FUN_L00_00232fe8_00208a10(void) __asm__("FUN_L00_00232fe8"); +extern void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); extern void set_moby_local_table_entry(void *, int, void *, float, float) __asm__("FUN_L00_0024eed8"); @@ -1976,7 +1989,7 @@ void update_hero_vehicle_moby(void) { } else { clear_hero_moby_flag_bit0(); } - FUN_L00_00232fe8_00208a10(); + set_hero_item_moby_flag_bit0(); hero.moby->hit_slot = 0xFF; hero_moby = ((unsigned char *)hero.moby); qcopy(&MOBY(hero_moby)->pos, &hero.motion.pos); @@ -2199,9 +2212,9 @@ f32 adjust_hero_animation_speed_for_target_frame(f32 target_anim_frame, /* Ported from rac1-decomp (src/overlays/shared/help_00203E98.c: func_L00_00209690), where it is exact; names translated to the US level program. */ -float FUN_L00_00209018(float *a, int n); +float vector_length_xyz_cf(float *a, int n) __asm__("FUN_L00_00209018"); -float FUN_L00_00209018(float *sample_values, int sample_count) { +float vector_length_xyz_cf(float *sample_values, int sample_count) { char sample_integral_part_scratch[16] __attribute__((aligned(16))); struct Hero *hero_base = (struct Hero *)((char *)((unsigned char *)&D_0013E533) + 0xE1D); int i = truncate_float_to_s32(hero_base->anim_frame); @@ -2545,6 +2558,9 @@ extern int random_integer_below_cf(void *, void *, float, float) __asm__("FUN_L0 void emit_hero_randomized_motion_effects(int iteration_count, int mode) __asm__("FUN_L00_00209a40"); void emit_hero_randomized_motion_effects(int iteration_count, int mode) { + enum { + HERO_MOTION_EFFECT_RANDOMIZED_HERO_POSITION = 0 + }; float pos[4]; V_209a40 randomized_displacement; int i; @@ -2554,7 +2570,7 @@ void emit_hero_randomized_motion_effects(int iteration_count, int mode) { for (i = 0; i < iteration_count; i++) { hero_state = &hero; hero_displacement_source = (V_209a40 *)&hero_state->motion.displacement; - if (mode == 0) { + if (mode == HERO_MOTION_EFFECT_RANDOMIZED_HERO_POSITION) { pos[0] = hero_state->motion.pos.f[0] + random_float_between(-0.1f, 0.1f); pos[1] = hero_state->motion.pos.f[1] + random_float_between(-0.1f, 0.1f); pos[2] = hero_state->motion.pos.f[2] + random_float_between(-0.5f, 0.1f); @@ -2637,7 +2653,7 @@ void emit_hero_surface_effect_burst(s32 puffs, s32 debris, s32 flash) { } void spawn_color_decaying_effect_particle(void *, void *, int) __asm__("FUN_L00_0026d598"); -void FUN_L00_00269958(void *, void *, int, int, int, int, int, int); +void spawn_effect(void *, void *, int, int, int, int, int, int) __asm__("FUN_L00_00269958"); extern char D_0013F7EE[] NOT_SDA; void emit_hero_timed_effects(void) __asm__("FUN_L00_00209ec8"); @@ -2688,7 +2704,7 @@ void emit_hero_timed_effects(void) { theta = random_angle_radians(); phi = random_angle_radians(); build_spherical_offset(pt, spherical_offset_scale, theta, phi); - FUN_L00_00269958( + spawn_effect( hero_position_copy, pt, col, 0x70F0, life, small_effect_sample, large_effect_sample, 1); } frame_count = random_int_between(scale_game_frames(3), scale_game_frames(7)); @@ -2708,10 +2724,10 @@ extern struct HeroEase hero_eases[] __asm__("D_L00_0017A680"); /* Sets the accel and max_speed of the first hero ease. */ void set_first_hero_easing_parameters(float a, float b) __asm__("FUN_L00_0020a1e0"); -void set_first_hero_easing_parameters(float a, float b) { +void set_first_hero_easing_parameters(float easing_acceleration, float easing_max_speed) { struct HeroEase *destination_record = hero_eases; - destination_record->accel = a; - destination_record->max_speed = b; + destination_record->accel = easing_acceleration; + destination_record->max_speed = easing_max_speed; } typedef struct V0020a240 { @@ -3467,24 +3483,24 @@ void apply_hero_selected_flags_and_state_transitions(void) { if (saved_flag_selector == 12) P.b12EA = 1; if (P.b12E3 && P.i300 && P.i208C != 0x10 && P.i208C != 0x14 && P.i208C != 7) { - target_state = 0x31; + target_state = HERO_STATE_VOICE_SLOT_CLEANUP_IDLE_EXIT; goto call; } if (P.b12E5 && P.i300 && P.b20A4 == 1 && P.i2084 != 0x7D) { - target_state = 0x7D; + target_state = HERO_STATE_VEHICLE_MODE_1_DEATH_DESCENT; goto call; } if (P.b12E5 && P.i300 && (P.i2084 != 0x3C || P.h41E != 0)) { exit_hero_vehicle_mode_if_mode_three(); if (P.i22A8) goto call3c; - target_state = 0x7C; + target_state = HERO_STATE_DEATH_DESCENT; goto call; } if (P.b12EC && P.i2084 != 0x7F && absolute_float(P.f2F0 - (P.f88 + 0.25f)) < 1.0f && 0.0f < P.f2F0 - P.f88 && P.f108 < 0.0f) { exit_hero_vehicle_mode_if_mode_three(); - target_state = 0x7F; + target_state = HERO_STATE_SINK; goto call; } if (P.b12E6 && P.i2084 != 0x68 && P.i2084 != 0x7B && @@ -3492,16 +3508,16 @@ void apply_hero_selected_flags_and_state_transitions(void) { (P.i2084 != 0x69 || P.h41E != 0) && P.f108 < 0.0f) { exit_hero_vehicle_mode_if_mode_three(); if (P.i22A8) { - target_state = 0x68; + target_state = HERO_STATE_WAIT_FOR_JUMP_OR_RESPAWN; goto call; } s7B: - target_state = 0x7B; + target_state = HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT; call: hero_set_state(target_state, 1); return; call3c: - target_state = 0x3C; + target_state = HERO_STATE_JUMP_WITH_HEALTH_DAMAGE; goto call; } if (P.b12EB && P.i2084 != 0x7B && absolute_float(P.f2F4 - (P.f88 + 0.25f)) < 1.0f && diff --git a/src/overlays/shared/hero/hero_move_state_velocity.c b/src/overlays/shared/hero/hero_move_state_velocity.c index b6391004cd..d4d09c1ae7 100644 --- a/src/overlays/shared/hero/hero_move_state_velocity.c +++ b/src/overlays/shared/hero/hero_move_state_velocity.c @@ -59,11 +59,11 @@ void hero_move_state_velocity(void) { s32 state; state = hero.state.current; - if (state == 10) { + if (state == HERO_STATE_PACK_JUMP) { build_scaled_hero_move_impulse(0.7f, ED6C * 0.0f); qcopy(&hero.motion.momentum, &hero.move_impulse); hero.ground_speed = hero.motion.flat_speed; - } else if (state == 16) { + } else if (state == HERO_STATE_PACK_LONG_JUMP) { if (FUN_001f96f8_214658(0x36) < hero.state_timer) { approach_value(ED70 * 25.0f, ED70 * 7.0f, &hero.jump_gravity); } @@ -75,7 +75,7 @@ void hero_move_state_velocity(void) { speed_step(ED70 * 44.0f, ED70 * 45.0f); set_gravity_relative_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, 0.0f); add_hero_forward_offset(&hero.motion.velocity, &hero.motion.velocity, hero.ground_speed); - } else if (state == 0x1C) { + } else if (state == HERO_STATE_LEDGE_JUMP) { if (FUN_001f96f8_214658(0x28) < hero.state_timer) { turn_to(0, ED64 * 0.04f, ED64 * 0.2f, ED6C * 15.009831f); steer_hero_planar_velocity(ED70 * 20.0f); @@ -91,7 +91,7 @@ void hero_move_state_velocity(void) { FUN_001f9dc8_214658(hero.motion.rot.f[2]) * hero.ledge_jump_speed; hero.motion.velocity.f[1] = FUN_001f9de0_214658(hero.motion.rot.f[2]) * hero.ledge_jump_speed; - } else if (state == 0x4C) { + } else if (state == HERO_STATE_ALT_LEDGE_JUMP) { if (5.0f <= hero.anim_frame && hero.anim_frame <= 18.0f) { if (15.0f < hero.anim_frame) { approach_value(0.0f, ED70 * 8.0f, &hero.ledge_jump_speed); @@ -103,7 +103,7 @@ void hero_move_state_velocity(void) { FUN_001f9dc8_214658(hero.motion.rot.f[2]) * hero.ledge_jump_speed; hero.motion.velocity.f[1] = FUN_001f9de0_214658(hero.motion.rot.f[2]) * hero.ledge_jump_speed; - } else if (state == 11 || state == 12) { + } else if (state == HERO_STATE_HIGH_JUMP || state == HERO_STATE_STORED_HEADING_JUMP) { hero.motion.move_yaw = hero.takeoff_yaw; turn_to(0, ED64 * 0.04f, ED64 * 0.2f, ED6C * 6.981317f); if (hero.unk450 != 3) { @@ -131,7 +131,7 @@ void hero_move_state_velocity(void) { FUN_001f9de0_214658(hero.takeoff_yaw) * heading_velocity_scale_or_pivot_yaw_delta; build_scaled_hero_move_impulse(0.7f, ED6C * 0.0f); qcopy(&hero.motion.momentum, &hero.move_impulse); - } else if (state == 0x11) { + } else if (state == HERO_STATE_REPEATABLE_JUMP) { hero.motion.move_yaw = hero.unk470.f[3]; qcopy(&hero.motion.move_dir, &hero.unk470); if (FUN_001f96f8_214658(9) < hero.state_timer) { @@ -152,7 +152,7 @@ void hero_move_state_velocity(void) { } hero.ground_speed = hero.motion.flat_speed; } else { - if (state == 0x2D) { + if (state == HERO_STATE_ITEM_RELEASE_FALL) { x = hero.motion.rot.f[2]; hero.motion.yaw_error = FUN_L00_0025bc98_214658(&x, &hero.motion.yaw_rate, @@ -653,7 +653,7 @@ void update_hero_tilt(void) { int effective_tilt_mode, current_hero_state, k; effective_tilt_mode = hero_state->gravity_mode; if (hero_state->unk1F8) { - effective_tilt_mode = 1; + effective_tilt_mode = HERO_TILT_APPLY_REFERENCE_ORIENTATION; } switch (effective_tilt_mode) { case HERO_TILT_RETURN_TO_ZERO: @@ -665,8 +665,10 @@ void update_hero_tilt(void) { if (k == 0x11 || k == 0x15 || k == 0x16) { return; } - if (current_hero_state == 0x77 || current_hero_state == 0x31 || - current_hero_state == 0x2D || current_hero_state == 0x2C) { + if (current_hero_state == HERO_STATE_FATAL_FALL || + current_hero_state == HERO_STATE_VOICE_SLOT_CLEANUP_IDLE_EXIT || + current_hero_state == HERO_STATE_ITEM_RELEASE_FALL || + current_hero_state == HERO_STATE_GRAPPLE_SWING_ENTRY) { return; } tilt_targets[0] = 0.0f; @@ -1061,7 +1063,7 @@ extern unsigned char coll_hit[] __asm__("D_L00_00173E40") __attribute__((section void FUN_001f9a68_217118(void *, float, void *) __asm__("FUN_001f9a68"); void add_hero_forward_offset(void *, void *, float) __asm__("FUN_L00_00233708"); void FUN_001f9a10_217118(void *, void *, void *) __asm__("FUN_001f9a10"); -void FUN_L00_00233810_217118(void *, void *, float) __asm__("FUN_L00_00233810"); +void add_hero_up_offset(void *, void *, float) __asm__("FUN_L00_00233810"); int FUN_L00_001efc70_217118(void *, void *, int, void *, int) __asm__("FUN_L00_001efc70"); float compute_gravity_relative_vector_inclination(void *) __asm__("FUN_L00_00233d30"); void scale_hero_motion(float) __asm__("FUN_L00_00213de8"); @@ -1100,14 +1102,14 @@ void stop_hero_motion_without_forward_support(float velocity_scale, float planar gravity_set_z(collision_query_position, collision_query_position, 0.0f); FUN_001f9a10_217118(collision_query_position, collision_query_position, (&hero.motion.pos)); qcopy(collision_query_second_position, collision_query_position); - FUN_L00_00233810_217118(collision_query_position, collision_query_position, 0.3f); + add_hero_up_offset(collision_query_position, collision_query_position, 0.3f); P = ((char *)&hero); k = -0.2f; if (*(int *)(P + 0x2084) == 0x20) k = -0.35f; if (P[0x20A4] == 2) k = -0.7f; - FUN_L00_00233810_217118(collision_query_second_position, collision_query_second_position, k); + add_hero_up_offset(collision_query_second_position, collision_query_second_position, k); final_call_enabled = 1.0f; if (FUN_L00_001efc70_217118(collision_query_position, collision_query_second_position, @@ -1246,6 +1248,9 @@ extern void create_moby_transform_history_entry(char *, int, int) __asm__("FUN_ void launch_hero_wrench(void) __asm__("FUN_L00_00217658"); void launch_hero_wrench(void) { + enum { + WRENCH_STATE_LAUNCH = 10 + }; f32 aim_origin_or_euler_angles[4]; f32 delta[4]; f32 item_rotation_matrix[12]; @@ -1260,7 +1265,8 @@ void launch_hero_wrench(void) { s32 state; state = hero.state.current; - aimed = (state == 1 || state == 0x1E) && scale_game_frames(0x14) < hero.state_timer; + aimed = (state == HERO_STATE_LOOK || state == HERO_STATE_LOOK_RELEASE_WAIT) && + scale_game_frames(0x14) < hero.state_timer; if (aimed) { target = hero.items[0].moby; has_target = 0; @@ -1287,7 +1293,7 @@ void launch_hero_wrench(void) { if (aimed) { allocate_hero_voice_for_entry(0x1B, 0); } - equipped_wrench_moby->state = 10; + equipped_wrench_moby->state = WRENCH_STATE_LAUNCH; launched_item_vars = (ThrowPvars *)equipped_wrench_moby->pvars; if (hero.wall_probe_distance < 1.2f && 0.6632251f < hero.wall_normal_pitch && !hero.wall_probe_moby_in_class_range) { diff --git a/src/overlays/shared/hero/hero_set_state.c b/src/overlays/shared/hero/hero_set_state.c index 7778f53819..d0175c98bb 100644 --- a/src/overlays/shared/hero/hero_set_state.c +++ b/src/overlays/shared/hero/hero_set_state.c @@ -210,7 +210,7 @@ void update_hero_timers_and_reach_state(void) { } } } - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { fast_dec_timer_s16(&hero.vehicle_triangle_cooldown); } for (i = 0; i < 5; i++) { @@ -675,7 +675,7 @@ extern void fast_vec_normalize(void *, void *, float) __asm__("FUN_001f9bf8"); extern int hero_set_state(int, int) __asm__("FUN_L00_002223f8"); extern char hero_velocity_profile_jump_keys[] __asm__("D_L00_0017BF20"); -int hero_set_state(int a, int b) { +int hero_set_state(int requested_state, int b) { int previous_state_step; char *moby; int old20A7; @@ -686,7 +686,8 @@ int hero_set_state(int a, int b) { V4_222B80 sampled_path_position; { struct Hero *p = &hero; - if (p->state.control_mode == 0x14 && (a != 0x64 || b != 2)) + if (p->state.control_mode == 0x14 && + (requested_state != HERO_STATE_IDLE_ANIMATION_WITH_DYING_OVERRIDE || b != 2)) return 0; } if ((D_L00_0015F5C4 == 2 || D_L00_0015F5C4 == 6) && b != 2) @@ -694,8 +695,16 @@ int hero_set_state(int a, int b) { { struct Hero *p = &hero; if (p->health.hp == 0 && (p->state.control_mode == 2 || p->state.control_mode == 7) && - a != 6 && a != 0x3D && a != 0x47 && a != 0x57 && a != 0x62 && a != 0x77 && a != 0x7B && - a != 0x7C && a != 0x7F && a != 0x6A && a != 0x80 && a != 0x82) + requested_state != HERO_STATE_FALL && requested_state != HERO_STATE_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_1_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_3_DYING && + requested_state != HERO_STATE_VEHICLE_MODE_2_DYING && + requested_state != HERO_STATE_FATAL_FALL && + requested_state != HERO_STATE_HEIGHT_OR_TIMEOUT_RESPAWN_WAIT && + requested_state != HERO_STATE_DEATH_DESCENT && requested_state != HERO_STATE_SINK && + requested_state != HERO_STATE_DROWN && + requested_state != HERO_STATE_DYING_SPEED_LIMITED && + requested_state != HERO_STATE_DYING_ZERO_HEALTH) return 0; } { @@ -708,11 +717,11 @@ int hero_set_state(int a, int b) { p->state.prev_timer = p->state_timer; p->state.prev = p->state.current; p->state.prev_control_mode = p->state.control_mode; - p->state.current = a; + p->state.current = requested_state; p->state.step = 0; p->unk20A5 = 0; p->item_use_locked = 0; - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { MOBY(moby)->collision_disable = 0; p->tilt_disabled = 0; p->item_select_blocked = 0; @@ -733,14 +742,14 @@ int hero_set_state(int a, int b) { create_missing_hero_item_slot_animations(p->state.prev, p->state.current); p->rand_timer.range = 0; } - switch (a) { + switch (requested_state) { case HERO_STATE_IDLE: { struct Hero *p = &hero; p->state.control_mode = 0; p->unk2284 = 0; p->unk1010 = random_int_between(scale_game_frames(0x32), scale_game_frames(0x64)); clear_hero_idle_rotation_targets(); - if (p->vehicle_mode != 0) { + if (p->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { set_hero_idle_state_for_vehicle_mode(); return 1; } @@ -1219,14 +1228,14 @@ int hero_set_state(int a, int b) { p->unk2284 = 0; p->ground_speed = vector_length_xy(&p->motion.resolved_velocity); p->item_use_locked = 1; - if (p->vehicle_mode == 0) + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) cancel_hero_item_animation(); if (b) { if (p->vehicle_mode == 3) { set_hero_animation(1, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 1) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(2, 0, (float)scale_game_frames(8)); - } else if (p->vehicle_mode == 0) { + } else if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { set_hero_animation(p->state.step + 3, ((int *)&hero_run_start_frame_by_speed_step)[p->state.step], (float)scale_game_frames(8)); @@ -1607,7 +1616,7 @@ int hero_set_state(int a, int b) { p->fall_state_gravity = frame_time_sq * 24.0f; p->stickless_decel = frame_time_sq * 7.0f; if (p->state.current == 0x77) { - if (p->vehicle_mode == 0) { + if (p->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { p->health.unk22B2 = allocate_hero_voice_for_entry(0x17, 0x20); } p->pivot_rot_x_target = randf_sym(frame_time * 3.1415927f, frame_time * 4.3633232f); @@ -1620,7 +1629,7 @@ int hero_set_state(int a, int b) { q->state.step = 0; qcopy(&q->motion.velocity, &q->motion.resolved_velocity); if (b) { - if (q->vehicle_mode == 1) { + if (q->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { set_hero_animation(4, 0, (float)scale_game_frames(8)); return 1; } @@ -1696,7 +1705,8 @@ int hero_set_state(int a, int b) { return 0; } p->state.control_mode = 4; - if (a >= 0x29 && a <= 0x2A) { + if (requested_state >= HERO_STATE_GRIND_JUMP && + requested_state <= HERO_STATE_GRIND_RAIL_TRANSFER) { p->unk2284 = 3; } else { p->unk2284 = 0x50; @@ -3037,7 +3047,7 @@ int try_start_hero_weapon_fire_state(void) __asm__("FUN_L00_002276c0"); int try_start_hero_weapon_fire_state(void) { struct Hero *hero_base = (struct Hero *)((char *)D_0013E533 + 0xE1D); int current_state = hero_base->state.current; - if ((unsigned)(current_state - 2) < 2 || current_state == 0) { + if ((unsigned)(current_state - 2) < 2 || current_state == HERO_STATE_IDLE) { if (hero_base->item_anim_active != 0) { if (hero_base->item_anim_frames < scale_game_frames(6)) { if (hero_base->stick_magnitude < 0.7f) { @@ -3318,6 +3328,9 @@ extern s32 D_00141660 NOT_SDA; int process_hero_equipped_item_input(void) __asm__("FUN_L00_00227fa0"); int process_hero_equipped_item_input(void) { + enum { + WRENCH_MOBY_STATE_READY = 0 + }; int item_press_age_frames[3]; int start; int mask; @@ -3356,7 +3369,7 @@ int process_hero_equipped_item_input(void) { if (!is_wrench_moby((char *)equipped_item_moby)) { break; } - if (equipped_item_moby->state != 0) { + if (equipped_item_moby->state != WRENCH_MOBY_STATE_READY) { break; } if ((controller_state.held & 0xA) || @@ -3697,7 +3710,7 @@ void update_hero_animation_for_movement_speed(void) { player->anim_speed = speed; if (speed < 0.7f) player->anim_speed = 0.7f; - } else if (mode == 1) { + } else if (mode == HERO_VEHICLE_MODE_CLANK) { float speed = player->motion.speed_xy * 90.0f; player->anim_speed = speed; if (speed < 0.5f) diff --git a/src/overlays/shared/hero/hero_switch_item.c b/src/overlays/shared/hero/hero_switch_item.c index 435792e02e..d8b15692db 100644 --- a/src/overlays/shared/hero/hero_switch_item.c +++ b/src/overlays/shared/hero/hero_switch_item.c @@ -32,6 +32,11 @@ #include "rnc/overlay/shared/mobys/evaluate_moby_animation_pose.h" #include "rnc/world/collision/collision_hit_material.h" +enum { + HERO_ITEM_SLOT_STATE_READY = 2, + HERO_ITEM_SLOT_STATE_REMOVING = 3 +}; + extern CollisionHit coll_hit __asm__("D_L00_00173E40") NOT_SDA; /* line query from -> to; fills the collision hit record, nonzero on a hit */ extern int @@ -62,7 +67,7 @@ int probe_hero_ledge_edge(Vec4 *ledge_probe_origin, f32 *facing_yaw) { up = 1.5f; reach = 1.15f; min_height = 1.8f; - if (hero.vehicle_mode == 1) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { min_height = 0.7f; drop = -0.4f; fwd = 0.25f; @@ -239,6 +244,9 @@ extern u8 D_0013D4DD_lui __asm__("D_0013D4DD") NOT_SDA; void find_grind_rail(void) __asm__("FUN_L00_0020cf58"); void find_grind_rail(void) { + enum { + HERO_CONTROL_MODE_JUMP = 4 + }; V_cf58 proximity_or_rail_point, proximity_or_query_position, third_proximity_point; s32 rail_owner, rail_query_integer_value, rail_kind; @@ -295,7 +303,7 @@ void find_grind_rail(void) { if ((u32)(hero.state.current - 41) < 2 && (hero.rail_off_frames != 0 || hero.rail_gap_jump != 0)) { } else { - if (control_mode != 4) + if (control_mode != HERO_CONTROL_MODE_JUMP) return; if (hero.past_jump_apex == 0 && hero.rail_catch_grace == 0) return; @@ -401,9 +409,6 @@ s32 hero_slot_moby(s32 i) { int hero_slot_item_id(int i) __asm__("FUN_L00_0020d498"); int hero_slot_item_id(int i) { - enum { - HERO_ITEM_SLOT_STATE_READY = 2 - }; /* hero shifted by i slots, so items[0] is slot i */ struct Hero *slot_owner = (struct Hero *)(((char *)&hero) + i * sizeof(struct HeroItemSlot)); switch (slot_owner->items[0].state) { @@ -456,16 +461,16 @@ s32 hero_is_in_special_state(void) { goto one; } current_state = hero_state->state.current; - if (current_state == 0x6A) { + if (current_state == HERO_STATE_DROWN) { goto one; } - if (current_state == 0x82) { + if (current_state == HERO_STATE_DYING_ZERO_HEALTH) { goto one; } - if (current_state == 0x76) { + if (current_state == HERO_STATE_HURT_WITH_DISPLACEMENT_VELOCITY) { goto one; } - if (current_state != 0x75) { + if (current_state != HERO_STATE_WATER_SURFACE_HURT) { goto zero; } one: @@ -669,12 +674,15 @@ char *find_best_hero_heading_target(float range_limit, s32 select_hero_condition_animation_id(s32 animation_selector) __asm__("FUN_L00_0020da10"); s32 select_hero_condition_animation_id(s32 animation_selector) { + enum { + HERO_CONDITION_ANIMATION_ITEM_SWITCH = 3 + }; switch (animation_selector) { case 1: return 0x79; case 2: return 0x77; - case 3: + case HERO_CONDITION_ANIMATION_ITEM_SWITCH: return 0x75; } return 0; @@ -766,10 +774,10 @@ void update_hero_condition_animation(void) { } } -extern s32 D_L00_0015F6A0_gp[2] __asm__("D_L00_0015F6A0") __attribute__((sda)); -extern u8 D_L00_00197BC0_lui[] __asm__("D_L00_00197BC0") NOT_SDA; -extern char *D_L00_00197300[]; -extern u8 D_L00_0017CA80[] NOT_SDA; +extern s32 l00_hero_item_animation_slot_ids[2] __asm__("D_L00_0015F6A0") __attribute__((sda)); +extern u8 D_L00_00197BC0_lui[] __asm__("D_L00_00197BC0") NOT_SDA; +extern char *D_L00_00197300[]; +extern u8 D_L00_0017CA80[] NOT_SDA; extern struct HeroEase hero_eases[] __asm__("D_L00_0017A680"); extern void advance_moby_animation_blend(void *, unsigned char *) __asm__("FUN_L00_0024f190"); extern float approach_value(float *, float, float) __asm__("FUN_00213ed8"); @@ -819,8 +827,8 @@ void update_hero_item_slot_blends(void) { if (want) { struct Hero *h = &hero; if (hero.item_slot_blends[i] == 0) { - u8 *allocated_item_slot_blend = - allocate_moby_animation_slot((u8 *)h->moby, D_L00_0015F6A0_gp[i]); + u8 *allocated_item_slot_blend = allocate_moby_animation_slot( + (u8 *)h->moby, l00_hero_item_animation_slot_ids[i]); hero.item_slot_blends[i] = allocated_item_slot_blend; *(f32 *)(allocated_item_slot_blend + 8) = 0.0f; *(u8 **)(hero.item_slot_blends[i] + 0x18) = @@ -1009,7 +1017,7 @@ void create_missing_hero_item_slot_animations(s32 suppress_slot_animation_creati break; { slot_animation_object = - allocate_moby_animation_slot((u8 *)hero.moby, D_L00_0015F6A0_gp[i]); + allocate_moby_animation_slot((u8 *)hero.moby, l00_hero_item_animation_slot_ids[i]); hero.held_item_anim_blend[i] = slot_animation_object; if (slot_animation_object) { hero.unkD14 = 0; @@ -1062,7 +1070,8 @@ void start_equipped_item_animation(void) { if (hero.held_item_anim_blend[i] != 0) { release_moby_animation_slot((u8 *)hero.moby, &hero.held_item_anim_blend[i]); } - slot_animation_object = allocate_moby_animation_slot((u8 *)hero.moby, D_L00_0015F6A0_gp[i]); + slot_animation_object = + allocate_moby_animation_slot((u8 *)hero.moby, l00_hero_item_animation_slot_ids[i]); hero.held_item_anim_blend[i] = slot_animation_object; if (slot_animation_object != 0) { hero.item_hold_anim = slot_animation_id; @@ -1922,6 +1931,10 @@ extern void replenish_hero_drones(void) __asm__("FUN_L00_002cdcc0"); void hero_switch_item(int i) __asm__("FUN_L00_0020fea0"); void hero_switch_item(int i) { + enum { + HERO_ITEM_SWITCH_MODE_RELOAD_TIMER_WHEN_ZERO = 1, + HERO_ITEM_SWITCH_MODE_BLOCKED = 2 + }; int changed; int flag6; int flag4; @@ -2170,10 +2183,11 @@ void hero_switch_item(int i) { { struct Hero *s = (struct Hero *)(((char *)&hero) + i * sizeof(struct HeroItemSlot)); item_switch_mode = s->items[0].switch_lock; - if (item_switch_mode == 2) { + if (item_switch_mode == HERO_ITEM_SWITCH_MODE_BLOCKED) { changed = 0; } - if (item_switch_mode == 1 && s->items[0].timer == 0) { + if (item_switch_mode == HERO_ITEM_SWITCH_MODE_RELOAD_TIMER_WHEN_ZERO && + s->items[0].timer == 0) { s->items[0].timer = s->items[0].timer_reload; } } @@ -2241,10 +2255,6 @@ extern s32 D_L00_0015F3F8; void hero_update_items(void) __asm__("FUN_L00_00210748"); void hero_update_items(void) { - enum { - HERO_ITEM_SLOT_STATE_READY = 2, - HERO_ITEM_SLOT_STATE_REMOVING = 3 - }; int i; int k; struct Moby *moby; @@ -2314,7 +2324,7 @@ void update_hero_equipped_items(void) { } void clear_moby_transform_history(void *) __asm__("FUN_L00_00262840"); -void FUN_L00_00232fe8_210a08(void) __asm__("FUN_L00_00232fe8"); +void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); void reset_hero_easing_records(void) __asm__("FUN_L00_00205538"); void update_hero_collision_capsule_dimensions(void) __asm__("FUN_L00_00211380"); void clear_hero_queued_animation(void) __asm__("FUN_L00_00232628"); @@ -2333,7 +2343,7 @@ void enter_hero_vehicle_mode(int mode, int requested_state, char *vehicle_moby) hero_state->moby = (struct Moby *)hero_state->unkA88; clear_moby_transform_history(&hero_state->trail); hero_state->moby->collision_disable = -1; - FUN_L00_00232fe8_210a08(); + set_hero_item_moby_flag_bit0(); release_and_clear_hero_voice_slots(); reset_hero_easing_records(); hero_state->vehicle_mode = mode; @@ -2369,7 +2379,7 @@ void exit_hero_vehicle_mode(void) __asm__("FUN_L00_00210b30"); void exit_hero_vehicle_mode(void) { struct Hero *hero_state = &hero; unsigned char *vehicle_moby; - if (hero_state->vehicle_mode == 1) { + if (hero_state->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero_state->health.vehicle_mode_hp = hero_state->health.hp; hero_state->health.hp = hero_state->health.unk22B0; if (hero_state->unk1620) { @@ -2383,7 +2393,8 @@ void exit_hero_vehicle_mode(void) { } { struct Hero *vehicle_animation_owner = &hero; - if (vehicle_animation_owner->vehicle_mode == 2 && vehicle_animation_owner->unk1634 != -1) { + if (vehicle_animation_owner->vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK && + vehicle_animation_owner->unk1634 != -1) { set_animation_parameter(vehicle_animation_owner->unk1634, 0); vehicle_animation_owner->unk1634 = -1; } @@ -2391,7 +2402,7 @@ void exit_hero_vehicle_mode(void) { } { struct Hero *vehicle_exit_owner = &hero; - vehicle_exit_owner->vehicle_mode = 0; + vehicle_exit_owner->vehicle_mode = HERO_VEHICLE_MODE_ON_FOOT; vehicle_moby = vehicle_exit_owner->unkA84; if (vehicle_moby) { MOBY(vehicle_moby)->flags &= ~6; @@ -2483,7 +2494,7 @@ s32 hero_check_damage(s32 apply_damage_response) { if (hero_hit_entry->owner != hero_moby) { return 0; } - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { if (!(hero_hit_entry->flags & 2)) { return 0; } @@ -2497,7 +2508,7 @@ s32 hero_check_damage(s32 apply_damage_response) { hero.unk5BE = 1; return 0; } - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { hero.vehicle_hp -= truncate_float_to_s32(hero_hit_entry->damage); if (hero.vehicle_hp < 0) { hero.vehicle_hp = 0; @@ -2840,6 +2851,12 @@ extern float compute_hero_ground_aligned_heading(void) __asm__("FUN_L00_002332d0 void stick_target(float scale, int mode) __asm__("FUN_L00_002118c8"); void stick_target(float scale, int mode) { + enum { + STICK_TARGET_MODE_CARDINAL_AXIS_FILTER = 1, + STICK_TARGET_MODE_FOUR_WAY_YAW = 2, + STICK_TARGET_MODE_EIGHT_WAY_YAW = 3, + STICK_TARGET_MODE_HERO_RELATIVE_YAW = 4 + }; V_2118c8 stick_vector; V_2118c8 q; float x; @@ -2848,7 +2865,7 @@ void stick_target(float scale, int mode) { stick_vector.f[1] = hero.stick_y; stick_vector.f[0] = hero.stick_x; - if (mode == 1) { + if (mode == STICK_TARGET_MODE_CARDINAL_AXIS_FILTER) { if (absolute_float(stick_vector.f[1]) > 0.7f && absolute_float(stick_vector.f[0]) < 0.12f) { stick_vector.f[0] = 0.0f; } @@ -2873,21 +2890,21 @@ void stick_target(float scale, int mode) { return; } hero.motion.move_yaw = fast_arc_tan(-stick_vector.f[1], -stick_vector.f[0]); - if (mode == 2) { + if (mode == STICK_TARGET_MODE_FOUR_WAY_YAW) { hero.motion.move_yaw = convert_integer_to_float( truncate_float_to_s32((hero.motion.move_yaw + 3.1415927f) * 0.63662f + 0.5f) & 3) * 1.5707964f - 3.1415927f; } - if (mode == 3) { + if (mode == STICK_TARGET_MODE_EIGHT_WAY_YAW) { hero.motion.move_yaw = convert_integer_to_float( truncate_float_to_s32((hero.motion.move_yaw + 3.1415927f) * 1.27324f + 0.5f) & 7) * 0.785398f - 3.1415927f; } - if (mode == 4) { + if (mode == STICK_TARGET_MODE_HERO_RELATIVE_YAW) { hero.motion.move_yaw = fast_add_rotations(hero.motion.move_yaw, hero.motion.rot.f[2]); } else { hero.motion.move_yaw = fast_add_rotations(hero.motion.move_yaw, D_L00_00166DD8_lui); @@ -2992,7 +3009,7 @@ void turn_to(int a, float x, float y, float z) __asm__("FUN_L00_00211e30"); void turn_to(int rotation_direction, float x, float y, float z) { struct Hero *hero_state = &hero; - if (hero_state->gravity_mode != 0) { + if (hero_state->gravity_mode != HERO_GRAVITY_WORLD_DOWN) { turn_hero_toward_transformed_move_direction(rotation_direction, x, y, z); } else { hero_state->motion.yaw_error = spring_angle(&hero_state->motion.rot.f[2], @@ -3098,7 +3115,7 @@ void set_planar_vel(float radians) { } ground_speed = hero_state->ground_speed; - if (hero_state->gravity_mode != 0) { + if (hero_state->gravity_mode != HERO_GRAVITY_WORLD_DOWN) { float matrix[16]; float velocity_vector[4]; @@ -3203,10 +3220,10 @@ void clip_hero_velocity_against_probed_surfaces(int force) { if ((u32)(hero.state.control_mode - 0x11) < 2) { primary_probe_height_offset = 0.0f; k = 0.7f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { primary_probe_height_offset = 0.35f; k = 0.27000001072883606f; - } else if (hero.vehicle_mode == 2) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { primary_probe_height_offset = 1.5f; k = 5.0f; } @@ -3418,7 +3435,8 @@ void update_hero_ground_contact_and_surface_slopes(void) { } if (hero.ground_distance < 0.02f) { hero.frames_off_ground.s = 0; - if (hero.ground_slope.f <= 0.87266463f || hero.gravity_mode == 1 || + if (hero.ground_slope.f <= 0.87266463f || + hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.state.control_mode == 0x16) { hero.air_frames.s = 0; hero.last_landed_moby = HH.moby; @@ -3513,7 +3531,7 @@ void correct_hero_ground_penetration(void) __asm__("FUN_L00_00212ff0"); void correct_hero_ground_penetration(void) { struct Hero *globals = &hero; float ground_position_correction[4]; - if (globals->gravity_mode != 0) { + if (globals->gravity_mode != HERO_GRAVITY_WORLD_DOWN) { float velocity_dot = fast_vec_dot(&globals->motion.velocity, &globals->ground_normal); float ground_dist; float ground_correction_length; @@ -3631,15 +3649,18 @@ typedef union { f32 f[4]; } V_2133a8; -extern void FUN_L00_002347c0(void); -extern void FUN_L00_00233810(void *, void *, f32); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void resolve_hero_pending_path_clearance(void) __asm__("FUN_L00_002347c0"); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern s32 coll_sphere(void *, s32, s32, f32) __asm__("FUN_L00_001f0d60"); extern s32 rig_probe(void *, s32, f32, s32, f32) __asm__("FUN_L00_001f19a0"); extern s32 FUN_L00_001f3170(void *, f32); s32 resolve_hero_current_position_collisions(s32 mode) __asm__("FUN_L00_002133a8"); s32 resolve_hero_current_position_collisions(s32 mode) { + enum { + HERO_COLLISION_HISTORY_FINAL_ATTEMPT_INDEX = 0xF + }; V_2133a8 pre_collision_position; V_2133a8 collision_probe_offset; V_2133a8 collision_correction; @@ -3653,15 +3674,15 @@ s32 resolve_hero_current_position_collisions(s32 mode) { qcopy(&pre_collision_position, &hero.motion.pos.q); clear_u64_value(&collision_probe_offset); if (hero.path_constrain_pending != 0) { - FUN_L00_002347c0(); + resolve_hero_pending_path_clearance(); hero.path_constrain_pending = 0; } if (hero.state.control_mode != 0x11) { - if (hero.gravity_mode != 0 || hero.unk1F8 != 0) { - if (hero.gravity_mode == 1 || hero.unk1F8 != 0) { - FUN_L00_00233810(&collision_probe_offset, &collision_probe_offset, 0.6f); + if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN || hero.unk1F8 != 0) { + if (hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.unk1F8 != 0) { + add_hero_up_offset(&collision_probe_offset, &collision_probe_offset, 0.6f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &collision_probe_offset, &collision_probe_offset, -hero.capsule_bottom); } } else { @@ -3674,7 +3695,7 @@ s32 resolve_hero_current_position_collisions(s32 mode) { mask = 0xD24; } for (i = 0; i < 8; i++) { - if (hero.gravity_mode != 0) { + if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN) { if (!coll_sphere(&hero.motion.pos.q, mask, ((s32)hero.moby), frame_scale * 0.4f)) break; } else if (hero.state.control_mode == 0x11) { @@ -3709,7 +3730,7 @@ s32 resolve_hero_current_position_collisions(s32 mode) { fast_vec_sub(&collision_correction, &hero.motion.pos.q, &pre_collision_position); probe_height_or_correction_length = fast_vec_length(&collision_correction); if (hero.capsule_radius * 1.5f < probe_height_or_correction_length) { - if (mode == 0xF) { + if (mode == HERO_COLLISION_HISTORY_FINAL_ATTEMPT_INDEX) { if (512.0f < collision_correction.f[0]) collision_correction.f[0] = 512.0f; else if (collision_correction.f[0] < -512.0f) @@ -4225,7 +4246,7 @@ void hero_integrate_velocity(void) { } } if (!(hero.state_timer < hero.takeoff_frame) && 0.0f < hero.unk428) { - FUN_L00_00233810(&hero.motion.velocity, &hero.motion.velocity, hero.unk428); + add_hero_up_offset(&hero.motion.velocity, &hero.motion.velocity, hero.unk428); hero.unk42C += hero.unk428; hero.unk428 = 0.0f; } @@ -4250,7 +4271,7 @@ void hero_integrate_velocity(void) { velocity_curve->value += velocity_curve->keys[velocity_curve->key].delta * frame_time_sq; } - FUN_L00_00233810(&hero_velocity, &hero_velocity, velocity_curve->value); + add_hero_up_offset(&hero_velocity, &hero_velocity, velocity_curve->value); } } } @@ -4262,9 +4283,10 @@ void hero_integrate_velocity(void) { } if (hero.state_timer < hero.takeoff_frame) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 48.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 48.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.jump_gravity); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, hero.jump_gravity); z = gravity_z(&hero.motion.velocity); movement_gravity_axis_velocity = gravity_z(&hero.motion.resolved_velocity); floor = movement_gravity_axis_velocity - 0.1f; diff --git a/src/overlays/shared/hero/hero_update_hop_movement.c b/src/overlays/shared/hero/hero_update_hop_movement.c index f1b48b4f2d..70e8d08012 100644 --- a/src/overlays/shared/hero/hero_update_hop_movement.c +++ b/src/overlays/shared/hero/hero_update_hop_movement.c @@ -81,11 +81,11 @@ void hero_update_hop_movement(void) { s32 state; state = hero.state.current; - if (state == 10) { + if (state == HERO_STATE_PACK_JUMP) { build_scaled_hero_move_impulse(0.7f, ED6C * 0.0f); qcopy(&hero.motion.momentum, &hero.move_impulse); hero.ground_speed = hero.motion.flat_speed; - } else if (state == 16) { + } else if (state == HERO_STATE_PACK_LONG_JUMP) { if (scale_game_frames(0x36) < hero.state_timer) { approach_value(ED70 * 25.0f, ED70 * 7.0f, &hero.jump_gravity); } @@ -97,7 +97,7 @@ void hero_update_hop_movement(void) { speed_step(ED70 * 44.0f, ED70 * 45.0f); set_gravity_relative_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, 0.0f); add_hero_forward_offset(&hero.motion.velocity, &hero.motion.velocity, hero.ground_speed); - } else if (state == 0x1C) { + } else if (state == HERO_STATE_LEDGE_JUMP) { if (scale_game_frames(0x28) < hero.state_timer) { turn_to(0, ED64 * 0.04f, ED64 * 0.2f, ED6C * 15.009831f); steer_hero_planar_velocity(ED70 * 20.0f); @@ -111,7 +111,7 @@ void hero_update_hop_movement(void) { } hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * hero.ledge_jump_speed; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * hero.ledge_jump_speed; - } else if (state == 11 || state == 12) { + } else if (state == HERO_STATE_HIGH_JUMP || state == HERO_STATE_STORED_HEADING_JUMP) { hero.motion.move_yaw = hero.takeoff_yaw; turn_to(0, ED64 * 0.04f, ED64 * 0.2f, ED6C * 6.981317f); if (hero.unk450 != 3) { @@ -135,7 +135,7 @@ void hero_update_hop_movement(void) { hero.motion.velocity.f[1] += fast_sin(hero.takeoff_yaw) * velocity_scale_or_yaw_delta; build_scaled_hero_move_impulse(0.7f, ED6C * 0.0f); qcopy(&hero.motion.momentum, &hero.move_impulse); - } else if (state == 0x11) { + } else if (state == HERO_STATE_REPEATABLE_JUMP) { hero.motion.move_yaw = hero.unk470.f[3]; qcopy(&hero.motion.move_dir, &hero.unk470); if (scale_game_frames(9) < hero.state_timer) { @@ -154,7 +154,7 @@ void hero_update_hop_movement(void) { } hero.ground_speed = hero.motion.flat_speed; } else { - if (state == 0x2D) { + if (state == HERO_STATE_ITEM_RELEASE_FALL) { x = hero.motion.rot.f[2]; hero.motion.yaw_error = spring_angle(&x, &hero.motion.yaw_rate, diff --git a/src/overlays/shared/hero/hero_update_movement.c b/src/overlays/shared/hero/hero_update_movement.c index 12c1d87be6..dcf211db94 100644 --- a/src/overlays/shared/hero/hero_update_movement.c +++ b/src/overlays/shared/hero/hero_update_movement.c @@ -96,7 +96,7 @@ extern void adjust_hero_animation_speed_for_target_frame(f32, f32, f32, f32) __asm__("FUN_L00_00208f20"); extern void speed_step(f32, f32) __asm__("FUN_L00_00212088"); extern void reduce_and_apply_hero_planar_velocity_addend(f32) __asm__("FUN_L00_00216710"); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern void clip_hero_velocity_against_probed_surfaces(s32) __asm__("FUN_L00_00212318"); extern void correct_hero_airborne_wall_velocity(void) __asm__("FUN_L00_002121c0"); extern void spawn_hero_radial_particle_burst(void) __asm__("FUN_L00_00217450"); @@ -127,7 +127,7 @@ extern void moby_point_position(struct MobyView *, s32, void *) __asm__("FUN_L00 extern u8 *FUN_L00_0026f080(void *, void *, f32, f32); extern s32 random_int_between(s32, s32) __asm__("FUN_L00_00257b90"); extern void FUN_L00_00262cf0(void *, void *, f32, f32, f32); -extern f32 FUN_L00_00209018(void *, s32); +extern f32 vector_length_xyz_cf(void *, s32) __asm__("FUN_L00_00209018"); extern f32 approach_value(f32 *, f32, f32) __asm__("FUN_00213ed8"); extern void set_first_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a1e0"); extern void set_fourth_hero_easing_parameters(f32, f32) __asm__("FUN_L00_0020a228"); @@ -182,7 +182,7 @@ struct PlayerSpeedTuning { extern struct PlayerSpeedTuning D_L00_0017BDB8; extern s32 allocate_hero_voice_for_entry(s32, s32) __asm__("FUN_L00_00216de8"); extern void add_hero_forward_offset(void *, void *, f32) __asm__("FUN_L00_00233708"); -extern void FUN_L00_00233810(void *, void *, f32); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); extern s32 collision_line(void *, void *, s32, struct MobyView *, s32) __asm__("FUN_001efa68"); extern void update_hero_motion_response_parameters(void) __asm__("FUN_L00_00215b68"); extern void transform_hero_local_offset_to_world(void *, f32, f32, f32) __asm__("FUN_L00_00233660"); @@ -235,9 +235,9 @@ void hero_update_movement(void) { s32 sub = hero.state.step; s32 anim = moby->b53; f32 speed; - Vec4 v0; + Vec4 movement_and_hit_descriptor_scratch; Vec4 v10; - Vec4 v20; + Vec4 spatial_and_hit_descriptor_scratch; Vec4 movement_vector_scratch; Vec4 matrix_vector_scratch[4]; Vec4 transposed_yaw_matrix[4]; @@ -270,9 +270,11 @@ void hero_update_movement(void) { stick_target(1.0f, 0); if (hero.state.current == HERO_STATE_LOOK || hero.state.current == 0x1E) { if (hero.unk20A5 != 0) { - v0.q = 0; - v0.f[0] = 1.0f; - transform_vector_by_basis(&hero.motion.move_dir, &v0, &D_L00_00166DD8[0x1F8]); + movement_and_hit_descriptor_scratch.q = 0; + movement_and_hit_descriptor_scratch.f[0] = 1.0f; + transform_vector_by_basis(&hero.motion.move_dir, + &movement_and_hit_descriptor_scratch, + &D_L00_00166DD8[0x1F8]); hero.motion.move_yaw = *(f32 *)D_L00_00166DD8; turn_to(0, frame_scale_sq, frame_scale_sq * 0.0f, frame_time * 174.53293f); if (D_L00_0015F688 > 0 && fast_dec_timer(&D_L00_0015F688) != 0) { @@ -365,10 +367,10 @@ void hero_update_movement(void) { reduce_and_apply_hero_planar_velocity_addend(speed); if (hero.on_magnet_ground != 0 && D_0013D4DC[0] != 0) { if (hero.ground_distance > 0.2f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); if (hero.ground_moby != NULL) { qcopy(&hero.motion.pos, &hero.ground_point); @@ -379,11 +381,11 @@ void hero_update_movement(void) { } else { clip_hero_velocity_against_probed_surfaces(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -547,13 +549,13 @@ void hero_update_movement(void) { if (PD.held & 0x40) { hero.jump_button_frames++; if (PD.analog[10] > 0.75f) { - s32 t2; + s32 swim_usage_time_bucket; if (++hero.swim_hard_press_frames > scale_game_frames(90) && usage_stats.stat[11].count < 0xFFFF) { usage_stats.stat[11].count++; } - t2 = scale_game_frames(D_0015EEA4) / 600; - if (usage_stats.stat[11].latest_time_bucket < t2) { + swim_usage_time_bucket = scale_game_frames(D_0015EEA4) / 600; + if (usage_stats.stat[11].latest_time_bucket < swim_usage_time_bucket) { usage_stats.stat[11].latest_time_bucket = scale_game_frames(D_0015EEA4) / 600; } @@ -627,16 +629,23 @@ void hero_update_movement(void) { s32 lo2; s32 hi2; pl = &hero_b; - moby_point_position((struct MobyView *)pl->moby, 4, &v0); - v20.q = 0; - v20.f[0] = 0.4f; - transform_vector_by_basis(&v20, &v20, &((struct MobyView *)pl->moby)->vC0); - fast_vec_add(&v0, &v0, &v20); + moby_point_position( + (struct MobyView *)pl->moby, 4, &movement_and_hit_descriptor_scratch); + spatial_and_hit_descriptor_scratch.q = 0; + spatial_and_hit_descriptor_scratch.f[0] = 0.4f; + transform_vector_by_basis(&spatial_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch, + &((struct MobyView *)pl->moby)->vC0); + fast_vec_add(&movement_and_hit_descriptor_scratch, + &movement_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch); qcopy(&v10, &hero_b.motion.displacement); - fast_vec_normalize(&v20, &v20, frame_time * 1.5f); - fast_vec_add(&v10, &v10, &v20); + fast_vec_normalize(&spatial_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch, + frame_time * 1.5f); + fast_vec_add(&v10, &v10, &spatial_and_hit_descriptor_scratch); v10.f[2] += frame_time * 2.0f; - FUN_L00_0026f080(&v0, &v10, 25200.0f, -1.0f); + FUN_L00_0026f080(&movement_and_hit_descriptor_scratch, &v10, 25200.0f, -1.0f); if (random_integer_below(100) < 40.0f) { lo2 = scale_game_frames(4); hi2 = 11; @@ -651,14 +660,21 @@ void hero_update_movement(void) { if (gm != NULL && gm->hA6 == 0x261) { s32 i; for (i = 0; i < 4; i++) { - moby_point_position(gm, i % 2, &v0); - v20.q = 0; - v20.f[0] = -0.15f; - transform_vector_by_basis(&v20, &v20, &((struct MobyView *)hero.moby)->vC0); - fast_vec_add(&v0, &v0, &v20); - v0.f[0] += random_float_between(0.0f, 0.03f); - v0.f[1] += random_float_between(0.0f, 0.03f); - v0.f[2] += random_float_between(0.0f, 0.03f); + moby_point_position(gm, i % 2, &movement_and_hit_descriptor_scratch); + spatial_and_hit_descriptor_scratch.q = 0; + spatial_and_hit_descriptor_scratch.f[0] = -0.15f; + transform_vector_by_basis(&spatial_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch, + &((struct MobyView *)hero.moby)->vC0); + fast_vec_add(&movement_and_hit_descriptor_scratch, + &movement_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch); + movement_and_hit_descriptor_scratch.f[0] += + random_float_between(0.0f, 0.03f); + movement_and_hit_descriptor_scratch.f[1] += + random_float_between(0.0f, 0.03f); + movement_and_hit_descriptor_scratch.f[2] += + random_float_between(0.0f, 0.03f); qcopy(&v10, &hero.motion.displacement); FUN_L00_00262cf0(&v10, &v10, @@ -668,7 +684,10 @@ void hero_update_movement(void) { hero.pack_particle_timer = truncate_float_to_s32((frame_time * 7.0f - hero.ground_speed) / (frame_time * 7.0f) * scale_game_frames(5)); - FUN_L00_0026f080(&v0, &v10, random_float_between(6300.0f, 9450.0f), -1.0f); + FUN_L00_0026f080(&movement_and_hit_descriptor_scratch, + &v10, + random_float_between(6300.0f, 9450.0f), + -1.0f); } } } @@ -683,7 +702,7 @@ void hero_update_movement(void) { &hero.motion.velocity, hero.ground_speed, hero.motion.rot.f[2], yaw); } else if (hero.state.current == 0x33) { f32 sp = hero.ground_speed * - FUN_L00_00209018(l00_swim_speed_scale_by_animation_frame, 0x1E) * 5.0f; + vector_length_xyz_cf(l00_swim_speed_scale_by_animation_frame, 0x1E) * 5.0f; if (hero.state.prev == 0x35 && scale_game_frames(15) > hero.state_timer) { if (sp < frame_time * 4.5f) { sp = frame_time * 4.5f; @@ -750,16 +769,23 @@ void hero_update_movement(void) { fast_vec_normalize(&hero.motion.momentum, &hero.motion.momentum, len); qcopy(&hero.motion.velocity, &hero.motion.momentum); if (fast_dec_timer(&hero.puff_timer) == 2) { - moby_point_position((struct MobyView *)hero.moby, 4, &v0); - v20.q = 0; - v20.f[0] = 0.4f; - transform_vector_by_basis(&v20, &v20, &((struct MobyView *)hero.moby)->vC0); - fast_vec_add(&v0, &v0, &v20); + moby_point_position( + (struct MobyView *)hero.moby, 4, &movement_and_hit_descriptor_scratch); + spatial_and_hit_descriptor_scratch.q = 0; + spatial_and_hit_descriptor_scratch.f[0] = 0.4f; + transform_vector_by_basis(&spatial_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch, + &((struct MobyView *)hero.moby)->vC0); + fast_vec_add(&movement_and_hit_descriptor_scratch, + &movement_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch); qcopy(&v10, &hero.motion.displacement); - fast_vec_normalize(&v20, &v20, frame_time * 1.5f); - fast_vec_add(&v10, &v10, &v20); + fast_vec_normalize(&spatial_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch, + frame_time * 1.5f); + fast_vec_add(&v10, &v10, &spatial_and_hit_descriptor_scratch); v10.f[2] += frame_time * 2.0f; - FUN_L00_0026f080(&v0, &v10, 25200.0f, -1.0f); + FUN_L00_0026f080(&movement_and_hit_descriptor_scratch, &v10, 25200.0f, -1.0f); if (scale_game_frames(40) > hero.state_timer) { hero.puff_timer = random_int_between(scale_game_frames(2), scale_game_frames(5)) + hero.state_timer / 5; @@ -808,7 +834,7 @@ void hero_update_movement(void) { speed_step(frame_time_sq * 4.0f, frame_time_sq * 5.0f); { f32 sp = hero.ground_speed * - FUN_L00_00209018(l00_swim_speed_scale_by_animation_frame, 0x1E) * 5.5f; + vector_length_xyz_cf(l00_swim_speed_scale_by_animation_frame, 0x1E) * 5.5f; hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * sp; hero.motion.velocity.f[2] = 0.0f; @@ -833,9 +859,12 @@ void hero_update_movement(void) { ((struct MobyView *)hero.ground_moby)->hA6 == 0x155) { f32 d; f32 ground_moby_yaw_step_limit; - clear_u64_value(&v0); - fast_vec_add(&v0, &v0, &((struct MobyView *)hero.ground_moby)->u10.v10); - fast_vec_sub(&hero.motion.velocity, &v0, &hero.motion.pos); + clear_u64_value(&movement_and_hit_descriptor_scratch); + fast_vec_add(&movement_and_hit_descriptor_scratch, + &movement_and_hit_descriptor_scratch, + &((struct MobyView *)hero.ground_moby)->u10.v10); + fast_vec_sub( + &hero.motion.velocity, &movement_and_hit_descriptor_scratch, &hero.motion.pos); FUN_L00_0025f730(&hero.motion.velocity, frame_time * 2.0f); d = fast_subtract_rotations(((struct MobyView *)hero.ground_moby)->u40.f48.v, hero.motion.rot.f[2]); @@ -862,11 +891,12 @@ void hero_update_movement(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if (anim != -1 && ((struct MobyView *)hero.moby)->b52 != 0x36) { set_hero_animation(anim, 0, frames); @@ -885,11 +915,12 @@ void hero_update_movement(void) { clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } if ((struct MobyView *)hero.grapple_target != NULL) { hero.motion.move_yaw = @@ -901,8 +932,9 @@ void hero_update_movement(void) { case HERO_STATE_APPROACH_TARGET_MOBY: { f32 hit; f32 hit2; - qcopy(&v0, &((struct MobyView *)hero.grapple_target)->u10.v10); - hero.unk970 = fast_vec_dist(&hero.motion.pos, &v0); + qcopy(&movement_and_hit_descriptor_scratch, + &((struct MobyView *)hero.grapple_target)->u10.v10); + hero.unk970 = fast_vec_dist(&hero.motion.pos, &movement_and_hit_descriptor_scratch); hero.target_arrival_frames = scale_game_frames(60); if (hero.grapple_pull_speed > 0.0f) { hero.target_arrival_frames = hero.unk970 / hero.motion.speed_xy; @@ -931,16 +963,24 @@ void hero_update_movement(void) { if (hero.grapple_pull_ending != 0) { step_angle_toward_target(&hero.motion.rot.f[1], 0, 0.0f, frame_time * 3.8397243f); } else { - f32 an = fast_add_rotations(-fast_arc_tan(vector_distance_xy(&hero.motion.pos, &v0), - v0.f[2] - hero.motion.pos.f[2]), - 1.5707964f); + f32 an = fast_add_rotations( + -fast_arc_tan( + vector_distance_xy(&hero.motion.pos, &movement_and_hit_descriptor_scratch), + movement_and_hit_descriptor_scratch.f[2] - hero.motion.pos.f[2]), + 1.5707964f); step_angle_toward_target(&hero.motion.rot.f[1], 0, an, frame_time * 6.4577184f); } - v20.f[0] = fast_cos(fast_add_rotations(hero.motion.rot.f[2], -1.5707964f)) * -0.57f; - v20.f[1] = fast_sin(fast_add_rotations(hero.motion.rot.f[2], -1.5707964f)) * -0.57f; - v20.f[2] = 0.0f; - fast_vec_add(&v20, &v20, &hero.motion.pos); - fast_vec_sub(&v10, &((struct MobyView *)hero.grapple_target)->u10.v10, &v20); + spatial_and_hit_descriptor_scratch.f[0] = + fast_cos(fast_add_rotations(hero.motion.rot.f[2], -1.5707964f)) * -0.57f; + spatial_and_hit_descriptor_scratch.f[1] = + fast_sin(fast_add_rotations(hero.motion.rot.f[2], -1.5707964f)) * -0.57f; + spatial_and_hit_descriptor_scratch.f[2] = 0.0f; + fast_vec_add(&spatial_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch, + &hero.motion.pos); + fast_vec_sub(&v10, + &((struct MobyView *)hero.grapple_target)->u10.v10, + &spatial_and_hit_descriptor_scratch); fast_vec_normalize(&hero.motion.velocity, &v10, hero.grapple_pull_speed); if (scale_game_frames(30) > hero.target_arrival_frames) { f32 t = scale_game_frames(30) - hero.target_arrival_frames; @@ -953,13 +993,16 @@ void hero_update_movement(void) { qcopy(&hero.motion.velocity, &hero.motion.displacement); fast_vec_scale(&hero.motion.velocity, &hero.motion.velocity, 0.9f); hero.motion.velocity.f[2] -= frame_time_sq * 15.0f; - qcopy(&v0, &((struct MobyView *)hero.grapple_target)->u10.v10); - hero.unk970 = fast_vec_dist(&hero.motion.pos, &v0); + qcopy(&movement_and_hit_descriptor_scratch, + &((struct MobyView *)hero.grapple_target)->u10.v10); + hero.unk970 = fast_vec_dist(&hero.motion.pos, &movement_and_hit_descriptor_scratch); fast_vec_add(&v10, &hero.motion.pos, &hero.motion.velocity); - fast_vec_sub(&movement_vector_scratch, &v10, &v0); + fast_vec_sub(&movement_vector_scratch, &v10, &movement_and_hit_descriptor_scratch); fast_vec_normalize(&movement_vector_scratch, &movement_vector_scratch, hero.tether_radius); - fast_vec_add(&v20, &v0, &movement_vector_scratch); - fast_vec_sub(&hero.motion.velocity, &v20, &hero.motion.pos); + fast_vec_add(&spatial_and_hit_descriptor_scratch, + &movement_and_hit_descriptor_scratch, + &movement_vector_scratch); + fast_vec_sub(&hero.motion.velocity, &spatial_and_hit_descriptor_scratch, &hero.motion.pos); break; } case HERO_STATE_GRAPPLE_SWING_ENTRY: { @@ -987,18 +1030,28 @@ void hero_update_movement(void) { } hero.motion.move_yaw = hero.swing_yaw; turn_to(0, frame_scale_sq * 0.02f, frame_scale_sq * 0.3f, frame_time * 4.712389f); - fast_vec_sub(&v0, &((struct MobyView *)hero.swing_target_moby)->u10.v10, &hero.motion.pos); - fast_vec_normalize(&v0, &v0, 1.0f); - if (v0.f[2] < 0.23f) { - v0.f[2] = 0.23f; - } - clear_u64_value(&v20); - v20.f[2] = hero.motion.rot.f[2]; - euler_rotation_matrix(matrix_vector_scratch, &v20); + fast_vec_sub(&movement_and_hit_descriptor_scratch, + &((struct MobyView *)hero.swing_target_moby)->u10.v10, + &hero.motion.pos); + fast_vec_normalize( + &movement_and_hit_descriptor_scratch, &movement_and_hit_descriptor_scratch, 1.0f); + if (movement_and_hit_descriptor_scratch.f[2] < 0.23f) { + movement_and_hit_descriptor_scratch.f[2] = 0.23f; + } + clear_u64_value(&spatial_and_hit_descriptor_scratch); + spatial_and_hit_descriptor_scratch.f[2] = hero.motion.rot.f[2]; + euler_rotation_matrix(matrix_vector_scratch, &spatial_and_hit_descriptor_scratch); transpose_rotation_matrix(transposed_yaw_matrix, matrix_vector_scratch); - transform_vector(&v0, &v0, transposed_yaw_matrix); - v10.f[0] = -fast_arc_tan(square_root(v0.f[0] * v0.f[0] + v0.f[2] * v0.f[2]), v0.f[1]); - v10.f[1] = fast_arc_tan(v0.f[2], v0.f[0]); + transform_vector(&movement_and_hit_descriptor_scratch, + &movement_and_hit_descriptor_scratch, + transposed_yaw_matrix); + v10.f[0] = -fast_arc_tan(square_root(movement_and_hit_descriptor_scratch.f[0] * + movement_and_hit_descriptor_scratch.f[0] + + movement_and_hit_descriptor_scratch.f[2] * + movement_and_hit_descriptor_scratch.f[2]), + movement_and_hit_descriptor_scratch.f[1]); + v10.f[1] = fast_arc_tan(movement_and_hit_descriptor_scratch.f[2], + movement_and_hit_descriptor_scratch.f[0]); spring_angle(&hero.motion.rot.f[1], v10.f[1], &hero.motion.rot_spring_vel.f[1], @@ -1040,13 +1093,13 @@ void hero_update_movement(void) { &((struct MobyView *)hero.swing_target_moby)->u10.v10) < hero.unk9A0 * 1.57f || hero.ground_distance > 1.5f) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 40.0f); if (hero.swing_entry_push != 0 && gravity_z(&hero.motion.velocity) > 0.0f) { fast_vec_sub(&movement_vector_scratch, &hero.motion.pos, &((struct MobyView *)hero.swing_target_moby)->u10.v10); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 57.0f); } } @@ -1166,20 +1219,25 @@ void hero_update_movement(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (fall_start_frame < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.rise_fall_gravity); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.past_apex = 1.0f; } } if (hero.past_apex != 0.0f && hero.air_frames.s != 0) { - qcopy(&v0, &hero.motion.pos); - v0.f[2] -= 0.5f; + qcopy(&movement_and_hit_descriptor_scratch, &hero.motion.pos); + movement_and_hit_descriptor_scratch.f[2] -= 0.5f; matrix_vector_scratch[0].f[0] = fast_cos(hero.motion.rot.f[2]); matrix_vector_scratch[0].f[1] = fast_sin(hero.motion.rot.f[2]); matrix_vector_scratch[0].f[2] = 0.0f; make_hit_descriptor( &v10, (struct MobyView *)hero.moby, 0x30000, 1.0f, &matrix_vector_scratch[0]); - collect_mobies_in_sphere(0.8f, &v0, 0x10, (struct MobyView *)hero.moby, &v10); + collect_mobies_in_sphere(0.8f, + &movement_and_hit_descriptor_scratch, + 0x10, + (struct MobyView *)hero.moby, + &v10); } if (hero.past_apex != 0.0f && hero.air_frames.s == 0) { if (hero.rise_fall_land_frames == 0) { @@ -1247,18 +1305,23 @@ void hero_update_movement(void) { fall_start_frame = scale_game_frames(14); if (hero.anim_changing == 0 && hero.anim_frame > 23.5f && hero.motion.displacement.f[2] < 0.0f && hero.air_frames.s != 0) { - qcopy(&v0, &hero.motion.pos); - offset_hero_position_against_gravity(&v0, &v0, -0.5f); + qcopy(&movement_and_hit_descriptor_scratch, &hero.motion.pos); + offset_hero_position_against_gravity( + &movement_and_hit_descriptor_scratch, &movement_and_hit_descriptor_scratch, -0.5f); matrix_vector_scratch[0].f[0] = fast_cos(hero.motion.rot.f[2]) * 2.0f; matrix_vector_scratch[0].f[1] = fast_sin(hero.motion.rot.f[2]) * 2.0f; matrix_vector_scratch[0].f[2] = 0.0f; make_hit_descriptor( &v10, (struct MobyView *)hero.moby, 0x10000, 2.0f, &matrix_vector_scratch[0]); v10.f[3] = 5627.925f; - ((u8 *)&v20)[9] = 1; - ((s16 *)&v20)[5] = 0x47; - ((u8 *)&v20)[8] = 0; - collect_mobies_in_sphere(0.4f, &v0, 0x10, (struct MobyView *)hero.moby, &v10); + ((u8 *)&spatial_and_hit_descriptor_scratch)[9] = 1; + ((s16 *)&spatial_and_hit_descriptor_scratch)[5] = 0x47; + ((u8 *)&spatial_and_hit_descriptor_scratch)[8] = 0; + collect_mobies_in_sphere(0.4f, + &movement_and_hit_descriptor_scratch, + 0x10, + (struct MobyView *)hero.moby, + &v10); } test_hero_animation_frame_window(27.0f); if (hero.state_timer < rise_end_frame) { @@ -1266,7 +1329,8 @@ void hero_update_movement(void) { approach_value(&h, r, mx); gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, h); } else if (fall_start_frame < hero.state_timer) { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 130.0f); if (gravity_z(&hero.motion.velocity) < 0.0f) { hero.slam_descending = 1.0f; } @@ -1312,7 +1376,7 @@ void hero_update_movement(void) { if (hero.anim_changing == 0 && hero.anim_frame > 6.0f) { ok = 0; } - if (ok && hero.gravity_mode == 0) { + if (ok && hero.gravity_mode == HERO_GRAVITY_WORLD_DOWN) { update_hero_target_heading(14.0f, 0.5235988f, 0.7853982f); } } @@ -1341,10 +1405,10 @@ void hero_update_movement(void) { speed_step(frame_time_sq * 37.0f, frame_time_sq * 28.0f); set_planar_vel(99999.0f); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } } @@ -1373,11 +1437,11 @@ void hero_update_movement(void) { if (d < 0.0f) { d = 0.0f; } - if (tb->kind == 0) { + if (tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE) { off = 0.75f; tol = 0.8f; mx = 4.0f; - } else if (tb->kind == 1) { + } else if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) { off = 0.6f; tol = 1.7f; mx = 4.0f; @@ -1422,7 +1486,7 @@ void hero_update_movement(void) { } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || (struct MobyView *)hero.melee_target != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -1432,7 +1496,8 @@ void hero_update_movement(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { s32 ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -1446,10 +1511,11 @@ void hero_update_movement(void) { set_planar_vel(99999.0f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -1517,10 +1583,13 @@ void hero_update_movement(void) { movement_vector_scratch.f[0] = fast_cos(hero.motion.rot.f[2]) * 2.0f; movement_vector_scratch.f[1] = fast_sin(hero.motion.rot.f[2]) * 2.0f; movement_vector_scratch.f[2] = 1.3f; - make_hit_descriptor( - &v0, (struct MobyView *)hero.moby, 0x30000, 3.0f, &movement_vector_scratch); + make_hit_descriptor(&movement_and_hit_descriptor_scratch, + (struct MobyView *)hero.moby, + 0x30000, + 3.0f, + &movement_vector_scratch); ((u8 *)&v10)[9] = 3; - v0.f[3] = 5627.925f; + movement_and_hit_descriptor_scratch.f[3] = 5627.925f; ((u8 *)&v10)[8] = 0; a = hero.motion.rot.f[2]; ((s16 *)&v10)[5] = o->hA6; @@ -1530,7 +1599,12 @@ void hero_update_movement(void) { fast_vec_add( &matrix_vector_scratch[0], &matrix_vector_scratch[0], &hero.motion.pos); emit_filtered_entry_sparkles( - o, collect_mobies_in_sphere(0.8f, &matrix_vector_scratch[0], 0, o, &v0)); + o, + collect_mobies_in_sphere(0.8f, + &matrix_vector_scratch[0], + 0, + o, + &movement_and_hit_descriptor_scratch)); a = fast_add_rotations(hero.motion.rot.f[2], -0.87266463f); matrix_vector_scratch[0].f[0] = fast_cos(a) * 0.8f; matrix_vector_scratch[0].f[1] = fast_sin(a) * 0.8f; @@ -1539,8 +1613,11 @@ void hero_update_movement(void) { &matrix_vector_scratch[0], &matrix_vector_scratch[0], &hero.motion.pos); emit_filtered_entry_sparkles( o, - collect_mobies_in_sphere( - 0.8f, &matrix_vector_scratch[0], 0, (struct MobyView *)hero.moby, &v0)); + collect_mobies_in_sphere(0.8f, + &matrix_vector_scratch[0], + 0, + (struct MobyView *)hero.moby, + &movement_and_hit_descriptor_scratch)); a = fast_add_rotations(hero.motion.rot.f[2], 0.87266463f); matrix_vector_scratch[0].f[0] = fast_cos(a) * 0.8f; matrix_vector_scratch[0].f[1] = fast_sin(a) * 0.8f; @@ -1548,7 +1625,12 @@ void hero_update_movement(void) { fast_vec_add( &matrix_vector_scratch[0], &matrix_vector_scratch[0], &hero.motion.pos); emit_filtered_entry_sparkles( - o, collect_mobies_in_sphere(0.8f, &matrix_vector_scratch[0], 0, o, &v0)); + o, + collect_mobies_in_sphere(0.8f, + &matrix_vector_scratch[0], + 0, + o, + &movement_and_hit_descriptor_scratch)); } } if (scale_game_frames(10) < hero.state_timer) { @@ -1556,11 +1638,12 @@ void hero_update_movement(void) { } clip_hero_velocity_against_probed_surfaces(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1585,8 +1668,11 @@ void hero_update_movement(void) { f32 a; f32 f; update_hero_target_speed_from_stick(); - transform_vector(&v0, &hero_b.motion.move_dir, (Vec4 *)hero_b.inv_rot_matrix); - a = absolute_float(fast_arc_tan(v0.f[0], v0.f[1])); + transform_vector(&movement_and_hit_descriptor_scratch, + &hero_b.motion.move_dir, + (Vec4 *)hero_b.inv_rot_matrix); + a = absolute_float(fast_arc_tan(movement_and_hit_descriptor_scratch.f[0], + movement_and_hit_descriptor_scratch.f[1])); if (a > 0.69813168f) { f32 x0 = hero.target_speed; f32 x1 = hero.ground_speed; @@ -1615,10 +1701,11 @@ void hero_update_movement(void) { hero.air_frames.s = 0; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1653,8 +1740,8 @@ void hero_update_movement(void) { if (hero.unk930 > 0.0f) { Vec4 *move_impulse_ptr = &hero.move_impulse; build_scaled_hero_move_impulse(0.7f, 0.0f); - v0.q = hero.move_impulse.q; - hero.target_speed += forward_component(&v0); + movement_and_hit_descriptor_scratch.q = hero.move_impulse.q; + hero.target_speed += forward_component(&movement_and_hit_descriptor_scratch); if (hero.target_speed < frame_time * 0.7f) { hero.target_speed = frame_time * 0.7f; } @@ -1712,11 +1799,12 @@ void hero_update_movement(void) { stop_hero_motion_without_forward_support(5.0f, 0.2f); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -1758,11 +1846,12 @@ void hero_update_movement(void) { hero_eases[1].rot_target.f[0] = s * m; } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); } else { hero.motion.velocity.f[2] = 0.0f; - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 150.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 150.0f); } break; } @@ -1777,15 +1866,19 @@ void hero_update_movement(void) { } if (current_level_index != 0xF) { emit_hero_randomized_motion_effects(4, 2); - v0.f[0] = hero.motion.pos.f[0] + random_float_between(-0.25f, 0.25f); - v0.f[1] = hero.motion.pos.f[1] + random_float_between(-0.25f, 0.25f); - v0.f[2] = hero.motion.pos.f[2] + random_float_between(-0.1f, 0.4f); + movement_and_hit_descriptor_scratch.f[0] = + hero.motion.pos.f[0] + random_float_between(-0.25f, 0.25f); + movement_and_hit_descriptor_scratch.f[1] = + hero.motion.pos.f[1] + random_float_between(-0.25f, 0.25f); + movement_and_hit_descriptor_scratch.f[2] = + hero.motion.pos.f[2] + random_float_between(-0.1f, 0.4f); fast_vec_scale(&v10, &hero.motion.displacement, 0.9f); v10.f[0] += random_float_between(frame_time * -0.7f, frame_time * 0.7f); v10.f[1] += random_float_between(frame_time * -0.7f, frame_time * 0.7f); v10.f[2] += random_float_between(frame_time, frame_time * 2.0f); - spawn_random_alpha_rotated_particle( - &v0, &v10, random_float_between(37800.0f, 75600.0f)); + spawn_random_alpha_rotated_particle(&movement_and_hit_descriptor_scratch, + &v10, + random_float_between(37800.0f, 75600.0f)); } f = fast_vec_length(&hero.motion.platform_delta); if (f > frame_time * 0.5f) { @@ -1859,7 +1952,7 @@ void hero_update_movement(void) { if (hero.state.current == HERO_STATE_GRIND || hero.state.current == 0x2B) { f32 yaw_angle; f32 rr; - qcopy(&v0, &hero.motion.pos); + qcopy(&movement_and_hit_descriptor_scratch, &hero.motion.pos); yaw_angle = fast_add_rotations(hero.rail_dir_yaw, randf_sym(0.0f, 0.5235988f)); rr = random_float_between(frame_time * 4.0f, frame_time * 7.0f); v10.f[0] = fast_cos(yaw_angle) * rr; @@ -1867,7 +1960,7 @@ void hero_update_movement(void) { v10.f[2] = 0.0f; v10.f[2] = random_float_between(frame_time * 3.0f, frame_time * 5.0f); v10.f[3] = -(frame_time_sq * 30.0f); - spawn_color_decaying_effect_particle(&v0, &v10, 0); + spawn_color_decaying_effect_particle(&movement_and_hit_descriptor_scratch, &v10, 0); } t = hero.items[0].item_id; has = item_defs[t].slot_anim_count != 0; @@ -1924,7 +2017,7 @@ void hero_update_movement(void) { r = hero.unk5CC * (f32)hero.grind_direction; } sample_path((void *)hero.rail_spline, - &v0, + &movement_and_hit_descriptor_scratch, &hero.rail_segment, &hero.rail_seg_frac, r, @@ -1942,10 +2035,15 @@ void hero_update_movement(void) { s32 si; f32 sf; f32 q = scale_time(30.0f) * hero.motion.speed_xy; - qcopy(&v20, &hero.motion.pos); + qcopy(&spatial_and_hit_descriptor_scratch, &hero.motion.pos); si = hero.rail_segment; sf = hero.rail_seg_frac; - h = sample_path((void *)hero.rail_spline, &v20, &si, &sf, q, hero.rail_spline_loops); + h = sample_path((void *)hero.rail_spline, + &spatial_and_hit_descriptor_scratch, + &si, + &sf, + q, + hero.rail_spline_loops); qcopy(&movement_vector_scratch, &hero.motion.pos); si = hero.rail_segment; sf = hero.rail_seg_frac; @@ -1956,11 +2054,13 @@ void hero_update_movement(void) { q + 0.1f, hero.rail_spline_loops)) == 0 || hero.rail_spline_loops != 0) { - f32 a = - fast_subtract_rotations(hero.rail_dir_yaw, - fast_arc_tan(movement_vector_scratch.f[0] - v20.f[0], - movement_vector_scratch.f[1] - v20.f[1])) * - 0.37f; + f32 a = fast_subtract_rotations( + hero.rail_dir_yaw, + fast_arc_tan(movement_vector_scratch.f[0] - + spatial_and_hit_descriptor_scratch.f[0], + movement_vector_scratch.f[1] - + spatial_and_hit_descriptor_scratch.f[1])) * + 0.37f; if (a > 0.7853982f) { a = 0.7853982f; } @@ -1987,10 +2087,14 @@ void hero_update_movement(void) { if ((struct MobyView *)hero.grind_look_moby != NULL) { f32 a; f32 k; - fast_vec_sub( - &v20, &((struct MobyView *)hero.grind_look_moby)->u10.v10, &hero.motion.pos); - transform_vector_by_basis(&v20, &v20, (Vec4 *)hero.inv_rot_matrix); - a = fast_arc_tan(v20.f[0], v20.f[1]); + fast_vec_sub(&spatial_and_hit_descriptor_scratch, + &((struct MobyView *)hero.grind_look_moby)->u10.v10, + &hero.motion.pos); + transform_vector_by_basis(&spatial_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch, + (Vec4 *)hero.inv_rot_matrix); + a = fast_arc_tan(spatial_and_hit_descriptor_scratch.f[0], + spatial_and_hit_descriptor_scratch.f[1]); if (((struct MobyView *)hero.moby)->b52 == 0x31) { a = fast_subtract_rotations(a, 1.5707964f); hero_eases[3].rot_target.f[2] = a * 0.3f; @@ -2024,15 +2128,19 @@ void hero_update_movement(void) { hero.rail_segment, hero.grind_direction, hero.rail_spline_loops); - fast_vec_sub(&v20, (Vec4 *)hero.rail_spline + (idx + 1), &v0); - if (fast_vec_length(&v20) < 0.001f) { + fast_vec_sub(&spatial_and_hit_descriptor_scratch, + (Vec4 *)hero.rail_spline + (idx + 1), + &movement_and_hit_descriptor_scratch); + if (fast_vec_length(&spatial_and_hit_descriptor_scratch) < 0.001f) { if (hero.rail_segment == idx) { hero.rail_off_frames = scale_game_frames(1); break; } } else { - hero.rail_dir_yaw = fast_arc_tan(v20.f[0], v20.f[1]); - hero.rail_pitch = fast_arc_tan(vector_length_xy(&v20), v20.f[2]); + hero.rail_dir_yaw = fast_arc_tan(spatial_and_hit_descriptor_scratch.f[0], + spatial_and_hit_descriptor_scratch.f[1]); + hero.rail_pitch = fast_arc_tan(vector_length_xy(&spatial_and_hit_descriptor_scratch), + spatial_and_hit_descriptor_scratch.f[2]); } hero.motion.move_yaw = fast_add_rotations(hero.rail_dir_yaw, hero.grind_yaw_offset); turn_to(0, frame_scale_sq * 0.015f, frame_scale_sq * 0.15f, frame_time * 6.2831855f); @@ -2050,23 +2158,31 @@ void hero_update_movement(void) { } if (hero.rail_switching != 0 && hero.rail_transfer_frames <= scale_game_frames(48)) { f32 previous_path_blend_fraction; - fast_vec_sub(&v20, &v0, &v10); + fast_vec_sub(&spatial_and_hit_descriptor_scratch, + &movement_and_hit_descriptor_scratch, + &v10); hero.rail_transfer_frames++; - fast_vec_scale( - &v20, &v20, (f32)hero.rail_transfer_frames / (f32)scale_game_frames(48)); + fast_vec_scale(&spatial_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch, + (f32)hero.rail_transfer_frames / (f32)scale_game_frames(48)); previous_path_blend_fraction = (f32)(hero.rail_transfer_frames - 1) / (f32)scale_game_frames(48); - fast_vec_sub(&movement_vector_scratch, &v0, &v10); + fast_vec_sub(&movement_vector_scratch, &movement_and_hit_descriptor_scratch, &v10); fast_vec_scale(&movement_vector_scratch, &movement_vector_scratch, previous_path_blend_fraction); - hero.motion.pos.f[2] += v20.f[2] - movement_vector_scratch.f[2]; - fast_vec_add(&movement_vector_scratch, &v10, &v20); - fast_vec_sub(&v20, &movement_vector_scratch, &hero.motion.pos); - hero.motion.velocity.f[0] = v20.f[0]; - hero.motion.velocity.f[1] = v20.f[1]; - fast_vec_sub(&v20, &v0, &hero.rail_point); - hero.motion.pos.f[2] += v20.f[2]; + hero.motion.pos.f[2] += + spatial_and_hit_descriptor_scratch.f[2] - movement_vector_scratch.f[2]; + fast_vec_add(&movement_vector_scratch, &v10, &spatial_and_hit_descriptor_scratch); + fast_vec_sub(&spatial_and_hit_descriptor_scratch, + &movement_vector_scratch, + &hero.motion.pos); + hero.motion.velocity.f[0] = spatial_and_hit_descriptor_scratch.f[0]; + hero.motion.velocity.f[1] = spatial_and_hit_descriptor_scratch.f[1]; + fast_vec_sub(&spatial_and_hit_descriptor_scratch, + &movement_and_hit_descriptor_scratch, + &hero.rail_point); + hero.motion.pos.f[2] += spatial_and_hit_descriptor_scratch.f[2]; if (hero.motion.pos.f[2] < hero.rail_point.f[2]) { if (hero.rail_transfer_frames <= scale_game_frames(48) && hero.motion.pos.f[2] < hero.rail_point.f[2]) { @@ -2074,10 +2190,12 @@ void hero_update_movement(void) { } } } else { - fast_vec_sub(&v20, &v0, &hero.rail_point); - hero.motion.velocity.f[0] = v20.f[0]; - hero.motion.velocity.f[1] = v20.f[1]; - hero.motion.pos.f[2] += v20.f[2]; + fast_vec_sub(&spatial_and_hit_descriptor_scratch, + &movement_and_hit_descriptor_scratch, + &hero.rail_point); + hero.motion.velocity.f[0] = spatial_and_hit_descriptor_scratch.f[0]; + hero.motion.velocity.f[1] = spatial_and_hit_descriptor_scratch.f[1]; + hero.motion.pos.f[2] += spatial_and_hit_descriptor_scratch.f[2]; fast_vec_sub(&movement_vector_scratch, &hero.rail_point, &hero.motion.pos); movement_vector_scratch.f[2] = 0.0f; if (fast_vec_length(&movement_vector_scratch) > frame_time) { @@ -2133,10 +2251,16 @@ void hero_update_movement(void) { approach_value(&hero.grind_base_speed, grind_base_speed_target, frame_time_sq * 15.0f); si = hero.rail_segment; sf = hero.rail_seg_frac; - qcopy(&v20, &hero.motion.pos); - sample_path((void *)hero.rail_spline, &v20, &si, &sf, 0.3f, hero.rail_spline_loops); - e = fast_arc_tan(vector_distance_xy(&hero.rail_point, &v20), - v20.f[2] - hero.rail_point.f[2]); + qcopy(&spatial_and_hit_descriptor_scratch, &hero.motion.pos); + sample_path((void *)hero.rail_spline, + &spatial_and_hit_descriptor_scratch, + &si, + &sf, + 0.3f, + hero.rail_spline_loops); + e = fast_arc_tan( + vector_distance_xy(&hero.rail_point, &spatial_and_hit_descriptor_scratch), + spatial_and_hit_descriptor_scratch.f[2] - hero.rail_point.f[2]); if (e > 0.0f) { sp = e * 1.9098593f * (frame_time * -2.5f); if (e > 0.2617994f && hero.grind_pose != 2 && hero.grind_pose != 3) { @@ -2167,27 +2291,31 @@ void hero_update_movement(void) { if (hero.unk574 < 0.0f) { hero.unk574 = 0.0f; } - fast_vec_sub(&hero.motion.velocity, &v0, &hero.rail_point); - fast_vec_sub(&v20, &hero.rail_point, &hero.motion.pos); + fast_vec_sub( + &hero.motion.velocity, &movement_and_hit_descriptor_scratch, &hero.rail_point); + fast_vec_sub(&spatial_and_hit_descriptor_scratch, &hero.rail_point, &hero.motion.pos); { f32 mx = frame_time * 7.0f; f32 fl; f32 len; - fl = -fast_vec_length(&v20); + fl = -fast_vec_length(&spatial_and_hit_descriptor_scratch); vendor_spring(&fl, &hero.rail_snap_dist, 0.0f, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, mx); - len = fast_vec_length(&v20); + len = fast_vec_length(&spatial_and_hit_descriptor_scratch); if (len < hero.rail_snap_dist) { hero.rail_snap_dist = len; } if (hero.rail_snap_dist < len) { - fast_vec_normalize(&v20, &v20, hero.rail_snap_dist); + fast_vec_normalize(&spatial_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch, + hero.rail_snap_dist); } - fast_vec_add(&hero.motion.pos, &hero.motion.pos, &v20); + fast_vec_add( + &hero.motion.pos, &hero.motion.pos, &spatial_and_hit_descriptor_scratch); } if (hero.motion.pos.f[2] < hero.rail_point.f[2] && hero.ground_distance < 1.0f && hero.motion.pos.f[2] < hero.rail_point.f[2]) { @@ -2199,37 +2327,45 @@ void hero_update_movement(void) { matrix_vector_scratch[1].f[0] = fast_cos(a); matrix_vector_scratch[1].f[1] = fast_sin(a); matrix_vector_scratch[1].f[2] = 0.0f; - make_hit_descriptor( - &v20, (struct MobyView *)hero.moby, 0x10000, 1.0f, &matrix_vector_scratch[1]); + make_hit_descriptor(&spatial_and_hit_descriptor_scratch, + (struct MobyView *)hero.moby, + 0x10000, + 1.0f, + &matrix_vector_scratch[1]); qcopy(&matrix_vector_scratch[2], &hero.motion.pos); matrix_vector_scratch[2].f[2] += 0.6f; - collect_mobies_in_sphere( - 1.0f, &matrix_vector_scratch[2], 0x10, (struct MobyView *)hero.moby, &v20); + collect_mobies_in_sphere(1.0f, + &matrix_vector_scratch[2], + 0x10, + (struct MobyView *)hero.moby, + &spatial_and_hit_descriptor_scratch); } break; } case HERO_STATE_FOLLOW_PATH: { s32 idx; s32 n; - compute_hero_fixed_offset_world_position(&v0); + compute_hero_fixed_offset_world_position(&movement_and_hit_descriptor_scratch); if (((struct MobyView *)hero.moby)->b53 == 0x66) { release_voice_slot_cf(0, (struct MobyView *)hero.moby, 0); if (D_L00_0015F5CC & 1) { f32 a; f32 r; - qcopy(&v10, &v0); - fast_vec_scale(&v20, &hero.motion.displacement, 0.4f); + qcopy(&v10, &movement_and_hit_descriptor_scratch); + fast_vec_scale( + &spatial_and_hit_descriptor_scratch, &hero.motion.displacement, 0.4f); a = fast_add_rotations(hero.grab_rail_yaw, randf_sym(0.0f, 0.5235988f)); r = random_float_between(frame_time * 0.0f, frame_time * 4.0f); - v20.f[0] += fast_cos(a) * r; - v20.f[1] += fast_sin(a) * r; - v20.f[2] = random_float_between(frame_time * 3.0f, frame_time * 5.0f); - v20.f[3] = -(frame_time_sq * 35.0f); - spawn_color_decaying_effect_particle(&v10, &v20, 0); + spatial_and_hit_descriptor_scratch.f[0] += fast_cos(a) * r; + spatial_and_hit_descriptor_scratch.f[1] += fast_sin(a) * r; + spatial_and_hit_descriptor_scratch.f[2] = + random_float_between(frame_time * 3.0f, frame_time * 5.0f); + spatial_and_hit_descriptor_scratch.f[3] = -(frame_time_sq * 35.0f); + spawn_color_decaying_effect_particle(&v10, &spatial_and_hit_descriptor_scratch, 0); } } FUN_L00_0025df68(hero.follow_path_spline, - &v0, + &movement_and_hit_descriptor_scratch, &hero.grab_rail_point, &hero.follow_path_segment, &hero.rail_candidate_frac, @@ -2252,39 +2388,47 @@ void hero_update_movement(void) { hero.rail_candidate_kind); idx = offset_path_index( hero.follow_path_spline, hero.follow_path_segment, 1, hero.rail_candidate_kind); - fast_vec_sub(&v20, (Vec4 *)hero.follow_path_spline + (idx + 1), &v10); - if (fast_vec_length(&v20) < 0.001f) { + fast_vec_sub( + &spatial_and_hit_descriptor_scratch, (Vec4 *)hero.follow_path_spline + (idx + 1), &v10); + if (fast_vec_length(&spatial_and_hit_descriptor_scratch) < 0.001f) { if (hero.follow_path_segment == idx) { hero.follow_path_end_frames = scale_game_frames(1); break; } } else { - hero.grab_rail_yaw = fast_arc_tan(v20.f[0], v20.f[1]); - hero.follow_path_pitch = fast_arc_tan(vector_length_xy(&v20), v20.f[2]); + hero.grab_rail_yaw = fast_arc_tan(spatial_and_hit_descriptor_scratch.f[0], + spatial_and_hit_descriptor_scratch.f[1]); + hero.follow_path_pitch = + fast_arc_tan(vector_length_xy(&spatial_and_hit_descriptor_scratch), + spatial_and_hit_descriptor_scratch.f[2]); } hero.motion.move_yaw = hero.grab_rail_yaw; turn_to(0, frame_scale_sq * 0.018f, frame_scale_sq * 0.2f, frame_time * 6.4577184f); approach_value(&hero.follow_path_speed, frame_time * 14.0f, frame_time_sq * 9.0f); fast_vec_sub(&hero.motion.velocity, &v10, &hero.grab_rail_point); - fast_vec_sub(&v20, &hero.grab_rail_point, &v0); + fast_vec_sub(&spatial_and_hit_descriptor_scratch, + &hero.grab_rail_point, + &movement_and_hit_descriptor_scratch); { f32 fl; f32 len; - fl = -fast_vec_length(&v20); + fl = -fast_vec_length(&spatial_and_hit_descriptor_scratch); vendor_spring(&fl, &hero.unk618.f, 0.0f, frame_scale_sq * 0.05f, frame_scale_sq * 0.3f, frame_time * 10.0f); - len = fast_vec_length(&v20); + len = fast_vec_length(&spatial_and_hit_descriptor_scratch); if (len < hero.unk618.f) { hero.unk618.f = len; } if (hero.unk618.f < len) { - fast_vec_normalize(&v20, &v20, hero.unk618.f); + fast_vec_normalize(&spatial_and_hit_descriptor_scratch, + &spatial_and_hit_descriptor_scratch, + hero.unk618.f); } - fast_vec_add(&hero.motion.pos, &hero.motion.pos, &v20); + fast_vec_add(&hero.motion.pos, &hero.motion.pos, &spatial_and_hit_descriptor_scratch); } break; } @@ -2314,7 +2458,7 @@ void hero_update_movement(void) { hero.motion.velocity.f[0] = 0.0f; hero.motion.velocity.f[1] = 0.0f; hero.motion.velocity.f[2] = 0.0f; - qcopy(&v20, &hero.motion.pos); + qcopy(&spatial_and_hit_descriptor_scratch, &hero.motion.pos); if (hero.state.current == 0x1A) { matrix_vector_scratch[0].f[0] = fast_cos(fast_add_rotations(hero.motion.rot.f[2], 1.5707964f)) * 0.3f; @@ -2328,16 +2472,18 @@ void hero_update_movement(void) { fast_sin(fast_add_rotations(hero.motion.rot.f[2], -1.5707964f)) * 0.3f; matrix_vector_scratch[0].f[2] = 0.0f; } - fast_vec_add(&movement_vector_scratch, &v20, &matrix_vector_scratch[0]); + fast_vec_add(&movement_vector_scratch, + &spatial_and_hit_descriptor_scratch, + &matrix_vector_scratch[0]); check_ledge_grab(); if (hero.ledge_found == 0) { break; } - qcopy(&v0, &hero.ledge_hang_pos); + qcopy(&movement_and_hit_descriptor_scratch, &hero.ledge_hang_pos); a = fast_add_rotations(hero.ledge_normal_yaw, 3.1415927f); qcopy(&hero.motion.pos, &movement_vector_scratch); check_ledge_grab(); - qcopy(&hero.motion.pos, &v20); + qcopy(&hero.motion.pos, &spatial_and_hit_descriptor_scratch); if (hero.ledge_found == 0) { break; } @@ -2347,7 +2493,7 @@ void hero_update_movement(void) { break; } a = fast_add_rotations(fast_subtract_rotations(a, b) * 0.5f, a); - fast_vec_add(&matrix_vector_scratch[1], &v0, &v10); + fast_vec_add(&matrix_vector_scratch[1], &movement_and_hit_descriptor_scratch, &v10); fast_vec_scale(&matrix_vector_scratch[1], &matrix_vector_scratch[1], 0.5f); hero.motion.move_yaw = a; turn_to(0, frame_scale_sq * 0.04f, frame_scale_sq * 0.2f, frame_time * 6.2831855f); @@ -2364,7 +2510,7 @@ void hero_update_movement(void) { hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; steer_hero_planar_velocity(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_FALL: @@ -2374,15 +2520,15 @@ void hero_update_movement(void) { if (hero.ground_distance > 4.0f) { t = 0.43633232f; } - qcopy(&v0, &hero.motion.rot); - spring_angle(&v0.f[1], + qcopy(&movement_and_hit_descriptor_scratch, &hero.motion.rot); + spring_angle(&movement_and_hit_descriptor_scratch.f[1], t, &hero.motion.rot_spring_vel.f[1], 0, frame_scale_sq * 0.02f, frame_scale_sq * 0.3f, frame_time * 2.6179938f); - spring_angle(&v0.f[0], + spring_angle(&movement_and_hit_descriptor_scratch.f[0], 0.0f, &hero.motion.rot_spring_vel.f[0], 0, @@ -2401,7 +2547,8 @@ void hero_update_movement(void) { } adjust_hero_pose_targets_from_motion(); build_scaled_hero_move_impulse(0.7f, frame_time * 0.0f); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2418,7 +2565,8 @@ void hero_update_movement(void) { len = vector_length_xy(&hero.motion.velocity); FUN_L00_001ff600( frame_scale * -0.100000024f * len + len, &hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, hero.fall_state_gravity); if (gravity_z(&hero.motion.velocity) < -(frame_time * 50.0f)) { gravity_set_z(&hero.motion.velocity, &hero.motion.velocity, -(frame_time * 50.0f)); } @@ -2468,7 +2616,7 @@ void hero_update_movement(void) { clip_hero_velocity_against_probed_surfaces(1); if (big) { gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); hero.ground_spring_velocity = hero.motion.velocity.f[2]; } else { vendor_spring(&hero.motion.pos.f[2], @@ -2513,7 +2661,7 @@ void hero_update_movement(void) { set_planar_vel(99999.0f); adjust_hero_pose_targets_from_motion(); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); if (hero.motion.pos.f[2] < hero.smoothed_ground_z) { approach_value(&hero.smoothed_ground_z, hero.motion.pos.f[2], frame_time * 4.0f); } @@ -2537,7 +2685,7 @@ void hero_update_movement(void) { case HERO_STATE_ALT_LEDGE_JUMP: case HERO_STATE_VEHICLE_MODE_2_JUMP: case HERO_STATE_JUMP_FROM_RESPAWN_WAIT: { - s32 t198; + s32 jump_timer_or_trail_mode; s32 jump_timer_threshold; if (hero.state.current == 0x1C && hero.pack_disabled == 0 && hero.items[3].item_id == 3) { if (test_hero_animation_frame_window(10.0f) != 0) { @@ -2569,13 +2717,14 @@ void hero_update_movement(void) { emit_hero_randomized_motion_effects(7, 0); } } - t198 = hero.state_timer; + jump_timer_or_trail_mode = hero.state_timer; jump_timer_threshold = hero.takeoff_frame; - if (t198 == jump_timer_threshold) { + if (jump_timer_or_trail_mode == jump_timer_threshold) { qcopy(&hero.takeoff_pos, &hero.motion.pos); } if (hero.rail_land_frames != 0 || - (t198 < jump_timer_threshold && hero.state.current != HERO_STATE_HIGH_JUMP && + (jump_timer_or_trail_mode < jump_timer_threshold && + hero.state.current != HERO_STATE_HIGH_JUMP && hero.state.current != HERO_STATE_PACK_LONG_JUMP && hero.state.current != 0xC && hero.state.current != 0x11 && hero.state.current != 0x1C && hero.state.current != 0x4C)) { @@ -2627,12 +2776,18 @@ void hero_update_movement(void) { frame_time_sq * 53.0f * (f32)hero.state_timer); } if (hero.state_timer < scale_game_frames(10) && hero.stick_magnitude > 0.2f) { - qcopy(&v0, &hero.motion.pos); - FUN_L00_00233810(&v0, &v0, 0.5f); - qcopy(&v10, &v0); + qcopy(&movement_and_hit_descriptor_scratch, &hero.motion.pos); + add_hero_up_offset(&movement_and_hit_descriptor_scratch, + &movement_and_hit_descriptor_scratch, + 0.5f); + qcopy(&v10, &movement_and_hit_descriptor_scratch); v10.f[0] += fast_cos(hero.motion.rot.f[2]) * 0.85f; v10.f[1] += fast_sin(hero.motion.rot.f[2]) * 0.85f; - if (collision_line(&v0, &v10, 4, (struct MobyView *)hero.moby, 0) != 0) { + if (collision_line(&movement_and_hit_descriptor_scratch, + &v10, + 4, + (struct MobyView *)hero.moby, + 0) != 0) { hero.jump_blocked_ahead = 1; } } @@ -2663,21 +2818,23 @@ void hero_update_movement(void) { hero.jump_gravity = hero.fall_gravity; } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } - if (hero.vehicle_mode == 1) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { update_hero_motion_response_parameters(); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP || hero.state.current == 0xD) { - t198 = (scale_game_frames(12) < hero.state_timer) * 2; - update_moby_transform_history(&hero.trail.pos[0], t198); + jump_timer_or_trail_mode = (scale_game_frames(12) < hero.state_timer) * 2; + update_moby_transform_history(&hero.trail.pos[0], jump_timer_or_trail_mode); } if (hero.state.current == HERO_STATE_PACK_LONG_JUMP && scale_game_frames(8) < hero.state_timer && hero.anim_frame < 28.0f) { s32 n; - transform_hero_local_offset_to_world(&v0, 0.8f, 0.0f, 0.3f); - n = collect_mobies_in_sphere(0.9f, &v0, 0, (struct MobyView *)hero.moby, NULL); + transform_hero_local_offset_to_world( + &movement_and_hit_descriptor_scratch, 0.8f, 0.0f, 0.3f); + n = collect_mobies_in_sphere( + 0.9f, &movement_and_hit_descriptor_scratch, 0, (struct MobyView *)hero.moby, NULL); if (n != 0) { s32 i; fast_vec_scale(&v10, &hero.motion.displacement, 7.0f); @@ -2715,18 +2872,20 @@ void hero_update_movement(void) { stop_hero_motion_without_forward_support(3.7f, 0.0f); } set_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, l); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); break; } case HERO_STATE_APPROACH_TARGET_POSE: { f32 l; f32 k; - fast_vec_sub(&v0, &hero.target_pose, &hero.motion.pos); - hero.motion.move_yaw = fast_arc_tan(v0.f[0], v0.f[1]); - l = vector_length_xy(&v0); + fast_vec_sub(&movement_and_hit_descriptor_scratch, &hero.target_pose, &hero.motion.pos); + hero.motion.move_yaw = fast_arc_tan(movement_and_hit_descriptor_scratch.f[0], + movement_and_hit_descriptor_scratch.f[1]); + l = vector_length_xy(&movement_and_hit_descriptor_scratch); if (l > 0.2f) { hero.stick_magnitude = 1.0f; - hero.motion.move_yaw = fast_arc_tan(v0.f[0], v0.f[1]); + hero.motion.move_yaw = fast_arc_tan(movement_and_hit_descriptor_scratch.f[0], + movement_and_hit_descriptor_scratch.f[1]); hero.target_speed = l; if (l < D_L00_0017BDB8.x0C) { hero.target_speed = D_L00_0017BDB8.x08 * frame_time; @@ -2735,7 +2894,7 @@ void hero_update_movement(void) { } if (hero.vehicle_mode == 3) { hero.target_speed = D_0015ED6C_a * 1.5f; - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero.target_speed = D_0015ED6C_a * 0.9f; } } else { @@ -2746,46 +2905,48 @@ void hero_update_movement(void) { k = 1.0f; if (hero.vehicle_mode == 3) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 5.5850534f); - } else if (hero.vehicle_mode == 1) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { turn_to(0, frame_scale_sq * 0.03f, frame_scale_sq * 0.3f, frame_time * 7.8539815f); - } else if (hero.vehicle_mode == 0) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.state.step == 1) { turn_to(0, frame_scale_sq * 0.016f, frame_scale_sq * 0.15f, frame_time * 9.948377f); } else { turn_hero_toward_move_direction_with_stick_scale(); } } - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { adjust_hero_pose_targets_from_motion(); } speed_step(frame_time_sq * 7.5f * k, frame_time_sq * 8.5f); set_planar_vel(99999.0f); - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { clip_hero_velocity_against_probed_surfaces(1); } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } case HERO_STATE_BRAKE_AT_TARGET_POSITION: - fast_vec_sub(&v0, &hero.target_pose, &hero.motion.pos); - if (fast_vec_dot(&v0, &hero.motion.momentum) < 0.0f) { + fast_vec_sub(&movement_and_hit_descriptor_scratch, &hero.target_pose, &hero.motion.pos); + if (fast_vec_dot(&movement_and_hit_descriptor_scratch, &hero.motion.momentum) < 0.0f) { clear_u64_value(&hero.motion.momentum); } clear_u64_value(&hero.motion.velocity); reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.0f); clip_hero_velocity_against_probed_surfaces(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.displacement, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_FIDGET: @@ -2823,11 +2984,12 @@ void hero_update_movement(void) { clear_u64_value(&hero.motion.velocity); clip_hero_velocity_against_probed_surfaces(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_1_ATTACK: { @@ -2835,22 +2997,35 @@ void hero_update_movement(void) { s32 ok; tb = &attack_records[hero.attack_record]; hero.target_speed = 0.0f; - if ((tb->kind == 0 ? 1 : tb->kind == 1) && hero.anim_frame < 5.5f) { + if ((tb->kind == HERO_COMBO_KIND_FRAME_GATED_FORWARD_ADVANCE + ? 1 + : tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION) && + hero.anim_frame < 5.5f) { hero.target_speed = frame_time * 3.5f; } if (hero.anim_changing == 0 && (f32)tb->f1C <= hero.anim_frame && hero.anim_frame <= (f32)tb->f20) { - s32 k = tb->kind == 1 ? 0 : 2; + s32 k = tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION ? 0 : 2; moby_point_position((struct MobyView *)hero.moby, k, &v10); - moby_point_position((struct MobyView *)hero.moby, k | 1, &v20); - fast_vec_add(&v0, &v10, &v20); - fast_vec_scale(&v0, &v0, 0.5f); - play_entity_sound( - (struct MobyView *)hero.moby, 0.25f, &v0, 0x10000, 1.0f, 1.0f, 0, 1, 0); + moby_point_position( + (struct MobyView *)hero.moby, k | 1, &spatial_and_hit_descriptor_scratch); + fast_vec_add( + &movement_and_hit_descriptor_scratch, &v10, &spatial_and_hit_descriptor_scratch); + fast_vec_scale( + &movement_and_hit_descriptor_scratch, &movement_and_hit_descriptor_scratch, 0.5f); + play_entity_sound((struct MobyView *)hero.moby, + 0.25f, + &movement_and_hit_descriptor_scratch, + 0x10000, + 1.0f, + 1.0f, + 0, + 1, + 0); } approach_value(&hero.anim_speed, 1.0f, 0.2f); if (hero.heading_locked != 0 || (struct MobyView *)hero.melee_target != NULL) { - if (tb->kind == 1 && + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && fast_subtract_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) > 0.0f) { hero.anim_speed = 1.0f / (fast_difference_between_rotations(hero.attack_target_yaw, hero.motion.rot.f[2]) + @@ -2860,7 +3035,8 @@ void hero_update_movement(void) { turn_to(0, frame_scale_sq * 0.05f, frame_scale_sq * 0.2f, frame_time * 15.009831f); } else { ok = 1; - if (tb->kind == 1 && hero.anim_changing == 0 && hero.anim_frame > 7.0f) { + if (tb->kind == HERO_COMBO_KIND_STAGED_FORWARD_DECELERATION && + hero.anim_changing == 0 && hero.anim_frame > 7.0f) { ok = 0; } if (ok) { @@ -2889,14 +3065,14 @@ void hero_update_movement(void) { speed_step(frame_time_sq * 15.0f, frame_time_sq * 7.0f); set_planar_vel(99999.0f); gravity_flatten(&hero.motion.velocity, &hero.motion.velocity); - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, sp * 0.72f); break; } case HERO_STATE_VEHICLE_MODE_1_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; steer_hero_planar_velocity(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_1_FALL: @@ -2904,7 +3080,8 @@ void hero_update_movement(void) { if (hero.move_lock_timer == 0) { hero_move_state_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); if (hero.motion.velocity.f[2] < frame_time * -10.0f) { hero.motion.velocity.f[2] = frame_time * -10.0f; } @@ -2936,11 +3113,12 @@ void hero_update_movement(void) { } clip_hero_velocity_against_probed_surfaces(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -2955,10 +3133,10 @@ void hero_update_movement(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } @@ -2972,7 +3150,7 @@ void hero_update_movement(void) { hero.anim_speed = 1.3f; hero.motion.velocity.f[1] = 0.0f; hero.motion.velocity.f[2] = 0.0f; - qcopy(&v20, &hero.motion.pos); + qcopy(&spatial_and_hit_descriptor_scratch, &hero.motion.pos); if (hero.state.current == 0x4D) { matrix_vector_scratch[0].f[0] = fast_cos(fast_add_rotations(hero.motion.rot.f[2], 1.5707964f)) * 0.3f; @@ -2986,16 +3164,18 @@ void hero_update_movement(void) { fast_sin(fast_add_rotations(hero.motion.rot.f[2], -1.5707964f)) * 0.3f; matrix_vector_scratch[0].f[2] = 0.0f; } - fast_vec_add(&movement_vector_scratch, &v20, &matrix_vector_scratch[0]); + fast_vec_add(&movement_vector_scratch, + &spatial_and_hit_descriptor_scratch, + &matrix_vector_scratch[0]); check_ledge_grab(); if (hero.ledge_found == 0) { break; } - qcopy(&v0, &hero.ledge_hang_pos); + qcopy(&movement_and_hit_descriptor_scratch, &hero.ledge_hang_pos); a = fast_add_rotations(hero.ledge_normal_yaw, 3.1415927f); qcopy(&hero.motion.pos, &movement_vector_scratch); check_ledge_grab(); - qcopy(&hero.motion.pos, &v20); + qcopy(&hero.motion.pos, &spatial_and_hit_descriptor_scratch); if (hero.ledge_found == 0) { break; } @@ -3005,7 +3185,7 @@ void hero_update_movement(void) { break; } a = fast_add_rotations(fast_subtract_rotations(a, b) * 0.5f, a); - fast_vec_add(&matrix_vector_scratch[1], &v0, &v10); + fast_vec_add(&matrix_vector_scratch[1], &movement_and_hit_descriptor_scratch, &v10); fast_vec_scale(&matrix_vector_scratch[1], &matrix_vector_scratch[1], 0.5f); hero.motion.move_yaw = a; turn_to(0, frame_scale_sq * 0.04f, frame_scale_sq * 0.2f, frame_time * 6.2831855f); @@ -3028,11 +3208,12 @@ void hero_update_movement(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_velocity_against_probed_surfaces(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_2_REPEATABLE_SQUARE_ACTION: @@ -3050,31 +3231,50 @@ void hero_update_movement(void) { &v10, (struct MobyView *)hero.moby, 0xB0000, 4.0f, &matrix_vector_scratch[0]); v10.f[2] = 1.0f; v10.f[3] = 5627.925f; - ((u8 *)&v20)[8] = 7; - ((u8 *)&v20)[9] = 1; - ((s16 *)&v20)[5] = ((struct MobyView *)hero.moby)->hA6; + ((u8 *)&spatial_and_hit_descriptor_scratch)[8] = 7; + ((u8 *)&spatial_and_hit_descriptor_scratch)[9] = 1; + ((s16 *)&spatial_and_hit_descriptor_scratch)[5] = ((struct MobyView *)hero.moby)->hA6; switch (hero.attack_record) { case HERO_ATTACK_RECORD_POINT_3_STRIKE: if (hero.anim_frame > 7.0f && hero.anim_frame < 14.0f) { - moby_point_position((struct MobyView *)hero.moby, 3, &v0); - collect_mobies_in_sphere(2.0f, &v0, 0x10, (struct MobyView *)hero.moby, &v10); + moby_point_position( + (struct MobyView *)hero.moby, 3, &movement_and_hit_descriptor_scratch); + collect_mobies_in_sphere(2.0f, + &movement_and_hit_descriptor_scratch, + 0x10, + (struct MobyView *)hero.moby, + &v10); } break; case HERO_ATTACK_RECORD_POINT_4_STRIKE: if (hero.anim_frame > 7.0f && hero.anim_frame < 14.0f) { - moby_point_position((struct MobyView *)hero.moby, 4, &v0); - collect_mobies_in_sphere(2.0f, &v0, 0x10, (struct MobyView *)hero.moby, &v10); + moby_point_position( + (struct MobyView *)hero.moby, 4, &movement_and_hit_descriptor_scratch); + collect_mobies_in_sphere(2.0f, + &movement_and_hit_descriptor_scratch, + 0x10, + (struct MobyView *)hero.moby, + &v10); } break; case HERO_ATTACK_RECORD_PAIRED_POINT_STRIKE: if (hero.anim_frame > 14.0f && hero.anim_frame < 21.0f) { f32 sphere_radius = 2.0f; - moby_point_position((struct MobyView *)hero.moby, 3, &v0); - collect_mobies_in_sphere( - sphere_radius, &v0, 0x10, (struct MobyView *)hero.moby, &v10); + moby_point_position( + (struct MobyView *)hero.moby, 3, &movement_and_hit_descriptor_scratch); + collect_mobies_in_sphere(sphere_radius, + &movement_and_hit_descriptor_scratch, + 0x10, + (struct MobyView *)hero.moby, + &v10); sphere_radius = 0.0f; - moby_point_position((struct MobyView *)hero.moby, 4, &v0); - collect_mobies_in_sphere(2.0f, &v0, 0x10, (struct MobyView *)hero.moby, &v10); + moby_point_position( + (struct MobyView *)hero.moby, 4, &movement_and_hit_descriptor_scratch); + collect_mobies_in_sphere(2.0f, + &movement_and_hit_descriptor_scratch, + 0x10, + (struct MobyView *)hero.moby, + &v10); } break; } @@ -3114,10 +3314,11 @@ void hero_update_movement(void) { } clip_hero_velocity_against_probed_surfaces(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } stop_hero_motion_without_forward_support(3.7f, 0.0f); break; @@ -3130,19 +3331,20 @@ void hero_update_movement(void) { if (hero.anim_frame > 22.0f && hero.anim_frame < 55.0f) { hero.anim_speed = 1.0f; } else if (hero.anim_changing == 0 && hero.anim_frame <= 22.0f) { - fast_vec_normalize(&v0, &hero, 3.0f); - v0.f[2] += 5.0f; - add_vectors(&v10, &v0, &moby->u10.v10); - set_giant_clank_charged_blast_position(moby, &v0); + fast_vec_normalize(&movement_and_hit_descriptor_scratch, &hero, 3.0f); + movement_and_hit_descriptor_scratch.f[2] += 5.0f; + add_vectors(&v10, &movement_and_hit_descriptor_scratch, &moby->u10.v10); + set_giant_clank_charged_blast_position(moby, &movement_and_hit_descriptor_scratch); hero.anim_speed = 0.5f; } } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_WAIT_FOR_CIRCLE_RELEASE_AND_ANIMATION: { @@ -3159,11 +3361,12 @@ void hero_update_movement(void) { f32 effect_pitch = z; z = 1.0f; for (i = 0; i < 2; i++) { - moby_point_position((struct MobyView *)hero.moby, i + 3, &v0); - v0.f[0] += fast_cos(hero.motion.rot.f[2]) * 1.4f; - v0.f[1] += fast_sin(hero.motion.rot.f[2]) * 1.4f; + moby_point_position( + (struct MobyView *)hero.moby, i + 3, &movement_and_hit_descriptor_scratch); + movement_and_hit_descriptor_scratch.f[0] += fast_cos(hero.motion.rot.f[2]) * 1.4f; + movement_and_hit_descriptor_scratch.f[1] += fast_sin(hero.motion.rot.f[2]) * 1.4f; spawn_giant_clank_missile((struct MobyView *)hero.moby, - &v0, + &movement_and_hit_descriptor_scratch, hero.motion.rot.f[2], effect_pitch, 0, @@ -3173,23 +3376,33 @@ void hero_update_movement(void) { } } if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } case HERO_STATE_VEHICLE_MODE_2_FALL: stick_target(frame_time * 6.0f, 0); - qcopy(&v0, &hero.motion.pos); - v0.f[2] -= 1.0f; - play_entity_sound((struct MobyView *)hero.moby, 3.5f, &v0, 0x30000, 40.0f, 1.0f, 0, 1, 0); + qcopy(&movement_and_hit_descriptor_scratch, &hero.motion.pos); + movement_and_hit_descriptor_scratch.f[2] -= 1.0f; + play_entity_sound((struct MobyView *)hero.moby, + 3.5f, + &movement_and_hit_descriptor_scratch, + 0x30000, + 40.0f, + 1.0f, + 0, + 1, + 0); if (hero.move_lock_timer == 0) { hero_move_state_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 12.0f); if (hero.motion.velocity.f[2] < frame_time * -10.0f) { hero.motion.velocity.f[2] = frame_time * -10.0f; } @@ -3203,9 +3416,19 @@ void hero_update_movement(void) { d = fast_difference_between_rotations(hero.motion.rot.f[2], hero.motion.move_yaw); for (i = 0; i < 3; i++) { transform_hero_polar_offset_to_world( - &v0, 1.8f, fast_add_rotations(-0.7853982f, (f32)i * 0.7853982f), 1.4f); - play_entity_sound( - (struct MobyView *)hero.moby, 2.7f, &v0, 0x30000, 40.0f, 1.0f, 0, 1, 0); + &movement_and_hit_descriptor_scratch, + 1.8f, + fast_add_rotations(-0.7853982f, (f32)i * 0.7853982f), + 1.4f); + play_entity_sound((struct MobyView *)hero.moby, + 2.7f, + &movement_and_hit_descriptor_scratch, + 0x30000, + 40.0f, + 1.0f, + 0, + 1, + 0); } if (test_hero_animation_frame_window(30.0f) != 0 || test_hero_animation_frame_window(0.0f) != 0) { @@ -3247,11 +3470,12 @@ void hero_update_movement(void) { } clip_hero_velocity_against_probed_surfaces(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3266,10 +3490,10 @@ void hero_update_movement(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } @@ -3284,18 +3508,19 @@ void hero_update_movement(void) { reduce_and_apply_hero_planar_velocity_addend(frame_time_sq * 12.6f); clip_hero_velocity_against_probed_surfaces(0); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; case HERO_STATE_VEHICLE_MODE_3_SLIP: hero.motion.move_yaw = hero.downhill_yaw; hero.target_speed = frame_time * 5.5f; steer_hero_planar_velocity(frame_time_sq * 25.0f); - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 18.0f); break; case HERO_STATE_VEHICLE_MODE_3_FALL: @@ -3303,7 +3528,8 @@ void hero_update_movement(void) { if (hero.move_lock_timer == 0) { hero_move_state_velocity(); } - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 21.0f); if (hero.motion.velocity.f[2] < frame_time * -15.0f) { hero.motion.velocity.f[2] = frame_time * -15.0f; } @@ -3332,11 +3558,12 @@ void hero_update_movement(void) { } clip_hero_velocity_against_probed_surfaces(1); if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity_z, frame_time_sq * 25.0f); correct_hero_airborne_wall_velocity(); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); + add_hero_gravity_offset( + &hero.motion.velocity, &hero.motion.velocity, frame_time_sq * 54.0f); } break; } @@ -3351,10 +3578,10 @@ void hero_update_movement(void) { FUN_L00_001ff600(len, &hero.motion.velocity, &hero.motion.velocity); hero.motion.velocity.f[2] = 0.0f; if (hero.air_frames.s != 0) { - FUN_L00_002334d0( + add_hero_gravity_offset( &hero.motion.velocity, &hero.motion.resolved_velocity, frame_time_sq * 24.0f); } else { - FUN_L00_002334d0(&hero.motion.velocity, &hero.motion.velocity, 0.004f); + add_hero_gravity_offset(&hero.motion.velocity, &hero.motion.velocity, 0.004f); } break; } diff --git a/src/overlays/shared/hero/hero_update_transitions.c b/src/overlays/shared/hero/hero_update_transitions.c index 84e1b8daad..099bccd156 100644 --- a/src/overlays/shared/hero/hero_update_transitions.c +++ b/src/overlays/shared/hero/hero_update_transitions.c @@ -200,8 +200,10 @@ void hero_update_transitions(void) { try_start_hero_weapon_fire_state() == 0) { if ((controller_state.pressed & 0x10) || (controller_state.pressed_unmasked & 0x10)) { if (hero.items[0].switch_lock != 2 && D_L00_0015F594 == 0 && - (hero.item_use_locked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0) && - (hero.item_select_blocked == 0 || hero.vehicle_mode == 1 || hero.unk1B2 != 0)) { + (hero.item_use_locked == 0 || hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || + hero.unk1B2 != 0) && + (hero.item_select_blocked == 0 || + hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK || hero.unk1B2 != 0)) { switch (hero.vehicle_mode) { case HERO_VEHICLE_MODE_ON_FOOT: case 3: { @@ -280,7 +282,7 @@ void hero_update_transitions(void) { } } if (D_L00_0015F638 > hero.motion.pos.f[2] && hero.ground_distance > 2.0f && - hero.vehicle_mode != 2 && hero.state.current != 0x77) { + hero.vehicle_mode != HERO_VEHICLE_MODE_GIANT_CLANK && hero.state.current != 0x77) { hero_set_state(0x77, 1); } else { switch (hero.state.current) { @@ -696,7 +698,7 @@ void hero_update_transitions(void) { } break; case HERO_STATE_LOOK: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (hero.moby->prev_seq != 0xD) { @@ -723,7 +725,7 @@ void hero_update_transitions(void) { break; } } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { set_hero_idle_state_for_vehicle_mode(); break; } @@ -1035,7 +1037,8 @@ void hero_update_transitions(void) { break; } } - if (hero.vehicle_mode != 0 && frame_time * 2.7f <= hero.motion.speed_xy) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + frame_time * 2.7f <= hero.motion.speed_xy) { hero_set_state(0x66, 1); } break; @@ -3292,7 +3295,7 @@ void hero_update_transitions(void) { } break; case HERO_STATE_LOOK_RELEASE_WAIT: - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { if (hero.unk20AA == 0 || hero.unk20A5 != 0) { if (controller_state.held & 0xA) { if (hero.moby->prev_seq != 0xD) { diff --git a/src/overlays/shared/hero/process_hero_item_action_input.c b/src/overlays/shared/hero/process_hero_item_action_input.c index 6859049518..657b26bb8a 100644 --- a/src/overlays/shared/hero/process_hero_item_action_input.c +++ b/src/overlays/shared/hero/process_hero_item_action_input.c @@ -239,11 +239,11 @@ void hero_update_hop_velocity(void) { s32 state; state = hero.state.current; - if (state == 10) { + if (state == HERO_STATE_PACK_JUMP) { build_scaled_hero_move_impulse(0.7f, ED6C * 0.0f); qcopy(&hero.motion.momentum, &hero.move_impulse); hero.ground_speed = hero.motion.flat_speed; - } else if (state == 16) { + } else if (state == HERO_STATE_PACK_LONG_JUMP) { if (scale_game_frames(0x36) < hero.state_timer) { approach_value(ED70 * 25.0f, ED70 * 7.0f, &hero.jump_gravity); } @@ -255,7 +255,7 @@ void hero_update_hop_velocity(void) { speed_step(ED70 * 44.0f, ED70 * 45.0f); set_gravity_relative_vector_length_xy(&hero.motion.velocity, &hero.motion.velocity, 0.0f); add_hero_forward_offset(&hero.motion.velocity, &hero.motion.velocity, hero.ground_speed); - } else if (state == 0x1C) { + } else if (state == HERO_STATE_LEDGE_JUMP) { if (scale_game_frames(0x28) < hero.state_timer) { turn_to(0, ED64 * 0.04f, ED64 * 0.2f, ED6C * 15.009831f); air_accel(ED70 * 20.0f); @@ -269,7 +269,7 @@ void hero_update_hop_velocity(void) { } hero.motion.velocity.f[0] = fast_cos(hero.motion.rot.f[2]) * hero.ledge_jump_speed; hero.motion.velocity.f[1] = fast_sin(hero.motion.rot.f[2]) * hero.ledge_jump_speed; - } else if (state == 11 || state == 12) { + } else if (state == HERO_STATE_HIGH_JUMP || state == HERO_STATE_STORED_HEADING_JUMP) { hero.motion.move_yaw = hero.takeoff_yaw; turn_to(0, ED64 * 0.04f, ED64 * 0.2f, ED6C * 6.981317f); if (hero.unk450 != 3) { @@ -292,7 +292,7 @@ void hero_update_hop_velocity(void) { hero.motion.velocity.f[1] += fast_sin(hero.takeoff_yaw) * a; build_scaled_hero_move_impulse(0.7f, ED6C * 0.0f); qcopy(&hero.motion.momentum, &hero.move_impulse); - } else if (state == 0x11) { + } else if (state == HERO_STATE_REPEATABLE_JUMP) { hero.motion.move_yaw = hero.unk470.f[3]; qcopy(&hero.motion.move_dir, &hero.unk470); if (scale_game_frames(9) < hero.state_timer) { @@ -311,7 +311,7 @@ void hero_update_hop_velocity(void) { } hero.ground_speed = hero.motion.flat_speed; } else { - if (state == 0x2D) { + if (state == HERO_STATE_ITEM_RELEASE_FALL) { x = hero.motion.rot.f[2]; hero.motion.yaw_error = spring_angle(&x, &hero.motion.yaw_rate, @@ -415,7 +415,7 @@ s32 process_hero_item_action_input(void) { if (hero.item_use_locked != 0 && (hero.items[0].item_id != 8 || hero.unk308 != 1)) { return 0; } - if (hero.vehicle_mode != 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { return 0; } if (hero.items[0].moby == NULL) { @@ -537,7 +537,7 @@ s32 process_hero_item_action_input(void) { break; case HERO_ITEM_CLASS_GATED_BUFFERED_ACTIVATE: - if (hero.vehicle_mode == 0 && can_select_hero_item_31() != 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT && can_select_hero_item_31() != 0) { if (pad_pressed_within(buttons, scale_game_frames(7), NULL) != 0 && D_00141660 == 0x1F && hero.items[0].moby->oclass == 0x1E3 && hero.vehicle_toggle_timer == 0) { diff --git a/src/overlays/shared/hero/process_hero_primary_item_input.c b/src/overlays/shared/hero/process_hero_primary_item_input.c index 731870bbcd..415e865cad 100644 --- a/src/overlays/shared/hero/process_hero_primary_item_input.c +++ b/src/overlays/shared/hero/process_hero_primary_item_input.c @@ -131,6 +131,10 @@ void set_hero_item_switch_timer_for_item(int id) __asm__("FUN_L00_0020 void apply_hero_item_slot_selection(int i) __asm__("FUN_L05_0023dc88"); void apply_hero_item_slot_selection(int i) { + enum { + ITEM_SWITCH_GATE_RELOAD_ZERO_TIMER = 1, + ITEM_SWITCH_GATE_BLOCK_SWITCH = 2 + }; int changed; int flag6; int flag4; @@ -388,10 +392,11 @@ void apply_hero_item_slot_selection(int i) { { struct Hero *s = (struct Hero *)(((char *)&hero) + i * sizeof(struct HeroItemSlot)); item_switch_gate_state = s->items[0].switch_lock; - if (item_switch_gate_state == 2) { + if (item_switch_gate_state == ITEM_SWITCH_GATE_BLOCK_SWITCH) { changed = 0; } - if (item_switch_gate_state == 1 && s->items[0].timer == 0) { + if (item_switch_gate_state == ITEM_SWITCH_GATE_RELOAD_ZERO_TIMER && + s->items[0].timer == 0) { s->items[0].timer = s->items[0].timer_reload; } } @@ -679,6 +684,9 @@ int process_hero_primary_item_input(void) { ITEM_AMMO_MENU_DEVICE = 32, ITEM_RACE_PROJECTILE = 36 }; + enum { + WRENCH_MOBY_STATE_READY = 0 + }; float joint_pos[4]; int press_time0, press_time1, press_time2; int start_timer; @@ -721,7 +729,7 @@ int process_hero_primary_item_input(void) { if (!is_wrench_moby(item)) { break; } - if (item->state != 0) { + if (item->state != WRENCH_MOBY_STATE_READY) { break; } if ((controller_state.held & 0xA) || @@ -1543,6 +1551,10 @@ extern s32 current_bolt_count_macro __asm__("D_0015ED98") MACRO_ADDR; void update_hero_hoverboard_race_progress(void) __asm__("FUN_L05_00254608"); void update_hero_hoverboard_race_progress(void) { + enum { + RACE_RESPAWN_GATE_WAITING = 0, + RACE_RESPAWN_GATE_READY = 1 + }; float world_position_scratch[4] __attribute__((aligned(16))); float course_point_or_respawn_rotation[4] __attribute__((aligned(16))); Data *race_pvars; @@ -1634,11 +1646,11 @@ void update_hero_hoverboard_race_progress(void) { if (hero.off_course_frames > FUN_001f96f8_254608(0xB4)) { if (race_respawn_request_active == 0) { race_respawn_request_active = 1; - race_respawn_gate_state = 0; + race_respawn_gate_state = RACE_RESPAWN_GATE_WAITING; D_L05_0015F67C = frame_scale * 0.08f; } hero.off_course_reset_pending = 1; - if (race_respawn_gate_state == 1) { + if (race_respawn_gate_state == RACE_RESPAWN_GATE_READY) { hero.off_course_reset_pending = 0; compute_hero_hoverboard_respawn_transform(world_position_scratch, course_point_or_respawn_rotation); @@ -1717,7 +1729,7 @@ void update_hero_hoverboard_race_progress(void) { if (D_0015ED84_lui == 5) { int fast_finish_threshold_frames; - if (pal_mode != 0) { + if (pal_mode != FALSE) { fast_finish_threshold_frames = FUN_001f96f8_254608(0x1680); } else { fast_finish_threshold_frames = FUN_001f96f8_254608(0x1644); @@ -1813,7 +1825,8 @@ extern s32 current_level_index __asm__("D_0015ED84") __attribute__((sda)); extern float frame_time __asm__("D_0015ED6C") MACRO_ADDR; extern void fast_vec_normalize(void *, void *, float) __asm__("FUN_001f9bf8"); extern int offset_path_index(void *, int, int, int) __asm__("FUN_L00_0025d7a0"); -extern int D_L05_0015F698 __attribute__((sda)); +extern int l05_hoverboard_trick_landing_frame_thresholds __asm__("D_L05_0015F698") + __attribute__((sda)); int hero_pick_help_mode(void) __asm__("FUN_L05_00255208"); @@ -1842,9 +1855,9 @@ int hero_pick_help_mode(void) { if (fast_difference_between_rotations( fast_arc_tan(player->motion.velocity.f[0], player->motion.velocity.f[1]), player->unk8A4) < 0.7853982f) { - state = 0x6F; + state = HERO_STATE_HOVERBOARD_RESPAWN_ANIMATION_WAIT; if (!(player->ground_distance < 1.0f)) - state = 0x6D; + state = HERO_STATE_HOVERBOARD_RESPAWN_HEIGHT_OR_ANIMATION_WAIT; goto change_state; } } @@ -1854,7 +1867,7 @@ int hero_pick_help_mode(void) { if ((&hero)->wall_hit) { float distance = vector_length_xy(&(&hero)->motion.displacement); if (distance < vector_length_xy(&(&hero)->motion.velocity) * 0.25f) { - state = 0x6D; + state = HERO_STATE_HOVERBOARD_RESPAWN_HEIGHT_OR_ANIMATION_WAIT; goto change_state; } level = *(int *)0x0015ED84; @@ -1862,18 +1875,18 @@ int hero_pick_help_mode(void) { if (level == 5) { if ((&hero)->motion.pos.f[2] < 61.4f) { (&hero)->board_floor_z = 61.4f; - state = 0x6E; + state = HERO_STATE_HOVERBOARD_RESPAWN_POSITION_OR_TIMEOUT_WAIT; goto change_state; } } if (level == 0x10) { if ((&hero)->motion.pos.f[2] < 76.0f) { (&hero)->board_floor_z = 76.0f; - state = 0x6E; + state = HERO_STATE_HOVERBOARD_RESPAWN_POSITION_OR_TIMEOUT_WAIT; goto change_state; } if ((&hero)->on_slip_ground && (&hero)->ground_distance < 0.1f) { - state = 0x6D; + state = HERO_STATE_HOVERBOARD_RESPAWN_HEIGHT_OR_ANIMATION_WAIT; goto change_state; } } @@ -1881,21 +1894,21 @@ int hero_pick_help_mode(void) { if ((&hero)->race_path != 0) { int index = select_point_index_by_distance(&(&hero)->motion.pos, (&hero)->race_path, 0.0f); - int next = offset_path_index((&hero)->race_path, index, -1, 1); + int previous_path_point_index = offset_path_index((&hero)->race_path, index, -1, 1); (&hero)->wrong_way_path_point = index; if (*(int *)0x0015ED84 == 5) { Path *path = (Path *)(&hero)->race_path; float height = path->p[index].z; - float other = path->p[next].z; + float previous_path_point_height = path->p[previous_path_point_index].z; float distance; float minimum; - if (height < other) + if (height < previous_path_point_height) minimum = height; else - minimum = other; + minimum = previous_path_point_height; distance = vector_distance_xy(&(&hero)->motion.pos, &path->p[index]); if (0.5f < minimum - (&hero)->motion.pos.f[2] && 4.0f < distance) { - state = 0x6D; + state = HERO_STATE_HOVERBOARD_RESPAWN_HEIGHT_OR_ANIMATION_WAIT; goto change_state; } } @@ -1921,21 +1934,22 @@ int hero_pick_help_mode(void) { if (!((&hero)->motion.velocity.f[2] < 0.0f)) return 0; if (1.0471976f < absolute_float((&hero)->motion.rot.f[1])) { - state = 0x6D; + state = HERO_STATE_HOVERBOARD_RESPAWN_HEIGHT_OR_ANIMATION_WAIT; goto change_state; } if (1.0471976f < absolute_float((&hero)->motion.rot.f[0])) { - state = 0x6D; + state = HERO_STATE_HOVERBOARD_RESPAWN_HEIGHT_OR_ANIMATION_WAIT; goto change_state; } if (1.3962634f < fast_difference_between_rotations((&hero)->motion.rot.f[2], (&hero)->board_air_yaw)) { - state = 0x6D; + state = HERO_STATE_HOVERBOARD_RESPAWN_HEIGHT_OR_ANIMATION_WAIT; goto change_state; } if ((unsigned)(*((unsigned char *)(&hero)->moby + 0x53) - 0x69) < 4 && - (&hero)->anim_frame < (float)(&D_L05_0015F698)[(&hero)->air_pose_index]) { - state = 0x6D; + (&hero)->anim_frame < + (float)(&l05_hoverboard_trick_landing_frame_thresholds)[(&hero)->air_pose_index]) { + state = HERO_STATE_HOVERBOARD_RESPAWN_HEIGHT_OR_ANIMATION_WAIT; goto change_state; } goto continue_fall; diff --git a/src/overlays/shared/hero/set_hero_animation.c b/src/overlays/shared/hero/set_hero_animation.c index dd3d05ab59..78014982b8 100644 --- a/src/overlays/shared/hero/set_hero_animation.c +++ b/src/overlays/shared/hero/set_hero_animation.c @@ -227,7 +227,7 @@ void sync_hero_slot3_animation_speed(void) { struct Hero *hero_slot3_animation_speed_state = &hero; int mapped_animation_ids[2]; - if (hero_slot3_animation_speed_state->vehicle_mode != 0) { + if (hero_slot3_animation_speed_state->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { return; } if (hero_slot3_animation_speed_state->items[3].state != 2) { @@ -491,7 +491,7 @@ void set_hero_animation(int requested_animation_id, blend_frames_or_selector = *(int *)((char *)&hero_blend_curve_frame_counts + hero_animation_dispatch_state->anim_blend_curve * 4); } - if (hero_animation_dispatch_state->vehicle_mode == 0) { + if (hero_animation_dispatch_state->vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { blend_hero_slot3_mapped_animation_pair( requested_animation_id, starting_frame_index, blend_frames_or_selector); } @@ -703,9 +703,9 @@ typedef struct { extern int D_L00_0015F5C4; -void FUN_L00_00232fe8(void); +void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); -void FUN_L00_00232fe8(void) { +void set_hero_item_moby_flag_bit0(void) { struct Hero *hero_item_flag_state = &hero; struct Hero *tail; struct Hero *last; @@ -726,7 +726,7 @@ void FUN_L00_00232fe8(void) { if (hero_flag_target != 0) { *(unsigned short *)(hero_flag_target + 0x34) |= 1; } - if (tail->vehicle_mode == 1) { + if (tail->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero_flag_target = ((char *)tail->unk1624); if (hero_flag_target != 0) { *(unsigned short *)(hero_flag_target + 0x34) |= 1; @@ -750,9 +750,9 @@ void FUN_L00_00232fe8(void) { block, as retail re-forms it from the saved %hi before each one. */ /* Ported from rac1-decomp (src/overlays/shared/help_00232560.c: func_L00_00233950), where it is exact; names translated to the US level program. */ -void FUN_L00_002330d0(void); +void update_hero_item_moby_flags(void) __asm__("FUN_L00_002330d0"); -void FUN_L00_002330d0(void) { +void update_hero_item_moby_flags(void) { struct Hero *hero_item_flag_clear_state = &hero; struct Hero *blk2; struct Hero *blk3; @@ -774,7 +774,7 @@ void FUN_L00_002330d0(void) { if (hero_flag_target != 0) { *(unsigned short *)(hero_flag_target + 0x34) &= ~1; } - if (blk2->vehicle_mode == 1) { + if (blk2->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero_flag_target = *(char **)&blk2->unk1624; if (hero_flag_target != 0) { *(unsigned short *)(hero_flag_target + 0x34) &= ~1; @@ -920,8 +920,11 @@ int resolve_hero_gravity_mode(void) { int state = hero_gravity_mode_state->state.current; int return_value = hero_gravity_mode_state->unk308; - if (state == 0x3F || state == 0x71 || state == 0x70 || - (hero_gravity_mode_state->on_magnet_ground != 0 && D_0013D4DC[0] != 0 && state == 0 && + if (state == HERO_STATE_DIRECTION_LIMITED_GROUND_MOVE || + state == HERO_STATE_ANIMATION_FRAME_EXIT_WAIT || + state == HERO_STATE_ATTACK_RECORD_FRAME_EXIT_WAIT || + (hero_gravity_mode_state->on_magnet_ground != 0 && D_0013D4DC[0] != 0 && + state == HERO_STATE_IDLE && hero_gravity_mode_state->air_frames.s < scale_game_frames(4))) { return_value = 1; } @@ -932,9 +935,9 @@ typedef struct { f32 v[4]; } V002334d0 __attribute__((aligned(16))); -void FUN_L00_002334d0(f32 *out, f32 *in, f32 k); +void add_hero_gravity_offset(f32 *out, f32 *in, f32 k) __asm__("FUN_L00_002334d0"); -void FUN_L00_002334d0(f32 *gravity_adjusted_vector, f32 *in, f32 k) { +void add_hero_gravity_offset(f32 *gravity_adjusted_vector, f32 *in, f32 k) { struct Hero *hero_base = &hero; V002334d0 offset_vector; switch (hero_base->gravity_mode) { @@ -1076,9 +1079,9 @@ typedef struct { f32 v[4]; } V00233810 __attribute__((aligned(16))); -void FUN_L00_00233810(f32 *out, f32 *in, f32 z); +void add_hero_up_offset(f32 *out, f32 *in, f32 z) __asm__("FUN_L00_00233810"); -void FUN_L00_00233810(f32 *gravity_offset_adjusted_vector, f32 *in, f32 z) { +void add_hero_up_offset(f32 *gravity_offset_adjusted_vector, f32 *in, f32 z) { struct Hero *hero_base = &hero; M00233810 moby_rotation_matrix; V00233810 offset_vector; @@ -1447,6 +1450,11 @@ extern f32 frame_time_sq_macro __asm__("D_0015ED70") MACRO_ADDR; void update_hero_attachment(void) __asm__("FUN_L00_00233f80"); void update_hero_attachment(void) { + enum { + HERO_ATTACHMENT_MODE_INACTIVE = 0, + HERO_ATTACHMENT_MODE_PROBE = 1, + HERO_ATTACHMENT_MODE_ANCHORED = 2 + }; Vec_234800 probed_position, unanchored_probe_rotation, attachment_motion_scratch, attachment_position_motion_scratch, probe_transform_scratch, anchored_probe_rotation, primary_attachment_position, primary_attachment_rotation, secondary_attachment_position, @@ -1456,12 +1464,12 @@ void update_hero_attachment(void) { int mode; Plat *plat; - mode = 0; + mode = HERO_ATTACHMENT_MODE_INACTIVE; amt = 0.0f; saved_hero_yaw = ((Hero_234800 *)hero_233f80)->v90.z; if (((Hero_234800 *)hero_233f80)->h30E == 0) { if (((Hero_234800 *)hero_233f80)->p2FC != 0) { - mode = 1; + mode = HERO_ATTACHMENT_MODE_PROBE; if (((Hero_234800 *)hero_233f80)->p360 != ((Hero_234800 *)hero_233f80)->p2FC) { ((Hero_234800 *)hero_233f80)->i364 &= ~1; } @@ -1474,13 +1482,13 @@ void update_hero_attachment(void) { } else if (((Hero_234800 *)hero_233f80)->i2084 == 0x1C && ((Hero_234800 *)hero_233f80)->p4F8 != 0) { ((Hero_234800 *)hero_233f80)->p360 = ((Hero_234800 *)hero_233f80)->p4F8; - mode = 1; + mode = HERO_ATTACHMENT_MODE_PROBE; } else if (((Hero_234800 *)hero_233f80)->i208C == 3 && ((Hero_234800 *)hero_233f80)->p4F8 != 0) { ((Hero_234800 *)hero_233f80)->p360 = ((Hero_234800 *)hero_233f80)->p4F8; - mode = 1; + mode = HERO_ATTACHMENT_MODE_PROBE; } else if (((Hero_234800 *)hero_233f80)->p360 != 0) { - mode = 1; + mode = HERO_ATTACHMENT_MODE_PROBE; convert_integer_to_float(scale_game_frames(120) - ((Hero_234800 *)hero_233f80)->h30E); scale_game_frames_v_233f80(120); amt = ((Hero_234800 *)hero_233f80)->h30E; @@ -1575,7 +1583,7 @@ void update_hero_attachment(void) { ((Hero_234800 *)hero_233f80)->i364 &= ~2; } if (((Hero_234800 *)hero_233f80)->i364 & 3) { - mode = 2; + mode = HERO_ATTACHMENT_MODE_ANCHORED; } clear_u64_value(&attachment_motion_scratch); clear_u64_value(&attachment_position_motion_scratch); @@ -1592,7 +1600,7 @@ void update_hero_attachment(void) { qcopy(&attachment_motion_scratch, &((Hero_234800 *)hero_233f80)->v350); } qcopy(&attachment_position_motion_scratch, &attachment_motion_scratch); - } else if (mode == 1) { + } else if (mode == HERO_ATTACHMENT_MODE_PROBE) { probe_ground_height_cf(((Hero_234800 *)hero_233f80)->i2080, ((Hero_234800 *)hero_233f80)->p360, &((Hero_234800 *)hero_233f80)->pos, @@ -1603,7 +1611,7 @@ void update_hero_attachment(void) { fast_vec_sub( &attachment_motion_scratch, &probed_position, &((Hero_234800 *)hero_233f80)->pos); qcopy((Vec_234800 *)(hero_233f80 + 0x350), &attachment_motion_scratch); - } else if (mode == 2) { + } else if (mode == HERO_ATTACHMENT_MODE_ANCHORED) { probe_ground_height_cf(((Hero_234800 *)hero_233f80)->i2080, ((Hero_234800 *)hero_233f80)->p360, &((Hero_234800 *)hero_233f80)->pos, @@ -1685,9 +1693,9 @@ extern int resolve_point_path_segment_clearance(int, void *, void *, float) __asm__("FUN_L00_00262030"); /* Sets the short at &hero.unk1F6 to 4 when FUN_L00_00262030 succeeds. */ -void FUN_L00_002347c0(void); +void resolve_hero_pending_path_clearance(void) __asm__("FUN_L00_002347c0"); -void FUN_L00_002347c0(void) { +void resolve_hero_pending_path_clearance(void) { struct Hero *hero_path_clearance_state = &hero; if (resolve_point_path_segment_clearance(hero_path_clearance_state->path_constrain_pending, @@ -1747,7 +1755,7 @@ void animate_hero_slot4_and_slot5_visuals(void) { if (!hero.unk1D90.attached) attach_manipulator(slot5_moby, 0, &hero.unk1D90); else - rotation_2D5FA8(&hero.unk1D90.quat, 0, hero.unk22F0); + build_axis_rotation_quaternion(&hero.unk1D90.quat, 0, hero.unk22F0); } } } diff --git a/src/overlays/shared/hero/set_second_hero_easing_parameters.c b/src/overlays/shared/hero/set_second_hero_easing_parameters.c index 0a3667eed6..411e59ed4d 100644 --- a/src/overlays/shared/hero/set_second_hero_easing_parameters.c +++ b/src/overlays/shared/hero/set_second_hero_easing_parameters.c @@ -7,30 +7,30 @@ extern struct HeroEase hero_eases[] __asm__("D_L00_0017A680"); /* Sets the accel and max_speed of one hero ease. */ void set_second_hero_easing_parameters(float a, float b) __asm__("FUN_L00_0020a1f8"); -void set_second_hero_easing_parameters(float a, float b) { +void set_second_hero_easing_parameters(float easing_acceleration, float easing_max_speed) { struct HeroEase *destination = hero_eases; - destination[1].accel = a; - destination[1].max_speed = b; + destination[1].accel = easing_acceleration; + destination[1].max_speed = easing_max_speed; } extern struct HeroEase hero_eases[] __asm__("D_L00_0017A680"); /* Sets the accel and max_speed of one hero ease. */ void set_third_hero_easing_parameters(float a, float b) __asm__("FUN_L00_0020a210"); -void set_third_hero_easing_parameters(float a, float b) { +void set_third_hero_easing_parameters(float hero_ease_acceleration, float hero_ease_max_speed) { struct HeroEase *destination = hero_eases; - destination[2].accel = a; - destination[2].max_speed = b; + destination[2].accel = hero_ease_acceleration; + destination[2].max_speed = hero_ease_max_speed; } extern struct HeroEase hero_eases[] __asm__("D_L00_0017A680"); /* Sets the accel and max_speed of one hero ease. */ void set_fourth_hero_easing_parameters(float a, float b) __asm__("FUN_L00_0020a228"); -void set_fourth_hero_easing_parameters(float a, float b) { +void set_fourth_hero_easing_parameters(float ease_acceleration, float ease_max_speed) { struct HeroEase *destination = hero_eases; - destination[3].accel = a; - destination[3].max_speed = b; + destination[3].accel = ease_acceleration; + destination[3].max_speed = ease_max_speed; } extern int D_0013F350_002321a8[] __asm__("D_0013F350"); diff --git a/src/overlays/shared/hero/try_transition_hero_water_state.c b/src/overlays/shared/hero/try_transition_hero_water_state.c index 7df9da5276..891544d62e 100644 --- a/src/overlays/shared/hero/try_transition_hero_water_state.c +++ b/src/overlays/shared/hero/try_transition_hero_water_state.c @@ -48,10 +48,10 @@ int try_transition_hero_water_state(void) { if (hero.underwater_air == 0 && (!(hero.water_surface_z - 2.0f < hero.motion.pos.f[2]) || !(hero.motion.rot.f[1] < -0.87266463f) || !(frame_time < hero.motion.displacement.f[2]))) { - state = 0x6A; + state = HERO_STATE_DROWN; } else if (hero.water_surface_z + 0.4f < hero.motion.pos.f[2]) { D_L00_00167014[0] = 0; - state = 6; + state = HERO_STATE_FALL; } else { goto collision_mode; } @@ -70,7 +70,7 @@ int try_transition_hero_water_state(void) { end.f[2] += 0.3f; if (collision_line(&start, &end, 2, hero.moby, 0)) { if (item_available[4] != 0 && (((u32)pad_held_lui) & 10) != 0) { - state = 0x35; + state = HERO_STATE_SWIM_WITH_CROUCH_INPUT; goto change_state; } /* Retail keeps this as its own call site. Through the int-returning diff --git a/src/overlays/shared/hero/update_hero_and_vehicle_mode_effects.c b/src/overlays/shared/hero/update_hero_and_vehicle_mode_effects.c index 12d8c89185..f143527cae 100644 --- a/src/overlays/shared/hero/update_hero_and_vehicle_mode_effects.c +++ b/src/overlays/shared/hero/update_hero_and_vehicle_mode_effects.c @@ -243,7 +243,7 @@ void restore_saved_hero_moby_and_clear_vehicle_mode(void) { int flag_clear_target; void *moby_to_remove; char *restored_hero_moby; - if (hero_state_for_vehicle_exit->vehicle_mode == 2) { + if (hero_state_for_vehicle_exit->vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { int animation_parameter_value = hero_state_for_vehicle_exit->unk1634; if (animation_parameter_value != -1) { set_animation_parameter(animation_parameter_value, 0); @@ -253,7 +253,7 @@ void restore_saved_hero_moby_and_clear_vehicle_mode(void) { reset_hero_easing_records(); hero_state_bytes = (struct Hero *)(((unsigned char *)&D_0013E533) + 0xE1D); flag_clear_target = *(int *)&hero_state_bytes->unkA84; - hero_state_bytes->vehicle_mode = 0; + hero_state_bytes->vehicle_mode = HERO_VEHICLE_MODE_ON_FOOT; if (flag_clear_target != 0) { *(unsigned short *)(flag_clear_target + 0x34) &= 0xFFF9; } @@ -535,7 +535,7 @@ void update_hero_timers_and_auxiliary_state(void) { } } } - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { fast_dec_timer_s16(&hero.vehicle_triangle_cooldown); } for (i = 0; i < 5; i++) { @@ -567,7 +567,7 @@ void update_hero_timers_and_auxiliary_state(void) { hero.still_frames = 0; skip: update_hero_planar_distance_spring_motion(); - if (hero.vehicle_mode == 2) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) { transform_hero_local_offset_to_world(&hero.motion.body_center, 0.0f, 0.0f, 4.0f); hero.reach_distance = 15.0f; hero.reach_height = 3.0f; diff --git a/src/overlays/shared/hero/update_hero_frame_pipeline.c b/src/overlays/shared/hero/update_hero_frame_pipeline.c index aaed16f457..12c0585c95 100644 --- a/src/overlays/shared/hero/update_hero_frame_pipeline.c +++ b/src/overlays/shared/hero/update_hero_frame_pipeline.c @@ -34,7 +34,7 @@ void update_hero_frame_pipeline(void) { } hero_state->unk1EB2 = 0; hero_state->unk1EB0 = 0; - if (hero_state->vehicle_mode != 0) { + if (hero_state->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { hero_frame_update(); return; } @@ -44,7 +44,7 @@ void update_hero_frame_pipeline(void) { update_hero_ledge_probe(); update_hero_offset_rail_candidate(); update_hero_state_machine(); - if (hero_state->vehicle_mode != 0) { + if (hero_state->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { return; } update_hero_delayed_voice_requests(); diff --git a/src/overlays/shared/hero/update_hero_ground_contact.c b/src/overlays/shared/hero/update_hero_ground_contact.c index 5e49217a53..24953985e3 100644 --- a/src/overlays/shared/hero/update_hero_ground_contact.c +++ b/src/overlays/shared/hero/update_hero_ground_contact.c @@ -93,6 +93,9 @@ extern struct Hero hero_lui __asm__("D_0013F350") NOT_SDA; void update_hero_ground_contact(void) __asm__("FUN_L15_0020a7a0"); void update_hero_ground_contact(void) { + enum { + GROUND_MATERIAL_WATER = 0 + }; V shared_ray_endpoint, ground_ray_endpoint, ground_displacement_or_angles, surface_probe_endpoint, unused_probe_vector, probe_surface_angles, probe_surface_normal; f32 f; @@ -136,7 +139,7 @@ void update_hero_ground_contact(void) { } hero.ground_sound_class = collision_sound_class; hero.ground_type = collision_hit_material(); - if (hero.ground_type == 0) { + if (hero.ground_type == GROUND_MATERIAL_WATER) { hero.water_surface_z = resolve_camera_surface_height(D_L15_00174460, &hero.water_surface_normal); if (hero.motion.pos.f[2] < hero.water_surface_z && hero.in_water_frames <= 0) { @@ -185,7 +188,8 @@ void update_hero_ground_contact(void) { } if (hero.ground_distance < 0.02f) { hero.frames_off_ground.s = 0; - if (hero.ground_slope.f <= 0.87266463f || hero.gravity_mode == 1 || + if (hero.ground_slope.f <= 0.87266463f || + hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.state.control_mode == 0x16) { hero.air_frames.s = 0; hero.last_landed_moby = HH.moby; diff --git a/src/overlays/shared/hero/update_hero_vehicle_attachments_and_effects.c b/src/overlays/shared/hero/update_hero_vehicle_attachments_and_effects.c index dac099492e..bb1f61f0c8 100644 --- a/src/overlays/shared/hero/update_hero_vehicle_attachments_and_effects.c +++ b/src/overlays/shared/hero/update_hero_vehicle_attachments_and_effects.c @@ -370,7 +370,7 @@ void restore_hero_from_vehicle_mode(void) __asm__("FUN_L06_00227cf8"); void restore_hero_from_vehicle_mode(void) { struct Hero *hero_context = &hero; unsigned char *flag_clear_target; - if (hero_context->vehicle_mode == 1) { + if (hero_context->vehicle_mode == HERO_VEHICLE_MODE_CLANK) { hero_context->health.vehicle_mode_hp = hero_context->health.hp; hero_context->health.hp = hero_context->health.unk22B0; if (hero_context->unk1620) { @@ -385,7 +385,7 @@ void restore_hero_from_vehicle_mode(void) { { struct Hero *hero_restore_context = &hero; reset_hero_easing_records(); - hero_restore_context->vehicle_mode = 0; + hero_restore_context->vehicle_mode = HERO_VEHICLE_MODE_ON_FOOT; flag_clear_target = hero_restore_context->unkA84; if (flag_clear_target) { *(u16 *)(flag_clear_target + 0x34) &= ~6; @@ -552,9 +552,9 @@ typedef union { } V_22a1d0; extern OvlVec4 coll_hit_pos __asm__("D_L06_001745F0") NOT_SDA; /* position after push-out of the last collision query */ -extern void FUN_L00_002347c0(void); -extern void FUN_L00_00233810(void *, void *, f32); -extern void FUN_L00_002334d0(void *, void *, f32); +extern void resolve_hero_pending_path_clearance(void) __asm__("FUN_L00_002347c0"); +extern void add_hero_up_offset(void *, void *, f32) __asm__("FUN_L00_00233810"); +extern void add_hero_gravity_offset(void *, void *, f32) __asm__("FUN_L00_002334d0"); extern s32 coll_sphere(void *, s32, s32, f32) __asm__("FUN_L00_001f0d60"); extern s32 rig_probe(void *, s32, f32, s32, f32) __asm__("FUN_L00_001f19a0"); extern s32 coll3_22a1d0(void *, f32) __asm__("FUN_L00_001f3170"); @@ -574,15 +574,15 @@ s32 resolve_hero_position_collisions(s32 mode) { qcopy(&pre_collision_position, &hero.motion.pos.q); clear_u64_value(&collision_query_offset); if (hero.path_constrain_pending != 0) { - FUN_L00_002347c0(); + resolve_hero_pending_path_clearance(); hero.path_constrain_pending = 0; } if (hero.state.control_mode != 0x11) { - if (hero.gravity_mode != 0 || hero.unk1F8 != 0) { - if (hero.gravity_mode == 1 || hero.unk1F8 != 0) { - FUN_L00_00233810(&collision_query_offset, &collision_query_offset, 0.6f); + if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN || hero.unk1F8 != 0) { + if (hero.gravity_mode == HERO_GRAVITY_OPPOSITE_GROUND_NORMAL || hero.unk1F8 != 0) { + add_hero_up_offset(&collision_query_offset, &collision_query_offset, 0.6f); } else { - FUN_L00_002334d0( + add_hero_gravity_offset( &collision_query_offset, &collision_query_offset, -hero.capsule_bottom); } } else { @@ -594,7 +594,7 @@ s32 resolve_hero_position_collisions(s32 mode) { if (hero.state.current == HERO_STATE_SINK) mask = 0xD24; for (i = 0; i < 8; i++) { - if (hero.gravity_mode != 0) { + if (hero.gravity_mode != HERO_GRAVITY_WORLD_DOWN) { if (!coll_sphere(&hero.motion.pos.q, mask, hero.moby, frame_scale * 0.4f)) break; } else if (hero.state.control_mode == 0xF) { @@ -773,7 +773,7 @@ void update_hero_timers_and_spatial_state(void) { hero.still_frames = 0; skip: update_hero_planar_distance_spring_motion(); - if (hero.vehicle_mode == 1) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { transform_hero_local_offset_to_world(&hero.motion.body_center, 0.0f, 0.0f, 0.4f); hero.reach_distance = 2.125f; hero.reach_height = 1.25f; diff --git a/src/overlays/shared/input/pad_pressed_within.c b/src/overlays/shared/input/pad_pressed_within.c index b00d98e7da..f3f45930bb 100644 --- a/src/overlays/shared/input/pad_pressed_within.c +++ b/src/overlays/shared/input/pad_pressed_within.c @@ -5,11 +5,11 @@ u32 pad_pressed_within(u32 mask, s32 n, s32 *out) __asm__("FUN_L00_00266d60"); -u32 pad_pressed_within(u32 mask, s32 n, s32 *press_age_frames_out) { +u32 pad_pressed_within(u32 mask, s32 requested_lookback_frames, s32 *press_age_frames_out) { s32 history_search_limit = controller_state.hist_count; s32 i; - if (history_search_limit >= n) - history_search_limit = n; + if (history_search_limit >= requested_lookback_frames) + history_search_limit = requested_lookback_frames; for (i = 1; i < history_search_limit + 1; i++) { s32 k = (controller_state.hist_idx - i + 30) % 30; if (controller_state.pressed_history[k] & mask) { diff --git a/src/overlays/shared/math/interpolation/spring_turn.c b/src/overlays/shared/math/interpolation/spring_turn.c index 0709e7b915..69ee2c836d 100644 --- a/src/overlays/shared/math/interpolation/spring_turn.c +++ b/src/overlays/shared/math/interpolation/spring_turn.c @@ -192,93 +192,118 @@ extern float allocate_voice_for_target_entry_cf(void *) __asm__("FUN_L00_0025971 extern int FUN_001efa68_258490(void *, void *, int, void *, int) __asm__("FUN_001efa68"); extern int FUN_L00_001f0d60_258490(void *, float, int, void *) __asm__("FUN_L00_001f0d60"); -int FUN_L00_00258490( - - void *ign, V_258490 *to, V_258490 *pos, int flags, float h, float r, float lim, float slope) { - V_258490 d; - V_258490 n; - V_258490 a; - V_258490 b; +int move_moby_xy_with_collision_constraints( + + void *ign, + V_258490 *to, + V_258490 *pos, + int flags, + float h, + float r, + float lim, + float slope) __asm__("FUN_L00_00258490"); + +int move_moby_xy_with_collision_constraints( + + void *ign, + V_258490 *to, + V_258490 *proposed_position, + int flags, + float collision_height_offset, + float collision_radius, + float ground_height_difference_limit, + + float slope) { + V_258490 movement_displacement; + V_258490 line_probe_displacement; + V_258490 line_probe_start; + V_258490 line_probe_end; V_258490 up; - V_258490 t; + V_258490 sphere_probe_center; int ok; int i; - int m2; + int line_collision_flag_bit_2; float gz; float zz; - float ang; - unsigned char *c; + float sphere_contact_angle; + unsigned char *line_collision_result; float *nrm; - unsigned char *q60; - unsigned char *q40; + unsigned char *sphere_contact_position; + unsigned char *sphere_collision_result; ok = 1; - m2 = flags & 2; - pos->f[2] += h; - gz = allocate_voice_for_target_entry_cf(pos); - pos->f[2] -= h; - if (lim < absolute_float(gz - to->f[2])) { + line_collision_flag_bit_2 = flags & 2; + proposed_position->f[2] += collision_height_offset; + gz = allocate_voice_for_target_entry_cf(proposed_position); + proposed_position->f[2] -= collision_height_offset; + if (ground_height_difference_limit < absolute_float(gz - to->f[2])) { if ((((flags ^ 1) & 1) && gz < to->f[2]) || to->f[2] < gz) { - qcopy(pos, to); + qcopy(proposed_position, to); ok = 0; } } - fast_vec_sub(&d, pos, to); - fast_vec_normalize(&n, &d, r * 1.2f); + fast_vec_sub(&movement_displacement, proposed_position, to); + fast_vec_normalize(&line_probe_displacement, &movement_displacement, collision_radius * 1.2f); up.q = 0; - up.f[2] = h; - fast_vec_add(&a, to, &up); - fast_vec_add(&b, &a, &n); - if (ok && FUN_001efa68_258490(&a, &b, m2 | 0x24, ign, 0)) { - c = D_L00_00173E40_258490; - if (*(int *)(c + 0x1C) > 0) { - nrm = (float *)(c + 0x40); - if (slope <= fast_arc_tan(*(float *)(c + 0x48), vector_length_xy(nrm))) { - *(int *)(c + 0x48) = 0; + up.f[2] = collision_height_offset; + fast_vec_add(&line_probe_start, to, &up); + fast_vec_add(&line_probe_end, &line_probe_start, &line_probe_displacement); + if (ok && FUN_001efa68_258490( + &line_probe_start, &line_probe_end, line_collision_flag_bit_2 | 0x24, ign, 0)) { + line_collision_result = D_L00_00173E40_258490; + if (*(int *)(line_collision_result + 0x1C) > 0) { + nrm = (float *)(line_collision_result + 0x40); + if (slope <= + fast_arc_tan(*(float *)(line_collision_result + 0x48), vector_length_xy(nrm))) { + *(int *)(line_collision_result + 0x48) = 0; sceVu0Normalize(nrm, nrm); { - float k = -d.f[0] * *(float *)(c + 0x40) - d.f[1] * *(float *)(c + 0x44); + float k = + -movement_displacement.f[0] * *(float *)(line_collision_result + 0x40) - + movement_displacement.f[1] * *(float *)(line_collision_result + 0x44); if (0.0f < k) { fast_vec_scale(nrm, nrm, k); ok = 0; - fast_vec_add(&d, &d, nrm); + fast_vec_add(&movement_displacement, &movement_displacement, nrm); } } } - fast_vec_add(pos, to, &d); + fast_vec_add(proposed_position, to, &movement_displacement); } } if (!(flags & 2)) { - zz = h + r; - q60 = (unsigned char *)&D_L00_00173E60_lui; - q40 = q60 - 0x20; + zz = collision_height_offset + collision_radius; + sphere_contact_position = (unsigned char *)&D_L00_00173E60_lui; + sphere_collision_result = sphere_contact_position - 0x20; i = 0; do { - qcopy(&t, pos); - t.f[2] += zz; - if (!FUN_L00_001f0d60_258490(&t, r, 0x24, ign)) { + qcopy(&sphere_probe_center, proposed_position); + sphere_probe_center.f[2] += zz; + if (!FUN_L00_001f0d60_258490(&sphere_probe_center, collision_radius, 0x24, ign)) { break; } - ang = fast_arc_tan(vector_distance_xy(pos, q60), *(float *)(q40 + 0x28) - pos->f[2]); - if (*(int *)(q40 + 0x18) != 0 || slope < ang) { - qcopy(pos, &coll_hit_position); + sphere_contact_angle = + fast_arc_tan(vector_distance_xy(proposed_position, sphere_contact_position), + *(float *)(sphere_collision_result + 0x28) - proposed_position->f[2]); + if (*(int *)(sphere_collision_result + 0x18) != 0 || slope < sphere_contact_angle) { + qcopy(proposed_position, &coll_hit_position); ok = 0; - pos->f[2] -= zz; + proposed_position->f[2] -= zz; } i++; } while (i < 6); } - pos->f[2] += h; - gz = allocate_voice_for_target_entry_cf(pos); - pos->f[2] -= h; - if (lim < absolute_float(gz - to->f[2])) { + proposed_position->f[2] += collision_height_offset; + gz = allocate_voice_for_target_entry_cf(proposed_position); + proposed_position->f[2] -= collision_height_offset; + if (ground_height_difference_limit < absolute_float(gz - to->f[2])) { if ((((flags ^ 1) & 1) && gz < to->f[2]) || to->f[2] < gz) { - qcopy(pos, to); + qcopy(proposed_position, to); ok = 0; } } - to->f[0] = pos->f[0]; - to->f[1] = pos->f[1]; + to->f[0] = proposed_position->f[0]; + to->f[1] = proposed_position->f[1]; return ok; } @@ -317,7 +342,7 @@ int move_moby_with_step_collision(char *moby, Vs raised_position; Vs probe_end; Vs scaled_displacement; - int result = 0; + int movement_collision_result_flags = 0; int coll_flags = (flags * 2) & 0x20; char *movement_position = &MOBY(moby)->pos; int i; @@ -333,7 +358,7 @@ int move_moby_with_step_collision(char *moby, probe_end.a[2] += step_height; if (collision_line(&raised_position, &probe_end, coll_flags, (int)moby, 0)) { fast_vec_sub(movement_position, (char *)&D_94C8_60, &scaled_displacement); - result = 1; + movement_collision_result_flags = 1; MOBY(moby)->pos.z -= step_height; } } @@ -342,7 +367,7 @@ int move_moby_with_step_collision(char *moby, raised_position.a[2] += step_height; if (func_L00_001F10E0_l(&raised_position, radius, coll_flags | 4, moby)) { qcopy(collision_position, &coll_hit_position); - result |= 1; + movement_collision_result_flags |= 1; MOBY(moby)->pos.z -= step_height; } else { break; @@ -355,21 +380,22 @@ int move_moby_with_step_collision(char *moby, probe_end.a[2] = radius - 0.05f; if (collision_line(&raised_position, &probe_end, coll_flags | 2, (int)moby, 0)) { if (D_L00_00173E40[7] > 0) { - float g; - result |= 2; - g = fast_arc_tan(*(float *)((char *)D_L00_00173E40 + 0x48), + float ground_normal_angle_or_hit_height; + movement_collision_result_flags |= 2; + ground_normal_angle_or_hit_height = + fast_arc_tan(*(float *)((char *)D_L00_00173E40 + 0x48), vector_length_xy((char *)D_L00_00173E40 + 0x40)); - if (g > 0.5f) { - result |= 4; + if (ground_normal_angle_or_hit_height > 0.5f) { + movement_collision_result_flags |= 4; } - g = *(float *)((char *)D_L00_00173E40 + 0x28); - if (radius < g) { - MOBY(moby)->pos.z += (g - radius) * 0.3f; + ground_normal_angle_or_hit_height = *(float *)((char *)D_L00_00173E40 + 0x28); + if (radius < ground_normal_angle_or_hit_height) { + MOBY(moby)->pos.z += (ground_normal_angle_or_hit_height - radius) * 0.3f; } } } fast_vec_sub(velocity, collision_position, &original_position); - return result; + return movement_collision_result_flags; } /* move_moby_with_step_collision as this caller passes it: the moby and velocity as ints. */ @@ -577,8 +603,8 @@ s32 FUN_L00_00258b50(Obj *moby, void approach_w(unsigned char *, float *, float, float, float, float) __asm__("FUN_L00_00258278"); int move_w(unsigned char *, char *, float *, void *, float) __asm__("FUN_L00_00258b50"); -int FUN_L00_00259028(unsigned char *m, char *c, float *tgt, void *out); -int FUN_L00_00259028(unsigned char *moby, +int step_mover_2e3f20(unsigned char *m, char *c, float *tgt, void *out) __asm__("FUN_L00_00259028"); +int step_mover_2e3f20(unsigned char *moby, char *movement_control, float *target_position, diff --git a/src/overlays/shared/mobys/allocate_moby_animation_slot.c b/src/overlays/shared/mobys/allocate_moby_animation_slot.c index 25720591ea..dc2abad18d 100644 --- a/src/overlays/shared/mobys/allocate_moby_animation_slot.c +++ b/src/overlays/shared/mobys/allocate_moby_animation_slot.c @@ -193,67 +193,80 @@ extern void FUN_L00_00252990(void *); void advance_moby_animation_blend(void *unused, unsigned char *a) __asm__("FUN_L00_0024f190"); -void advance_moby_animation_blend(void *unused, unsigned char *a) { - float s = *(float *)(a + 0x28); - a[5] = 0; - if (s != 0.0f && *(float *)(a + 0x2C) != 0.0f) { - float t = *(float *)(a + 0x24) + s * *(float *)(a + 0x2C); - *(float *)(a + 0x24) = t; - if (s > 0.0f) { - if (t > 0.99f && t < 1.01f) { - *(float *)(a + 0x24) = 1.0f; +void advance_moby_animation_blend(void *unused, unsigned char *animation_state) { + float unscaled_frame_step = *(float *)(animation_state + 0x28); + animation_state[5] = 0; + if (unscaled_frame_step != 0.0f && *(float *)(animation_state + 0x2C) != 0.0f) { + float advanced_frame_progress = *(float *)(animation_state + 0x24) + + unscaled_frame_step * *(float *)(animation_state + 0x2C); + *(float *)(animation_state + 0x24) = advanced_frame_progress; + if (unscaled_frame_step > 0.0f) { + if (advanced_frame_progress > 0.99f && advanced_frame_progress < 1.01f) { + *(float *)(animation_state + 0x24) = 1.0f; } - if (*(float *)(a + 0x24) >= 1.0f) { - int u = a[7]; + if (*(float *)(animation_state + 0x24) >= 1.0f) { + int next_frame_remap_flag = animation_state[7]; do { - int o, p, o2; - a[6] = u; - a[5] |= 1; - a[0x20] = a[0x21]; - if ((unsigned char)u) { - *(int *)(a + 0x38) = *(int *)(a + 0x3C); + int o, p, animation_table_byte_offset; + animation_state[6] = next_frame_remap_flag; + animation_state[5] |= 1; + animation_state[0x20] = animation_state[0x21]; + if ((unsigned char)next_frame_remap_flag) { + *(int *)(animation_state + 0x38) = *(int *)(animation_state + 0x3C); } - a[0x22] = a[0x23]; - a[0x21]++; - o = a[0x23] * 4; - if (a[0x21] >= - *(unsigned char *)(*(int *)(*(unsigned char **)(a + 0x14) + o + 0x48) + + animation_state[0x22] = animation_state[0x23]; + animation_state[0x21]++; + o = animation_state[0x23] * 4; + if (animation_state[0x21] >= + *(unsigned char *)(*(int *)(*(unsigned char **)(animation_state + 0x14) + + o + 0x48) + 0x10)) { - a[0x21] = 0; - a[5] |= 2; + animation_state[0x21] = 0; + animation_state[5] |= 2; } { - float f = (*(float *)(a + 0x24) - 1.0f) / *(float *)(a + 0x2C); - float g; - o2 = a[0x22] * 4; - p = a[0x20] * 4; - *(float *)(a + 0x24) = f; - g = **(float **)(*(int *)(*(unsigned char **)(a + 0x14) + o2 + 0x48) + p + - 0x1C); - *(float *)(a + 0x2C) = g; - *(float *)(a + 0x24) = f * g; + float unscaled_frame_remainder = + (*(float *)(animation_state + 0x24) - 1.0f) / + *(float *)(animation_state + 0x2C); + float frame_progress_scale; + animation_table_byte_offset = animation_state[0x22] * 4; + p = animation_state[0x20] * 4; + *(float *)(animation_state + 0x24) = unscaled_frame_remainder; + frame_progress_scale = + **(float **)(*(int *)(*(unsigned char **)(animation_state + 0x14) + + animation_table_byte_offset + 0x48) + + p + 0x1C); + *(float *)(animation_state + 0x2C) = frame_progress_scale; + *(float *)(animation_state + 0x24) = + unscaled_frame_remainder * frame_progress_scale; } - } while (*(float *)(a + 0x24) >= 1.0f); + } while (*(float *)(animation_state + 0x24) >= 1.0f); } } } - if (a[6]) { - FUN_L00_0024f440(a, a[0x22], a[0x20], *(int *)(a + 0x38)); + if (animation_state[6]) { + FUN_L00_0024f440(animation_state, + animation_state[0x22], + animation_state[0x20], + *(int *)(animation_state + 0x38)); } else { - int o = a[0x22] * 4; - int p = a[0x20] * 4; - *(int *)(a + 0x38) = - *(int *)(*(int *)(*(unsigned char **)(a + 0x14) + o + 0x48) + p + 0x1C); + int o = animation_state[0x22] * 4; + int p = animation_state[0x20] * 4; + *(int *)(animation_state + 0x38) = + *(int *)(*(int *)(*(unsigned char **)(animation_state + 0x14) + o + 0x48) + p + 0x1C); } - if (a[7]) { - FUN_L00_0024f440(a, a[0x23], a[0x21], *(int *)(a + 0x3C)); + if (animation_state[7]) { + FUN_L00_0024f440(animation_state, + animation_state[0x23], + animation_state[0x21], + *(int *)(animation_state + 0x3C)); } else { - int o = a[0x23] * 4; - int p = a[0x21] * 4; - *(int *)(a + 0x3C) = - *(int *)(*(int *)(*(unsigned char **)(a + 0x14) + o + 0x48) + p + 0x1C); + int o = animation_state[0x23] * 4; + int p = animation_state[0x21] * 4; + *(int *)(animation_state + 0x3C) = + *(int *)(*(int *)(*(unsigned char **)(animation_state + 0x14) + o + 0x48) + p + 0x1C); } - FUN_L00_00252990(a); + FUN_L00_00252990(animation_state); } typedef struct { diff --git a/src/overlays/shared/mobys/count_active_moby_group_members.c b/src/overlays/shared/mobys/count_active_moby_group_members.c index 462e32effa..c382efc519 100644 --- a/src/overlays/shared/mobys/count_active_moby_group_members.c +++ b/src/overlays/shared/mobys/count_active_moby_group_members.c @@ -36,6 +36,9 @@ extern O_26e008 *D_L01_0015FFD8_26e008 __asm__("D_L01_0015FFD8"); int count_active_moby_group_members(int i, int st) __asm__("FUN_L01_0026e008"); int count_active_moby_group_members(int i, int excluded_moby_state) { + enum { + MIN_ACTIVE_MOBY_STATE = 0 + }; unsigned short *moby_index_entry; int qualifying_moby_count = 0; O_26e008 *moby; @@ -46,7 +49,7 @@ int count_active_moby_group_members(int i, int excluded_moby_state) { moby_index_entry = D_L01_001ABCC0_lui[i]; do { moby = (O_26e008 *)(((*moby_index_entry & 0x7FFF) << 8) + (int)D_L01_0015FFD8_26e008); - if (moby->state >= 0 && + if (moby->state >= MIN_ACTIVE_MOBY_STATE && (excluded_moby_state == -1 || (unsigned char)moby->state != excluded_moby_state)) { qualifying_moby_count++; } diff --git a/src/overlays/shared/mobys/draw_only_moby_update.c b/src/overlays/shared/mobys/draw_only_moby_update.c index 76d17cc3d5..f267f69693 100644 --- a/src/overlays/shared/mobys/draw_only_moby_update.c +++ b/src/overlays/shared/mobys/draw_only_moby_update.c @@ -15,7 +15,7 @@ void draw_only_moby_update(struct Moby *moby) { }; switch (moby->state) { case MOBY_DRAW_ONLY_STATE_INITIALIZE: - moby->state = 1; + moby->state = MOBY_DRAW_ONLY_STATE_ENQUEUE_DRAW_CALLBACK; break; case MOBY_DRAW_ONLY_STATE_ENQUEUE_DRAW_CALLBACK: add_draw_callback((int)draw_level16_reflection_mesh_batch, (int)moby); diff --git a/src/overlays/shared/mobys/evaluate_moby_animation_pose.c b/src/overlays/shared/mobys/evaluate_moby_animation_pose.c index f4b2f0f848..87b4e56af2 100644 --- a/src/overlays/shared/mobys/evaluate_moby_animation_pose.c +++ b/src/overlays/shared/mobys/evaluate_moby_animation_pose.c @@ -38,13 +38,15 @@ extern Item257218 D_L00_001C40B0[] NOT_SDA; int FUN_L00_00257218_u3(Moby257218 *, int *) __asm__("FUN_L00_00257218"); /* Picks the weapon whose ammo a pickup gives (*out), preferring owned weapons that are not full, and returns how many pickups to drop (1 or 2). */ -int FUN_L00_00257218_u3(Moby257218 *m, int *out) { - int i, idx, x; +int FUN_L00_00257218_u3(Moby257218 *drop_source_moby, int *pickup_item_type) { + int i, pickup_candidate_index, x; int not_full = 0, owned = 0, with_max = 0; int drops = 1; - if (*out <= 0 || - (m != 0 && (D_0014C190[D_0015ED84][(s16)m->uid >> 5] >> (m->uid & 0x1F)) & 1)) { + if (*pickup_item_type <= 0 || + (drop_source_moby != 0 && (D_0014C190[D_0015ED84][(s16)drop_source_moby->uid >> 5] >> + (drop_source_moby->uid & 0x1F)) & + 1)) { for (i = 0; i < 12 && D_0015EDD0_macro[i] != 0xFF; i++) { x = D_0015EDD0_macro[i] & 0x3F; if (item_available[x]) { @@ -55,29 +57,29 @@ int FUN_L00_00257218_u3(Moby257218 *m, int *out) { ((Item257218 *)(x * 0x18 + (u8 *)D_L00_001C40B0))->max_ammo; } } - idx = -1; + pickup_candidate_index = -1; if (not_full) { i = random_integer_below(not_full); while (i >= 0) { - idx++; - x = D_0015EDD0_macro[idx] & 0x3F; + pickup_candidate_index++; + x = D_0015EDD0_macro[pickup_candidate_index] & 0x3F; if (item_available[x]) i -= ((Item257218 *)(x * 0x18 + (u8 *)D_L00_001C40B0))->max_ammo > weapon_ammo_counts[x]; } - *out = D_0015EDD0_macro[idx] & 0x3F; + *pickup_item_type = D_0015EDD0_macro[pickup_candidate_index] & 0x3F; } else if (owned) { i = random_integer_below(with_max); while (i >= 0) { - idx++; - x = D_0015EDD0_macro[idx] & 0x3F; + pickup_candidate_index++; + x = D_0015EDD0_macro[pickup_candidate_index] & 0x3F; if (item_available[x] && ((Item257218 *)(x * 0x18 + (u8 *)D_L00_001C40B0))->max_ammo) i--; } - *out = D_0015EDD0_macro[idx] & 0x3F; + *pickup_item_type = D_0015EDD0_macro[pickup_candidate_index] & 0x3F; } else { - *out = 10; + *pickup_item_type = 10; } } if (random_integer_below(5) == 0) diff --git a/src/overlays/shared/mobys/find_moby_hit.c b/src/overlays/shared/mobys/find_moby_hit.c index 25eb5766ae..5cbaa33e23 100644 --- a/src/overlays/shared/mobys/find_moby_hit.c +++ b/src/overlays/shared/mobys/find_moby_hit.c @@ -231,18 +231,18 @@ void spawn_nearby_effect(unsigned char *owner_moby, u128 *hit_vector_source, u128 *direction_vector, - float f) { + float hit_damage) { int i = D_L00_00173E40.idx; MobyHit *hit_record; if (MOBY(owner_moby)->hit_slot != 0xFF) { MobyHit *existing_hit = &moby_hits[MOBY(owner_moby)->hit_slot]; - if (existing_hit->owner == owner_moby && f < existing_hit->damage) + if (existing_hit->owner == owner_moby && hit_damage < existing_hit->damage) return; } hit_record = &moby_hits[i]; hit_record->source_moby = (u8 *)x; hit_record->flags = y; - hit_record->damage = f; + hit_record->damage = hit_damage; hit_record->owner = owner_moby; hit_record->unk38 = 0; if (fast_vec_length(direction_vector) > 0.0001f) { @@ -293,16 +293,16 @@ typedef struct { int a[4]; } Vk __attribute__((aligned(16))); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); void build_quaternion_from_axis_rotations(void *output_quaternion, float *axis_rotation_angles) __asm__("FUN_L00_00259f50"); void build_quaternion_from_axis_rotations(void *output_quaternion, float *axis_rotation_angles) { Vk z_axis_quaternion, y_axis_quaternion, x_axis_quaternion; - FUN_L00_001fff28(&x_axis_quaternion, 0, axis_rotation_angles[0]); - FUN_L00_001fff28(&y_axis_quaternion, 1, axis_rotation_angles[1]); - FUN_L00_001fff28(&z_axis_quaternion, 2, axis_rotation_angles[2]); + build_axis_rotation_quaternion(&x_axis_quaternion, 0, axis_rotation_angles[0]); + build_axis_rotation_quaternion(&y_axis_quaternion, 1, axis_rotation_angles[1]); + build_axis_rotation_quaternion(&z_axis_quaternion, 2, axis_rotation_angles[2]); multiply_quaternions(output_quaternion, &x_axis_quaternion, &y_axis_quaternion); multiply_quaternions(output_quaternion, output_quaternion, &z_axis_quaternion); } @@ -381,9 +381,9 @@ MobyHit *find_moby_hit(u8 *p, s32 mask, s32 flag) __asm__("FUN_L00_0025a420"); MobyHit *find_moby_hit(u8 *owner_moby, s32 mask, s32 flag) { MobyHit *hit_record; - u8 *a = owner_moby + 0xA4; - u8 i = load_u8_0025a420(a); - if (load_u8_0025a420(a) == 0xFF) + u8 *hit_slot_address = owner_moby + 0xA4; + u8 i = load_u8_0025a420(hit_slot_address); + if (load_u8_0025a420(hit_slot_address) == 0xFF) return 0; hit_record = &moby_hits[i]; if (hit_record->owner != owner_moby) @@ -639,7 +639,7 @@ int generate_random_points_from_shape_entries( case SHAPE_INLINE_CENTER_SPHERE: case 1: case SHAPE_INDEXED_CENTER_SPHERE: { - if (type < 2) { + if (type < SHAPE_INDEXED_CENTER_SPHERE) { qcopy(&shape_anchor, (void *)((entry + 0x10))); scale_vector(*(float *)(entity + 0x2c) * 0.0009765625f, &shape_anchor, @@ -709,7 +709,7 @@ int generate_random_points_from_shape_entries( case 1: case SHAPE_INDEXED_CENTER_SPHERE: { float radius, extent; - if (type < 2) { + if (type < SHAPE_INDEXED_CENTER_SPHERE) { qcopy(&shape_anchor, (void *)((entry + 0x10))); FUN_001f9a68_25aca0(*(float *)(entity + 0x2c), &shape_anchor, &shape_anchor); extent = shape_anchor.f[3] * *(float *)(entity + 0x2c); @@ -834,6 +834,9 @@ int update_arc_motion(O_25b440 *moving_object, S_25b440 *arc_motion_state) { DESCEND_TO_GROUND = 2, WAIT_AFTER_GROUND_CLAMP = 3 }; + enum { + ARC_MOTION_FINISHED = 4 + }; float motion_displacement[4]; float prediction_time; float ground_height; @@ -848,7 +851,7 @@ int update_arc_motion(O_25b440 *moving_object, S_25b440 *arc_motion_state) { } if (moving_object->b70 & 2) { blend_moby_animation(moving_object, arc_motion_state->b2D, 0, 10); - arc_motion_state->state = 1; + arc_motion_state->state = INTEGRATE_ARC_MOTION; } case INTEGRATE_ARC_MOTION: approach_w(moving_object, @@ -869,7 +872,7 @@ int update_arc_motion(O_25b440 *moving_object, S_25b440 *arc_motion_state) { (arc_motion_state->f10 * prediction_time - arc_motion_state->f1C * 0.5f * prediction_time * prediction_time)) { blend_moby_animation(moving_object, arc_motion_state->b2E, 0, 10); - arc_motion_state->state = 2; + arc_motion_state->state = DESCEND_TO_GROUND; } } break; @@ -879,7 +882,7 @@ int update_arc_motion(O_25b440 *moving_object, S_25b440 *arc_motion_state) { ground_height = probe_ground_height(moving_object->pos, 0, 0.5f); if (moving_object->z <= ground_height) { moving_object->z = ground_height; - arc_motion_state->state = 3; + arc_motion_state->state = WAIT_AFTER_GROUND_CLAMP; } else { motion_displacement[0] = FUN_001f9dc8_25b440(arc_motion_state->f18) * arc_motion_state->f14; @@ -890,7 +893,7 @@ int update_arc_motion(O_25b440 *moving_object, S_25b440 *arc_motion_state) { } case WAIT_AFTER_GROUND_CLAMP: if (moving_object->b70 & 2) { - arc_motion_state->state = 4; + arc_motion_state->state = ARC_MOTION_FINISHED; } break; } diff --git a/src/overlays/shared/mobys/find_point_ahead.c b/src/overlays/shared/mobys/find_point_ahead.c index 3c959108d6..66e53cf3f2 100644 --- a/src/overlays/shared/mobys/find_point_ahead.c +++ b/src/overlays/shared/mobys/find_point_ahead.c @@ -16,6 +16,11 @@ int find_point_ahead(char *a, char *o, float best) __asm__("FUN_L int find_point_ahead(char *source_entity, char *target_out, float best) __asm__("FUN_L01_00274b78"); int find_point_ahead(char *source_entity, char *target_out, float best) { + enum { + POINT_AHEAD_HERO_FALLBACK = 0, + POINT_AHEAD_CANDIDATE_SELECTED = 1, + POINT_AHEAD_NO_TARGET = 2 + }; struct Hero *hero = &hero_lui; char *selected_entity; char *candidate_entity; @@ -25,10 +30,10 @@ int find_point_ahead(char *source_entity, char *target_out, float best) { float candidate_metric; selected_entity = ((char *)hero->moby); - selection_status = 0; + selection_status = POINT_AHEAD_HERO_FALLBACK; if (hero->state.control_mode == 0x18 || hero->state.current == 0x72) { selected_entity = 0; - selection_status = 2; + selection_status = POINT_AHEAD_NO_TARGET; } for (i = 1; i <= D_L01_001B0CB0[0]; i++) { candidate_entity = ents + (D_L01_001B0CB0[i] << 8); @@ -47,7 +52,7 @@ int find_point_ahead(char *source_entity, char *target_out, float best) { if (candidate_metric < best) { selected_entity = candidate_entity; best = candidate_metric; - selection_status = 1; + selection_status = POINT_AHEAD_CANDIDATE_SELECTED; } } for (j = 0; j < 20; j++) { @@ -66,7 +71,7 @@ int find_point_ahead(char *source_entity, char *target_out, float best) { if (candidate_metric < best) { selected_entity = candidate_entity; best = candidate_metric; - selection_status = 1; + selection_status = POINT_AHEAD_CANDIDATE_SELECTED; } } if (selected_entity != 0) { diff --git a/src/overlays/shared/mobys/initialize_moby_launch_motion.c b/src/overlays/shared/mobys/initialize_moby_launch_motion.c index abbdd6a654..1f4fee40a6 100644 --- a/src/overlays/shared/mobys/initialize_moby_launch_motion.c +++ b/src/overlays/shared/mobys/initialize_moby_launch_motion.c @@ -26,8 +26,11 @@ void initialize_moby_launch_motion(char *moby, void *local_rotation_offset, int lifetime_frames) { + enum { + MOBY_LAUNCH_STATE_MOVING = 1 + }; Dat *moby_vars = ((Dat *)MOBY(moby)->pvars); - MOBY(moby)->state = 1; + MOBY(moby)->state = MOBY_LAUNCH_STATE_MOVING; qcopy((char *)moby_vars + 0x30, initial_motion_step); qcopy((char *)moby_vars + 0x10, local_rotation_offset); moby_vars->id = scale_game_frames(lifetime_frames); diff --git a/src/overlays/shared/mobys/link_and_update_all_mobys.c b/src/overlays/shared/mobys/link_and_update_all_mobys.c index e86e1d3330..11cdadab11 100644 --- a/src/overlays/shared/mobys/link_and_update_all_mobys.c +++ b/src/overlays/shared/mobys/link_and_update_all_mobys.c @@ -14,6 +14,9 @@ extern void FUN_L00_00250480(struct Moby *moby); void link_and_update_all_mobys(void) __asm__("FUN_L00_00264740"); void link_and_update_all_mobys(void) { + enum { + MOBY_TABLE_END_STATE = 0xFF + }; struct Moby *moby; struct Moby *last; struct Moby *current; @@ -22,7 +25,7 @@ void link_and_update_all_mobys(void) { suck_moby_list = 0; moby = (struct Moby *)moby_table; last = 0; - while (moby->state != 0xFF) { + while (moby->state != MOBY_TABLE_END_STATE) { if (!(moby->state & 0x80) && !(moby->flags & 2)) { if (last != 0) { last->next = moby; diff --git a/src/overlays/shared/mobys/moby_draw_callback_update.c b/src/overlays/shared/mobys/moby_draw_callback_update.c index 77433dab4a..ce4f201956 100644 --- a/src/overlays/shared/mobys/moby_draw_callback_update.c +++ b/src/overlays/shared/mobys/moby_draw_callback_update.c @@ -22,7 +22,7 @@ void moby_draw_callback_update(struct Moby *moby) { case DRAW_CALLBACK_INITIALIZE: prepare_scaled_float_table_with_target_byte( l03_draw_callback_setup_byte_target, 0x20, 0.6666667f); - moby->state = 1; + moby->state = DRAW_CALLBACK_REGISTER; moby->update_dist = 0xFF; break; case DRAW_CALLBACK_REGISTER: diff --git a/src/overlays/shared/mobys/record_moby_context_bytes.c b/src/overlays/shared/mobys/record_moby_context_bytes.c index c03542fa29..ddc2ab7e6b 100644 --- a/src/overlays/shared/mobys/record_moby_context_bytes.c +++ b/src/overlays/shared/mobys/record_moby_context_bytes.c @@ -29,13 +29,16 @@ void record_moby_context_bytes(char *source, void record_moby_context_bytes( char *source, int byte_count, char *context_moby, int mode, Table *entry_table) { + enum { + MOBY_CONTEXT_MODE_MOBY_RELATIVE = 1 + }; short v20 = ((short)MOBY(context_moby)->save_id); short v19 = MOBY(context_moby)->oclass; short key; int i; Entry *e; Entry *ne; - if (mode == 1) { + if (mode == MOBY_CONTEXT_MODE_MOBY_RELATIVE) { key = source - context_moby; } else { key = (int)source - *(unsigned short *)(context_moby + 0x78); diff --git a/src/overlays/shared/mobys/rig_probe_setup.c b/src/overlays/shared/mobys/rig_probe_setup.c index 854f23b319..f868bc1334 100644 --- a/src/overlays/shared/mobys/rig_probe_setup.c +++ b/src/overlays/shared/mobys/rig_probe_setup.c @@ -28,6 +28,11 @@ int rig_probe_setup( float *radius, float *distance) { + enum { + RIG_PROBE_SINGLE_JOINT = 2, + RIG_PROBE_LOCAL_POSITION_WITH_DISTANCE = 3, + RIG_PROBE_JOINT_PAIR = 4 + }; char *probe_entry; float scale; u128 matrix[4]; @@ -44,19 +49,19 @@ int rig_probe_setup( scale = MOBY(moby)->scale * 0.0009765625f; euler_rotation_matrix(matrix, moby + 0x40); - if (*type < 2 || *type == 3) { + if (*type < RIG_PROBE_SINGLE_JOINT || *type == RIG_PROBE_LOCAL_POSITION_WITH_DISTANCE) { qcopy(probe_position, probe_entry + 0x10); fast_vec_scale(probe_position, probe_position, scale); transform_vector(probe_position, probe_position, matrix); fast_vec_add(probe_position, probe_position, &MOBY(moby)->pos); *radius = probe_position[3] * scale; - if (*type < 2) { + if (*type < RIG_PROBE_SINGLE_JOINT) { *distance = 0.0f; } else { *distance = *(float *)(probe_entry + 4) * scale; } return 1; - } else if (*type == 2) { + } else if (*type == RIG_PROBE_SINGLE_JOINT) { short joint = *(short *)(*(char **)(moby + 0x94) + 2); if (joint != 0) { compute_moby_joint_matrices(moby, joint, 0); @@ -68,7 +73,7 @@ int rig_probe_setup( *radius = *(float *)(probe_entry + 0xc) * scale; *distance = 0.0f; return 1; - } else if (*type == 4) { + } else if (*type == RIG_PROBE_JOINT_PAIR) { short joint = *(short *)(*(char **)(moby + 0x94) + 2); if (joint != 0) { compute_moby_joint_matrices(moby, joint, 0); diff --git a/src/overlays/shared/mobys/select_auto_aim_target_moby.c b/src/overlays/shared/mobys/select_auto_aim_target_moby.c index c3cb3f3cb1..1bb79b2e6f 100644 --- a/src/overlays/shared/mobys/select_auto_aim_target_moby.c +++ b/src/overlays/shared/mobys/select_auto_aim_target_moby.c @@ -439,7 +439,7 @@ void draw_trail(void *first_spawn_position, } extern int D_L00_0015F640; -extern u8 D_L00_00179118[]; +extern u8 l00_dialogue_message_text_buffer[] __asm__("D_L00_00179118"); int get_help_message_text(int) __asm__("FUN_001fdd10"); void FUN_001165b8_00263d40(char *, int) __asm__("FUN_001165b8"); /* Calls strcpy with D_L00_00179118 and get_help_message_text(a); stores b (default 0xB4 frames). */ @@ -448,7 +448,7 @@ void queue_dialogue_message(int a, int b) __asm__("FUN_L00_00263d40"); void queue_dialogue_message(int message_id, int message_duration_frames) { if (message_duration_frames == -1) message_duration_frames = scale_game_frames(0xB4); - FUN_001165b8_00263d40(D_L00_00179118, get_help_message_text(message_id)); + FUN_001165b8_00263d40(l00_dialogue_message_text_buffer, get_help_message_text(message_id)); D_L00_0015F640 = message_duration_frames; } @@ -463,7 +463,9 @@ void queue_formatted_dialogue_message(s32 help_message_selector, s32 message_duration_frames) { if (message_duration_frames == -1) message_duration_frames = scale_game_frames(0xB4); - sprintf(D_L00_00179118, get_help_message_text(help_message_selector), format_argument); + sprintf(l00_dialogue_message_text_buffer, + get_help_message_text(help_message_selector), + format_argument); D_L00_0015F640 = message_duration_frames; } diff --git a/src/overlays/shared/mobys/select_moby_record_by_xy_distance.c b/src/overlays/shared/mobys/select_moby_record_by_xy_distance.c index eef9f287d8..c580b9b302 100644 --- a/src/overlays/shared/mobys/select_moby_record_by_xy_distance.c +++ b/src/overlays/shared/mobys/select_moby_record_by_xy_distance.c @@ -16,6 +16,11 @@ extern struct Hero hero_lui __asm__("D_0013F350") NOT_SDA; int select_moby_record_by_xy_distance(char *a, char *o, float best) __asm__("FUN_L04_00252e18"); int select_moby_record_by_xy_distance(char *reference_object, char *output_record, float best) { + enum { + MOBY_SELECTION_HERO_FALLBACK = 0, + MOBY_SELECTION_NEARER_CANDIDATE = 1, + MOBY_SELECTION_NO_TARGET = 2 + }; struct Hero *hero = &hero_lui; char *selected_moby; char *candidate_moby; @@ -25,10 +30,10 @@ int select_moby_record_by_xy_distance(char *reference_object, char *output_recor float candidate_comparison_value; selected_moby = ((char *)hero->moby); - selection_status = 0; + selection_status = MOBY_SELECTION_HERO_FALLBACK; if (hero->state.control_mode == 0x18 || hero->state.current == 0x72) { selected_moby = 0; - selection_status = 2; + selection_status = MOBY_SELECTION_NO_TARGET; } for (i = 1; i <= D_L04_001B09B0[0]; i++) { candidate_moby = moby_array + (D_L04_001B09B0[i] << 8); @@ -47,7 +52,7 @@ int select_moby_record_by_xy_distance(char *reference_object, char *output_recor if (candidate_comparison_value < best) { selected_moby = candidate_moby; best = candidate_comparison_value; - selection_status = 1; + selection_status = MOBY_SELECTION_NEARER_CANDIDATE; } } for (j = 0; j < 20; j++) { @@ -67,7 +72,7 @@ int select_moby_record_by_xy_distance(char *reference_object, char *output_recor if (candidate_comparison_value < best) { selected_moby = candidate_moby; best = candidate_comparison_value; - selection_status = 1; + selection_status = MOBY_SELECTION_NEARER_CANDIDATE; } } if (selected_moby != 0) { diff --git a/src/overlays/shared/mobys/select_moby_target_goal.c b/src/overlays/shared/mobys/select_moby_target_goal.c index 75b1994eae..4fc8bf8a5a 100644 --- a/src/overlays/shared/mobys/select_moby_target_goal.c +++ b/src/overlays/shared/mobys/select_moby_target_goal.c @@ -19,6 +19,11 @@ int select_moby_target_goal(char *comparison_source, float best) __asm__("FUN_L02_00261c80"); int select_moby_target_goal(char *comparison_source, char *output_data, float best) { + enum { + TARGET_SELECTION_DEFAULT_HERO = 0, + TARGET_SELECTION_CANDIDATE = 1, + TARGET_SELECTION_HERO_EXCLUDED = 2 + }; struct Hero *hero = &hero_lui; char *selected_moby; char *candidate_moby; @@ -28,10 +33,10 @@ int select_moby_target_goal(char *comparison_source, char *output_data, float be float candidate_metric; selected_moby = ((char *)hero->moby); - selection_status = 0; + selection_status = TARGET_SELECTION_DEFAULT_HERO; if (hero->state.control_mode == 0x18 || hero->state.current == 0x72) { selected_moby = 0; - selection_status = 2; + selection_status = TARGET_SELECTION_HERO_EXCLUDED; } for (i = 1; i <= D_L02_001B0E30[0]; i++) { candidate_moby = D_L00_0015FFD8_25fcb8 + (D_L02_001B0E30[i] << 8); @@ -49,7 +54,7 @@ int select_moby_target_goal(char *comparison_source, char *output_data, float be if (candidate_metric < best) { selected_moby = candidate_moby; best = candidate_metric; - selection_status = 1; + selection_status = TARGET_SELECTION_CANDIDATE; } } for (j = 0; j < 20; j++) { @@ -68,7 +73,7 @@ int select_moby_target_goal(char *comparison_source, char *output_data, float be if (candidate_metric < best) { selected_moby = candidate_moby; best = candidate_metric; - selection_status = 1; + selection_status = TARGET_SELECTION_CANDIDATE; } } if (selected_moby != 0) { diff --git a/src/overlays/shared/mobys/select_nearest_xy_moby_with_hero_fallback.c b/src/overlays/shared/mobys/select_nearest_xy_moby_with_hero_fallback.c index 6b2fc1f26f..b6f88574dd 100644 --- a/src/overlays/shared/mobys/select_nearest_xy_moby_with_hero_fallback.c +++ b/src/overlays/shared/mobys/select_nearest_xy_moby_with_hero_fallback.c @@ -21,6 +21,11 @@ int select_nearest_xy_moby_with_hero_fallback(char *comparison_reference, char *selection_output, float best) { + enum { + XY_SELECTION_HERO_FALLBACK = 0, + XY_SELECTION_CANDIDATE_SELECTED = 1, + XY_SELECTION_HERO_FALLBACK_DISABLED = 2 + }; struct Hero *hero = &hero_lui; char *selected_moby; char *candidate_moby; @@ -30,10 +35,10 @@ int select_nearest_xy_moby_with_hero_fallback(char *comparison_reference, float candidate_metric; selected_moby = ((char *)hero->moby); - selection_status = 0; + selection_status = XY_SELECTION_HERO_FALLBACK; if (hero->state.control_mode == 0x18 || hero->state.current == 0x72) { selected_moby = 0; - selection_status = 2; + selection_status = XY_SELECTION_HERO_FALLBACK_DISABLED; } for (i = 1; i <= D_L08_001B1030[0]; i++) { candidate_moby = D_L08_0015FFD8 + (D_L08_001B1030[i] << 8); @@ -52,7 +57,7 @@ int select_nearest_xy_moby_with_hero_fallback(char *comparison_reference, if (candidate_metric < best) { selected_moby = candidate_moby; best = candidate_metric; - selection_status = 1; + selection_status = XY_SELECTION_CANDIDATE_SELECTED; } } for (j = 0; j < 20; j++) { @@ -72,7 +77,7 @@ int select_nearest_xy_moby_with_hero_fallback(char *comparison_reference, if (candidate_metric < best) { selected_moby = candidate_moby; best = candidate_metric; - selection_status = 1; + selection_status = XY_SELECTION_CANDIDATE_SELECTED; } } if (selected_moby != 0) { diff --git a/src/overlays/shared/mobys/suck_cannon_methods.c b/src/overlays/shared/mobys/suck_cannon_methods.c index 7919007926..cd1558262a 100644 --- a/src/overlays/shared/mobys/suck_cannon_methods.c +++ b/src/overlays/shared/mobys/suck_cannon_methods.c @@ -24,11 +24,14 @@ int launch_suck_cannon_projectile_and_sync_moby_state(struct Moby *moby, int position_source_moby, float position_z_offset) { + enum { + MOBY_STATE_SUCK_CANNON_LAUNCHED = 7 + }; char *callback_record = get_moby_suck_cannon_record(moby); int projectile_launch_result = launch_suck_cannon_projectile( moby, launch_data_source, position_source_moby, position_z_offset); if (projectile_launch_result != 0) { - moby->state = 7; + moby->state = MOBY_STATE_SUCK_CANNON_LAUNCHED; } else if ((unsigned char)((char)moby->state) == 7) { moby->state = 1; } @@ -46,12 +49,15 @@ extern int process_moby_suck_cannon_suction(void *) __asm__("FUN_L00_002db8f8"); int update_moby_suck_cannon_state(struct Moby *a) __asm__("FUN_L02_002d61c0"); int update_moby_suck_cannon_state(struct Moby *moby) { + enum { + MOBY_STATE_SUCK_CANNON_SUCTION_ACTIVE = 0x9 + }; int suction_result = process_moby_suck_cannon_suction(moby); if (suction_result == 0) { - if (moby->state == 0x9) + if (moby->state == MOBY_STATE_SUCK_CANNON_SUCTION_ACTIVE) moby->state = 1; } else { - moby->state = 0x9; + moby->state = MOBY_STATE_SUCK_CANNON_SUCTION_ACTIVE; } return suction_result; } diff --git a/src/overlays/shared/mobys/test_path_segment_strict_crossing.c b/src/overlays/shared/mobys/test_path_segment_strict_crossing.c index fc08ff4afb..8c183fd2a2 100644 --- a/src/overlays/shared/mobys/test_path_segment_strict_crossing.c +++ b/src/overlays/shared/mobys/test_path_segment_strict_crossing.c @@ -110,52 +110,63 @@ typedef struct { int FUN_L00_00261b48(int idx, void *a, void *b, void *c); -int FUN_L00_00261b48(int idx, void *a, void *b, void *c) { - float v[4], w[4], z[4], t[4], u[4]; +int FUN_L00_00261b48(int segment_path_index, + void *segment_start, + void *segment_end, + + void *adjusted_endpoint) { + float v[4], perpendicular_xy_axis[4], z[4], previous_path_point_in_basis[4], u[4]; float best; float zero; int found = 0; int i = 1; int offset; - float *prev; - float *cur; - fast_vec_sub(v, b, a); + float *previous_path_point_slot; + float *current_path_point_slot; + fast_vec_sub(v, segment_end, segment_start); v[2] = 0; fast_vec_normalize(v, v, 1.0f / fast_vec_length(v)); - clear_u64_value(w); - w[0] = v[1]; - w[1] = -v[0]; + clear_u64_value(perpendicular_xy_axis); + perpendicular_xy_axis[0] = v[1]; + perpendicular_xy_axis[1] = -v[0]; clear_u64_value(z); z[2] = 1.0f; best = 1.0f; - fast_vec_sub(t, (char *)((SegmentPath **)D_L00_001B04B0_261968)[idx] + 0x10, a); - transform_vector_by_basis(t, t, v); - prev = t; - cur = u; - if (i < ((SegmentPath **)D_L00_001B04B0_261968)[idx]->count) { + fast_vec_sub(previous_path_point_in_basis, + (char *)((SegmentPath **)D_L00_001B04B0_261968)[segment_path_index] + 0x10, + segment_start); + transform_vector_by_basis(previous_path_point_in_basis, previous_path_point_in_basis, v); + previous_path_point_slot = previous_path_point_in_basis; + current_path_point_slot = u; + if (i < ((SegmentPath **)D_L00_001B04B0_261968)[segment_path_index]->count) { offset = 0x20; zero = 0.0f; do { - fast_vec_sub(cur, (char *)((SegmentPath **)D_L00_001B04B0_261968)[idx] + offset, a); - transform_vector_by_basis(cur, cur, v); - if (t[3] != zero || u[3] != zero) { - if (u[1] * t[1] < 0.0f) { - float x = (t[0] - u[0]) / (t[1] - u[1]) * -u[1] + u[0]; + fast_vec_sub(current_path_point_slot, + (char *)((SegmentPath **)D_L00_001B04B0_261968)[segment_path_index] + + offset, + segment_start); + transform_vector_by_basis(current_path_point_slot, current_path_point_slot, v); + if (previous_path_point_in_basis[3] != zero || u[3] != zero) { + if (u[1] * previous_path_point_in_basis[1] < 0.0f) { + float x = (previous_path_point_in_basis[0] - u[0]) / + (previous_path_point_in_basis[1] - u[1]) * -u[1] + + u[0]; if (x > 0.0f && x < best) { best = x; found = 1; - qcopy(prev, cur); + qcopy(previous_path_point_slot, current_path_point_slot); goto next; } } } - qcopy(prev, cur); + qcopy(previous_path_point_slot, current_path_point_slot); next: i++; offset += 0x10; - } while (i < ((SegmentPath **)D_L00_001B04B0_261968)[idx]->count); + } while (i < ((SegmentPath **)D_L00_001B04B0_261968)[segment_path_index]->count); } - lerp_vector(c, a, b, best); + lerp_vector(adjusted_endpoint, segment_start, segment_end, best); return found; } @@ -345,30 +356,36 @@ void path_sample_at_distance(PointPath *path, f32 spacing) __asm__("FUN_L00_00262360"); void path_sample_at_distance( - PointPath *path, s32 *seg_out, f32 *along, Vec4 *out, f32 dist, f32 spacing) { - Vec4 tmp; + PointPath *path, + s32 *seg_out, + f32 *along, + Vec4 *sampled_position, + f32 path_distance, + + f32 spacing) { + Vec4 sampling_intermediate; s32 seg; - seg = truncate_float_to_s32(dist / spacing); + seg = truncate_float_to_s32(path_distance / spacing); *seg_out = seg; if (seg >= path->count - 1) { *seg_out = path->count - 1; *along = 0.0f; - out->q = (path->points + *seg_out)->q; + sampled_position->q = (path->points + *seg_out)->q; return; } if (seg < 0) { *seg_out = 0; *along = 0.0f; - out->q = (path->points + *seg_out)->q; + sampled_position->q = (path->points + *seg_out)->q; return; } - *along = dist - convert_integer_to_float(seg) * spacing; - fast_vec_sub(&tmp, &path->points[*seg_out + 1], &path->points[*seg_out]); - out->q = tmp.q; - fast_vec_normalize(out, out, *along); - fast_vec_add(&tmp, out, &path->points[*seg_out]); - out->q = tmp.q; + *along = path_distance - convert_integer_to_float(seg) * spacing; + fast_vec_sub(&sampling_intermediate, &path->points[*seg_out + 1], &path->points[*seg_out]); + sampled_position->q = sampling_intermediate.q; + fast_vec_normalize(sampled_position, sampled_position, *along); + fast_vec_add(&sampling_intermediate, sampled_position, &path->points[*seg_out]); + sampled_position->q = sampling_intermediate.q; } /* Ported from rac1-decomp (src/overlays/shared/mobyutil_00261B00.c: func_L00_002634F8), where it is exact; names translated to the US level program. */ diff --git a/src/overlays/shared/mobys/update_moby_proximity_interaction.c b/src/overlays/shared/mobys/update_moby_proximity_interaction.c index 27b91de4a4..cf5b531699 100644 --- a/src/overlays/shared/mobys/update_moby_proximity_interaction.c +++ b/src/overlays/shared/mobys/update_moby_proximity_interaction.c @@ -28,6 +28,10 @@ extern void draw_light_flare() __asm__("func_0022DF40"); void update_moby_proximity_interaction(unsigned char *moby) __asm__("FUN_L00_0028e180"); void update_moby_proximity_interaction(unsigned char *moby) { + enum { + PROXIMITY_MOBY_STATE_INTERACTIVE = 0, + PROXIMITY_MOBY_STATE_FOLLOWUP_SCENES = 0x2A + }; char *proximity_state_data = ((char *)MOBY(moby)->pvars); float *moby_position; float proximity_test_position[4]; @@ -35,7 +39,7 @@ void update_moby_proximity_interaction(unsigned char *moby) { int one; unsigned char *hero_position_or_scene_flags; - if (MOBY(moby)->state != 0x2A) { + if (MOBY(moby)->state != PROXIMITY_MOBY_STATE_FOLLOWUP_SCENES) { if (MOBY(moby)->visible != 0) { MOBY(moby)->command += 2; color_pulse_intensity = @@ -83,8 +87,8 @@ void update_moby_proximity_interaction(unsigned char *moby) { if (*(short *)(proximity_state_data + 0xC) != 0) { int help_message_accepted = try_set_help_message(2, 0x53E4) != 0; if ((pad_pressed_words[0] & 0x10) && help_message_accepted) { - if (current_level_index == 10 && hero.vehicle_mode == 1) { - MOBY(moby)->state = 0x2A; + if (current_level_index == 10 && hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) { + MOBY(moby)->state = PROXIMITY_MOBY_STATE_FOLLOWUP_SCENES; MOBY(moby)->flags |= 0x41; start_scene(9); } else { @@ -116,7 +120,7 @@ void update_moby_proximity_interaction(unsigned char *moby) { start_scene(6); hero_position_or_scene_flags[0x4B] = 1; } else { - MOBY(moby)->state = 0; + MOBY(moby)->state = PROXIMITY_MOBY_STATE_INTERACTIVE; MOBY(moby)->flags &= 0xFFBE; one = 1; ship_index[1] = one; diff --git a/src/overlays/shared/mobys/update_object_wander_movement.c b/src/overlays/shared/mobys/update_object_wander_movement.c index 027f73435e..5298532046 100644 --- a/src/overlays/shared/mobys/update_object_wander_movement.c +++ b/src/overlays/shared/mobys/update_object_wander_movement.c @@ -12,7 +12,8 @@ #include "rnc/overlay/shared/mobys/find_moby_hit.h" void step_angle_toward_target(void *, s32, f32, f32) __asm__("FUN_L00_0025bc00"); -s32 FUN_L00_00258490_261630(void *, void *, void *, s32, f32, f32, f32, f32) __asm__("FUN_L00_00258490"); +s32 move_moby_xy_with_collision_constraints( + void *, void *, void *, s32, f32, f32, f32, f32) __asm__("FUN_L00_00258490"); void update_object_wander_movement(u8 *moving_object, u8 *movement_state, f32 a, @@ -47,14 +48,15 @@ void update_object_wander_movement(u8 *moving_object, fast_cos(*(f32 *)(moving_object + 0x48)) * *(f32 *)(movement_state + 0x14); ((f32 *)proposed_position)[1] += fast_sin(*(f32 *)(moving_object + 0x48)) * *(f32 *)(movement_state + 0x14); - movement_unconstrained = FUN_L00_00258490_261630(moving_object, - pos, - proposed_position, - 0, - collision_height_offset, - *(f32 *)(movement_state + 0x10), - ground_height_difference_limit, - 0.52359879f); + movement_unconstrained = + move_moby_xy_with_collision_constraints(moving_object, + pos, + proposed_position, + 0, + collision_height_offset, + *(f32 *)(movement_state + 0x10), + ground_height_difference_limit, + 0.52359879f); *(f32 *)(moving_object + 0x18) = probe_ground_height(pos, 0, 0.5f); planar_distance = vector_distance_xy(pos, movement_state); if (movement_unconstrained == 0 || *(f32 *)(movement_state + 0x1C) < planar_distance) { diff --git a/src/overlays/shared/pickups/bolt.c b/src/overlays/shared/pickups/bolt.c index 3258a7e48c..b4ef3aa11e 100644 --- a/src/overlays/shared/pickups/bolt.c +++ b/src/overlays/shared/pickups/bolt.c @@ -21,6 +21,14 @@ #include "qcopy.h" #include "rnc/overlay/shared/world/collision.h" +enum { + BOLT_INITIALIZE = 0x0, + BOLT_FALLING = 0x1, + BOLT_SETTLING = 0x2, + BOLT_IDLE = 0x3, + BOLT_MOVE_TO_HERO = 0x4 +}; + typedef struct { u8 pad0[0x24]; f32 scale; /* 0x24 */ @@ -174,13 +182,6 @@ void bolt_update(Bolt *obj) __asm__("FUN_L00_002a5dd8"); /* Moby classes 13-16 */ void bolt_update(Bolt *bolt_moby) { - enum { - BOLT_INITIALIZE = 0x0, - BOLT_FALLING = 0x1, - BOLT_SETTLING = 0x2, - BOLT_IDLE = 0x3, - BOLT_MOVE_TO_HERO = 0x4 - }; BoltVars *v = bolt_moby->vars; Vec4 geometry_scratch; Vec4 vector_scratch; @@ -211,7 +212,7 @@ void bolt_update(Bolt *bolt_moby) { } switch (bolt_moby->state) { case BOLT_INITIALIZE: - bolt_moby->state = 3; + bolt_moby->state = BOLT_IDLE; bolt_moby->unk73 = 0x14; bolt_moby->flags |= 0x100; bolt_moby->unk30 = 0x20; @@ -312,7 +313,7 @@ void bolt_update(Bolt *bolt_moby) { settling_inclination_limit)) { return; } - bolt_moby->state = 2; + bolt_moby->state = BOLT_SETTLING; v->hop_frames = v->hop_left = truncate_float_to_s32(scale_time(random_float_between(30.0f, 40.0f))); if (D_L00_00173E40.moby != 0 && FUN_L00_002603d0((void *)D_L00_00173E40.moby) != 0) { @@ -341,7 +342,7 @@ void bolt_update(Bolt *bolt_moby) { if (--v->hop_left != 0) { return; } - bolt_moby->state = 3; + bolt_moby->state = BOLT_IDLE; v->hop_frames = v->hop_left = truncate_float_to_s32(scale_time(random_float_between(10.0f, 20.0f))); return; @@ -616,7 +617,7 @@ void update_bolt_grounded_pose(char *moby, void *base_position_output, void *bas qcopy(base_position_output, A); if (base_rotation_output != 0) qcopy(base_rotation_output, B); - if (MOBY(moby)->state == 3) { + if (MOBY(moby)->state == BOLT_IDLE) { char *ground_moby = *(char **)(grounded_bolt_vars + 0x5C); if (ground_moby != 0 && *(unsigned char *)(grounded_bolt_vars + 0x57) == 0) { int should_detach_from_ground; @@ -629,7 +630,7 @@ void update_bolt_grounded_pose(char *moby, void *base_position_output, void *bas coll_sphere(ground_collision_radius, &MOBY(moby)->pos, 0x22, moby) == 0; } if (should_detach_from_ground) { - MOBY(moby)->state = 1; + MOBY(moby)->state = BOLT_FALLING; clear_u64_value(grounded_bolt_vars + 0x30); *(float *)(grounded_bolt_vars + 0x3C) = 1.0f; x = FUN_L00_002603d0_c(*(char **)(grounded_bolt_vars + 0x5C)); @@ -666,7 +667,7 @@ int begin_bolt_attraction(void *ov, float k; float attraction_geometry_scratch[3][4] __attribute__((aligned(16))); - if (MOBY(bolt_moby)->state == 4) { + if (MOBY(bolt_moby)->state == BOLT_MOVE_TO_HERO) { return 0; } sound_cooldown_frames = scale_game_frames(3); @@ -681,7 +682,7 @@ int begin_bolt_attraction(void *ov, if (attraction_pitch_angle == 0.0f) attraction_pitch_angle = random_float_between(0.0f, 30.0f) * DEG_TO_RAD; } - if (MOBY(bolt_moby)->state == 3) { + if (MOBY(bolt_moby)->state == BOLT_IDLE) { euler_rotation_basis(attraction_geometry_scratch, bolt_vars + 0x10); fast_vec_normalize(bolt_vars + 0x20, attraction_geometry_scratch[2], @@ -702,7 +703,7 @@ int begin_bolt_attraction(void *ov, DEG_TO_RAD; build_quaternion_from_axis_angle(bolt_vars + 0x30, bolt_vars + 0x30, k * frame_time); } - MOBY(bolt_moby)->state = 4; + MOBY(bolt_moby)->state = BOLT_MOVE_TO_HERO; return 1; } @@ -779,7 +780,7 @@ struct Moby *spawn_bolt_by_value( spawned_bolt->update_dist = 0x40; spawned_bolt->draw_dist = 0x40; spawned_bolt->visible = 1; - spawned_bolt->state = 1; + spawned_bolt->state = BOLT_FALLING; spawned_bolt->scale = spawned_bolt->pclass->scale * scale; euler_rotation_basis(&spawned_bolt->rot_row0, &spawned_bolt->rot); if ((bolt_source->flags & 0x20) && (color = *(u8 **)(bolt_source->pvars + 0xC)) != 0) diff --git a/src/overlays/shared/pickups/buried_bolts.c b/src/overlays/shared/pickups/buried_bolts.c index 74b7f70ffc..3cb4b89406 100644 --- a/src/overlays/shared/pickups/buried_bolts.c +++ b/src/overlays/shared/pickups/buried_bolts.c @@ -32,13 +32,17 @@ void buried_bolts_update(struct Moby *moby) __asm__("FUN_L01_002f2eb8"); /* Moby class 605 */ void buried_bolts_update(struct Moby *moby) { + enum { + AREA_MOBY_STATE_UNINITIALIZED = 0, + AREA_MOBY_STATE_INITIALIZED = 1 + }; AreaVars *area_vars = (AreaVars *)moby->pvars; Vec4 target; s32 k; s32 *path; f32 target_distance; - if (moby->state == 0) { + if (moby->state == AREA_MOBY_STATE_UNINITIALIZED) { if (area_vars == 0) { mark_moby_for_removal(moby); return; @@ -46,7 +50,7 @@ void buried_bolts_update(struct Moby *moby) { moby->update_dist = 0xFF; qcopy(&area_vars->home, &moby->pos); moby->flags |= 0x41; - moby->state = 1; + moby->state = AREA_MOBY_STATE_INITIALIZED; if (moby->command == 0 && D_0015ED84 < 20) { k = D_0014BF10[D_L01_00161AF0 / 2 + D_0015ED84 * 16]; if (D_L01_00161AF0 & 1) { diff --git a/src/overlays/shared/pickups/codebot.c b/src/overlays/shared/pickups/codebot.c index 240629c3ea..4222fe82e0 100644 --- a/src/overlays/shared/pickups/codebot.c +++ b/src/overlays/shared/pickups/codebot.c @@ -61,7 +61,7 @@ void codebot_update(struct Moby *moby) { if (alternate_item_available[2] != 0) { mark_moby_for_removal(moby); } else { - moby->state = 1; + moby->state = CODEBOT_CHECK_HERO_PROXIMITY; moby->pos.z += 1.0f; } break; @@ -71,7 +71,7 @@ void codebot_update(struct Moby *moby) { if (hero.state.current != 0x32) { moby->flags |= 0x41; start_scene(1); - moby->state = 2; + moby->state = CODEBOT_RECORD_COLLECTION; } } break; @@ -82,7 +82,7 @@ void codebot_update(struct Moby *moby) { collection_flags = alternate_item_available; collection_flags[2] = 1; collection_flags[0x78] = 1; - moby->state = 3; + moby->state = CODEBOT_REMOVE; memcard_save_data(0, -1); } break; diff --git a/src/overlays/shared/pickups/crate.c b/src/overlays/shared/pickups/crate.c index 400354e4e9..46302e4cd7 100644 --- a/src/overlays/shared/pickups/crate.c +++ b/src/overlays/shared/pickups/crate.c @@ -23,6 +23,16 @@ #include "rnc/rendering/debug/debug_menu.h" /* Class header view: pclass + 0xE and + 0x10. */ +enum { + CRATE_STATE_INITIALIZE = 0, + CRATE_STATE_PROCESS_HITS = 1, + CRATE_STATE_CLASS_CHANGE_COOLDOWN = 2, + CRATE_STATE_BROKEN = 3, + CRATE_STATE_REACTIVATION_DELAY = 4, + CRATE_STATE_DETONATION_COUNTDOWN = 5, + CRATE_STATE_WAIT_RESPAWN = 6 +}; + typedef struct { u8 pad00[0xE]; u8 unkE; @@ -248,15 +258,6 @@ void crate_update(struct Moby *moby) __asm__("FUN_L00_002cf218"); /* Moby classes 500-502, 505, 511 */ void crate_update(struct Moby *moby) { - enum { - CRATE_STATE_INITIALIZE = 0, - CRATE_STATE_PROCESS_HITS = 1, - CRATE_STATE_CLASS_CHANGE_COOLDOWN = 2, - CRATE_STATE_BROKEN = 3, - CRATE_STATE_REACTIVATION_DELAY = 4, - CRATE_STATE_DETONATION_COUNTDOWN = 5, - CRATE_STATE_WAIT_RESPAWN = 6 - }; Burst burst; Vec4f at; s32 hitKind; @@ -287,7 +288,7 @@ void crate_update(struct Moby *moby) { } else { coll->flags &= ~1; } - if (crate_vars->frameB4 != D_L00_0015F5CC_macro && moby->state != 0 && + if (crate_vars->frameB4 != D_L00_0015F5CC_macro && moby->state != CRATE_STATE_INITIALIZE && (crate_vars->flags & 0xC)) { update_crate_stack_motion(moby); } @@ -305,12 +306,12 @@ void crate_update(struct Moby *moby) { case CRATE_STATE_INITIALIZE: clear_u64_value(&crate_vars->unk40); if (D_0015ED84 == 0x12 && moby->oclass == 0x1FF && crate_vars->unkC8 != 0) { - moby->state = 6; + moby->state = CRATE_STATE_WAIT_RESPAWN; moby->flags |= 0x41; moby->collision = 0; moby->flags &= ~0x1000; } else { - moby->state = 1; + moby->state = CRATE_STATE_PROCESS_HITS; } crate_vars->unkA8 = 0; if ((crate_vars->flags ^ 1) & 1) { @@ -330,7 +331,7 @@ void crate_update(struct Moby *moby) { (hero.ground_moby == moby && hero.air_frames.s == 0) || hero.ledge_moby == (s32)moby || touched)) { moby->command = 0; - moby->state = 5; + moby->state = CRATE_STATE_DETONATION_COUNTDOWN; break; } if (hit_contact == NULL || !(hit_contact->damage > 0.0f)) { @@ -341,7 +342,7 @@ void crate_update(struct Moby *moby) { doHit = 0; } if (moby->oclass == 0x1F9) { - moby->state = 5; + moby->state = CRATE_STATE_DETONATION_COUNTDOWN; if (hit_contact->hit.s.flags & 0x20000) { moby->command = 1; } else { @@ -372,7 +373,7 @@ void crate_update(struct Moby *moby) { moby->pclass = D_L00_00197300[moby->class_slot]; update_moby_animation_state(moby); moby->unk72 = ((Part *)moby->pclass)->unkE; - moby->state = 2; + moby->state = CRATE_STATE_CLASS_CHANGE_COOLDOWN; moby->command = scale_game_frames(15); doHit = 0; } @@ -399,7 +400,7 @@ void crate_update(struct Moby *moby) { case CRATE_STATE_CLASS_CHANGE_COOLDOWN: if (--moby->command == 0xFF) { moby->hit_slot = 0xFF; - moby->state = 1; + moby->state = CRATE_STATE_PROCESS_HITS; } break; @@ -430,7 +431,7 @@ void crate_update(struct Moby *moby) { if (moby->unkB4 >= 2) { moby->unkB4 = 1; } - moby->state = 6; + moby->state = CRATE_STATE_WAIT_RESPAWN; if (D_0015ED84 == 0x12) { crate_vars->unkC9 = FUN_L00_00257b90(300, 720); } else { @@ -452,7 +453,7 @@ void crate_update(struct Moby *moby) { break; } if (moby->group == 0xFF) { - moby->state = 1; + moby->state = CRATE_STATE_PROCESS_HITS; moby->visible = 1; moby->flags &= ~1; moby->collision = ((Part *)moby->pclass)->unk10; @@ -489,7 +490,7 @@ void crate_update(struct Moby *moby) { get_first_moby_in_group(&it, moby->group, 0, 0); while (it != NULL) { if (moby != it && !(vector_distance_xy(&moby->pos, &it->pos) > 0.1f) && - it->state == 1) { + it->state == CRATE_STATE_PROCESS_HITS) { CrateVars *ipv = (CrateVars *)it->pvars; if (ipv->rider == NULL) { @@ -498,7 +499,7 @@ void crate_update(struct Moby *moby) { ipv->rider = moby; crate_vars->below = it; crate_vars->rider = NULL; - moby->state = 1; + moby->state = CRATE_STATE_PROCESS_HITS; moby->visible = 1; moby->flags &= ~1; moby->collision = ((Part *)moby->pclass)->unk10; @@ -509,9 +510,9 @@ void crate_update(struct Moby *moby) { } get_next_moby_in_group(&it, it, 0, 0); } - if (moby->state != 1) { + if (moby->state != CRATE_STATE_PROCESS_HITS) { moby->pos.z = probe_ground_height(&moby->pos, 0, 0.5f); - moby->state = 1; + moby->state = CRATE_STATE_PROCESS_HITS; crate_vars->rider = NULL; crate_vars->below = NULL; moby->visible = 1; @@ -549,7 +550,7 @@ void crate_update(struct Moby *moby) { case CRATE_STATE_REACTIVATION_DELAY: if (FUN_L00_001fefc8(&moby->command)) { - moby->state = 1; + moby->state = CRATE_STATE_PROCESS_HITS; moby->flags &= ~1; } break; @@ -653,15 +654,19 @@ struct Vars; void ground_attached_update(M_2cfcb8 *moby) __asm__("FUN_L00_002cfcb8"); void ground_attached_update(M_2cfcb8 *moby) { + enum { + ROUTE_ENTRY_ADVANCE_LIMIT = 0x111 + }; V_2cfcb8 probe_top; V_2cfcb8 probe_bottom; V_2cfcb8 probe_up; V_2cfcb8 probe_down; M_2cfcb8 *member; - M_2cfcb8 *other; + M_2cfcb8 *later_group_member; Vars *vars; Vars *below_vars; - V_2cfcb8 *src1, *src2, *src3, *src4; + V_2cfcb8 *ungrouped_crate_position, *group_crate_probe_position, *stacked_crate_position, + *stack_base_probe_position; R_2cfcb8 *route; s32 group, flags_before, i, member_flags; M_2cfcb8 *below; @@ -683,9 +688,9 @@ void ground_attached_update(M_2cfcb8 *moby) { vars->hC4 = moby->hA8; vars->height = 1.0f; vars->flags = flags_before | 1; - src1 = &moby->pos; - qcopy(&probe_top, src1); - qcopy(&probe_bottom, src1); + ungrouped_crate_position = &moby->pos; + qcopy(&probe_top, ungrouped_crate_position); + qcopy(&probe_bottom, ungrouped_crate_position); probe_top.z += 0.5f; probe_bottom.z = 0.1f; if (FUN_001efa68_2cfcb8(&probe_top, &probe_bottom, 2, 0, 0) == 0) { @@ -732,9 +737,9 @@ void ground_attached_update(M_2cfcb8 *moby) { vars->hC4 = moby->hA8; vars->height = 1.0f; vars->flags = member_flags | 1; - src2 = &moby->pos; - qcopy(&probe_top, src2); - qcopy(&probe_bottom, src2); + group_crate_probe_position = &moby->pos; + qcopy(&probe_top, group_crate_probe_position); + qcopy(&probe_bottom, group_crate_probe_position); probe_top.z += 0.5f; probe_bottom.z = 0.1f; if (FUN_001efa68_2cfcb8(&probe_top, &probe_bottom, 2, 0, 0) == 0) { @@ -756,10 +761,11 @@ void ground_attached_update(M_2cfcb8 *moby) { } else if (is_moby_in_class_range_500_to_540( (*(H_2cfcb8 *)&D_L00_00173E40).moby) != 0) { vars->pA4 = (*(H_2cfcb8 *)&D_L00_00173E40).moby; - src3 = &moby->pos; + stacked_crate_position = &moby->pos; below = (*(H_2cfcb8 *)&D_L00_00173E40).moby; - qcopy(src3, &below->pos); - FUN_001f9a10_2cfcb8(src3, src3, (u8 *)below + 0xE0); + qcopy(stacked_crate_position, &below->pos); + FUN_001f9a10_2cfcb8( + stacked_crate_position, stacked_crate_position, (u8 *)below + 0xE0); vars = (*(H_2cfcb8 *)&D_L00_00173E40).moby->vars; if (is_moby_in_class_range_500_to_540(moby) != 0) { vars->next_member = moby; @@ -782,9 +788,9 @@ void ground_attached_update(M_2cfcb8 *moby) { while (member != 0) { vars = member->vars; if (is_moby_in_class_range_500_to_540(member) != 0 && vars->pA4 == 0) { - src4 = &member->pos; - qcopy(&probe_up, src4); - qcopy(&probe_down, src4); + stack_base_probe_position = &member->pos; + qcopy(&probe_up, stack_base_probe_position); + qcopy(&probe_down, stack_base_probe_position); probe_up.z += vars->height * 0.5f; probe_down.z = 0.1f; if (FUN_001efa68_2cfcb8(&probe_up, &probe_down, 2, moby, 0) != 0) { @@ -828,7 +834,7 @@ void ground_attached_update(M_2cfcb8 *moby) { s32 entry_state = route->entries[0].state; if (entry_state == 1 || entry_state == 3) { vars->route_index = -1; - } else if (entry_state == 0x111) { + } else if (entry_state == ROUTE_ENTRY_ADVANCE_LIMIT) { vars->route_index = -1; } else if ((u32)(entry_state - 0x11) < 0x100) { if (entry_state - 0x10 >= route->count) { @@ -852,12 +858,12 @@ void ground_attached_update(M_2cfcb8 *moby) { get_first_moby_in_group(&moby, group, 0, 0); while (moby != 0) { if (is_moby_in_class_range_500_to_540(moby) != 0) { - get_next_moby_in_group(&other, moby, 0, 0); - while (other != 0) { - if (is_moby_in_class_range_500_to_540(other) != 0) { - fast_vec_dist(&moby->pos, &other->pos); + get_next_moby_in_group(&later_group_member, moby, 0, 0); + while (later_group_member != 0) { + if (is_moby_in_class_range_500_to_540(later_group_member) != 0) { + fast_vec_dist(&moby->pos, &later_group_member->pos); } - get_next_moby_in_group(&other, other, 0, 0); + get_next_moby_in_group(&later_group_member, later_group_member, 0, 0); } } get_next_moby_in_group(&moby, moby, 0, 0); @@ -1017,6 +1023,15 @@ void break_crate(M2d1428 *moby, s32 hit, s32 source) { CRATE_VARIANT_FINAL_DAMAGE_STAGE = 10, CRATE_VARIANT_CONDITIONAL_RESPAWN_START = 11 }; + enum { + CRATE_DEBRIS_FALLBACK_BASE = 0x95, + CRATE_DEBRIS_MISSION_THRESHOLD_GATED_BASE = 0x15C, + CRATE_DEBRIS_DAMAGE_FLAG_GATED_BASE = 0x162, + CRATE_DEBRIS_OPTIONAL_TURN_OR_RESPAWN_BASE = 0x165, + CRATE_DEBRIS_IMPACT_TRIGGERED_BASE = 0x16B, + CRATE_DEBRIS_CLASS_OVERRIDE_BREAK_SOUND_BASE = 0x16E, + CRATE_DEBRIS_DAMAGE_STAGE_BASE = 0x171 + }; u8 *vars = (u8 *)moby->vars; V2d09b8 position, away, rotation, basis[3], launch, spawn_pos, spin; s32 kind; @@ -1068,7 +1083,7 @@ void break_crate(M2d1428 *moby, s32 hit, s32 source) { fast_vec_sub(&away, &moby->pos, (*(u8 **)D_001413D0) + 0x10); switch ((s16)((u16)moby->oclass - 500)) { case CRATE_VARIANT_MISSION_THRESHOLD_GATED: - kind = 0x15C; + kind = CRATE_DEBRIS_MISSION_THRESHOLD_GATED_BASE; break; case 3: kind = 0x15F; @@ -1076,29 +1091,29 @@ void break_crate(M2d1428 *moby, s32 hit, s32 source) { case CRATE_VARIANT_DAMAGE_FLAG_GATED: if (!angle) { } - kind = 0x162; + kind = CRATE_DEBRIS_DAMAGE_FLAG_GATED_BASE; break; case CRATE_VARIANT_OPTIONAL_QUARTER_TURN: case CRATE_VARIANT_CONDITIONAL_RESPAWN_START: - kind = 0x165; + kind = CRATE_DEBRIS_OPTIONAL_TURN_OR_RESPAWN_BASE; break; case 4: kind = 0x168; break; case CRATE_VARIANT_IMPACT_TRIGGERED: - kind = 0x16B; + kind = CRATE_DEBRIS_IMPACT_TRIGGERED_BASE; break; case CRATE_VARIANT_CLASS_OVERRIDE_BREAK_SOUND: - kind = 0x16E; + kind = CRATE_DEBRIS_CLASS_OVERRIDE_BREAK_SOUND_BASE; break; case CRATE_VARIANT_INITIAL_DAMAGE_STAGE: case CRATE_VARIANT_SECOND_DAMAGE_STAGE: case CRATE_VARIANT_PENULTIMATE_DAMAGE_STAGE: case CRATE_VARIANT_FINAL_DAMAGE_STAGE: - kind = 0x171; + kind = CRATE_DEBRIS_DAMAGE_STAGE_BASE; break; default: - kind = 0x95; + kind = CRATE_DEBRIS_FALLBACK_BASE; break; } if (D_L00_0015FFBC >= 201) { @@ -1169,7 +1184,7 @@ void break_crate(M2d1428 *moby, s32 hit, s32 source) { } } *(u32 *)((u8 *)broken_crate_moby + 0x94) = 0; - moby->state = 3; + moby->state = CRATE_STATE_BROKEN; *(u16 *)((u8 *)moby + 0x34) |= 1; moby->bBC = FUN_001fef20_2d09b8(15); if (hit) { @@ -1262,7 +1277,7 @@ void update_crate_stack_motion(M2d1428 *moby) { if (vars->flags & 2) return; vars->iB4 = D_L00_0015F5CC; - if (moby->state == 0) + if (moby->state == CRATE_STATE_INITIALIZE) continue; fast_vec_sub(&hero_local_offset, &hero.motion.pos, &moby->pos); transform_vector_by_basis(&hero_local_offset, &hero_local_offset, moby->vC0); @@ -1328,12 +1343,12 @@ void update_crate_stack_motion(M2d1428 *moby) { if (hit != 0) { acceleration_scale_or_speed = fast_vec_length(&vars->vel); if (frame_time * 0.5f < acceleration_scale_or_speed) { - if (moby->oclass == 0x1F9 && moby->state == 1) { + if (moby->oclass == 0x1F9 && moby->state == CRATE_STATE_BREAKABLE) { moby->bBC = 0; - moby->state = 5; + moby->state = CRATE_STATE_IMPACT_TRIGGERED; } else if ((parent_moby = vars->parent) != 0 && parent_moby->oclass == 0x1F9 && - parent_moby->state == 1) { - parent_moby->state = 5; + parent_moby->state == CRATE_STATE_BREAKABLE) { + parent_moby->state = CRATE_STATE_IMPACT_TRIGGERED; vars->parent->bBC = 0; } } diff --git a/src/overlays/shared/pickups/crate_fragment.c b/src/overlays/shared/pickups/crate_fragment.c index 7b0decff96..d90f62217e 100644 --- a/src/overlays/shared/pickups/crate_fragment.c +++ b/src/overlays/shared/pickups/crate_fragment.c @@ -12,6 +12,11 @@ #include "rnc/overlay/shared/world/collision.h" #include "rnc/overlay/shared/math/random/random_int_between.h" +enum { + NANOTECH_CRATE_FRAGMENT_BOUNCING = 0, + NANOTECH_CRATE_FRAGMENT_FADING = 1 +}; + typedef struct { void *o; float f4, f8; @@ -153,7 +158,7 @@ unsigned char *spawn_crate_debris(unsigned char *debris_source_moby, MOBY(debris_moby)->draw_dist = 0x7E; MOBY(debris_moby)->visible = 1; MOBY(debris_moby)->spawn_frame = *(long *)(debris_source_moby + 0x38); - MOBY(debris_moby)->state = 0; + MOBY(debris_moby)->state = NANOTECH_CRATE_FRAGMENT_BOUNCING; MOBY(debris_moby)->rot.x = random_angle_radians(); MOBY(debris_moby)->rot.y = random_angle_radians(); MOBY(debris_moby)->rot.z = random_angle_radians(); @@ -185,10 +190,6 @@ void nanotech_crate_fragment_update(M_2afa48 *m) __asm__("FUN_L00_002afa48"); /* Moby classes 149, 348, 349, 354-359, 363, 364 */ void nanotech_crate_fragment_update(M_2afa48 *fragment_moby) { - enum { - NANOTECH_CRATE_FRAGMENT_BOUNCING = 0, - NANOTECH_CRATE_FRAGMENT_FADING = 1 - }; PV *pv = fragment_moby->pv; u128 pre_motion_position; u128 *hit_normal; diff --git a/src/overlays/shared/pickups/fighter_jet_crate.c b/src/overlays/shared/pickups/fighter_jet_crate.c index ad2abe7cea..0a4db05fd0 100644 --- a/src/overlays/shared/pickups/fighter_jet_crate.c +++ b/src/overlays/shared/pickups/fighter_jet_crate.c @@ -12,6 +12,16 @@ #include "rnc/globals.h" #include "rnc/overlay/shared/world/level_labels.h" +enum { + SHIP_PICKUP_INITIALIZE = 0, + SHIP_PICKUP_SELECT_ACTIVATION_GATE = 1, + SHIP_PICKUP_WAIT_FOR_TARGET_STATE = 2, + SHIP_PICKUP_WAIT_FOR_ACTIVATION_TIMER = 3, + SHIP_PICKUP_ACTIVE = 4, + SHIP_PICKUP_COLLECTED_SHRINKING = 5, + SHIP_PICKUP_REMOVE_OR_RESET = 6 +}; + extern int D_L13_00174158_lui __asm__("D_L13_00174158") NOT_SDA; extern int coll_sphere(float, void *, int, void *) __asm__("FUN_L00_001f0d60"); @@ -32,7 +42,7 @@ unsigned char *spawn_ship_pickup(char *position, int moby_class) { MOBY(moby)->update_dist = 0xFF; MOBY(moby)->draw_dist = 0xFF; MOBY(moby)->visible = 1; - MOBY(moby)->state = 0; + MOBY(moby)->state = SHIP_PICKUP_INITIALIZE; MOBY(moby)->command = 0; qcopy(&MOBY(moby)->pos, position); update_entity(moby); @@ -46,13 +56,8 @@ void ammocrate_update(char *moby) __asm__("FUN_L13_002e1cc8"); /* Moby classes 224, 228 */ void ammocrate_update(char *moby) { enum { - SHIP_PICKUP_INITIALIZE = 0, - SHIP_PICKUP_SELECT_ACTIVATION_GATE = 1, - SHIP_PICKUP_WAIT_FOR_TARGET_STATE = 2, - SHIP_PICKUP_WAIT_FOR_ACTIVATION_TIMER = 3, - SHIP_PICKUP_ACTIVE = 4, - SHIP_PICKUP_COLLECTED_SHRINKING = 5, - SHIP_PICKUP_REMOVE_OR_RESET = 6 + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xfd, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xfe }; int *pickup_private_state = ((int *)MOBY(moby)->pvars); int hero_moby = ((char *)hero.ship_moby); @@ -67,39 +72,40 @@ void ammocrate_update(char *moby) { case SHIP_PICKUP_INITIALIZE: if (*((unsigned char *)pickup_private_state + 0xc) != 0) { MOBY(moby)->scale = *(float *)(((char *)MOBY(moby)->pclass) + 0x24); - MOBY(moby)->state = 4; + MOBY(moby)->state = SHIP_PICKUP_ACTIVE; break; } MOBY(moby)->collision = 0; MOBY(moby)->visible = 0; MOBY(moby)->flags |= 1; start_size = *(float *)(((char *)MOBY(moby)->pclass) + 0x24); - MOBY(moby)->state = 1; + MOBY(moby)->state = SHIP_PICKUP_SELECT_ACTIVATION_GATE; MOBY(moby)->scale = start_size * 0.1f; break; case SHIP_PICKUP_SELECT_ACTIVATION_GATE: if (pickup_private_state[0] != -1) { - MOBY(moby)->state = 2; + MOBY(moby)->state = SHIP_PICKUP_WAIT_FOR_TARGET_STATE; break; } - MOBY(moby)->state = 3; + MOBY(moby)->state = SHIP_PICKUP_WAIT_FOR_ACTIVATION_TIMER; break; case SHIP_PICKUP_WAIT_FOR_TARGET_STATE: { int target_index = pickup_private_state[0]; int target_base = (int)moby_base; struct Moby *target = (struct Moby *)(target_base + target_index * 0x100); - if (target != 0 && target->state != 0xfe && target->state != 0xfd && + if (target != 0 && target->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + target->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END && pickup_private_state[1] != -1 && target->state != pickup_private_state[1]) { goto frame_tail; } - MOBY(moby)->state = 3; + MOBY(moby)->state = SHIP_PICKUP_WAIT_FOR_ACTIVATION_TIMER; break; } case SHIP_PICKUP_WAIT_FOR_ACTIVATION_TIMER: if (pickup_private_state[2] == -1 || fast_dec_timer(pickup_private_state + 4)) { - MOBY(moby)->state = 4; + MOBY(moby)->state = SHIP_PICKUP_ACTIVE; } - if ((unsigned char)MOBY(moby)->state != 4) + if ((unsigned char)MOBY(moby)->state != SHIP_PICKUP_ACTIVE) goto frame_tail; MOBY(moby)->collision = *(int *)(((char *)MOBY(moby)->pclass) + 0x10); MOBY(moby)->visible = 1; @@ -129,8 +135,9 @@ void ammocrate_update(char *moby) { if (moby_class == 0x4da || moby_class == 0x45 || moby_class == 0x563) hit = 1; } - if (hero.state.current == 0x32 && hero_moby != 0 && MOBY(hero_moby)->state != 0xfe && - MOBY(hero_moby)->state != 0xfd) { + if (hero.state.current == 0x32 && hero_moby != 0 && + MOBY(hero_moby)->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + MOBY(hero_moby)->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END) { short moby_class = MOBY(hero_moby)->oclass; if (moby_class == 0x4da || moby_class == 0x45 || moby_class == 0x563) distance = fast_vec_dist((void *)&MOBY(hero_moby)->pos, &MOBY(moby)->pos); @@ -161,7 +168,7 @@ void ammocrate_update(char *moby) { if (hero.ship_hp_max < hero.ship_hp) hero.ship_hp = hero.ship_hp_max; collected: - MOBY(moby)->state = 5; + MOBY(moby)->state = SHIP_PICKUP_COLLECTED_SHRINKING; break; } else if (distance < 40.0f && (MOBY(moby)->visible) != 0) { float step = 0.8f / square_root(distance); @@ -176,7 +183,7 @@ void ammocrate_update(char *moby) { MOBY(moby)->scale += (*(float *)(((char *)MOBY(moby)->pclass) + 0x24) * 0.01f - MOBY(moby)->scale) * 0.3f; if (MOBY(moby)->scale < *(float *)(((char *)MOBY(moby)->pclass) + 0x24) * 0.05f) - MOBY(moby)->state = 6; + MOBY(moby)->state = SHIP_PICKUP_REMOVE_OR_RESET; break; } case SHIP_PICKUP_REMOVE_OR_RESET: @@ -189,7 +196,7 @@ void ammocrate_update(char *moby) { MOBY(moby)->flags |= 1; MOBY(moby)->scale = *(float *)(((char *)MOBY(moby)->pclass) + 0x24) * 0.1f; pickup_private_state[4] = pickup_private_state[2]; - MOBY(moby)->state = 1; + MOBY(moby)->state = SHIP_PICKUP_SELECT_ACTIVATION_GATE; break; } frame_tail: diff --git a/src/overlays/shared/pickups/gadget_pickup.c b/src/overlays/shared/pickups/gadget_pickup.c index b8f58e8853..22c2d49e36 100644 --- a/src/overlays/shared/pickups/gadget_pickup.c +++ b/src/overlays/shared/pickups/gadget_pickup.c @@ -57,7 +57,7 @@ extern float D_0015ED6C; extern float D_L02_0015F3FC; extern int func_001FA8A8_2ebce8_ea8b0(int, int, float) __asm__("FUN_001fa6e0"); -extern unsigned char *func_L00_00273E08_ea8b0( +extern unsigned char *spawn_timed_hero_relative_particle( void *, int, unsigned char, int, int, int, int, float) __asm__("FUN_L00_00272f68"); extern char D_L02_00167440_ea8b0[] __asm__("D_L02_001673C0"); @@ -65,17 +65,24 @@ void tresspasser_update(struct Moby *moby) __asm__("FUN_L02_002ea210"); /* Moby classes 1005, 1016 */ void tresspasser_update(struct Moby *moby) { - char *data; + enum { + GADGET_PICKUP_STATE_INITIALIZE = 0, + GADGET_PICKUP_STATE_WAIT_FOR_PLAYER = 1, + GADGET_PICKUP_STATE_GRANT_ITEM = 3, + GADGET_PICKUP_STATE_CAMERA_SEQUENCE = 4, + GADGET_PICKUP_STATE_SAVE_AND_REMOVE = 5 + }; + char *gadget_pickup_state; int which; int frames; float angle; float ground_offset; - data = (char *)moby->pvars; + gadget_pickup_state = (char *)moby->pvars; frames = scale_game_frames(60); angle = 3.14159274f / (float)frames; which = moby->oclass == 0x3ED ? 0x1A : 0x16; switch (moby->state) { - case 0: + case GADGET_PICKUP_STATE_INITIALIZE: FUN_L02_002ea7d0_c(moby); ground_offset = 0.2f; if (items_acquired[which] == 0) { @@ -83,12 +90,12 @@ void tresspasser_update(struct Moby *moby) { *(float *)((char *)moby + 0x40) = 1.57079637f; *(float *)((char *)moby + 0x44) = 3.14159274f; moby->pos.z = D_L02_00174468 + ground_offset; - moby->state = 1; + moby->state = GADGET_PICKUP_STATE_WAIT_FOR_PLAYER; return; } mark_moby_for_removal(moby); return; - case 1: + case GADGET_PICKUP_STATE_WAIT_FOR_PLAYER: moby->rot.z = fast_add_rotations(moby->rot.z, angle); FUN_L02_002ea8b0_c(moby); if (D_L02_0015F5CC % 10 != 0) @@ -96,7 +103,7 @@ void tresspasser_update(struct Moby *moby) { if (!(vector_distance_xy(&moby->pos, D_0013F3D0) < 1.0f)) return; if (absolute_float(moby->pos.z - *(float *)(D_0013F3D0 + 8)) < 2.0f) { - moby->state = 3; + moby->state = GADGET_PICKUP_STATE_GRANT_ITEM; moby->flags |= 1; moby->visible = 0; moby->collision = 0; @@ -107,7 +114,7 @@ void tresspasser_update(struct Moby *moby) { } } return; - case 3: + case GADGET_PICKUP_STATE_GRANT_ITEM: if (level_game_mode == 2) return; if (D_001413F4 != 0) { @@ -125,14 +132,14 @@ void tresspasser_update(struct Moby *moby) { clear_active_help_record(); help_request(0x7D9, 0x13); D_L02_0015F3FC = 1.0f; - moby->state = 4; + moby->state = GADGET_PICKUP_STATE_CAMERA_SEQUENCE; set_race_camera(D_0013F3D0, D_0013F3D0 + 16, 0x72, 1); return; } memcard_save_data(0, -1); mark_moby_for_removal(moby); return; - case 4: { + case GADGET_PICKUP_STATE_CAMERA_SEQUENCE: { float a[4] __attribute__((aligned(16))), b[4] __attribute__((aligned(16))), c[4] __attribute__((aligned(16))), d[4] __attribute__((aligned(16))); float position[4] __attribute__((aligned(16))); @@ -158,20 +165,21 @@ void tresspasser_update(struct Moby *moby) { D_0015ED70 * 0.15f, D_0015ED70 * 0.15f, D_0015ED6C * 0.15f, - data + 0x40, - data + 0x44); - lerp_vector(position, (void *)a, (void *)b, *(float *)(data + 0x40)); - output[2] = - fast_add_rotations(fast_subtract_rotations(d[2], c[2]) * *(float *)(data + 0x40), c[2]); - output[1] = - fast_add_rotations(fast_subtract_rotations(d[1], c[1]) * *(float *)(data + 0x40), c[1]); - output[0] = - fast_add_rotations(fast_subtract_rotations(d[0], c[0]) * *(float *)(data + 0x40), c[0]); + gadget_pickup_state + 0x40, + gadget_pickup_state + 0x44); + lerp_vector(position, (void *)a, (void *)b, *(float *)(gadget_pickup_state + 0x40)); + output[2] = fast_add_rotations( + fast_subtract_rotations(d[2], c[2]) * *(float *)(gadget_pickup_state + 0x40), c[2]); + output[1] = fast_add_rotations( + fast_subtract_rotations(d[1], c[1]) * *(float *)(gadget_pickup_state + 0x40), c[1]); + output[0] = fast_add_rotations( + fast_subtract_rotations(d[0], c[0]) * *(float *)(gadget_pickup_state + 0x40), c[0]); if (D_L02_00167400 && *(short *)(D_L02_00167400 + 0x86) != 5) jet_mount(position, output, 1, 0, 0); set_camera_position(position); set_camera_rotation(output); - if (D_L02_00179A10.i0 == 0 && D_L02_00179A10.i24 == -1 && 0.2f < *(float *)(data + 0x40)) { + if (D_L02_00179A10.i0 == 0 && D_L02_00179A10.i24 == -1 && + 0.2f < *(float *)(gadget_pickup_state + 0x40)) { approach_value(1.0f, frame_time * 4.0f, &D_L02_0015F3FC); } else { approach_value(0.0f, D_0015ED6C * 4.0f, &D_L02_0015F3FC); @@ -180,10 +188,10 @@ void tresspasser_update(struct Moby *moby) { return; set_race_camera(D_0013F3D0, D_0013F3D0 + 16, 0, 0); jet_end_mount(0); - moby->state = 5; + moby->state = GADGET_PICKUP_STATE_SAVE_AND_REMOVE; return; } - case 5: + case GADGET_PICKUP_STATE_SAVE_AND_REMOVE: approach_value(0.0f, D_0015ED6C * 4.0f, &D_L02_0015F3FC); if (D_L02_0015F3FC == 0.0f) { memcard_save_data(0, -1); @@ -251,14 +259,14 @@ void update_collectible_sprite_effect(char *moby) { timer_elapsed_fraction = timer_elapsed_fraction / (float)scale_game_frames(0xFF); col = func_001FA8A8_2ebce8_ea8b0( 0x4040FFFF, 0x1040FFFF, absolute_float(0.5f - timer_elapsed_fraction)); - func_L00_00273E08_ea8b0(d, - col, - truncate_float_to_s32(sprite_data->a[i]) & 0xFF, - 0x35, - 1, - 2, - 0, - sprite_data->d[i]); + spawn_timed_hero_relative_particle(d, + col, + truncate_float_to_s32(sprite_data->a[i]) & 0xFF, + 0x35, + 1, + 2, + 0, + sprite_data->d[i]); fast_vec_add(d, d, sprite_position_step); } } diff --git a/src/overlays/shared/pickups/gold_bolt.c b/src/overlays/shared/pickups/gold_bolt.c index c23a25044d..6102fd31fb 100644 --- a/src/overlays/shared/pickups/gold_bolt.c +++ b/src/overlays/shared/pickups/gold_bolt.c @@ -23,6 +23,12 @@ #include "rnc/game/options.h" #include "rnc/overlay/shared/hero/hero_frame_update.h" +enum { + GOLD_BOLT_INITIALIZE = 0, + GOLD_BOLT_WAIT_FOR_PICKUP = 1, + GOLD_BOLT_PICKUP_CUTSCENE = 2 +}; + typedef struct { s32 id; /* collected flag index (D_0014BEC0 + level * 4), -1 none */ u8 pad4[8]; @@ -66,12 +72,13 @@ extern void FUN_L01_003089f0_f(struct Moby *) __asm__("FUN_L01_003089f void update_gold_bolt_glow_rings(struct Moby *m) __asm__("FUN_L01_00308550"); extern void FUN_L01_003089f0_u(char *) __asm__("FUN_L01_003089f0"); extern int fast_tween_color(int, int, float) __asm__("FUN_001fa6e0"); -extern unsigned char *FUN_L00_00272f68(void *, int, unsigned char, int, int, int, int, float); -extern void spawn_moving_hero_relative_alpha_fade_particle( - void *, void *, int, int, int, int, float) __asm__("FUN_L00_002730e0"); +extern unsigned char *spawn_timed_hero_relative_particle( + void *, int, unsigned char, int, int, int, int, float) __asm__("FUN_L00_00272f68"); +extern void spawn_moving_hero_relative_alpha_fade_particle( + void *, void *, int, int, int, int, float) __asm__("FUN_L00_002730e0"); extern s32 D_0015ED84; -extern char D_L01_00167240[]; +extern char camera_pos[] __asm__("D_L01_00167240"); extern int D_0015ED84; /* no foreign declaration */ extern int cutscene_active __asm__("D_L01_0015F404"); extern u8 D_0014BEC0[]; @@ -81,9 +88,10 @@ extern s32 current_level_index_macro __asm__("D_0015ED84"); extern s32 D_L01_0015F640; extern s32 cutscene_active __asm__("D_L01_0015F404"); extern f32 D_L01_00161F10_gp __asm__("D_L01_00161F10") __attribute__((sda)); -extern f32 D_L01_00161F14_gp __asm__("D_L01_00161F14") __attribute__((sda)); -extern f32 D_L01_00161F18_gp __asm__("D_L01_00161F18") __attribute__((sda)); -extern f32 D_L01_00161F2C_gp __asm__("D_L01_00161F2C") __attribute__((sda)); +extern f32 l01_gold_bolt_bobbing_height_offset_gp __asm__("D_L01_00161F14") __attribute__((sda)); +extern f32 l01_gold_bolt_bobbing_amplitude_gp __asm__("D_L01_00161F18") __attribute__((sda)); +extern f32 l01_gold_bolt_bobbing_phase_degrees_per_second_gp __asm__("D_L01_00161F2C") + __attribute__((sda)); extern s32 D_L01_00161F50_gp __asm__("D_L01_00161F50") __attribute__((sda)); extern f32 gold_bolt_spin_x_degrees_per_second_gp __asm__("D_L01_00161F20") __attribute__((sda)); extern f32 gold_bolt_spin_y_degrees_per_second_gp __asm__("D_L01_00161F24") __attribute__((sda)); @@ -468,11 +476,6 @@ void gold_bolt_update(struct Moby *moby) __asm__("FUN_L01_00307ca0"); /* Moby class 1134 */ void gold_bolt_update(struct Moby *moby) { - enum { - GOLD_BOLT_INITIALIZE = 0, - GOLD_BOLT_WAIT_FOR_PICKUP = 1, - GOLD_BOLT_PICKUP_CUTSCENE = 2 - }; Vars *gold_bolt_instance_vars = (Vars *)moby->pvars; struct Hero *hero_ptr; Vec4f at; @@ -499,21 +502,22 @@ void gold_bolt_update(struct Moby *moby) { gold_bolt_spin_y_degrees_per_second_gp * 0.017453292f * frame_time_macro; gold_bolt_instance_vars->unk60 = gold_bolt_spin_z_degrees_per_second_gp * 0.017453292f * frame_time_macro; - moby->state = 1; + moby->state = GOLD_BOLT_WAIT_FOR_PICKUP; initialize_gold_bolt_data(moby); return; case GOLD_BOLT_WAIT_FOR_PICKUP: moby->scale = moby->pclass->scale * D_L01_00161F10_gp; - moby->pos.z = gold_bolt_instance_vars->home.z + D_L01_00161F14_gp + - D_L01_00161F18_gp * fast_sin(moby->rot.w); + moby->pos.z = gold_bolt_instance_vars->home.z + l01_gold_bolt_bobbing_height_offset_gp + + l01_gold_bolt_bobbing_amplitude_gp * fast_sin(moby->rot.w); moby->rot.x = fast_add_rotations( moby->rot.x, gold_bolt_spin_x_degrees_per_second_gp * 0.017453292f * frame_time_macro); moby->rot.y = fast_add_rotations( moby->rot.y, gold_bolt_spin_y_degrees_per_second_gp * 0.017453292f * frame_time_macro); moby->rot.z = fast_add_rotations( moby->rot.z, gold_bolt_spin_z_degrees_per_second_gp * 0.017453292f * frame_time_macro); - moby->rot.w = - fast_add_rotations(moby->rot.w, D_L01_00161F2C_gp * 0.017453292f * frame_time_macro); + moby->rot.w = fast_add_rotations(moby->rot.w, + l01_gold_bolt_bobbing_phase_degrees_per_second_gp * + 0.017453292f * frame_time_macro); FUN_L01_00308550_f(moby); if (!random_integer_below(D_L01_00161F50_gp)) { FUN_L01_003089f0_f(moby); @@ -527,7 +531,7 @@ void gold_bolt_update(struct Moby *moby) { if (hero.health.hp == 0) { return; } - if (hero.vehicle_mode != 3 && hero.vehicle_mode != 0) { + if (hero.vehicle_mode != 3 && hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { return; } if (gold_bolt_instance_vars->unkC != 0) { @@ -574,7 +578,7 @@ void gold_bolt_update(struct Moby *moby) { } hero.unk20AF = 1; cutscene_active = 1; - moby->state = 2; + moby->state = GOLD_BOLT_PICKUP_CUTSCENE; gold_bolt_instance_vars->timer = scale_game_frames(60); return; case GOLD_BOLT_PICKUP_CUTSCENE: @@ -625,15 +629,16 @@ void update_gold_bolt_visuals(struct Moby *moby) { float bobbing_sine; float k; moby->scale = moby->pclass->scale * *(float *)&D_L01_00161F10_gp; - if (moby->state == 1) { + if (moby->state == GOLD_BOLT_WAIT_FOR_PICKUP) { bobbing_sine = fast_sin(moby->rot.w); - moby->pos.z = *(float *)(gold_bolt_visual_vars + 0x18) + *(float *)&D_L01_00161F14_gp + - *(float *)&D_L01_00161F18_gp * bobbing_sine; + moby->pos.z = *(float *)(gold_bolt_visual_vars + 0x18) + + *(float *)&l01_gold_bolt_bobbing_height_offset_gp + + *(float *)&l01_gold_bolt_bobbing_amplitude_gp * bobbing_sine; moby->rot.x = fast_add_rotations(moby->rot.x, *(float *)(gold_bolt_visual_vars + 0x68)); moby->rot.y = fast_add_rotations(moby->rot.y, *(float *)(gold_bolt_visual_vars + 0x64)); updated_rotation_z = fast_add_rotations(moby->rot.z, *(float *)(gold_bolt_visual_vars + 0x60)); - k = *(float *)&D_L01_00161F2C_gp * DEG_TO_RAD * frame_time; + k = *(float *)&l01_gold_bolt_bobbing_phase_degrees_per_second_gp * DEG_TO_RAD * frame_time; moby->rot.z = updated_rotation_z; moby->rot.w = fast_add_rotations(moby->rot.w, k); } @@ -683,7 +688,7 @@ void update_gold_bolt_glow_rings(struct Moby *moby) { if (1.0f < scale) scale = 1.0f; } - fast_vec_sub(glow_particle_position, D_L01_00167240, glow_origin_position); + fast_vec_sub(glow_particle_position, camera_pos, glow_origin_position); fast_vec_normalize(glow_particle_position, glow_particle_position, -0.3f); fast_vec_normalize(step, glow_particle_position, 0.1f); fast_vec_add(glow_particle_position, glow_particle_position, glow_origin_position); @@ -709,14 +714,14 @@ void update_gold_bolt_glow_rings(struct Moby *moby) { packed_color = fast_tween_color(gold_bolt_glow_ring_tween_start_color_gp, gold_bolt_glow_ring_tween_end_color_gp, absolute_float(0.5f - pulse_progress)); - FUN_L00_00272f68(glow_particle_position, - packed_color, - truncate_float_to_s32(ring_rotations[i]), - gold_bolt_glow_ring_particle_texture_index_gp, - gold_bolt_glow_ring_particle_use_flags_44_gp, - 2, - 0, - sz[i] * scale); + spawn_timed_hero_relative_particle(glow_particle_position, + packed_color, + truncate_float_to_s32(ring_rotations[i]), + gold_bolt_glow_ring_particle_texture_index_gp, + gold_bolt_glow_ring_particle_use_flags_44_gp, + 2, + 0, + sz[i] * scale); fast_vec_add(glow_particle_position, glow_particle_position, step); } } @@ -790,7 +795,7 @@ void spawn_gold_bolt_particles(struct Moby *moby) { int i; int particle_lifetime; int loop_particle_lifetime; - if (moby->state == 1) { + if (moby->state == GOLD_BOLT_WAIT_FOR_PICKUP) { fast_vec_scale(v, moby, 0.0009765625f); } else { moby_point_position(moby, 0, v); diff --git a/src/overlays/shared/pickups/infobot.c b/src/overlays/shared/pickups/infobot.c index c207e25cc2..6d6d6816fd 100644 --- a/src/overlays/shared/pickups/infobot.c +++ b/src/overlays/shared/pickups/infobot.c @@ -18,6 +18,10 @@ #include "rnc/mobys/moby_spawn.h" #include "rnc/overlay/shared/game/unlock_planet.h" #include "rnc/overlay/shared/rendering/effects/particles.h" + +unsigned char *spawn_timed_hero_relative_particle( + u128 *, int, unsigned char, int, int, int, int, float) __asm__("FUN_L00_00272f68"); + #include "rnc/save/memcard_save_data.h" typedef struct Moby Moby; @@ -149,7 +153,7 @@ extern float FUN_001f9bf8_2d5988(void *, void *, f32) __asm__("FUN_001f9bf8"); extern float FUN_001f9dc8_2d5988(f32) __asm__("FUN_001f9dc8"); extern float FUN_001f9de0_2d5988(f32) __asm__("FUN_001f9de0"); -extern Path *D_L00_001B04B0[]; +extern Path *toad_paths[] __asm__("D_L00_001B04B0"); extern Player D_0013F3D0; extern Camera D_0013F350; extern f32 D_0015ED6C; @@ -350,18 +354,18 @@ void infobot_update(struct Moby *moby) { infobot->yaw = moby->rot.z; infobot->home = MPOS(moby)->q; if (infobot->arrived != 0) { - moby->state = 2; + moby->state = INFOBOT_WAIT_FOR_PLAYER; FUN_L00_002d6bf0_2d5de8(moby); } else { if (infobot->waiting != 0) { - moby->state = 2; + moby->state = INFOBOT_WAIT_FOR_PLAYER; } else { - moby->state = 1; + moby->state = INFOBOT_IDLE; } moby->flags |= 0x41; } if (infobot->attach != -1) { - moby->state = 5; + moby->state = INFOBOT_ORBIT_CARRIER; FUN_L00_002d6bf0_2d5de8(moby); break; } @@ -372,11 +376,11 @@ void infobot_update(struct Moby *moby) { if (infobot->slots[i] == -1) { continue; } - measure_path(D_L00_001B04B0[infobot->slots[i]]); + measure_path(toad_paths[infobot->slots[i]]); } - MPOS(moby)->q = D_L00_001B04B0[infobot->slots[0]]->pts[0].q; + MPOS(moby)->q = toad_paths[infobot->slots[0]]->pts[0].q; infobot->seg = 0; - moby->state = 3; + moby->state = INFOBOT_WAIT_TO_FOLLOW_SLOT_PATH; break; case INFOBOT_IDLE: break; @@ -407,7 +411,7 @@ void infobot_update(struct Moby *moby) { return; } if (fast_vec_dist(&D_0013F3D0, &moby->pos) < range && D_0013F3D0.active != 0) { - moby->state = 8; + moby->state = INFOBOT_START_SCENE_SEQUENCE; } break; case INFOBOT_WAIT_TO_FOLLOW_SLOT_PATH: @@ -417,7 +421,7 @@ void infobot_update(struct Moby *moby) { return; } if (infobot->slots[infobot->seg] == -1) { - moby->state = 2; + moby->state = INFOBOT_WAIT_FOR_PLAYER; break; } heading = @@ -436,14 +440,14 @@ void infobot_update(struct Moby *moby) { D_0015ED6C * 1.5707964f, &infobot->spin[0]); if (fast_vec_dist(&D_0013F350.target, &moby->pos) < 8.0f) { - moby->state = 4; + moby->state = INFOBOT_FOLLOW_SLOT_PATH; set_moby_dialogue_record_value(moby, 1); } break; case INFOBOT_FOLLOW_SLOT_PATH: - FUN_L00_002d5988_2d5de8(moby, D_L00_001B04B0[infobot->slots[infobot->seg]], 3); + FUN_L00_002d5988_2d5de8(moby, toad_paths[infobot->slots[infobot->seg]], 3); FUN_L00_002d6cd0_2d5de8(moby); - if (moby->state != 4) { + if (moby->state != INFOBOT_FOLLOW_SLOT_PATH) { infobot->seg++; } break; @@ -470,16 +474,16 @@ void infobot_update(struct Moby *moby) { if (infobot->path == -1) { break; } - moby->state = 6; + moby->state = INFOBOT_FOLLOW_PATH; infobot->attach = -1; - MPOS(moby)->q = D_L00_001B04B0[infobot->path]->pts[0].q; + MPOS(moby)->q = toad_paths[infobot->path]->pts[0].q; moby->rot.z = fast_arc_tan( - D_L00_001B04B0[infobot->path]->pts[1].v.x - D_L00_001B04B0[infobot->path]->pts[0].v.x, - D_L00_001B04B0[infobot->path]->pts[1].v.y - D_L00_001B04B0[infobot->path]->pts[0].v.y); - measure_path(D_L00_001B04B0[infobot->path]); + toad_paths[infobot->path]->pts[1].v.x - toad_paths[infobot->path]->pts[0].v.x, + toad_paths[infobot->path]->pts[1].v.y - toad_paths[infobot->path]->pts[0].v.y); + measure_path(toad_paths[infobot->path]); break; case INFOBOT_FOLLOW_PATH: - path = D_L00_001B04B0[infobot->path]; + path = toad_paths[infobot->path]; pos = (Vec *)&moby->pos; FUN_L00_002d6cd0_2d5de8(moby); FUN_L00_0025df68(path, pos, &point, &segment, &fraction, 0, 999.0f, 5.0f, 0.0f); @@ -504,7 +508,7 @@ void infobot_update(struct Moby *moby) { if (segment >= path->count - 1) { if (infobot->speed <= D_0015ED70 * 16.0f) { MPOS(moby)->q = ((Vec *)path)[path->count].q; - moby->state = 7; + moby->state = INFOBOT_ORBIT_PATH_ENDPOINT; break; } segment = path->count - 2; @@ -541,7 +545,7 @@ void infobot_update(struct Moby *moby) { &infobot->spin[0]); break; case INFOBOT_ORBIT_PATH_ENDPOINT: { - Path *orbit_path = D_L00_001B04B0[infobot->path]; + Path *orbit_path = toad_paths[infobot->path]; FUN_L00_002d6cd0_2d5de8(moby); infobot->sway = infobot->sway + D_0015ED6C; if (1.0f < infobot->sway) { @@ -562,7 +566,7 @@ void infobot_update(struct Moby *moby) { MPOS(moby)->q = step.q; if (fast_vec_dist(&D_0013F3D0, &orbit_path->pts[orbit_path->count - 1]) < 2.0f && D_0013F3D0.active != 0) { - moby->state = 8; + moby->state = INFOBOT_START_SCENE_SEQUENCE; } moby->rot.y = spring_turn(moby->rot.y, 0.0f, @@ -586,7 +590,7 @@ void infobot_update(struct Moby *moby) { jet_reset_camera(&D_L00_001600EC_2d5de8[infobot->cutscene].pos, &D_L00_001600EC_2d5de8[infobot->cutscene].dir); } - moby->state = 9; + moby->state = INFOBOT_WAIT_TO_DISPATCH_MSG1; if (infobot->msg0 != -1) { start_scene(infobot->msg0); } @@ -595,7 +599,7 @@ void infobot_update(struct Moby *moby) { if (D_L00_0015F5C4 == 2) { break; } - moby->state = 10; + moby->state = INFOBOT_WAIT_TO_START_FINAL_SCENE; if (infobot->msg1 != -1) { queue_scene_movie_with_game_language(infobot->msg1); } @@ -607,7 +611,7 @@ void infobot_update(struct Moby *moby) { if (infobot->msg2 != -1) { start_scene(infobot->msg2); } - moby->state = 11; + moby->state = INFOBOT_SAVE_AND_REMOVE; break; case INFOBOT_SAVE_AND_REMOVE: if (D_L00_0015F5C4 == 2) { @@ -694,14 +698,15 @@ void update_infobot_particle_effect(char *moby) { f = f / (float)scale_game_frames(0xFF); col = fast_tween_color(0x4040FFFF, 0x1040FFFF, absolute_float(0.5f - f)); if (D_15F5C4_2d6cd0 != 2) { - FUN_L00_00272f68(d, - col, - truncate_float_to_s32(infobot_particle_state->a[i]) & 0xFF, - 0x35, - 1, - 2, - 0, - infobot_particle_state->d[i]); + spawn_timed_hero_relative_particle(d, + col, + truncate_float_to_s32(infobot_particle_state->a[i]) & + 0xFF, + 0x35, + 1, + 2, + 0, + infobot_particle_state->d[i]); } fast_vec_add(d, d, particle_position_step); } diff --git a/src/overlays/shared/pickups/nanotech_ball.c b/src/overlays/shared/pickups/nanotech_ball.c index 8102f015f0..82f86b1d7b 100644 --- a/src/overlays/shared/pickups/nanotech_ball.c +++ b/src/overlays/shared/pickups/nanotech_ball.c @@ -23,6 +23,14 @@ #include "rnc/overlay/shared/math/random/random_vector.h" #include "rnc/ui/text/font/font_queue_vu_state.h" +enum { + NANOTECH_BALL_STATE_INITIALIZE = 0, + NANOTECH_BALL_STATE_FOLLOW_OWNER = 1, + NANOTECH_BALL_STATE_DETACHED_PICKUP = 2, + NANOTECH_BALL_STATE_COLLECTING = 3, + NANOTECH_BALL_STATE_BASIS_ONLY = 4 +}; + typedef struct { char pad[0x10]; OvlQuad q; @@ -188,11 +196,11 @@ void FUN_00214890_002d8418(Vec4_002d8418 *, float) __asm__("FUN_00214890"); void spawn_moving_hero_relative_alpha_fade_particle( void *, Vec4_002d8418 *, int, int, int, int, float) __asm__("FUN_L00_002730e0"); -s32 FUN_001f96f8_2d8510(s32) __asm__("FUN_001f96f8"); -s32 FUN_001fa6e0_2d8510(s32, s32, f32) __asm__("FUN_001fa6e0"); -u8 *FUN_L00_00272f68_2d8510(void *, s32, u8, s32, s32, s32, s32, f32) __asm__("FUN_L00_00272f68"); -void FUN_001f9bf8_002d8850(void *, void *, float) __asm__("FUN_001f9bf8"); -void draw_nanotech_ball(Moby *moby) __asm__("FUN_L00_002d9810"); +s32 FUN_001f96f8_2d8510(s32) __asm__("FUN_001f96f8"); +s32 FUN_001fa6e0_2d8510(s32, s32, f32) __asm__("FUN_001fa6e0"); +u8 *spawn_timed_hero_relative_particle(void *, s32, u8, s32, s32, s32, s32, f32) __asm__("FUN_L00_00272f68"); +void FUN_001f9bf8_002d8850(void *, void *, float) __asm__("FUN_001f9bf8"); +void draw_nanotech_ball(Moby *moby) __asm__("FUN_L00_002d9810"); extern int func_001F9850_2D9EA0(int) __asm__("FUN_001f96f8"); extern void func_L00_001FF4B0_2D9EA0(void *, void *, float) __asm__("FUN_001f9bf8"); extern void func_001F9BD8_2D9EA0(void *, void *, void *) __asm__("FUN_001f9a10"); @@ -1006,7 +1014,7 @@ float D_L18_00161E2C = 1.125f; int is_moby_in_state_one(unsigned char *moby) __asm__("FUN_L00_002d8128"); int is_moby_in_state_one(unsigned char *moby) { - return MOBY(moby)->state == 1; + return MOBY(moby)->state == NANOTECH_BALL_STATE_FOLLOW_OWNER; } /* Creates a class 0x326 moby linked to p at p's position; 0 when p's state is negative. */ @@ -1170,27 +1178,27 @@ s32 update_nanotech_ball_collection_effects(M_2d8510 *moby) { << 24; c = al | (c & 0xFFFFFF); effect_position.z = z + nanotech_ball_collection_particle_z_offsets[i]; - effect_record = FUN_L00_00272f68_2d8510(&effect_position, - c, - truncate_float_to_s32(effect_data->f60[i]), - nanotech_ball_collection_particle_byte_source_index, - 0, - 2, - 1, - nanotech_ball_collection_particle_scale_factors[i] * - color_progress_or_size_factor); + effect_record = spawn_timed_hero_relative_particle( + &effect_position, + c, + truncate_float_to_s32(effect_data->f60[i]), + nanotech_ball_collection_particle_byte_source_index, + 0, + 2, + 1, + nanotech_ball_collection_particle_scale_factors[i] * color_progress_or_size_factor); if (effect_record) effect_record[2] = *D_L00_001B2080_lui.pF8; - effect_record = - FUN_L00_00272f68_2d8510(&effect_position, - al | 0xFFFFFF, - truncate_float_to_s32(effect_data->f60[i]), - nanotech_ball_collection_particle_byte_source_index, - nanotech_ball_collection_second_particle_mode_selector, - 2, - 1, - nanotech_ball_collection_particle_scale_factors[i] * - (color_progress_or_size_factor * 0.7f)); + effect_record = spawn_timed_hero_relative_particle( + &effect_position, + al | 0xFFFFFF, + truncate_float_to_s32(effect_data->f60[i]), + nanotech_ball_collection_particle_byte_source_index, + nanotech_ball_collection_second_particle_mode_selector, + 2, + 1, + nanotech_ball_collection_particle_scale_factors[i] * + (color_progress_or_size_factor * 0.7f)); if (effect_record) effect_record[2] = *D_L00_001B2080_lui.pF8; fast_vec_add(&effect_position, &effect_position, &effect_position_step); @@ -1209,7 +1217,7 @@ void compute_nanotech_ball_slot_position(unsigned char *moby, float *out_slot_po build_look_at_matrix( &slot_offset, &D_L00_001E3CA0_002d8850[i], &moby_data->p20, moby_data->p20.f[3]); e = moby_data->e[i]; - if (e && MOBY(moby)->state == 2) + if (e && MOBY(moby)->state == NANOTECH_BALL_STATE_DETACHED_PICKUP) FUN_001f9bf8_002d8850(&slot_offset, &slot_offset, *(float *)(e + 0x28)); fast_vec_add(out_slot_position, &moby_data->p10, &slot_offset); out_slot_position[2] += moby_data->f0_002d8850; @@ -1246,13 +1254,6 @@ void nanotech_ball_update(Moby *moby) __asm__("FUN_L00_002d89f0"); /* Moby class 806 */ void nanotech_ball_update(Moby *moby) { - enum { - NANOTECH_BALL_STATE_INITIALIZE = 0, - NANOTECH_BALL_STATE_FOLLOW_OWNER = 1, - NANOTECH_BALL_STATE_DETACHED_PICKUP = 2, - NANOTECH_BALL_STATE_COLLECTING = 3, - NANOTECH_BALL_STATE_BASIS_ONLY = 4 - }; V_2D9EA0 slot_rotation_basis_or_cull_position_or_start_tangent, rotated_slot_offset_or_particle_position, v20, collection_target_or_end_tangent, cross_product_or_particle_midpoint, half_displacement_or_spark_position, slot_curve_offset; @@ -1262,7 +1263,7 @@ void nanotech_ball_update(Moby *moby) { case NANOTECH_BALL_STATE_INITIALIZE: { Moby *owner; int i; - moby->state = 1; + moby->state = NANOTECH_BALL_STATE_FOLLOW_OWNER; moby->flags |= 0x41; moby->collision = 0; moby->command = 0; @@ -1325,12 +1326,12 @@ void nanotech_ball_update(Moby *moby) { qcopy(&nanotech_ball_state->pos, &owner->pos); nanotech_ball_state->pos.z += 0.5f; if ((signed char)owner->state < 0 || owner == moby) { - moby->state = 2; + moby->state = NANOTECH_BALL_STATE_DETACHED_PICKUP; nanotech_ball_state->f50 = 0; } } case NANOTECH_BALL_STATE_DETACHED_PICKUP: - if (moby->state == 2) { + if (moby->state == NANOTECH_BALL_STATE_DETACHED_PICKUP) { int i; qcopy(&nanotech_ball_state->pos, &moby->pos); nanotech_ball_state->pos.z += 0.5f; @@ -1348,9 +1349,9 @@ void nanotech_ball_update(Moby *moby) { { Hero *player = &hero; int max_hp = hero_max_health; - if (player->vehicle_mode == 1) + if (player->vehicle_mode == HERO_VEHICLE_MODE_CLANK) max_hp = 4; - if (moby->state != 1 && D_L00_0015F63C != 0 && + if (moby->state != NANOTECH_BALL_STATE_FOLLOW_OWNER && D_L00_0015F63C != 0 && ((D_2D9EA0 *)D_L00_0015F63C->pvars) != 0 && player->health.hp != 0 && (player->health.hp + ((D_2D9EA0 *)D_L00_0015F63C->pvars)->f7C < max_hp || (nanotech_ball_invulnerability_pickup_enabled != 0 && @@ -1358,7 +1359,7 @@ void nanotech_ball_update(Moby *moby) { fast_vec_dist(&moby->pos, &player->motion.pos) < 10.0f && func_L00_002D9E30_2D9EA0(moby)) { int i; - moby->state = 3; + moby->state = NANOTECH_BALL_STATE_COLLECTING; ((D_2D9EA0 *)D_L00_0015F63C->pvars)->f7C++; if (nanotech_ball_invulnerability_pickup_enabled != 0) player->invulnerable_frames = func_001F9850_2D9EA0(0x258); @@ -1448,7 +1449,7 @@ void nanotech_ball_update(Moby *moby) { ext->b.x = part->pos.x - moby->pos.x; ext->b.y = part->pos.y - moby->pos.y; ext->b.z = part->pos.z - moby->pos.z; - if (moby->state == 2) + if (moby->state == NANOTECH_BALL_STATE_DETACHED_PICKUP) ext->u.s.owner = moby; else ext->u.s.owner = nanotech_ball_state->owner; @@ -1487,7 +1488,7 @@ void nanotech_ball_update(Moby *moby) { { Hero *player = &hero; int max_hp = hero_max_health; - if (player->vehicle_mode == 1) + if (player->vehicle_mode == HERO_VEHICLE_MODE_CLANK) max_hp = 4; if (player->health.hp == max_hp && player->invulnerable_frames != 0 && nanotech_ball_invulnerability_pickup_enabled != 0) { @@ -1510,7 +1511,7 @@ void nanotech_ball_update(Moby *moby) { } } if (D_L00_0015F63C == moby) - moby->state = 4; + moby->state = NANOTECH_BALL_STATE_BASIS_ONLY; else mark_moby_for_removal(moby); } else { @@ -1528,7 +1529,7 @@ void nanotech_ball_update(Moby *moby) { if (nanotech_ball_state->h56 == 0) { Hero *player = &hero; int max_hp = hero_max_health; - if (player->vehicle_mode == 1) + if (player->vehicle_mode == HERO_VEHICLE_MODE_CLANK) max_hp = 4; if (player->health.hp != 0) { int new_hp = player->health.hp + 1; diff --git a/src/overlays/shared/pickups/pilots_helmet.c b/src/overlays/shared/pickups/pilots_helmet.c index 35237aafc2..55e788b1a2 100644 --- a/src/overlays/shared/pickups/pilots_helmet.c +++ b/src/overlays/shared/pickups/pilots_helmet.c @@ -17,6 +17,10 @@ #include "rnc/overlay/shared/game/unlock_planet.h" #include "rnc/overlay/shared/pickups/infobot.h" #include "rnc/overlay/shared/rendering/effects/particles.h" + +unsigned char *spawn_timed_hero_relative_particle( + u128 *, int, unsigned char, int, int, int, int, float) __asm__("FUN_L00_00272f68"); + #include "rnc/save/memcard_save_data.h" typedef struct { @@ -113,7 +117,7 @@ void pilots_helmet_update(M_2e03a0_2e03a0 *moby) { mark_moby_for_removal(moby); return; } - moby->state = 1; + moby->state = PILOTS_HELMET_WAIT_FOR_HERO_PROXIMITY; moby->z += 1.0f; break; case PILOTS_HELMET_WAIT_FOR_HERO_PROXIMITY: @@ -128,7 +132,7 @@ void pilots_helmet_update(M_2e03a0_2e03a0 *moby) { start_scene(p->fa_2e03a0); else debug_print(pilots_helmet_missing_cutscene_format, moby->h); - moby->state = 2; + moby->state = PILOTS_HELMET_GRANT_REWARD; } } break; @@ -157,7 +161,7 @@ void pilots_helmet_update(M_2e03a0_2e03a0 *moby) { if (moby->b0 != 0xFF) jet_clear_persistent(moby->b0); D_00141410_2e03a0[0] = 7; - moby->state = 3; + moby->state = PILOTS_HELMET_SAVE_AND_REMOVE; break; case PILOTS_HELMET_SAVE_AND_REMOVE: memcard_save_data(0, -1); @@ -198,14 +202,14 @@ void emit_moby_color_cycling_particles(unsigned char *moby) { color_cycle_progress = convert_integer_to_float(scale_game_frames(0xff) - moby_data->t[j]); color_cycle_progress = color_cycle_progress / (float)scale_game_frames(0xff); c = fast_tween_color(0x4040FFFF, 0x1040FFFF, absolute_float(0.5f - color_cycle_progress)); - FUN_L00_00272f68(sprite_position_and_step, - c, - truncate_float_to_s32(*a++), - 0x35, - 1, - 2, - 0, - moby_data->c[j]); + spawn_timed_hero_relative_particle(sprite_position_and_step, + c, + truncate_float_to_s32(*a++), + 0x35, + 1, + 2, + 0, + moby_data->c[j]); j++; fast_vec_add( sprite_position_and_step, sprite_position_and_step, &sprite_position_and_step[1]); diff --git a/src/overlays/shared/pickups/weapon_ammo.c b/src/overlays/shared/pickups/weapon_ammo.c index 70ca51fb39..9986ab34c6 100644 --- a/src/overlays/shared/pickups/weapon_ammo.c +++ b/src/overlays/shared/pickups/weapon_ammo.c @@ -15,6 +15,14 @@ #include "rnc/globals.h" #include "rnc/overlay/shared/mobys/select_auto_aim_target_moby.h" +enum { + AMMO_PICKUP_INITIALIZE = 0, + AMMO_PICKUP_WAIT_FOR_COLLECTION = 1, + AMMO_PICKUP_COLLECTED = 2, + AMMO_PICKUP_PULSE_ALPHA = 3, + AMMO_PICKUP_RESTORE_SCALE = 4 +}; + typedef struct { float x; float y; @@ -103,7 +111,7 @@ unsigned char *spawn_on_path(u128 *spawn_position, int weapon_index, int ammo_am MOBY(spawned_moby)->draw_dist = 0xff; moby_vars = *(int **)(spawned_moby + 0x78); MOBY(spawned_moby)->visible = 1; - MOBY(spawned_moby)->state = 1; + MOBY(spawned_moby)->state = AMMO_PICKUP_WAIT_FOR_COLLECTION; MOBY(spawned_moby)->command = 0; qcopy(&MOBY(spawned_moby)->pos, spawn_position); if (ammo_amount == -1) @@ -126,13 +134,6 @@ void devestator_ammo_update(struct Moby *m) __asm__("FUN_L00_002c53c0"); /* Moby classes 204, 213, 214, 222, 223, 225, 226, 1006, 1438, 1447, 1449 */ void devestator_ammo_update(struct Moby *pickup_moby) { - enum { - AMMO_PICKUP_INITIALIZE = 0, - AMMO_PICKUP_WAIT_FOR_COLLECTION = 1, - AMMO_PICKUP_COLLECTED = 2, - AMMO_PICKUP_PULSE_ALPHA = 3, - AMMO_PICKUP_RESTORE_SCALE = 4 - }; AmmoPickup *pickup_vars; unsigned int state; FxVec position; @@ -146,7 +147,8 @@ void devestator_ammo_update(struct Moby *pickup_moby) { pickup_vars = (AmmoPickup *)pickup_moby->pvars; FUN_001f9740_2c53c0(&pickup_vars->timer); state = pickup_moby->state; - if (state == 1 || state == 4 || state == 3) { + if (state == AMMO_PICKUP_WAIT_FOR_COLLECTION || state == AMMO_PICKUP_RESTORE_SCALE || + state == AMMO_PICKUP_PULSE_ALPHA) { magnitude = FUN_001f9af0_2c53c0(&pickup_vars->velocity); if (magnitude != 0.0f) { qcopy(&position, &pickup_moby->pos); @@ -170,7 +172,7 @@ void devestator_ammo_update(struct Moby *pickup_moby) { } switch (pickup_moby->state) { case AMMO_PICKUP_INITIALIZE: - pickup_moby->state = 1; + pickup_moby->state = AMMO_PICKUP_WAIT_FOR_COLLECTION; break; case AMMO_PICKUP_WAIT_FOR_COLLECTION: { struct Hero *player; @@ -237,7 +239,7 @@ void devestator_ammo_update(struct Moby *pickup_moby) { } account_idx = pickup_vars->weapon; weapon_ammo_pickup_totals[account_idx] += weapon_ammo_counts[account_idx] - before; - pickup_moby->state = 2; + pickup_moby->state = AMMO_PICKUP_COLLECTED; pickup_moby->scale *= frame_scale_macro * 0.20000005f + 1.0f; clear_u64_value(&pickup_vars->velocity); elapsed = D_L00_0015F5CC_macro - D_L00_00161838_macro; @@ -253,7 +255,7 @@ void devestator_ammo_update(struct Moby *pickup_moby) { if (pickup_moby->alpha < 0xFF) ++pickup_moby->alpha; if (jet_distance(pickup_moby, hero.moby) <= -0.2f) { - pickup_moby->state = 3; + pickup_moby->state = AMMO_PICKUP_PULSE_ALPHA; pickup_vars->recovery_timer = FUN_001f96f8_2c53c0(60); } return; @@ -310,12 +312,12 @@ void devestator_ammo_update(struct Moby *pickup_moby) { approach_value(value_ptr, target, (float)(128 / random)); pickup_moby->alpha = FUN_001fa6d0_2c53c0(*value_ptr); if (jet_distance(pickup_moby, hero.moby) >= 0.0f) { - pickup_moby->state = 1; + pickup_moby->state = AMMO_PICKUP_WAIT_FOR_COLLECTION; return; } idx = pickup_vars->weapon; if (weapon_ammo_counts[idx] < D_L00_001C40B0[idx].hE) { - pickup_moby->state = 1; + pickup_moby->state = AMMO_PICKUP_WAIT_FOR_COLLECTION; } return; } @@ -329,7 +331,7 @@ void devestator_ammo_update(struct Moby *pickup_moby) { remaining = (target - current) / target; if (remaining < 0.01f) { pickup_moby->scale = target; - pickup_moby->state = 1; + pickup_moby->state = AMMO_PICKUP_WAIT_FOR_COLLECTION; pickup_moby->collision = pickup_moby->pclass->collision; } break; @@ -344,7 +346,7 @@ int try_collect_ammo_pickup(struct Moby *pickup_moby) { float excess_ammo_amount; int ammo_added; - if (pickup_moby->state == 2) { + if (pickup_moby->state == AMMO_PICKUP_COLLECTED) { fail: return 0; } @@ -362,7 +364,7 @@ int try_collect_ammo_pickup(struct Moby *pickup_moby) { -1); if (excess_ammo_amount < (float)pickup_vars[0]) { weapon_ammo_pickup_totals[pickup_vars[2]] += weapon_ammo_counts[pickup_vars[2]] - before; - pickup_moby->state = 2; + pickup_moby->state = AMMO_PICKUP_COLLECTED; pickup_moby->scale *= frame_scale * 0.200000048f + 1.0f; clear_u64_value(pickup_vars + 4); { diff --git a/src/overlays/shared/props/bolt_crank.c b/src/overlays/shared/props/bolt_crank.c index 97d65dc411..353b06cf7c 100644 --- a/src/overlays/shared/props/bolt_crank.c +++ b/src/overlays/shared/props/bolt_crank.c @@ -46,7 +46,7 @@ typedef struct { f32 rest_height; /* 0x3C */ } BoltCrankVars; -extern char D_L01_00167240[]; +extern char camera_pos[] __asm__("D_L01_00167240"); extern int D_0015ED84; extern unsigned char menu_item_enabled_1_lui __asm__("D_0013D395") NOT_SDA; @@ -74,12 +74,12 @@ void set_novalis_bolt_crank_completion_flags(char *moby) { if (level != 1) return; if (((short)MOBY(moby)->save_id) == 0x34 && MOBY(moby)->oclass == 0x118 && - (unsigned char)MOBY(moby)->state == 5) { + (unsigned char)MOBY(moby)->state == BOLT_CRANK_DONE) { menu_item_enabled_0 = level; level = D_0015ED84; } if (level == 1 && ((short)MOBY(moby)->save_id) == 0x35 && MOBY(moby)->oclass == 0x118 && - (unsigned char)MOBY(moby)->state == 5) { + (unsigned char)MOBY(moby)->state == BOLT_CRANK_DONE) { menu_item_enabled_1_lui = level; } } @@ -133,7 +133,7 @@ void bolt_crank_update(struct Moby *moby) { } distance = vector_distance_xy(&moby->pos, &hero.motion.pos); if (distance < 1.75f) { - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { angle = fast_arc_tan(moby->pos.x - hero.motion.pos.f[0], moby->pos.y - hero.motion.pos.f[1]); yaw_diff = fast_difference_between_rotations(hero.motion.rot.f[2], angle); @@ -166,11 +166,8 @@ void bolt_crank_update(struct Moby *moby) { goto done; } l01_hero_set_state(HERO_STATE_CRANK, 1); - jet_mount(D_L01_00167240, - D_L01_00167240 + 0x10, - 3, - scale_game_frames(0xB4), - 0); + jet_mount( + camera_pos, camera_pos + 0x10, 3, scale_game_frames(0xB4), 0); set_camera_rotation(&l01_cuboids[crank->camera_point].rot); set_camera_position(&l01_cuboids[crank->camera_point].pos); set_camera_5_track_acceleration_yz(crank->camera_params[0], diff --git a/src/overlays/shared/props/bot_door_lock.c b/src/overlays/shared/props/bot_door_lock.c index 9473d56eb7..c0b25b9b3d 100644 --- a/src/overlays/shared/props/bot_door_lock.c +++ b/src/overlays/shared/props/bot_door_lock.c @@ -26,6 +26,9 @@ extern int D_L06_001fe9d0[][4]; void draw_bot_door_lock_glow(struct Moby *moby) __asm__("FUN_L06_00307578"); void draw_bot_door_lock_glow(struct Moby *moby) { + enum { + GEOMETRY_QUAD_TEX1_FIXED_LOD = 1 + }; struct GeometryQuad quad; OvlVec4 rotated_quad_corners[4]; float rotation[4]; @@ -45,7 +48,7 @@ void draw_bot_door_lock_glow(struct Moby *moby) { bot_door_lock_private_data[7] += 0.01f; if (1.0f < bot_door_lock_private_data[7]) bot_door_lock_private_data[7] -= 1.0f; - quad.texture_state = 1; + quad.texture_state = GEOMETRY_QUAD_TEX1_FIXED_LOD; quad.primitive = 0x4000000044ULL; quad.reserved.value = 0; quad.texture = get_effect_texture(0x18); @@ -246,7 +249,7 @@ void bot_door_lock_update(char *moby) { idata[5] = idata[4]; bot_door_lock_data[6] = random_angle_radians(); bot_door_lock_data[10] = random_angle_radians(); - MOBY(moby)->state = 1; + MOBY(moby)->state = BOT_DOOR_LOCK_STATE_ACTIVE; bot_door_lock_data[9] = bot_door_lock_max_effect_horizontal_scale_gp; return; case BOT_DOOR_LOCK_STATE_ACTIVE: @@ -319,7 +322,7 @@ void bot_door_lock_update(char *moby) { activate_bot_door_lock_target( (unsigned char *)moby, (unsigned char *)(level_mobys_q + idata[i] * 0x100)); } - MOBY(moby)->state = 2; + MOBY(moby)->state = BOT_DOOR_LOCK_STATE_SHRINK_EFFECT; } break; case BOT_DOOR_LOCK_STATE_SHRINK_EFFECT: diff --git a/src/overlays/shared/props/breakable_lamp.c b/src/overlays/shared/props/breakable_lamp.c index 0591900483..c05d4d1aa6 100644 --- a/src/overlays/shared/props/breakable_lamp.c +++ b/src/overlays/shared/props/breakable_lamp.c @@ -76,6 +76,10 @@ void breakable_lamp_update(struct Moby *moby) __asm__("FUN_L05_0031c8e0"); /* Moby class 1511 */ void breakable_lamp_update(struct Moby *moby) { + enum { + BREAKABLE_LAMP_STATE_UNINITIALIZED = 0, + BREAKABLE_LAMP_STATE_INITIALIZED = 1 + }; struct MineVars_c8e0 *glow_and_spark_state = (struct MineVars_c8e0 *)moby->pvars; Vec4 tip; Vec4 debris_velocity; @@ -96,8 +100,8 @@ void breakable_lamp_update(struct Moby *moby) { s32 i; s32 frames; - if (moby->state == 0) { - moby->state = 1; + if (moby->state == BREAKABLE_LAMP_STATE_UNINITIALIZED) { + moby->state = BREAKABLE_LAMP_STATE_INITIALIZED; moby->glow_color = (0x7F000000 | glow_and_spark_state->glow_b << 16 | glow_and_spark_state->glow_g << 8) | glow_and_spark_state->glow_r; diff --git a/src/overlays/shared/props/breakable_prop.c b/src/overlays/shared/props/breakable_prop.c index 4894b7532e..1520c3088f 100644 --- a/src/overlays/shared/props/breakable_prop.c +++ b/src/overlays/shared/props/breakable_prop.c @@ -45,14 +45,14 @@ void prop_breakup_update(char *breakup_moby) { struct Moby *hit_moby = find_moby_hit(breakup_moby, 0x10000, 0); switch (((unsigned char *)breakup_moby)[0x20]) { case MOBY_STATE_INITIALIZE: - MOBY(breakup_moby)->state = 1; + MOBY(breakup_moby)->state = MOBY_STATE_WAIT_FOR_HIT; break; case MOBY_STATE_WAIT_FOR_HIT: if (hit_moby != 0 && hit_moby->scale > 0.0f) { flag = 1; } if (flag) { - MOBY(breakup_moby)->state = 2; + MOBY(breakup_moby)->state = MOBY_STATE_SPAWN_AND_REMOVE; } break; case MOBY_STATE_SPAWN_AND_REMOVE: { diff --git a/src/overlays/shared/props/bridge.c b/src/overlays/shared/props/bridge.c index ab2ebf0f84..079d42319f 100644 --- a/src/overlays/shared/props/bridge.c +++ b/src/overlays/shared/props/bridge.c @@ -66,7 +66,7 @@ void bridge_update(u8 *moby) { qcopy(&bridge_data->unkA0, &MOBY(moby)->pos); if (bridge_data->unkD8 != -1) D_L07_00184528[bridge_data->unkD8] = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = BRIDGE_WAIT_TO_MOVE_TO_OFFSET_POSITION; *(s32 *)&bridge_data->unkA0[3] = 0; break; case BRIDGE_WAIT_TO_MOVE_TO_OFFSET_POSITION: @@ -85,7 +85,7 @@ void bridge_update(u8 *moby) { bridge_data->unkA0[3] = fast_vec_length(vectors); if (bridge_data->unkD0 != -1) allocate_voice_for_target_entry(bridge_data->unkD0, 0, moby); - MOBY(moby)->state = 2; + MOBY(moby)->state = BRIDGE_MOVE_TO_OFFSET_POSITION; break; case BRIDGE_MOVE_TO_OFFSET_POSITION: if (bridge_data->unkB0 != -1) { @@ -95,7 +95,7 @@ void bridge_update(u8 *moby) { MOBY(linked_state_moby)->state == bridge_data->unkB8) { if (bridge_data->unkD0 != -1) allocate_voice_for_target_entry(bridge_data->unkD0, 0, moby); - MOBY(moby)->state = 4; + MOBY(moby)->state = BRIDGE_RETURN_TO_INITIAL_POSITION; break; } } @@ -113,7 +113,7 @@ void bridge_update(u8 *moby) { bridge_data->unkA0[3] = 0.0f; if (bridge_data->unkD8 != -1) D_L07_00184528[bridge_data->unkD8] = 1; - MOBY(moby)->state = 3; + MOBY(moby)->state = BRIDGE_WAIT_TO_RETURN_TO_INITIAL_POSITION; if (bridge_data->unkD4 != -1) allocate_voice_for_target_entry(bridge_data->unkD0, 0, moby); } @@ -127,7 +127,7 @@ void bridge_update(u8 *moby) { *(s32 *)&bridge_data->unkA0[3] = 0; if (bridge_data->unkD0 != -1) allocate_voice_for_target_entry(bridge_data->unkD0, 0, moby); - MOBY(moby)->state = 4; + MOBY(moby)->state = BRIDGE_RETURN_TO_INITIAL_POSITION; } } break; @@ -138,7 +138,7 @@ void bridge_update(u8 *moby) { MOBY(linked_state_moby)->state == bridge_data->unkB4) { if (bridge_data->unkD0 != -1) allocate_voice_for_target_entry(bridge_data->unkD0, 0, moby); - MOBY(moby)->state = 2; + MOBY(moby)->state = BRIDGE_MOVE_TO_OFFSET_POSITION; } else { *(quadword *)(vectors + 4) = 0; vectors[4] = bridge_data->unkBC; @@ -156,7 +156,7 @@ void bridge_update(u8 *moby) { allocate_voice_for_target_entry(bridge_data->unkD4, 0, moby); if (bridge_data->unkD8 != -1) D_L07_00184528[bridge_data->unkD8] = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = BRIDGE_WAIT_TO_MOVE_TO_OFFSET_POSITION; } } break; diff --git a/src/overlays/shared/props/door.c b/src/overlays/shared/props/door.c index 9379cf06a0..02118e7c8d 100644 --- a/src/overlays/shared/props/door.c +++ b/src/overlays/shared/props/door.c @@ -57,7 +57,7 @@ void door_update(u8 *moby) { qcopy(door_data, &MOBY(moby)->pos); if (door_data->unk38 != -1) D_L07_00184528[door_data->unk38] = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = DOOR_WAIT_TO_MOVE_TO_OFFSET_POSITION; *(s32 *)&door_data->unkC = 0; return; case DOOR_WAIT_TO_MOVE_TO_OFFSET_POSITION: @@ -77,7 +77,7 @@ void door_update(u8 *moby) { door_data->unkC = fast_vec_length(vectors); if (door_data->sound_entry != -1) allocate_voice_for_target_entry(door_data->sound_entry, 0, moby); - MOBY(moby)->state = 2; + MOBY(moby)->state = DOOR_MOVE_TO_OFFSET_POSITION; return; case DOOR_MOVE_TO_OFFSET_POSITION: if (door_data->unk38 != -1) @@ -88,7 +88,7 @@ void door_update(u8 *moby) { MOBY(linked_moby)->state != 0xfd && MOBY(linked_moby)->state == door_data->unk18) { if (door_data->sound_entry != -1) allocate_voice_for_target_entry(door_data->sound_entry, 0, moby); - MOBY(moby)->state = 4; + MOBY(moby)->state = DOOR_RETURN_TO_INITIAL_POSITION; return; } } @@ -105,7 +105,7 @@ void door_update(u8 *moby) { return; fast_vec_add(&MOBY(moby)->pos, door_data, vectors); door_data->unkC = 0.0f; - MOBY(moby)->state = 3; + MOBY(moby)->state = DOOR_WAIT_TO_RETURN_TO_INITIAL_POSITION; if (door_data->unk34 != -1) allocate_voice_for_target_entry(door_data->sound_entry, 0, moby); return; @@ -121,7 +121,7 @@ void door_update(u8 *moby) { *(s32 *)&door_data->unkC = 0; if (door_data->sound_entry != -1) allocate_voice_for_target_entry(door_data->sound_entry, 0, moby); - MOBY(moby)->state = 4; + MOBY(moby)->state = DOOR_RETURN_TO_INITIAL_POSITION; return; case DOOR_RETURN_TO_INITIAL_POSITION: if (door_data->unk38 != -1) @@ -132,7 +132,7 @@ void door_update(u8 *moby) { MOBY(linked_moby)->state == door_data->unk14) { if (door_data->sound_entry != -1) allocate_voice_for_target_entry(door_data->sound_entry, 0, moby); - MOBY(moby)->state = 2; + MOBY(moby)->state = DOOR_MOVE_TO_OFFSET_POSITION; } else { *(quadword *)(vectors + 4) = 0; vectors[4] = door_data->unk1C; @@ -151,7 +151,7 @@ void door_update(u8 *moby) { allocate_voice_for_target_entry(door_data->unk34, 0, moby); if (door_data->unk38 != -1) D_L07_00184528[door_data->unk38] = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = DOOR_WAIT_TO_MOVE_TO_OFFSET_POSITION; } break; case 5: diff --git a/src/overlays/shared/props/electric_beam.c b/src/overlays/shared/props/electric_beam.c index 176fe76370..b8f8ae710d 100644 --- a/src/overlays/shared/props/electric_beam.c +++ b/src/overlays/shared/props/electric_beam.c @@ -43,8 +43,8 @@ extern void draw_electric_beam(char *) __asm__("FUN_L14_00301fa8"); void apply_electric_beam_damage(char *self) __asm__("FUN_L14_00302538"); extern void apply_electric_beam_damage(char *) __asm__("FUN_L14_00302538"); -extern int D_L14_001620CC_gp __asm__("D_L14_001620CC") __attribute__((sda)); -extern int D_L14_001620B8_gp __asm__("D_L14_001620B8") __attribute__((sda)); +extern int l14_electric_beam_update_disabled __asm__("D_L14_001620CC") __attribute__((sda)); +extern int l14_electric_beam_pending_pulse_count __asm__("D_L14_001620B8") __attribute__((sda)); extern int D_L14_001620D0_gp __asm__("D_L14_001620D0") __attribute__((sda)); extern s32 D_L14_001620C8_gp __asm__("D_L14_001620C8") __attribute__((sda)); extern int D_L14_001620D4_gp __asm__("D_L14_001620D4") __attribute__((sda)); @@ -64,14 +64,14 @@ void electric_beam_update(unsigned char *moby) { float beam_culling_sphere[4] __attribute__((aligned(16))); int beam_state; int phase_duration_frames; - if (MOBY(moby)->state != 0) { + if (MOBY(moby)->state != BEAM_STATE_INITIALIZE) { qcopy(beam_culling_sphere, &MOBY(moby)->pos); beam_culling_sphere[3] = beam_vars->f624; if (fast_bsphere_check(beam_culling_sphere, 52.0f) < 0) { return; } } - if (D_L14_001620CC_gp != 0) { + if (l14_electric_beam_update_disabled != 0) { return; } beam_state = MOBY(moby)->state; @@ -79,22 +79,22 @@ void electric_beam_update(unsigned char *moby) { case BEAM_STATE_INITIALIZE: start_electric_beam_pulse((char *)moby); beam_vars->s10 = scale_game_frames(beam_vars->wC); - MOBY(moby)->state = 2; + MOBY(moby)->state = BEAM_STATE_WAIT_FOR_TIMED_PULSE; beam_vars->f624 = fast_vec_length(&l14_cuboids[beam_vars->w0].axes[1]); beam_vars->s8 = 1; beam_vars->sA = 1; break; case BEAM_STATE_COUNTER_TRIGGERED_PULSES: - if (D_L14_001620B8_gp != 0) { + if (l14_electric_beam_pending_pulse_count != 0) { if (beam_vars->s12 == 0) { - D_L14_001620B8_gp = D_L14_001620B8_gp - 1; + l14_electric_beam_pending_pulse_count = l14_electric_beam_pending_pulse_count - 1; start_electric_beam_pulse((char *)moby); } } break; case BEAM_STATE_WAIT_FOR_TIMED_PULSE: if (fast_dec_timer_s16(&beam_vars->s10) != 0) { - MOBY(moby)->state = 3; + MOBY(moby)->state = BEAM_STATE_REPEAT_PULSES; beam_vars->s10 = scale_game_frames(beam_vars->s4); start_electric_beam_pulse((char *)moby); } @@ -102,7 +102,7 @@ void electric_beam_update(unsigned char *moby) { case BEAM_STATE_REPEAT_PULSES: if (fast_dec_timer_s16(&beam_vars->s10) != 0) { if (beam_vars->s6 != 0) { - MOBY(moby)->state = 2; + MOBY(moby)->state = BEAM_STATE_WAIT_FOR_TIMED_PULSE; phase_duration_frames = beam_vars->s6; } else { phase_duration_frames = beam_vars->s4; diff --git a/src/overlays/shared/props/electric_water.c b/src/overlays/shared/props/electric_water.c index a3ba7f5dfd..bf3b934521 100644 --- a/src/overlays/shared/props/electric_water.c +++ b/src/overlays/shared/props/electric_water.c @@ -133,7 +133,7 @@ void electric_water_update(struct Moby *moby) { unsigned short save_id; float distance, theta, phi, radius; - if (moby->state != 0 && + if (moby->state != ELECTRIC_WATER_INITIALIZE && is_point_inside_clip_volume(D_0013F3D0, electric_water_controller_vars->active_area) == 0) { if (electric_water_controller_vars->owner != 0) { if (electric_water_controller_vars->voice0 != -1) { @@ -196,7 +196,7 @@ void electric_water_update(struct Moby *moby) { electric_water_controller_vars->off_timer = scale_game_frames(200); electric_water_controller_vars->shock_count = 0; electric_water_controller_vars->light = -1; - moby->state = 1; + moby->state = ELECTRIC_WATER_ON; electric_water_controller_vars->voice0 = -1; electric_water_controller_vars->voice1 = -1; break; @@ -207,7 +207,7 @@ void electric_water_update(struct Moby *moby) { if (fast_dec_timer_s16(&electric_water_controller_vars->on_timer) != 0) { electric_water_controller_vars->off_timer = truncate_float_to_s32(scale_time(electric_water_off_duration_seconds_gp * 60.0f)); - moby->state = 2; + moby->state = ELECTRIC_WATER_OFF; if (electric_water_controller_vars->owner != 0) { if (electric_water_controller_vars->voice1 != -1) { VoicePoolWindow *voice = @@ -229,7 +229,7 @@ void electric_water_update(struct Moby *moby) { break; } } - if (moby->state == 2) { + if (moby->state == ELECTRIC_WATER_OFF) { for (dim_lamp = 0; dim_lamp < 3; dim_lamp++) { if (electric_water_controller_vars->lamps[dim_lamp] != -1) { set_moby_color(&l15_moby_array[electric_water_controller_vars->lamps[dim_lamp]], @@ -378,7 +378,7 @@ void electric_water_update(struct Moby *moby) { hit.v[3] = 5627.9248f; hit.unk18 = 0; record_moby_hit(hero.moby, &hit); - if (moby->state == 2) { + if (moby->state == ELECTRIC_WATER_OFF) { D_L15_0015F448 = electric_water_controller_vars->saved_fog[0]; D_L15_0015F44C = electric_water_controller_vars->saved_fog[1]; D_L15_0015F450 = electric_water_controller_vars->saved_fog[2]; @@ -440,18 +440,19 @@ void electric_water_update(struct Moby *moby) { electric_water_controller_vars->voice0 = trooper_play_sound(0, 5, electric_water_controller_vars->owner, 0x28F); } - if (moby->state == 1 && voice_is_playing(electric_water_controller_vars->owner, - electric_water_controller_vars->voice1) == 0) { + if (moby->state == ELECTRIC_WATER_ON && + voice_is_playing(electric_water_controller_vars->owner, + electric_water_controller_vars->voice1) == 0) { electric_water_controller_vars->voice1 = trooper_play_sound(1, 5, electric_water_controller_vars->owner, 0x28F); } if (fast_dec_timer_s16(&electric_water_controller_vars->off_timer) != 0 && - moby->state == 2) { + moby->state == ELECTRIC_WATER_OFF) { electric_water_controller_vars->on_timer = truncate_float_to_s32(scale_time(electric_water_on_duration_seconds_gp * 60.0f)); electric_water_controller_vars->off_timer = scale_game_frames(200); electric_water_controller_vars->shock_count = 0; - moby->state = 1; + moby->state = ELECTRIC_WATER_ON; } for (sw = 0; sw < 4; sw++) { /* Fakematch: the press action is written in both arms so CSE keeps the second sw load. */ @@ -460,7 +461,7 @@ void electric_water_update(struct Moby *moby) { l15_moby_array[electric_water_controller_vars->switches[sw]].state == 2) { electric_water_controller_vars->off_timer = truncate_float_to_s32( scale_time(electric_water_controller_vars->off_seconds * 60.0f)); - moby->state = 3; + moby->state = ELECTRIC_WATER_SWITCH_DISABLED; trooper_play_sound( 2, 0, &l15_moby_array[electric_water_controller_vars->switches[sw]], 0x28F); electric_water_controller_vars->armed = 0; @@ -469,7 +470,7 @@ void electric_water_update(struct Moby *moby) { &l15_moby_array[electric_water_controller_vars->switches[sw]]) != 0) { electric_water_controller_vars->off_timer = truncate_float_to_s32( scale_time(electric_water_controller_vars->off_seconds * 60.0f)); - moby->state = 3; + moby->state = ELECTRIC_WATER_SWITCH_DISABLED; trooper_play_sound( 2, 0, &l15_moby_array[electric_water_controller_vars->switches[sw]], 0x28F); electric_water_controller_vars->armed = 0; @@ -561,7 +562,7 @@ void electric_water_update(struct Moby *moby) { truncate_float_to_s32(scale_time(electric_water_on_duration_seconds_gp * 60.0f)); electric_water_controller_vars->off_timer = scale_game_frames(200); electric_water_controller_vars->shock_count = 0; - moby->state = 1; + moby->state = ELECTRIC_WATER_ON; break; } @@ -1031,15 +1032,21 @@ extern float frame_scale __asm__("D_0015ED60"); extern char D_L15_001D3750_8710[] __asm__("D_L15_001D3750"); extern char D_L15_001D3BB0_8710[] __asm__("D_L15_001D3BB0"); extern int D_L15_00161CC8_8710 __asm__("D_L15_00161CC8"); -extern short D_L15_00161C58_gp __asm__("D_L15_00161C58") __attribute__((sda)); -extern short D_L15_00161C54_gp __asm__("D_L15_00161C54") __attribute__((sda)); -extern short D_L15_00161C3C_gp __asm__("D_L15_00161C3C") __attribute__((sda)); -extern short D_L15_00161C44_gp __asm__("D_L15_00161C44") __attribute__((sda)); +extern short l15_electric_water_bolt_draw_accumulator_decrement_rate __asm__("D_L15_00161C58") + __attribute__((sda)); +extern short l15_electric_water_bolt_draw_wrapped_accumulator __asm__("D_L15_00161C54") + __attribute__((sda)); +extern short l15_electric_water_first_bolt_path_first_pass_alpha __asm__("D_L15_00161C3C") + __attribute__((sda)); +extern short l15_electric_water_first_bolt_path_second_pass_alpha __asm__("D_L15_00161C44") + __attribute__((sda)); extern short D_L15_00161C64_gp __asm__("D_L15_00161C64") __attribute__((sda)); extern short D_L15_00161C68_gp __asm__("D_L15_00161C68") __attribute__((sda)); extern short D_L15_00161C9C_gp __asm__("D_L15_00161C9C") __attribute__((sda)); -extern short D_L15_00161C6C_gp __asm__("D_L15_00161C6C") __attribute__((sda)); -extern short D_L15_00161C70_gp __asm__("D_L15_00161C70") __attribute__((sda)); +extern short l15_electric_water_second_bolt_path_first_pass_alpha __asm__("D_L15_00161C6C") + __attribute__((sda)); +extern short l15_electric_water_second_bolt_path_second_pass_alpha __asm__("D_L15_00161C70") + __attribute__((sda)); extern short D_L15_00161C74_gp __asm__("D_L15_00161C74") __attribute__((sda)); extern short D_L15_00161C78_gp __asm__("D_L15_00161C78") __attribute__((sda)); extern short D_L15_00161CA0_gp __asm__("D_L15_00161CA0") __attribute__((sda)); @@ -1047,21 +1054,23 @@ extern void draw_beam_and_arc_two_pass_quads(char *, int, int, int, float, floa extern void FUN_L15_002d8e48_8710(char *) __asm__("FUN_L15_002d8e48"); #define F(x) (*(float *)&(x)) void draw_electric_water_bolt_effect(char *moby) { - float decremented_accumulator = F(D_L15_00161C54_gp) - F(D_L15_00161C58_gp) * frame_scale; - F(D_L15_00161C54_gp) = decremented_accumulator; + float decremented_accumulator = + F(l15_electric_water_bolt_draw_wrapped_accumulator) - + F(l15_electric_water_bolt_draw_accumulator_decrement_rate) * frame_scale; + F(l15_electric_water_bolt_draw_wrapped_accumulator) = decremented_accumulator; if (decremented_accumulator <= -8.0f) { - F(D_L15_00161C54_gp) = decremented_accumulator + 8.0f; + F(l15_electric_water_bolt_draw_wrapped_accumulator) = decremented_accumulator + 8.0f; } draw_beam_and_arc_two_pass_quads(D_L15_001D3750_8710, - W(D_L15_00161C3C_gp), - W(D_L15_00161C44_gp), + W(l15_electric_water_first_bolt_path_first_pass_alpha), + W(l15_electric_water_first_bolt_path_second_pass_alpha), 0x14, F(D_L15_00161C64_gp), F(D_L15_00161C68_gp), F(D_L15_00161C9C_gp)); draw_beam_and_arc_two_pass_quads(D_L15_001D3750_8710 + 0x140, - W(D_L15_00161C6C_gp), - W(D_L15_00161C70_gp), + W(l15_electric_water_second_bolt_path_first_pass_alpha), + W(l15_electric_water_second_bolt_path_second_pass_alpha), 0x14, F(D_L15_00161C74_gp), F(D_L15_00161C78_gp), @@ -1184,8 +1193,11 @@ extern int is_moby_class_23e_in_state_14(void *) __asm__("FUN_L03_002c6c60"); void reset_electric_water_switch(char *moby) __asm__("FUN_L15_002d95a0"); void reset_electric_water_switch(char *moby) { + enum { + ELECTRIC_WATER_SWITCH_RESET = 1 + }; if (is_moby_class_23e_in_state_14(moby)) { - MOBY(moby)->state = 1; + MOBY(moby)->state = ELECTRIC_WATER_SWITCH_RESET; MOBY(moby)->pos.z += 1.5f; } } diff --git a/src/overlays/shared/props/energy_sphere.c b/src/overlays/shared/props/energy_sphere.c index a208225041..e1c42a523b 100644 --- a/src/overlays/shared/props/energy_sphere.c +++ b/src/overlays/shared/props/energy_sphere.c @@ -124,7 +124,7 @@ void energy_sphere_update(struct Moby *sphere_moby) { set_moby_color(sphere_moby, 0x80, 0x80, 0x80); sphere_moby->scale = sphere_moby->pclass->scale * D_L06_00161E80; *(char **)sphere_vars = sphere_vars + 0x20; - sphere_moby->state = 1; + sphere_moby->state = ENERGY_SPHERE_UPDATE_ROTATION; sphere_moby->flags |= 0x20; *(int *)(sphere_vars + 0x60) = -1; case ENERGY_SPHERE_UPDATE_ROTATION: { diff --git a/src/overlays/shared/props/energy_sphere_holder.c b/src/overlays/shared/props/energy_sphere_holder.c index d3b9438243..4d2d1a01b6 100644 --- a/src/overlays/shared/props/energy_sphere_holder.c +++ b/src/overlays/shared/props/energy_sphere_holder.c @@ -13,6 +13,9 @@ #include "rnc/overlay/shared/props.h" #include "rnc/overlay/shared/rendering/effects/particles.h" +unsigned char *spawn_timed_hero_relative_particle( + u128 *, int, unsigned char, int, int, int, int, float) __asm__("FUN_L00_00272f68"); + typedef struct { float ph[4]; float spd[4]; @@ -65,6 +68,9 @@ void energy_sphere_holder_update(char *holder_moby) { ENERGY_SPHERE_HOLDER_INITIALIZE = 0, ENERGY_SPHERE_HOLDER_HANDLE_HITS_AND_UPDATE_BEAM = 1 }; + enum { + ENERGY_SPHERE_HOLDER_COMPLETED = 2 + }; char *holder_vars = ((char *)MOBY(holder_moby)->pvars); char *spawned_moby; unsigned char *visited_table; @@ -77,7 +83,7 @@ void energy_sphere_holder_update(char *holder_moby) { (current_level_index != 10 || (visited_table = (unsigned char *)((char *)visited52), (visited_table + ((unsigned char *)holder_moby)[0xB0]))[0xA0] == 0xFF)) { - MOBY(holder_moby)->state = 2; + MOBY(holder_moby)->state = ENERGY_SPHERE_HOLDER_COMPLETED; MOBY(holder_moby)->command = 1; break; } @@ -93,7 +99,7 @@ void energy_sphere_holder_update(char *holder_moby) { MOBY(spawned_moby)->rot.z = random_angle_radians(); MOBY(spawned_moby)->pos.z += 0.85f; *(char **)(holder_vars + 0x40) = spawned_moby; - MOBY(holder_moby)->state = 1; + MOBY(holder_moby)->state = ENERGY_SPHERE_HOLDER_HANDLE_HITS_AND_UPDATE_BEAM; initialize_energy_sphere_holder_vars(holder_moby); *(int *)(current_level_index * 256 + ((short)MOBY(holder_moby)->save_id >> 5) * 4 + (char *)D_0014C190_257218) &= ~(1 << (MOBY(holder_moby)->save_id & 0x1F)); @@ -113,7 +119,7 @@ void energy_sphere_holder_update(char *holder_moby) { } if ((*(char **)(holder_vars + 0x40))[0x20] < 0) { MOBY(holder_moby)->command = 1; - MOBY(holder_moby)->state = 2; + MOBY(holder_moby)->state = ENERGY_SPHERE_HOLDER_COMPLETED; *(int *)(current_level_index * 256 + ((short)MOBY(holder_moby)->save_id >> 5) * 4 + (char *)D_0014C190_257218) |= 1 << (MOBY(holder_moby)->save_id & 0x1F); energy_sphere_holder_completion_bits[(short)MOBY(holder_moby)->save_id >> 5] |= @@ -157,14 +163,14 @@ void update_energy_sphere_holder_beam_effects(char *moby) { beam_sprite_color = fast_tween_color(energy_sphere_holder_beam_color_start_gp, energy_sphere_holder_beam_color_end_gp, absolute_float(0.5f - timer_progress)); - FUN_L00_00272f68(beam_sprite_position, - beam_sprite_color, - truncate_float_to_s32(beam->ph[i]), - energy_sphere_holder_beam_texture_index_gp, - energy_sphere_holder_beam_particle_variant_flag_gp, - 2, - 0, - beam->sz[i]); + spawn_timed_hero_relative_particle(beam_sprite_position, + beam_sprite_color, + truncate_float_to_s32(beam->ph[i]), + energy_sphere_holder_beam_texture_index_gp, + energy_sphere_holder_beam_particle_variant_flag_gp, + 2, + 0, + beam->sz[i]); fast_vec_add(beam_sprite_position, beam_sprite_position, step); } if ((level_frame_count & 3) == 3 && ((unsigned char *)moby)[0x31] != 0) { diff --git a/src/overlays/shared/props/escalator.c b/src/overlays/shared/props/escalator.c index 3d99ccb2b3..a708367d4c 100644 --- a/src/overlays/shared/props/escalator.c +++ b/src/overlays/shared/props/escalator.c @@ -27,24 +27,30 @@ void escalator_update(char *moby) __asm__("FUN_L02_002dc6b0"); /* Moby classes 296, 652, 653 */ void escalator_update(char *moby) { + enum { + ESCALATOR_STATE_INITIALIZE = 0, + ESCALATOR_STATE_TIMED_NEGATIVE_YAW_MOTION = 1, + ESCALATOR_STATE_TIMED_POSITIVE_YAW_MOTION = 2, + ESCALATOR_STATE_CONSTANT_SPEED_MOTION = 3 + }; EscalatorVars *escalator_motion_state = (EscalatorVars *)MOBY(moby)->pvars; float limit; float y; int state; - if (escalator_motion_state == 0) + if (escalator_motion_state == NULL) return; state = MOBY(moby)->state; - if (state == 1) + if (state == ESCALATOR_STATE_TIMED_NEGATIVE_YAW_MOTION) goto state1; - if (state < 2) { - if (state == 0) + if (state < ESCALATOR_STATE_TIMED_POSITIVE_YAW_MOTION) { + if (state == ESCALATOR_STATE_INITIALIZE) goto state0; goto move; } - if (state == 2) + if (state == ESCALATOR_STATE_TIMED_POSITIVE_YAW_MOTION) goto state2; - if (state == 3) + if (state == ESCALATOR_STATE_CONSTANT_SPEED_MOTION) goto state3; goto move; state0: @@ -52,9 +58,9 @@ void escalator_update(char *moby) { escalator_motion_state->unkA0 = scale_game_frames(escalator_direction_timer_frames_gp); escalator_motion_state->unk9C |= 4; if (escalator_motion_state->unkA4 != 0) - MOBY(moby)->state = 3; + MOBY(moby)->state = ESCALATOR_STATE_CONSTANT_SPEED_MOTION; else - MOBY(moby)->state = 1; + MOBY(moby)->state = ESCALATOR_STATE_TIMED_NEGATIVE_YAW_MOTION; goto move; state1: { float speed; @@ -65,7 +71,7 @@ state1: { escalator_acceleration_gp * frame_time_sq; if (speed <= 0.0f) { escalator_motion_state->unkA0 = scale_game_frames(escalator_direction_timer_frames_gp); - MOBY(moby)->state = 2; + MOBY(moby)->state = ESCALATOR_STATE_TIMED_POSITIVE_YAW_MOTION; } else { escalator_motion_state->unk40 = fast_cos(MOBY(moby)->rot.z) * -speed; y = fast_sin(MOBY(moby)->rot.z) * -speed; @@ -94,7 +100,7 @@ state2: { escalator_acceleration_gp * frame_time_sq; if (speed <= 0.0f) { escalator_motion_state->unkA0 = scale_game_frames(escalator_direction_timer_frames_gp); - MOBY(moby)->state = 1; + MOBY(moby)->state = ESCALATOR_STATE_TIMED_NEGATIVE_YAW_MOTION; } else { escalator_motion_state->unk40 = fast_cos(MOBY(moby)->rot.z) * speed; escalator_motion_state->unk44 = fast_sin(MOBY(moby)->rot.z) * speed; diff --git a/src/overlays/shared/props/flickering_point_light.c b/src/overlays/shared/props/flickering_point_light.c index ee79473e8e..95b33c3a14 100644 --- a/src/overlays/shared/props/flickering_point_light.c +++ b/src/overlays/shared/props/flickering_point_light.c @@ -59,7 +59,7 @@ void flickering_point_light_update(u8 *moby) { *(s32 *)(effect_vars + 0x68) = -1; if (MOBY(moby)->update_dist < truncate_float_to_s32(*(f32 *)(effect_vars + 0x5c)) + 4) MOBY(moby)->update_dist = truncate_float_to_s32(*(f32 *)(effect_vars + 0x5c)) + 4; - MOBY(moby)->state = 1; + MOBY(moby)->state = EFFECT_STATE_UPDATE; return; case EFFECT_STATE_UPDATE: break; diff --git a/src/overlays/shared/props/floor_button.c b/src/overlays/shared/props/floor_button.c index 6f612b187c..9dc333f2dd 100644 --- a/src/overlays/shared/props/floor_button.c +++ b/src/overlays/shared/props/floor_button.c @@ -16,7 +16,7 @@ typedef struct { u8 collected[1]; } SaveFlags; -extern SaveFlags D_L05_001BB6B0; +extern SaveFlags l05_mission_gated_moby_save_flags __asm__("D_L05_001BB6B0"); extern SaveFlags l05_moby_save_flags __asm__("D_L05_001BAA50"); extern unsigned char D_L05_0015FC88[] MACRO_ADDR; @@ -26,47 +26,57 @@ void floor_button_update(struct Moby *moby) __asm__("FUN_L05_0030c5b0"); /* Moby class 830 */ void floor_button_update(struct Moby *moby) { - s32 *vars = (s32 *)moby->pvars; + enum { + FLOOR_BUTTON_STATE_INITIALIZE = 0, + FLOOR_BUTTON_STATE_WAIT_FOR_PRESS = 1 + }; + enum { + FLOOR_BUTTON_STATE_DISABLED = 2 + }; + s32 *floor_button_private_state = (s32 *)moby->pvars; s16 id; s32 i; s32 list; - char *entry; + char *path_key_cursor; f32 angle; s32 color; u32 shade; u32 high; switch (moby->state) { - case 0: - *(f32 *)(vars + 3) = random_angle_radians(); + case FLOOR_BUTTON_STATE_INITIALIZE: + *(f32 *)(floor_button_private_state + 3) = random_angle_radians(); moby->pos.z -= 0.35f; id = (s16)moby->save_id; - if (D_L05_001BB6B0.collected[id] != 0 || + if (l05_mission_gated_moby_save_flags.collected[id] != 0 || (D_0014C190_257218[current_level_index][id >> 5] >> (moby->save_id & 31) & 1) != 0 || - (vars[2] != 0 && D_0014C050[moby->mission + current_level_index * 16] == 0xFF)) { + (floor_button_private_state[2] != 0 && + D_0014C050[moby->mission + current_level_index * 16] == 0xFF)) { moby->command = 2; moby->glow_color = 0x80208020; - moby->state = 2; - list = vars[0]; + moby->state = FLOOR_BUTTON_STATE_DISABLED; + list = floor_button_private_state[0]; if (list != -1) { i = 0; if (*(s32 *)l05_paths[list] > 0) { do { - entry = ((char *)l05_paths[list]) + i * 16; - if (*(f32 *)(entry + 0x1C) == ((f32 *)vars)[1]) - *(s32 *)(entry + 0x1C) = 0; - list = vars[0]; + path_key_cursor = ((char *)l05_paths[list]) + i * 16; + if (*(f32 *)(path_key_cursor + 0x1C) == + ((f32 *)floor_button_private_state)[1]) + *(s32 *)(path_key_cursor + 0x1C) = 0; + list = floor_button_private_state[0]; i++; } while (i < *(s32 *)l05_paths[list]); } } } else { - moby->state = 1; + moby->state = FLOOR_BUTTON_STATE_WAIT_FOR_PRESS; } break; - case 1: - angle = fast_add_rotations(*(f32 *)(vars + 3), frame_time * 6.2831855f); - *(f32 *)(vars + 3) = angle; + case FLOOR_BUTTON_STATE_WAIT_FOR_PRESS: + angle = + fast_add_rotations(*(f32 *)(floor_button_private_state + 3), frame_time * 6.2831855f); + *(f32 *)(floor_button_private_state + 3) = angle; color = truncate_float_to_s32((fast_sin(angle) * 4.0f - 3.0f) * 128.0f); if (color > 0x80) color = 0x80; @@ -80,21 +90,22 @@ void floor_button_update(struct Moby *moby) { if (moby->mission == 0xFF || (D_L05_0015FC88[moby->mission] != 0xFF && D_0014C050[moby->mission + current_level_index * 16] == 0xFF)) { - D_L05_001BB6B0.collected[(s16)moby->save_id] = moby->mission + 2; + l05_mission_gated_moby_save_flags.collected[(s16)moby->save_id] = moby->mission + 2; } - moby->state = 2; + moby->state = FLOOR_BUTTON_STATE_DISABLED; moby->command = 1; moby->glow_color = 0x80208020; allocate_voice_for_target_entry(0, 0, moby); - list = vars[0]; + list = floor_button_private_state[0]; if (list != -1) { i = 0; if (*(s32 *)l05_paths[list] > 0) { do { - entry = ((char *)l05_paths[list]) + i * 16; - if (*(f32 *)(entry + 0x1C) == ((f32 *)vars)[1]) - *(s32 *)(entry + 0x1C) = 0; - list = vars[0]; + path_key_cursor = ((char *)l05_paths[list]) + i * 16; + if (*(f32 *)(path_key_cursor + 0x1C) == + ((f32 *)floor_button_private_state)[1]) + *(s32 *)(path_key_cursor + 0x1C) = 0; + list = floor_button_private_state[0]; i++; } while (i < *(s32 *)l05_paths[list]); } diff --git a/src/overlays/shared/props/garage_door.c b/src/overlays/shared/props/garage_door.c index 2bdb1afb03..21a5aec258 100644 --- a/src/overlays/shared/props/garage_door.c +++ b/src/overlays/shared/props/garage_door.c @@ -40,12 +40,12 @@ void garage_door_update(struct Moby *door_moby) { 1)) return; } - door_moby->state = 1; + door_moby->state = GARAGE_DOOR_RISING; return; case GARAGE_DOOR_RISING: door_moby->pos.z += frame_time; if (target->f[2] + 4.0f <= door_moby->pos.z) - door_moby->state = 2; + door_moby->state = GARAGE_DOOR_RAISED; return; case GARAGE_DOOR_RAISED: door_moby->pos.z = target->f[2] + 4.0f; diff --git a/src/overlays/shared/props/gold_weapon_case.c b/src/overlays/shared/props/gold_weapon_case.c index de4afc9f74..8eac91bb4e 100644 --- a/src/overlays/shared/props/gold_weapon_case.c +++ b/src/overlays/shared/props/gold_weapon_case.c @@ -45,6 +45,9 @@ void gold_weapon_case_update(struct Moby *moby) { GOLD_WEAPON_CASE_IDLE = 3, GOLD_WEAPON_CASE_WAIT_FOR_CUTSCENE_END = 4 }; + enum { + CUTSCENE_MODE_INACTIVE = 0 + }; SaleVars *sale_vars = (SaleVars *)moby->pvars; s32 purchased_item_id; ItemPrice *price; @@ -57,12 +60,12 @@ void gold_weapon_case_update(struct Moby *moby) { switch (moby->state) { case GOLD_WEAPON_CASE_INITIALIZE: if (moby->oclass != 0x130) { - moby->state = 2; + moby->state = GOLD_WEAPON_CASE_REMOVE_WHEN_PURCHASED; } else if (item_text_variant[gold_weapon_case_item_ids_by_slot[sale_vars->slot]] != 0 || initialize_npc_dialogue(moby, sale_vars) == -1) { - moby->state = 3; + moby->state = GOLD_WEAPON_CASE_IDLE; } else { - moby->state = 1; + moby->state = GOLD_WEAPON_CASE_PROCESS_SALE; } break; case GOLD_WEAPON_CASE_PROCESS_SALE: @@ -70,7 +73,7 @@ void gold_weapon_case_update(struct Moby *moby) { FUN_L00_00266448_2e1ac0(moby, sale_vars); if (sale_vars->result == 2) { item_text_variant[gold_weapon_case_item_ids_by_slot[sale_vars->slot]] = 1; - moby->state = 4; + moby->state = GOLD_WEAPON_CASE_WAIT_FOR_CUTSCENE_END; purchased_item_id = gold_weapon_case_item_ids_by_slot[sale_vars->slot]; price = &l01_gold_weapon_case_item_prices[purchased_item_id]; current_bolt_count -= price->bolts; @@ -80,9 +83,9 @@ void gold_weapon_case_update(struct Moby *moby) { case GOLD_WEAPON_CASE_IDLE: /* sold out or done: idle */ break; case GOLD_WEAPON_CASE_WAIT_FOR_CUTSCENE_END: - if (cutscene_mode == 0) { + if (cutscene_mode == CUTSCENE_MODE_INACTIVE) { memcard_save_data(0, -1); - moby->state = 3; + moby->state = GOLD_WEAPON_CASE_IDLE; } break; case GOLD_WEAPON_CASE_REMOVE_WHEN_PURCHASED: diff --git a/src/overlays/shared/props/grindrail_barrier.c b/src/overlays/shared/props/grindrail_barrier.c index 4680f66cdf..0327d7f7c3 100644 --- a/src/overlays/shared/props/grindrail_barrier.c +++ b/src/overlays/shared/props/grindrail_barrier.c @@ -86,7 +86,7 @@ void grindrail_barrier_update(struct Moby *barrier_moby) { float *cardinal_angles; switch (barrier_moby->state) { case GRINDRAIL_BARRIER_STATE_INITIALIZE: - barrier_moby->state = 1; + barrier_moby->state = GRINDRAIL_BARRIER_STATE_COLLISION_ENABLED; barrier_moby->update_dist = 0xFF; break; case GRINDRAIL_BARRIER_STATE_COLLISION_ENABLED: @@ -111,13 +111,13 @@ void grindrail_barrier_update(struct Moby *barrier_moby) { if (barrier_data->unk20 != -1 && check_grindrail_barrier_release_condition(barrier_data->unk20)) { barrier_moby->collision = 0; - barrier_moby->state = 2; + barrier_moby->state = GRINDRAIL_BARRIER_STATE_COLLISION_DISABLED; group_trigger_nearest(barrier_data->unk20); } break; case GRINDRAIL_BARRIER_STATE_COLLISION_DISABLED: if (!check_grindrail_barrier_release_condition(barrier_data->unk20)) { - barrier_moby->state = 1; + barrier_moby->state = GRINDRAIL_BARRIER_STATE_COLLISION_ENABLED; barrier_moby->collision = barrier_moby->pclass->collision; } break; diff --git a/src/overlays/shared/props/group_rotator.c b/src/overlays/shared/props/group_rotator.c index 7d06d0a0a7..7629e4ffd0 100644 --- a/src/overlays/shared/props/group_rotator.c +++ b/src/overlays/shared/props/group_rotator.c @@ -54,6 +54,10 @@ void moby_rotation_group_update(Moby *moby) { RESTORE_ROTATION_THEN_WAIT_FOR_TRIGGER_AND_CHILDREN = 8, RESTORE_ROTATION_THEN_UPDATE_POSITION_FROM_BASE = 9 }; + enum { + ROTATED_AND_HIDDEN_AFTER_TRIGGER_AND_CHILDREN = 6, + ROTATED_AND_HIDDEN = 7 + }; Vars *moby_vars = (Vars *)(*(void **)&moby->pvars); float position_offset[4]; int i; @@ -65,7 +69,7 @@ void moby_rotation_group_update(Moby *moby) { case SPAWN_CHILD_MOBYS: moby_vars->unk10 = (*(float(*)[4]) & moby->rot)[0]; qcopy(moby_vars->pos, (*(float(*)[4]) & moby->pos)); - moby->state = 2; + moby->state = WAIT_FOR_TRIGGER_AND_CHILDREN; for (i = 0; i < 7; i++) { moby_vars->slots[i] = create_moby(0x3FD); (*(char *)&moby_vars->slots[i]->update_dist) = 0x40; @@ -86,7 +90,7 @@ void moby_rotation_group_update(Moby *moby) { case INITIALIZE_BASE_TRANSFORM: moby_vars->unk10 = (*(float(*)[4]) & moby->rot)[0]; qcopy(moby_vars->pos, (*(float(*)[4]) & moby->pos)); - moby->state = 3; + moby->state = UPDATE_POSITION_FROM_BASE; fast_vec_normalize(position_offset, (*(float(*)[4]) & moby->rot_row2), rotation_group_position_offset_distance_gp); @@ -121,7 +125,7 @@ void moby_rotation_group_update(Moby *moby) { } if (flag) { allocate_voice_for_target_entry(0, 0, moby); - moby->state = 4; + moby->state = ROTATE_AND_HIDE_AFTER_TRIGGER_AND_CHILDREN; moby_vars->unk18 = 0; moby_vars->unk14 = 0.0f; for (k = 0; k < 7; k++) { @@ -150,10 +154,10 @@ void moby_rotation_group_update(Moby *moby) { if (moby_vars->unk14 >= 1.0471976f) { moby->flags |= 1; (*(char *)&moby->visible) = 0; - if (moby->state == 4) { - moby->state = 6; + if (moby->state == ROTATE_AND_HIDE_AFTER_TRIGGER_AND_CHILDREN) { + moby->state = ROTATED_AND_HIDDEN_AFTER_TRIGGER_AND_CHILDREN; } else { - moby->state = 7; + moby->state = ROTATED_AND_HIDDEN; } } break; @@ -169,10 +173,10 @@ void moby_rotation_group_update(Moby *moby) { (*(float(*)[4]) & moby->rot)[0] = fast_subtract_rotations(moby_vars->unk10, moby_vars->unk14); if (moby_vars->unk14 <= 0.0f) { - if (moby->state == 8) { - moby->state = 2; + if (moby->state == RESTORE_ROTATION_THEN_WAIT_FOR_TRIGGER_AND_CHILDREN) { + moby->state = WAIT_FOR_TRIGGER_AND_CHILDREN; } else { - moby->state = 3; + moby->state = UPDATE_POSITION_FROM_BASE; } } break; diff --git a/src/overlays/shared/props/hoverboard_ring.c b/src/overlays/shared/props/hoverboard_ring.c index 92b49c27da..07f5e74dc7 100644 --- a/src/overlays/shared/props/hoverboard_ring.c +++ b/src/overlays/shared/props/hoverboard_ring.c @@ -33,7 +33,7 @@ void hoverboard_ring_update(char *moby) { case HOVERBOARD_RING_STATE_INIT: ((unsigned char *)moby)[0x30] = 0x80; MOBY(moby)->flags |= 0x41; - MOBY(moby)->state = 1; + MOBY(moby)->state = HOVERBOARD_RING_STATE_ACTIVE; break; case HOVERBOARD_RING_STATE_ACTIVE: { float bounding_sphere[4]; diff --git a/src/overlays/shared/props/hydrodisplacer.c b/src/overlays/shared/props/hydrodisplacer.c index 307c26187b..1539835f9c 100644 --- a/src/overlays/shared/props/hydrodisplacer.c +++ b/src/overlays/shared/props/hydrodisplacer.c @@ -20,6 +20,15 @@ #include "rnc/input/pad_globals.h" #include "rnc/math/interpolation/advance_accelerated_scalar.h" +enum { + HYDRODISPLACER_INITIALIZE = 0, + HYDRODISPLACER_WAIT_FOR_ANIMATION_FLAG = 1, + HYDRODISPLACER_WAIT_FOR_ACTIVATION = 2, + HYDRODISPLACER_WAIT_FOR_HERO_FLAG = 3, + HYDRODISPLACER_CAMERA_TRANSITION = 4, + HYDRODISPLACER_WAIT_FOR_TIMER = 5 +}; + typedef struct Hero Hero; typedef struct Moby Moby; @@ -102,14 +111,6 @@ void hydrodisplacer_update(Moby *moby) __asm__("FUN_L00_002df9a0"); /* Moby class 1251 */ void hydrodisplacer_update(Moby *moby) { - enum { - HYDRODISPLACER_INITIALIZE = 0, - HYDRODISPLACER_WAIT_FOR_ANIMATION_FLAG = 1, - HYDRODISPLACER_WAIT_FOR_ACTIVATION = 2, - HYDRODISPLACER_WAIT_FOR_HERO_FLAG = 3, - HYDRODISPLACER_CAMERA_TRANSITION = 4, - HYDRODISPLACER_WAIT_FOR_TIMER = 5 - }; enum { HYDRODISPLACER_CAMERA_PREPARE_INTERPOLATION = 0, HYDRODISPLACER_CAMERA_INTERPOLATE = 1, @@ -151,11 +152,11 @@ void hydrodisplacer_update(Moby *moby) { switch (moby->state) { case HYDRODISPLACER_INITIALIZE: allocate_voice_for_target_entry(0, 0, moby); - moby->state = 1; + moby->state = HYDRODISPLACER_WAIT_FOR_ANIMATION_FLAG; break; case HYDRODISPLACER_WAIT_FOR_ANIMATION_FLAG: if (moby->anim_flags & 2) { - moby->state = 2; + moby->state = HYDRODISPLACER_WAIT_FOR_ACTIVATION; } break; case HYDRODISPLACER_WAIT_FOR_ACTIVATION: @@ -171,7 +172,7 @@ void hydrodisplacer_update(Moby *moby) { if (func_L00_002E1790_2E0E50(moby) == 0 || (unsigned int)hero.state.control_mode >= 2) { break; } - moby->state = 3; + moby->state = HYDRODISPLACER_WAIT_FOR_HERO_FLAG; hero_set_state(0x38, 0); if (hero.hydro_tank_full != 0) { set_hero_animation(0x83, 0, func_001F9850_2E0E50(6)); @@ -205,7 +206,7 @@ void hydrodisplacer_update(Moby *moby) { } if (platform[1] != -1 && platform[2] != -1) { moby->command = 0; - moby->state = 4; + moby->state = HYDRODISPLACER_CAMERA_TRANSITION; hydrodisplacer_interaction_state->f10 = 0.0f; jet_mount(g_debug_camera.position, g_debug_camera.angles, 1, 0, 0); if (hero.hydro_tank_full != 0) { @@ -217,7 +218,7 @@ void hydrodisplacer_update(Moby *moby) { } break; } - moby->state = 5; + moby->state = HYDRODISPLACER_WAIT_FOR_TIMER; hydrodisplacer_interaction_state->i0 = func_001FA898_2E0E50(scale_time(hydrodisplacer_tank_fill_time_macro)); if (hero.hydro_tank_full == 0) { @@ -311,7 +312,7 @@ void hydrodisplacer_update(Moby *moby) { approach_value(&fade_level_macro, 0.0f, 1.0f / func_001F9850_2E0E50(15)); return; } - moby->state = 2; + moby->state = HYDRODISPLACER_WAIT_FOR_ACTIVATION; hero_set_state(0x3A, 0); if (hero.hydro_tank_full != 0) { set_hero_animation(0x48, 0, func_001F9850_2E0E50(6)); @@ -327,7 +328,7 @@ void hydrodisplacer_update(Moby *moby) { break; } end_hydrodisplacer_interaction(moby); - moby->state = 2; + moby->state = HYDRODISPLACER_WAIT_FOR_ACTIVATION; break; } } @@ -381,7 +382,7 @@ s32 test_hydrodisplacer_activation_flag(void) { /* Moby state 4: clears two globals, calls 002eac18(3); control mode 0x13: calls 002223f8(0, 1). */ void end_hydrodisplacer_interaction(char *moby) { - if (MOBY(moby)->state == 4) { + if (MOBY(moby)->state == HYDRODISPLACER_CAMERA_TRANSITION) { hydrodisplacer_camera_active = 0; *(int *)&D_L00_0015F3FC = 0; jet_end_mount(3); diff --git a/src/overlays/shared/props/lamp.c b/src/overlays/shared/props/lamp.c index 879c7ac62a..87a9a0fc67 100644 --- a/src/overlays/shared/props/lamp.c +++ b/src/overlays/shared/props/lamp.c @@ -32,7 +32,7 @@ typedef struct { extern int fast_tween_color(int, int, float) __asm__("FUN_001fa6e0"); -extern void FUN_L00_001fff28(void *, int, float); +extern void build_axis_rotation_quaternion(void *, int, float) __asm__("FUN_L00_001fff28"); void draw_moby_wobble_quads(struct Moby *moby) __asm__("FUN_L05_0030c220"); extern void draw_moby_wobble_quads(struct Moby *m) __asm__("FUN_L05_0030c220"); @@ -81,7 +81,7 @@ void moby_wobble_update(unsigned char *moby) { wobble_vars->unk4C = randf_sym(lo, hi); set_moby_color(moby, 0x80, 0x80, 0x80); attach_manipulator((char *)moby, 0, wobble_vars); - MOBY(moby)->state = 1; + MOBY(moby)->state = MOBY_WOBBLE_STATE_ANIMATE; break; case MOBY_WOBBLE_STATE_ANIMATE: { float k = 0.5235988f; @@ -92,7 +92,7 @@ void moby_wobble_update(unsigned char *moby) { MOBY(moby)->rot.z = fast_add_rotations(wobble_vars->unk40, fast_sin(wobble_phase) * k); wobble_phase = fast_add_rotations(wobble_vars->unk48, wobble_vars->unk50); wobble_vars->unk48 = wobble_phase; - FUN_L00_001fff28(&wobble_vars->unk10, 1, fast_sin(wobble_phase) * k + k); + build_axis_rotation_quaternion(&wobble_vars->unk10, 1, fast_sin(wobble_phase) * k + k); break; } } diff --git a/src/overlays/shared/props/linked_spark_emitter.c b/src/overlays/shared/props/linked_spark_emitter.c index 7fbc7aa6f8..779540489b 100644 --- a/src/overlays/shared/props/linked_spark_emitter.c +++ b/src/overlays/shared/props/linked_spark_emitter.c @@ -74,6 +74,9 @@ void linked_spark_emitter_update(unsigned char *moby) { EMIT_SPARKS = 1, WAIT_FOR_EFFECT_TIMEOUT = 2 }; + enum { + EFFECT_DISABLED = 3 + }; unsigned char *moby_data = ((unsigned char *)MOBY(moby)->pvars); float V[4]; float W[16]; @@ -91,11 +94,11 @@ void linked_spark_emitter_update(unsigned char *moby) { (((*(int *)(D_0014C190 + (((short)id >> 5) * 4) + (D_0015ED84 << 8)) >> (id & 0x1F)) ^ 1) & 1)) { - MOBY(moby)->state = 1; + MOBY(moby)->state = EMIT_SPARKS; } else { MOBY(moby)->command = 0xFF; MOBY(moby)->collision = 0; - MOBY(moby)->state = 3; + MOBY(moby)->state = EFFECT_DISABLED; } break; } @@ -105,10 +108,11 @@ void linked_spark_emitter_update(unsigned char *moby) { visited52[(unsigned char)MOBY(moby)->mission + (D_0015ED84 << 4)] == 0xFF) { mark_moby_killed_and_release_owned_voice(moby); } else { - Voice *e = (Voice *)((unsigned char *)&voice_pool + MOBY(moby)->command * 0x70); - float lo, hi, z, one; - int i; - if (e->owner != (char *)moby || e->active == 0) { + Voice *emitter_voice_slot = + (Voice *)((unsigned char *)&voice_pool + MOBY(moby)->command * 0x70); + float lo, hi, z, one; + int i; + if (emitter_voice_slot->owner != (char *)moby || emitter_voice_slot->active == 0) { MOBY(moby)->command = allocate_voice_for_target_entry(0, 4, moby); } fast_vec_sub(V, D_0013F420, &MOBY(moby)->pos); @@ -164,7 +168,7 @@ void linked_spark_emitter_update(unsigned char *moby) { } case WAIT_FOR_EFFECT_TIMEOUT: if ((*(int *)(moby_data + 0x14))++ >= 0x3D) { - MOBY(moby)->state = 3; + MOBY(moby)->state = EFFECT_DISABLED; } else { qzero(moby_data); add_draw_callback(func_L15_002A4318_2A3DD0, moby); diff --git a/src/overlays/shared/props/moby_state_trigger.c b/src/overlays/shared/props/moby_state_trigger.c index 6373b1843b..3ff933c9a3 100644 --- a/src/overlays/shared/props/moby_state_trigger.c +++ b/src/overlays/shared/props/moby_state_trigger.c @@ -111,6 +111,9 @@ void moby_spatial_trigger_update(struct Moby *trigger_moby) __asm__("FUN_L05_002 /* Moby class 258 */ void moby_spatial_trigger_update(struct Moby *trigger_moby) { + enum { + SPATIAL_TRIGGER_STATE_UNINITIALIZED = 0 + }; TriggerVars *trigger_vars = (TriggerVars *)trigger_moby->pvars; Vec4 target; s32 inside; @@ -142,7 +145,7 @@ void moby_spatial_trigger_update(struct Moby *trigger_moby) { } } if ((inside && trigger_moby->command == 0) || (!inside && trigger_moby->command != 0) || - trigger_moby->state == 0) { + trigger_moby->state == SPATIAL_TRIGGER_STATE_UNINITIALIZED) { if (inside) { trigger_moby->command = 1; } else { diff --git a/src/overlays/shared/props/novalis_elevator.c b/src/overlays/shared/props/novalis_elevator.c index 7d57548099..9bb1710463 100644 --- a/src/overlays/shared/props/novalis_elevator.c +++ b/src/overlays/shared/props/novalis_elevator.c @@ -31,6 +31,10 @@ void novalis_elevator_update(unsigned char *moby) { NOVALIS_ELEVATOR_WAIT_AT_PATH_START = 1, NOVALIS_ELEVATOR_TRAVERSE_PATH = 2 }; + enum { + NOVALIS_ELEVATOR_UNINITIALIZED = 0, + NOVALIS_ELEVATOR_INITIALIZED = 1 + }; char *elevator_vars = ((char *)MOBY(moby)->pvars); char *path; float orig[4], delta[4], segment_offset[4]; @@ -71,7 +75,7 @@ void novalis_elevator_update(unsigned char *moby) { } qcopy(orig, &MOBY(moby)->pos); fast_dec_timer_s16(elevator_vars + 0xBA); - if (MOBY(moby)->state == 0) { + if (MOBY(moby)->state == NOVALIS_ELEVATOR_UNINITIALIZED) { float f; char *pts; elevator_vars[0x28] = 4; @@ -88,7 +92,7 @@ void novalis_elevator_update(unsigned char *moby) { *(short *)(elevator_vars + 0xBA) = 0; *(int *)(elevator_vars + 0xA8) = 0; *(int *)(elevator_vars + 0xBC) = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = NOVALIS_ELEVATOR_INITIALIZED; MOBY(moby)->update_dist = 0xFF; MOBY(moby)->draw_dist = 0xFF; *(int *)(elevator_vars + 0xC4) = -1; diff --git a/src/overlays/shared/props/ocean_pokitaru.c b/src/overlays/shared/props/ocean_pokitaru.c index b0dff5824f..b9fff0e354 100644 --- a/src/overlays/shared/props/ocean_pokitaru.c +++ b/src/overlays/shared/props/ocean_pokitaru.c @@ -321,13 +321,17 @@ void ocean_pokitaru_update(OceanMoby *moby) __asm__("FUN_L11_0030b358"); /* Moby class 1111 */ void ocean_pokitaru_update(OceanMoby *moby) { + enum { + OCEAN_POKITARU_STATE_UNINITIALIZED = 0, + OCEAN_POKITARU_STATE_INITIALIZED = 1 + }; OceanVars *ocean_vars = moby->vars; float camera_displacement[4]; float camera_wave_uv_delta[4]; int k; - if (moby->state == 0) { - moby->state = 1; + if (moby->state == OCEAN_POKITARU_STATE_UNINITIALIZED) { + moby->state = OCEAN_POKITARU_STATE_INITIALIZED; moby->f30 = 0xFF; for (k = 0; k < 2; k++) { wave_offset[k].u = 0.0f; diff --git a/src/overlays/shared/props/particle_spawner_smoke_fire.c b/src/overlays/shared/props/particle_spawner_smoke_fire.c index d3f552fd5f..d84d709aeb 100644 --- a/src/overlays/shared/props/particle_spawner_smoke_fire.c +++ b/src/overlays/shared/props/particle_spawner_smoke_fire.c @@ -155,7 +155,7 @@ void particle_spawner_smoke_fire_update(P *spawner) { switch (spawner->state) { case PARTICLE_SPAWNER_INITIALIZE: - spawner->state = 1; + spawner->state = PARTICLE_SPAWNER_ACTIVE; spawner->b30 = 0xFF; if (q->idx == -1) { mark_moby_for_removal(spawner); diff --git a/src/overlays/shared/props/pterodactyl.c b/src/overlays/shared/props/pterodactyl.c index c05cf414e0..a38cada8b2 100644 --- a/src/overlays/shared/props/pterodactyl.c +++ b/src/overlays/shared/props/pterodactyl.c @@ -55,7 +55,7 @@ void pterodactyl_update(unsigned char *moby) { moby_data->i70 = absolute_float(first_segment_length - first_to_last_distance) < 0.1f; } moby_data->f6C = moby_data->f68 * (float)*path; - MOBY(moby)->state = 1; + MOBY(moby)->state = PTERODACTYL_FOLLOW_PATH; MOBY(moby)->scale *= pterodactyl_scale_multiplier_gp; MOBY(moby)->update_dist = 0xFF; case PTERODACTYL_FOLLOW_PATH: diff --git a/src/overlays/shared/props/red_orb.c b/src/overlays/shared/props/red_orb.c index 74ccbc3f38..f1dd0299ad 100644 --- a/src/overlays/shared/props/red_orb.c +++ b/src/overlays/shared/props/red_orb.c @@ -101,7 +101,7 @@ void red_orb_update(struct Moby *moby) { switch (state) { case RED_ORB_STATE_INITIALIZE_PHASE: *(float *)orb_data = *(float *)orb_data * DEG_TO_RAD; - moby->state = 1; + moby->state = RED_ORB_STATE_PULSE_COLOR; break; case RED_ORB_STATE_PULSE_COLOR: pulse_phase_or_sine = fast_add_rotations( diff --git a/src/overlays/shared/props/respawn_volume.c b/src/overlays/shared/props/respawn_volume.c index 4cb3118219..76fb920d29 100644 --- a/src/overlays/shared/props/respawn_volume.c +++ b/src/overlays/shared/props/respawn_volume.c @@ -29,7 +29,7 @@ void respawn_volume_update(char *moby) { int j; switch (((unsigned char *)moby)[0x20]) { case INITIALIZE_TRIGGER_MONITOR: - MOBY(moby)->state = 1; + MOBY(moby)->state = CHECK_HERO_TRIGGER_VOLUMES; ((unsigned char *)moby)[0x30] = 0xFF; return; case CHECK_HERO_TRIGGER_VOLUMES: @@ -49,7 +49,7 @@ void respawn_volume_update(char *moby) { for (i = 0; i < 32; i++) { if (list[i] >= 0 && is_point_inside_clip_volume(&hero.motion.pos, list[i])) { struct Hero *hero_ptr = &hero; - if (hero_ptr->vehicle_mode != 0) { + if (hero_ptr->vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) { fade_to_black(scale_game_frames(10)); hero_respawn(); } else if (hero_ptr->state.current != 0x77) { diff --git a/src/overlays/shared/props/ripple_strips.c b/src/overlays/shared/props/ripple_strips.c index 76a677899e..603dce660f 100644 --- a/src/overlays/shared/props/ripple_strips.c +++ b/src/overlays/shared/props/ripple_strips.c @@ -11,9 +11,13 @@ void ripple_strips_moby_update(struct Moby *moby) __asm__("FUN_L15_002eb0a0"); /* Moby classes 1405-1409, 1426, 1565, 1567 */ void ripple_strips_moby_update(struct Moby *moby) { - if (moby->state == 0) { + enum { + RIPPLE_STRIPS_STATE_INITIALIZE = 0, + RIPPLE_STRIPS_STATE_DRAW_READY = 1 + }; + if (moby->state == RIPPLE_STRIPS_STATE_INITIALIZE) { set_moby_color(moby, 0x40, 0x40, 0x40); - moby->state = 1; + moby->state = RIPPLE_STRIPS_STATE_DRAW_READY; } else { add_draw_callback((void *)draw_moby_radial_ripple_mesh_buffers, moby); moby->draw_dist = 0; diff --git a/src/overlays/shared/props/swingshot_versatarget.c b/src/overlays/shared/props/swingshot_versatarget.c index 44eec1bdc6..bf73e9ab70 100644 --- a/src/overlays/shared/props/swingshot_versatarget.c +++ b/src/overlays/shared/props/swingshot_versatarget.c @@ -53,12 +53,12 @@ void swingshot_versatarget_update(char *moby) { ((unsigned char *)linked_moby)[0x20] != 0xFE && ((unsigned char *)linked_moby)[0x20] != 0xFD)) { ((unsigned char *)moby)[0x30] = 0xFF; - MOBY(moby)->state = 2; + MOBY(moby)->state = VERSATARGET_STATE_INACTIVE; MOBY(moby)->flags |= 0x41; } else { set_moby_color(moby, 0xC0, 0xC0, 0xC0); func_L02_002FBB10_c(moby); - MOBY(moby)->state = 1; + MOBY(moby)->state = VERSATARGET_STATE_ACTIVE; } break; case VERSATARGET_STATE_ACTIVE: @@ -113,7 +113,7 @@ void swingshot_versatarget_update(char *moby) { ((unsigned char *)linked_moby)[0x20] == 0xFD))) { MOBY(moby)->flags &= 0xFFBE; *(int *)(moby_data + 0x30) = -1; - MOBY(moby)->state = 0; + MOBY(moby)->state = VERSATARGET_STATE_INITIALIZE; } break; } diff --git a/src/overlays/shared/props/teleporter.c b/src/overlays/shared/props/teleporter.c index 1a05ddd22e..1d3c994096 100644 --- a/src/overlays/shared/props/teleporter.c +++ b/src/overlays/shared/props/teleporter.c @@ -21,6 +21,17 @@ #include "rnc/game/item_state.h" #include "rnc/overlay/shared/world/level_labels.h" +enum { + TELEPORTER_INITIALIZE = 0, + TELEPORTER_WAIT_FOR_USE = 1, + TELEPORTER_PREPARE_TRANSFER = 2, + TELEPORTER_TRANSFER_TO_DESTINATION = 3, + TELEPORTER_RETURN_TO_IDLE = 4, + TELEPORTER_ENTER_WAIT_FOR_USE = 6, + TELEPORTER_EFFECT_CYCLE_PREPARE = 7, + TELEPORTER_EFFECT_CYCLE_RETURN_TO_IDLE = 8 +}; + typedef struct TeleporterVars { u8 pad0[0x4]; s32 unk4; @@ -241,7 +252,7 @@ void activate_teleporter_and_record_state(struct Moby *moby) { if (moby_group_index != 0xFF) set_moby_list_state((char *)moby_group_index, 1); else - moby->state = 1; + moby->state = TELEPORTER_WAIT_FOR_USE; } /* Ported from rac1-decomp (src/overlays/shared/vendor_002F7700.c: func_L01_00309FB0). */ @@ -250,14 +261,11 @@ void teleporter_update(struct Moby *moby) __asm__("FUN_L01_00308bd8"); /* Moby class 1135 */ void teleporter_update(struct Moby *moby) { enum { - TELEPORTER_INITIALIZE = 0, - TELEPORTER_WAIT_FOR_USE = 1, - TELEPORTER_PREPARE_TRANSFER = 2, - TELEPORTER_TRANSFER_TO_DESTINATION = 3, - TELEPORTER_RETURN_TO_IDLE = 4, - TELEPORTER_ENTER_WAIT_FOR_USE = 6, - TELEPORTER_EFFECT_CYCLE_PREPARE = 7, - TELEPORTER_EFFECT_CYCLE_RETURN_TO_IDLE = 8 + TELEPORTER_WAIT_FOR_ACTIVATION = 5 + }; + enum { + HERO_TARGET_POSE_STATUS_INACTIVE = 0, + HERO_TARGET_POSE_STATUS_TRANSFER_READY = 2 }; TeleporterVars *teleporter_vars = (TeleporterVars *)moby->pvars; int active = 0; @@ -269,12 +277,12 @@ void teleporter_update(struct Moby *moby) { active = 1; } active = active != 0; - if (moby->state != 0 && teleporter_vars->unk4 != -1 && !active && + if (moby->state != TELEPORTER_INITIALIZE && teleporter_vars->unk4 != -1 && !active && FUN_00214720(&hero.motion.pos, teleporter_vars->unk4) != 0) { active = 1; activate_teleporter_and_record_state(moby); show_teleporter_and_children(moby); - if (moby->state == 5) + if (moby->state == TELEPORTER_WAIT_FOR_ACTIVATION) moby->state = active; } if (teleporter_vars->unk3C != 0) { @@ -306,9 +314,9 @@ void teleporter_update(struct Moby *moby) { fast_add_rotations(MOBY(child_moby)->rot.z, (float)i * 2.0943952f); } if (teleporter_vars->unk38 != 0 || active) { - moby->state = 6; + moby->state = TELEPORTER_ENTER_WAIT_FOR_USE; } else { - moby->state = 5; + moby->state = TELEPORTER_WAIT_FOR_ACTIVATION; hide_teleporter_and_children((L01Moby *)moby); } update_teleporter_child_transforms(moby); @@ -318,7 +326,7 @@ void teleporter_update(struct Moby *moby) { if (moby->group != 0xFF) { set_moby_list_state((char *)moby->group, 1); } - moby->state = 1; + moby->state = TELEPORTER_WAIT_FOR_USE; case TELEPORTER_WAIT_FOR_USE: { struct Hero *g; if (teleporter_vars->unk8 >= 0 && @@ -327,7 +335,7 @@ void teleporter_update(struct Moby *moby) { if (*(int *)teleporter_vars == -1) break; g = &hero; - if (g->vehicle_mode == 2) + if (g->vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) break; if (((char *)g->ground_moby) != moby) break; @@ -337,7 +345,7 @@ void teleporter_update(struct Moby *moby) { if (!(pad_pressed_words[0] & 0x10)) break; allocate_voice_for_target_entry(0, 0, (void *)moby); - moby->state = 2; + moby->state = TELEPORTER_PREPARE_TRANSFER; teleporter_vars->unk30 = -1; *(int *)&teleporter_vars->unk2C = 0; *(int *)&teleporter_vars->unk28 = 0; @@ -362,7 +370,7 @@ void teleporter_update(struct Moby *moby) { teleporter_child_motion_max_speed_gp * frame_time); } else { allocate_voice_for_target_entry(1, 0, (void *)moby); - moby->state = 8; + moby->state = TELEPORTER_EFFECT_CYCLE_RETURN_TO_IDLE; teleporter_vars->unk34 = 0.0f; } update_teleporter_child_transforms(moby); @@ -384,11 +392,11 @@ void teleporter_update(struct Moby *moby) { teleporter_child_motion_deceleration_gp * frame_time_sq, teleporter_child_motion_max_speed_gp * frame_time); } else if (D_L01_0015F594 != 4 || !(teleporter_vars->unk14[3] > 0.25f)) { - if (transfer_preparation_status == 2) { + if (transfer_preparation_status == HERO_TARGET_POSE_STATUS_TRANSFER_READY) { teleporter_vars->unk34 = 1.95f; - moby->state = 3; - } else if (transfer_preparation_status == 0) { - moby->state = 4; + moby->state = TELEPORTER_TRANSFER_TO_DESTINATION; + } else if (transfer_preparation_status == HERO_TARGET_POSE_STATUS_INACTIVE) { + moby->state = TELEPORTER_RETURN_TO_IDLE; } } update_teleporter_child_transforms(moby); @@ -409,14 +417,14 @@ void teleporter_update(struct Moby *moby) { if (teleporter_vars->unk40 != -1 && teleporter_vars->unk44 != -1) { request_music_track(teleporter_vars->unk40, teleporter_vars->unk44); } - MOBY(destination_moby)->state = 4; + MOBY(destination_moby)->state = TELEPORTER_RETURN_TO_IDLE; td->unk34 = 0.0f; td->unk28 = 0.0f; td->unk2C = 0.0f; td->unk14[3] = 1.0f; td->unk24 = 1.0f; allocate_voice_for_target_entry(1, 0, (void *)destination_moby); - moby->state = 1; + moby->state = TELEPORTER_WAIT_FOR_USE; teleporter_vars->unk14[3] = 0.0f; teleporter_vars->unk24 = 0.0f; teleporter_vars->unk28 = 0.0f; @@ -445,7 +453,7 @@ void teleporter_update(struct Moby *moby) { teleporter_child_motion_deceleration_gp * frame_time_sq, teleporter_child_motion_max_speed_gp * frame_time); } else { - moby->state = 1; + moby->state = TELEPORTER_WAIT_FOR_USE; } update_teleporter_child_transforms(moby); break; @@ -578,11 +586,14 @@ void draw_moby_radius_ring(char *moby) { void hide_teleporter_and_children(L01Moby *moby) __asm__("FUN_L01_003097e8"); void hide_teleporter_and_children(L01Moby *moby) { + enum { + TELEPORTER_VISIBILITY_HIDDEN = 0 + }; L01Moby **slots = moby->data->slots; int i; moby->field94 = 0; moby->flags |= 1; - moby->state = 0; + moby->state = TELEPORTER_VISIBILITY_HIDDEN; for (i = 2; i >= 0; i--, slots++) { if (*slots != 0) { (*slots)->flags |= 1; diff --git a/src/overlays/shared/props/thruster_pack_lock.c b/src/overlays/shared/props/thruster_pack_lock.c index 877a7d2624..cbc813cba9 100644 --- a/src/overlays/shared/props/thruster_pack_lock.c +++ b/src/overlays/shared/props/thruster_pack_lock.c @@ -88,8 +88,8 @@ extern s32 allocate_voice_for_target_entry() __asm__("func_0022DA68"); extern unsigned char D_0013F350[]; s32 FUN_L00_00203908(s32 a, s32 b); extern unsigned char D_0014171B_3102C8[] __asm__("D_0013F350"); -extern LvState D_L11_001BBC30; -extern LvState D_L11_001BAFD0; +extern LvState l11_thruster_pack_lock_restore_state __asm__("D_L11_001BBC30"); +extern LvState l11_thruster_pack_lock_activation_state __asm__("D_L11_001BAFD0"); extern unsigned char D_L11_0015FD08_3102C8[] __asm__("D_L11_0015FC88"); void thruster_pack_lock_update(Lock *moby) __asm__("FUN_L11_0030ee00"); @@ -100,6 +100,9 @@ void thruster_pack_lock_update(Lock *moby) { THRUSTER_PACK_LOCK_STATE_INIT = 0, THRUSTER_PACK_LOCK_STATE_ACTIVE = 1 }; + enum { + THRUSTER_PACK_LOCK_STATE_LOWERED = 2 + }; char *vars = moby->vars; switch (moby->state) { @@ -109,17 +112,17 @@ void thruster_pack_lock_update(Lock *moby) { ((Stats *)(D_00141968_r))->best = 0; *(unsigned short *)(vars + 0x3E) |= 8; if (level == 0xB && moby->bB0 != 0xFF) { - if (D_L11_001BBC30.collected[(short)moby->uid] != 0 || + if (l11_thruster_pack_lock_restore_state.collected[(short)moby->uid] != 0 || ((*(int *)(D_0014C190_r + (((short)moby->uid >> 5) * 4 + (level << 8))) >> (moby->uid & 0x1F)) & 1)) { - moby->state = 2; + moby->state = THRUSTER_PACK_LOCK_STATE_LOWERED; moby->z = moby->z - 1.5f; allocate_voice_for_target_entry(0, 0, moby); return; } } - moby->state = 1; + moby->state = THRUSTER_PACK_LOCK_STATE_ACTIVE; break; } case THRUSTER_PACK_LOCK_STATE_ACTIVE: @@ -129,16 +132,16 @@ void thruster_pack_lock_update(Lock *moby) { if (current_level_index == 0xB && moby->bB0 != 0xFF) { int group; int group_index; - D_L11_001BAFD0.collected[(short)moby->uid] = moby->bB0 + 2; + l11_thruster_pack_lock_activation_state.collected[(short)moby->uid] = moby->bB0 + 2; group = moby->bB0; group_index = group & 0xFF; if (group == 0xFF || (D_L11_0015FD08_3102C8[group_index] != 0xFF && (visited52)[group_index + (current_level_index << 4)] == 0xFF)) { - D_L11_001BBC30.collected[(short)moby->uid] = group + 2; + l11_thruster_pack_lock_restore_state.collected[(short)moby->uid] = group + 2; } } - moby->state = 2; + moby->state = THRUSTER_PACK_LOCK_STATE_LOWERED; moby->z = moby->z - 1.5f; allocate_voice_for_target_entry(0, 0, moby); } @@ -738,6 +741,13 @@ extern unsigned char D_00141968[]; void update_moby_hit_stats_and_state(char *moby) __asm__("FUN_L11_0031a1c0"); void update_moby_hit_stats_and_state(char *moby) { + enum { + BLARG_SHIP_BURST_AND_WAIT_TO_REACTIVATE = 2, + BLARG_SHIP_BURST_AND_DEACTIVATE = 6 + }; + enum { + BLARG_SHIP_INACTIVE = 4 + }; char *moby_vars = ((char *)MOBY(moby)->pvars); char *hit_record = find_moby_hit(moby, 0x330000, 0); struct Hero *player_hero; @@ -771,11 +781,11 @@ void update_moby_hit_stats_and_state(char *moby) { } } if (*(int *)(moby_vars + 0x88) != 0) { - next_moby_state = 6; + next_moby_state = BLARG_SHIP_BURST_AND_DEACTIVATE; current_moby_state = ((unsigned char *)moby)[0x20]; } else { current_moby_state = ((unsigned char *)moby)[0x20]; - next_moby_state = 2; + next_moby_state = BLARG_SHIP_BURST_AND_WAIT_TO_REACTIVATE; } if (current_moby_state != next_moby_state) { MOBY(moby)->state = next_moby_state; @@ -786,12 +796,12 @@ void update_moby_hit_stats_and_state(char *moby) { } else if (((unsigned char *)moby)[0x20] == 5) { struct Hero *hero_for_state_check = &hero; if (hero_for_state_check->state.current != 0x32) { - MOBY(moby)->state = 4; + MOBY(moby)->state = BLARG_SHIP_INACTIVE; MOBY(moby)->collision = 0; MOBY(moby)->flags |= 1; } if (coll_sphere(1.0f, &MOBY(moby)->pos, 0, moby)) { - MOBY(moby)->state = 6; + MOBY(moby)->state = BLARG_SHIP_BURST_AND_DEACTIVATE; if (((unsigned char *)moby)[0x53] != 1) { blend_moby_animation(moby, 1, 0, scale_game_frames(10)); } diff --git a/src/overlays/shared/props/timed_activation_pads.c b/src/overlays/shared/props/timed_activation_pads.c index dd2357be8e..f6a005d787 100644 --- a/src/overlays/shared/props/timed_activation_pads.c +++ b/src/overlays/shared/props/timed_activation_pads.c @@ -63,7 +63,7 @@ void timed_activation_pads_update(unsigned char *moby) { return; flag = 0; - if (MOBY(moby)->state < 6) { + if (MOBY(moby)->state < PAD_INITIALIZE_FLASHING) { if (MOBY(moby)->mission != 0xFF) { if (visited52[MOBY(moby)->mission + (current_level_index << 4)] == 0xFF) set_moby_list_state(MOBY(moby)->group, 6); @@ -137,7 +137,7 @@ void timed_activation_pads_update(unsigned char *moby) { } break; case PAD_ADVANCE_TO_FLASH_ACTIVATION_GATE: - MOBY(moby)->state = 3; + MOBY(moby)->state = PAD_WAIT_TO_ENTER_FLASH_ACTIVATION_WAIT; break; case PAD_WAIT_TO_ENTER_FLASH_ACTIVATION_WAIT: if (flag) { @@ -148,7 +148,7 @@ void timed_activation_pads_update(unsigned char *moby) { } break; case PAD_ENTER_FLASH_ACTIVATION_WAIT: - MOBY(moby)->state = 5; + MOBY(moby)->state = PAD_WAIT_FOR_FLASH_ACTIVATION; break; case PAD_WAIT_FOR_FLASH_ACTIVATION: if (flag) { @@ -162,7 +162,7 @@ void timed_activation_pads_update(unsigned char *moby) { pad_data->unkC = func_001F9850_30D370(0x14); pad_data->unkE = 0; glow_n(moby, 0x80, 0xFF, 0x80); - MOBY(moby)->state = 7; + MOBY(moby)->state = PAD_UPDATE_FLASHING; break; case PAD_UPDATE_FLASHING: if (MOBY(moby)->mission != 0xFF) { @@ -189,7 +189,7 @@ void timed_activation_pads_update(unsigned char *moby) { case PAD_RESET_TO_ACTIVATION_WAIT: glow_n(moby, 0x80, 0x80, 0x80); MOBY(moby)->command = 0; - MOBY(moby)->state = 1; + MOBY(moby)->state = PAD_WAIT_FOR_ACTIVATION; break; case 9: break; diff --git a/src/overlays/shared/props/trespasser_pad.c b/src/overlays/shared/props/trespasser_pad.c index 1ec4e67ef4..5aa3299127 100644 --- a/src/overlays/shared/props/trespasser_pad.c +++ b/src/overlays/shared/props/trespasser_pad.c @@ -111,11 +111,15 @@ extern float frame_time_macro __asm__("D_0015ED6C") MACRO_ADDR; extern int D_L02_0017EB08_lui __asm__("D_L02_0017EB08") NOT_SDA; extern Idle D_L02_00179A10; extern int D_L02_001BADE0_2D9F08[] __asm__("D_L02_001BAAD0"); -extern int D_L02_00161B1C_gp __asm__("D_L02_00161B1C") __attribute__((sda)); -extern int D_L02_00161AA8_gp __asm__("D_L02_00161AA8") __attribute__((sda)); -extern int D_L02_00161AA4_gp __asm__("D_L02_00161AA4") __attribute__((sda)); -extern int D_L02_00161AA0_gp __asm__("D_L02_00161AA0") __attribute__((sda)); -extern char D_0013E633_2D9F08[] __asm__("D_0013E533"); +extern int l02_tresspasser_puzzle_texture_index_offset __asm__("D_L02_00161B1C") + __attribute__((sda)); +extern int l02_tresspasser_pad_no_ground_contact_glow_color __asm__("D_L02_00161AA8") + __attribute__((sda)); +extern int l02_tresspasser_pad_without_tool_glow_color __asm__("D_L02_00161AA4") + __attribute__((sda)); +extern int l02_tresspasser_pad_tool_equipped_glow_color __asm__("D_L02_00161AA0") + __attribute__((sda)); +extern char D_0013E633_2D9F08[] __asm__("D_0013E533"); extern void func_L00_002607A8_d92f0(void *a, float x) __asm__("FUN_L00_0025f730"); @@ -244,17 +248,20 @@ void tresspasser_pad_update(Moby *moby) { TRESSPASSER_PAD_STATE_ACTIVE_PUZZLE = 2, TRESSPASSER_PAD_STATE_COMMIT_COMPLETION = 3 }; + enum { + TRESSPASSER_PAD_STATE_COMPLETED = 4 + }; Vec_2D9F08 camera_pos, camera_rot; Data *pad_puzzle_state = (struct Data *)moby->pvars; int i; - if (pad_puzzle_state == 0) { + if (pad_puzzle_state == NULL) { return; } switch (moby->state) { case TRESSPASSER_PAD_STATE_INITIALIZE: pad_puzzle_state->h12 = 0; - moby->state = 1; + moby->state = TRESSPASSER_PAD_STATE_WAIT_FOR_TOOL_ACTIVATION; D_L02_001D33B0[2][1] = 17.0f; D_L02_001D33B0[0][1] = 17.0f; D_L02_001D33B0[1][0] = 17.0f; @@ -263,14 +270,14 @@ void tresspasser_pad_update(Moby *moby) { D_L02_001D33B0[3][0] = -17.0f; D_L02_001D33B0[3][1] = -17.0f; D_L02_001D33B0[0][0] = 17.0f; - D_L02_00161B1C_gp = pad_puzzle_state->iEC; + l02_tresspasser_puzzle_texture_index_offset = pad_puzzle_state->iEC; if (moby->mission != 0xFF) { if (D_L02_001BBB40_2D9F08.collected[(short)moby->save_id] != 0 || (((int *)((char *)D_0014C190_257218 + (current_level_index_macro << 8)))[(short)moby->save_id >> 5] >> (moby->save_id & 0x1F)) & 1) { - moby->state = 4; + moby->state = TRESSPASSER_PAD_STATE_COMPLETED; } } break; @@ -285,10 +292,10 @@ void tresspasser_pad_update(Moby *moby) { } if (((Hero *)(D_0013E633_2D9F08 + 0xE1D))->items[0].moby != 0 && ((Hero *)(D_0013E633_2D9F08 + 0xE1D))->items[0].item_id == 0x1A) { - moby->glow_color = D_L02_00161AA0_gp; + moby->glow_color = l02_tresspasser_pad_tool_equipped_glow_color; holding_tool = 1; } else { - moby->glow_color = D_L02_00161AA4_gp; + moby->glow_color = l02_tresspasser_pad_without_tool_glow_color; holding_tool = 0; } if (holding_tool && @@ -299,7 +306,7 @@ void tresspasser_pad_update(Moby *moby) { hero_set_state(0x72, 0); set_hero_animation(0x57, 0, scale_game_frames(6)); jet_mount(&D_L02_00167440_2D9F08[0], &D_L02_00167440_2D9F08[1], 1, 0, 0); - moby->state = 2; + moby->state = TRESSPASSER_PAD_STATE_ACTIVE_PUZZLE; pad_puzzle_state->h10 = scale_game_frames(0x3C); pad_puzzle_state->f110 = 0.0f; qcopy(&pad_puzzle_state->vF0, &D_L02_00167440_2D9F08[0]); @@ -307,7 +314,7 @@ void tresspasser_pad_update(Moby *moby) { } } else { pad_puzzle_state->h12 = 0; - moby->glow_color = D_L02_00161AA8_gp; + moby->glow_color = l02_tresspasser_pad_no_ground_contact_glow_color; } break; case TRESSPASSER_PAD_STATE_ACTIVE_PUZZLE: @@ -378,7 +385,7 @@ void tresspasser_pad_update(Moby *moby) { } } else if (i == 12) { if (fast_dec_timer_s16(&pad_puzzle_state->h10)) { - moby->state = 3; + moby->state = TRESSPASSER_PAD_STATE_COMMIT_COMPLETION; } } else if (((struct PadStateWords *)&controller_state)->unmasked.held_pressed & 0xA00000000000) { @@ -413,7 +420,7 @@ void tresspasser_pad_update(Moby *moby) { if (((pad_pressed_lui & 0x10) && D_L02_00179A10.i0 == 0 && D_L02_00179A10.i24 == -1) || ((Hero *)(D_0013E633_2D9F08 + 0xE1D))->state.current != 0x72 || ((Hero *)(D_0013E633_2D9F08 + 0xE1D))->items[0].item_id != 0x1A) { - moby->state = 1; + moby->state = TRESSPASSER_PAD_STATE_WAIT_FOR_TOOL_ACTIVATION; jet_end_mount(1); request_hero_idle_state_for_vehicle_mode(); pad_puzzle_state->h10 = scale_game_frames(0x3C); @@ -431,7 +438,7 @@ void tresspasser_pad_update(Moby *moby) { jet_end_mount(1); hero_set_state(0, 1); moby->command = 1; - moby->state = 4; + moby->state = TRESSPASSER_PAD_STATE_COMPLETED; } break; } @@ -487,6 +494,12 @@ void align_hero_to_tresspasser_pad(struct Moby *moby) { void draw_tresspasser_puzzle(char *moby) { /* Fakematch: the texture sits at retail's stack offset inside this frame. */ + enum { + TRESSPASSER_MARKER_ABSENT = 0, + TRESSPASSER_SELECTED_RING_FIRST = 1, + TRESSPASSER_SELECTED_RING_SECOND = 2, + TRESSPASSER_MARKER_REACHED = 2 + }; struct { char pad0[0x78]; u64 texture; @@ -517,17 +530,17 @@ void draw_tresspasser_puzzle(char *moby) { third_step = 0; if (puzzle_state->unkE4 > 0.31415927f) { state = puzzle_state->unkE0; - if (state == 1) + if (state == TRESSPASSER_SELECTED_RING_FIRST) first_step = 1; - else if (state == 2) + else if (state == TRESSPASSER_SELECTED_RING_SECOND) second_step = 1; else third_step = 1; } else if (puzzle_state->unkE4 < -0.31415927f) { state = puzzle_state->unkE0; - if (state == 1) + if (state == TRESSPASSER_SELECTED_RING_FIRST) first_step = -1; - else if (state == 2) + else if (state == TRESSPASSER_SELECTED_RING_SECOND) second_step = -1; else third_step = -1; @@ -845,8 +858,8 @@ void draw_tresspasser_puzzle(char *moby) { angle = fast_add_rotations(-0.08726646f, (float)(i * 30) * 0.017453292f); phase = fast_add_rotations(angle, 0.17453292f); marker_state = markers->slot[i]; - if (marker_state != 0) { - if (marker_state == 2) + if (marker_state != TRESSPASSER_MARKER_ABSENT) { + if (marker_state == TRESSPASSER_MARKER_REACHED) color = tresspasser_reached_marker_arc_color_gp; else if (D_L02_0015F5CC & 0x20) color = tresspasser_unreached_marker_arc_flag_set_color_gp; @@ -990,7 +1003,7 @@ void draw_tresspasser_puzzle_arrow( xy[2] += truncate_float_to_s32(M[2][1] * 16.0f); xy[3] += truncate_float_to_s32(M[3][0] * 16.0f) << 16; xy[3] += truncate_float_to_s32(M[3][1] * 16.0f); - texture_tex0 = get_effect_texture(D_L02_00161B1C_gp + 0x29); + texture_tex0 = get_effect_texture(l02_tresspasser_puzzle_texture_index_offset + 0x29); FUN_L02_0020bc88(xy, uv, col, texture_tex0, 1); FUN_L02_0020bc88(xy, uv, col, texture_tex0, 1); } @@ -1134,7 +1147,7 @@ void draw_tresspasser_puzzle_textured_quads(void) { vertex_uvs, vertex_colors, /* Fakematch: retail uses only the low word of the texture; the cast keeps it. */ - ((int (*)(int))get_effect_texture)(D_L02_00161B1C_gp + 0x28), + ((int (*)(int))get_effect_texture)(l02_tresspasser_puzzle_texture_index_offset + 0x28), 1); } } diff --git a/src/overlays/shared/props/underwater_door.c b/src/overlays/shared/props/underwater_door.c index e3ce5296c5..75735d1a40 100644 --- a/src/overlays/shared/props/underwater_door.c +++ b/src/overlays/shared/props/underwater_door.c @@ -32,6 +32,9 @@ void underwater_door_update(struct Moby *moby) { DOOR_WAIT_FOR_STOP_VOLUME_EXIT = 5, DOOR_RETURN_TO_ORIGIN = 6 }; + enum { + DOOR_HOLD_AWAY_FROM_ORIGIN = 3 + }; MovingMobyVars *door_motion_data = (MovingMobyVars *)moby->pvars; Vec4 offset; Vec4 updated_door_position; @@ -52,17 +55,17 @@ void underwater_door_update(struct Moby *moby) { case DOOR_INITIALIZE: door_motion_data->origin.q = *(u128 *)&moby->pos; if (door_motion_data->trigger != 0) { - moby->state = 1; + moby->state = DOOR_WAIT_FOR_TRIGGER; return; } - moby->state = 4; + moby->state = DOOR_WAIT_FOR_START_VOLUME_ENTRY; return; case DOOR_WAIT_FOR_TRIGGER: if (((struct Moby *)((int)l15_moby_array + door_motion_data->trigger * 0x100))->state != 4) return; if (reversed) allocate_voice_for_target_entry(0, 0, (int)moby); - moby->state = 2; + moby->state = DOOR_MOVE_AWAY_FROM_ORIGIN; break; case DOOR_MOVE_AWAY_FROM_ORIGIN: { union { @@ -88,10 +91,10 @@ void underwater_door_update(struct Moby *moby) { if (!(scale * step / moby->pclass->scale < magnitude)) return; if (door_motion_data->trigger != -1) { - moby->state = 3; + moby->state = DOOR_HOLD_AWAY_FROM_ORIGIN; return; } - moby->state = 5; + moby->state = DOOR_WAIT_FOR_STOP_VOLUME_EXIT; return; } case DOOR_WAIT_FOR_START_VOLUME_ENTRY: @@ -100,14 +103,14 @@ void underwater_door_update(struct Moby *moby) { return; if (reversed) allocate_voice_for_target_entry(0, 0, (int)moby); - moby->state = 2; + moby->state = DOOR_MOVE_AWAY_FROM_ORIGIN; break; case DOOR_WAIT_FOR_STOP_VOLUME_EXIT: if (is_point_inside_clip_volume(&hero.motion.pos, door_motion_data->stop_volume)) return; if (reversed) allocate_voice_for_target_entry(0, 0, (int)moby); - moby->state = 6; + moby->state = DOOR_RETURN_TO_ORIGIN; break; case DOOR_RETURN_TO_ORIGIN: { f32 old_travel; @@ -133,7 +136,7 @@ void underwater_door_update(struct Moby *moby) { *(u128 *)&moby->pos = updated_door_position.q; if (door_motion_data->travel != 0.0f) return; - moby->state = 4; + moby->state = DOOR_WAIT_FOR_START_VOLUME_ENTRY; break; } } diff --git a/src/overlays/shared/props/underwater_ring.c b/src/overlays/shared/props/underwater_ring.c index b2c9395d2e..fc1cdbb8ef 100644 --- a/src/overlays/shared/props/underwater_ring.c +++ b/src/overlays/shared/props/underwater_ring.c @@ -38,20 +38,27 @@ void underwater_ring_update(struct Moby *moby) __asm__("FUN_L15_002e5958"); /* Moby class 1209 */ void underwater_ring_update(struct Moby *moby) { - VendorVars *vars = (VendorVars *)moby->pvars; + enum { + UNDERWATER_RING_STATE_INITIALIZE = 0, + UNDERWATER_RING_STATE_READY = 1, + UNDERWATER_RING_STATE_TIMED_CHALLENGE = 2, + UNDERWATER_RING_STATE_RESET = 3, + UNDERWATER_RING_STATE_COMPLETED = 4 + }; + VendorVars *ring_vars = (VendorVars *)moby->pvars; u8 delta[16]; u8 matrix[64]; struct Moby *child; u16 save_id; u8 *save_byte; - s32 first; - s32 second; + s32 voice_delay_limit; + s32 voice_delay_base; s32 divisor; s32 near_parent = 0; if ((u8)(moby->state - 1) < 2) { fast_vec_sub(delta, &moby->pos, D_0013F3D0); - if (fast_vec_length(delta) < vars->distance) { + if (fast_vec_length(delta) < ring_vars->distance) { transpose_rotation_matrix(matrix, &moby->rot_row0); transform_vector(delta, delta, matrix); if (*(f32 *)(delta + 4) < 0.2f) @@ -59,34 +66,34 @@ void underwater_ring_update(struct Moby *moby) { } } switch (moby->state) { - case 0: - if (vars->initialized == 0) { + case UNDERWATER_RING_STATE_INITIALIZE: + if (ring_vars->initialized == 0) { moby_point_position(moby, 0, delta); - vars->distance = fast_vec_dist(&moby->pos, delta); - vars->notified_count = 0; - vars->parent = moby; + ring_vars->distance = fast_vec_dist(&moby->pos, delta); + ring_vars->notified_count = 0; + ring_vars->parent = moby; get_first_moby_in_group(&child, moby->group, 0, 0); while (child != 0) { if (child != moby && child->oclass == 0x4b9) { - VendorVars *other = (VendorVars *)child->pvars; - other->parent = moby; - other->initialized = 1; - other->distance = vars->distance; + VendorVars *child_ring_vars = (VendorVars *)child->pvars; + child_ring_vars->parent = moby; + child_ring_vars->initialized = 1; + child_ring_vars->distance = ring_vars->distance; } - vars->notified_count++; + ring_vars->notified_count++; get_next_moby_in_group(&child, child, 0, 0); } } - vars->timer = 0; - vars->delay = 0; - vars->child_count = 0; - vars->triggered = 0; - vars->flash_timer = 0; + ring_vars->timer = 0; + ring_vars->delay = 0; + ring_vars->child_count = 0; + ring_vars->triggered = 0; + ring_vars->flash_timer = 0; set_moby_color(moby, 0, 0, 0); - moby->state = 1; + moby->state = UNDERWATER_RING_STATE_READY; break; - case 1: - case 2: + case UNDERWATER_RING_STATE_READY: + case UNDERWATER_RING_STATE_TIMED_CHALLENGE: save_id = moby->save_id; save_byte = (u8 *)&l15_save_state; save_byte -= -(s16)save_id; @@ -95,74 +102,74 @@ void underwater_ring_update(struct Moby *moby) { (u8 *)D_0014C190)) >> (save_id & 31)) & 1) != 0) { - if (vars->enabled != 0) { + if (ring_vars->enabled != 0) { set_moby_list_state(moby->group, 4); - vars->timer = vars->restart_timer; - moby->state = 4; + ring_vars->timer = ring_vars->restart_timer; + moby->state = UNDERWATER_RING_STATE_COMPLETED; break; } } - if (vars->triggered == 0 && near_parent) { - struct Moby *parent = vars->parent; + if (ring_vars->triggered == 0 && near_parent) { + struct Moby *parent = ring_vars->parent; VendorVars *parent_vars = (VendorVars *)parent->pvars; - if (parent->state == 1) { - vars->child_count = 0; - parent->state = 2; + if (parent->state == UNDERWATER_RING_STATE_READY) { + ring_vars->child_count = 0; + parent->state = UNDERWATER_RING_STATE_TIMED_CHALLENGE; parent_vars->timer = - parent_vars->frame_count < 1 ? 900 : scale_game_frames(vars->frame_count); + parent_vars->frame_count < 1 ? 900 : scale_game_frames(ring_vars->frame_count); } parent_vars->child_count++; allocate_voice_for_target_entry(3, 0x31, moby); set_moby_color(moby, 0, 0xff, 0); - vars->triggered = 1; + ring_vars->triggered = 1; } - if (moby->state == 2) { - if (vars->child_count >= vars->notified_count) { + if (moby->state == UNDERWATER_RING_STATE_TIMED_CHALLENGE) { + if (ring_vars->child_count >= ring_vars->notified_count) { set_moby_list_state(moby->group, 4); allocate_voice_for_target_entry(1, 0x31, moby); - vars->timer = vars->restart_timer; - moby->state = 4; + ring_vars->timer = ring_vars->restart_timer; + moby->state = UNDERWATER_RING_STATE_COMPLETED; break; } else { - if (fast_dec_timer_s16(&vars->timer) != 0) { - vars->child_count = 0; - vars->triggered = 0; + if (fast_dec_timer_s16(&ring_vars->timer) != 0) { + ring_vars->child_count = 0; + ring_vars->triggered = 0; allocate_voice_for_target_entry(2, 0x31, moby); set_moby_list_state(moby->group, 3); - } else if (fast_dec_timer_s16(&vars->delay) != 0) { + } else if (fast_dec_timer_s16(&ring_vars->delay) != 0) { allocate_voice_for_target_entry(0, 0x31, moby); - first = scale_game_frames(0x2d); - second = scale_game_frames(5); + voice_delay_limit = scale_game_frames(0x2d); + voice_delay_base = scale_game_frames(5); divisor = scale_game_frames(0x28); - if (first < second + vars->timer / divisor) - vars->delay = scale_game_frames(0x2d); + if (voice_delay_limit < voice_delay_base + ring_vars->timer / divisor) + ring_vars->delay = scale_game_frames(0x2d); else { s32 delay = scale_game_frames(5); s32 delay_divisor = scale_game_frames(0x28); - delay_divisor = delay + vars->timer / delay_divisor; - vars->delay = delay_divisor; + delay_divisor = delay + ring_vars->timer / delay_divisor; + ring_vars->delay = delay_divisor; } } } } break; - case 3: + case UNDERWATER_RING_STATE_RESET: set_moby_color(moby, 0, 0, 0); - vars->child_count = 0; - vars->triggered = 0; - moby->state = 1; + ring_vars->child_count = 0; + ring_vars->triggered = 0; + moby->state = UNDERWATER_RING_STATE_READY; break; - case 4: { + case UNDERWATER_RING_STATE_COMPLETED: { u16 save_id; u32 *bits; - if (fast_dec_timer_s16(&vars->flash_timer) != 0) { - vars->flash_timer = scale_game_frames(0x14); - if (vars->flash_color != 0) { + if (fast_dec_timer_s16(&ring_vars->flash_timer) != 0) { + ring_vars->flash_timer = scale_game_frames(0x14); + if (ring_vars->flash_color != 0) { set_moby_color(moby, 0, 0xff, 0); - vars->flash_color = 0; + ring_vars->flash_color = 0; } else { set_moby_color(moby, 0xff, 0xff, 0xff); - vars->flash_color = 1; + ring_vars->flash_color = 1; } } save_id = moby->save_id; diff --git a/src/overlays/shared/props/updraft_vent.c b/src/overlays/shared/props/updraft_vent.c index c75a05f08d..7df8b1ee44 100644 --- a/src/overlays/shared/props/updraft_vent.c +++ b/src/overlays/shared/props/updraft_vent.c @@ -32,7 +32,7 @@ void updraft_vent_update(unsigned char *moby) { unsigned int update_state = MOBY(moby)->state; switch (update_state) { case MOBY_UPDATE_INITIALIZE: - MOBY(moby)->state = 1; + MOBY(moby)->state = MOBY_UPDATE_ACTIVE; MOBY(moby)->flags |= 1; MOBY(moby)->visible = 0; break; diff --git a/src/overlays/shared/props/white_flower.c b/src/overlays/shared/props/white_flower.c index 31d971b923..c283d1751c 100644 --- a/src/overlays/shared/props/white_flower.c +++ b/src/overlays/shared/props/white_flower.c @@ -26,13 +26,13 @@ void white_flower_update(struct Moby *moby) { char *hit_record = find_moby_hit(moby, 0x10000, 0); switch (moby->state) { case WHITE_FLOWER_INITIALIZE: - moby->state = 1; + moby->state = WHITE_FLOWER_WAIT_FOR_HIT; break; case WHITE_FLOWER_WAIT_FOR_HIT: if (hit_record != 0 && *(float *)(hit_record + 0x2C) > 0.0f) hit = 1; if (hit) - moby->state = 2; + moby->state = WHITE_FLOWER_REMOVE; break; case WHITE_FLOWER_REMOVE: allocate_voice_for_target_entry(0, 0, (int)moby); diff --git a/src/overlays/shared/rendering/build_interpolated_dma_packet.c b/src/overlays/shared/rendering/build_interpolated_dma_packet.c index dbeaaf55ed..abdacb02d2 100644 --- a/src/overlays/shared/rendering/build_interpolated_dma_packet.c +++ b/src/overlays/shared/rendering/build_interpolated_dma_packet.c @@ -124,6 +124,13 @@ void prepare_scaled_table_with_byte_128(char *value_target) { void build_interpolated_dma_packet(QuadDrawArgs *draw_parameters) __asm__("FUN_L02_002a40f0"); void build_interpolated_dma_packet(QuadDrawArgs *draw_parameters) { + enum { + TEXTURED_GRID_FOG_SOURCE_CAMERA = 1 + }; + enum { + TEXTURED_GRID_BLEND_MODE_ABOVE_ALPHA_LIMIT = 0x5360A, + TEXTURED_GRID_BLEND_MODE_AT_OR_BELOW_ALPHA_LIMIT = 0x5370B + }; float view_matrix[16]; int *view_setup_dma_packet; int *cursor; @@ -136,7 +143,7 @@ void build_interpolated_dma_packet(QuadDrawArgs *draw_parameters) { textured_grid_saved_fog_far_distance = ((QuadCamera *)level02_camera_view_state)->f21C; textured_grid_saved_fog_near_intensity = ((QuadCamera *)level02_camera_view_state)->f228; textured_grid_saved_fog_far_intensity = ((QuadCamera *)level02_camera_view_state)->f22C; - if (textured_grid_fog_source_mode != 1) { + if (textured_grid_fog_source_mode != TEXTURED_GRID_FOG_SOURCE_CAMERA) { ((QuadCamera *)level02_camera_view_state)->f218 = draw_parameters->f20; ((QuadCamera *)level02_camera_view_state)->f21C = draw_parameters->f24; ((QuadCamera *)level02_camera_view_state)->f228 = draw_parameters->f28; @@ -216,16 +223,16 @@ void build_interpolated_dma_packet(QuadDrawArgs *draw_parameters) { } TEXTURE_REGISTER = (TEXTURE_CURSOR >> 8) | 0x18100000 | 0x580000000; color = draw_parameters->c30 | draw_parameters->c31 << 8 | draw_parameters->c32 << 16; - if (textured_grid_fog_source_mode == 1) { + if (textured_grid_fog_source_mode == TEXTURED_GRID_FOG_SOURCE_CAMERA) { color = ((QuadCamera *)level02_camera_view_state)->c230 | ((QuadCamera *)level02_camera_view_state)->c234 << 8 | ((QuadCamera *)level02_camera_view_state)->c238 << 16; } words = (long *)PACKET_CURSOR; alpha_limit = 0x60; - blend_mode = 0x5360A; + blend_mode = TEXTURED_GRID_BLEND_MODE_ABOVE_ALPHA_LIMIT; if (!(alpha_limit < draw_parameters->alpha)) { - blend_mode = 0x5370B; + blend_mode = TEXTURED_GRID_BLEND_MODE_AT_OR_BELOW_ALPHA_LIMIT; } words[0] = 0x8000000000008001; words[1] = 0xEEEEEEEE; diff --git a/src/overlays/shared/rendering/debug/update_debug_menu.c b/src/overlays/shared/rendering/debug/update_debug_menu.c index c2f32fe0fc..429a13c152 100644 --- a/src/overlays/shared/rendering/debug/update_debug_menu.c +++ b/src/overlays/shared/rendering/debug/update_debug_menu.c @@ -20,6 +20,13 @@ #include "rnc/sdk/storage/fileio.h" #include "rnc/sdk/storage/fileio/sceopen.h" +enum { + DEBUG_CONTROL_MODE_ENABLE_LOW_FOUR_UPDATE_FLAGS = 0, + DEBUG_CONTROL_MODE_CLEAR_UPDATE_FLAGS = 1, + DEBUG_CONTROL_MODE_CAPTURE_HERO_CAMERA_OFFSET = 2, + DEBUG_CONTROL_MODE_ENABLE_SECOND_AND_THIRD_UPDATE_FLAGS = 3 +}; + typedef struct { s32 a, b, c, d; } E001f36f8; @@ -382,7 +389,8 @@ void update_debug_camera(void) { copy_matrix3x4(l00_camera.unk350, r); } } - if (g_debug_menu.control_mode == 2 && l00_camera.unk180 != 0) { + if (g_debug_menu.control_mode == DEBUG_CONTROL_MODE_CAPTURE_HERO_CAMERA_OFFSET && + l00_camera.unk180 != 0) { target = (DebugCameraTarget *)l00_camera.unk180; qcopy(target->position, l00_camera.pos.f); qcopy(target->basis, l00_camera.unk350); @@ -502,10 +510,15 @@ void update_debug_menu(void) { DEBUG_OPTION_ROW_SEGMENT_INDEX = 10 }; enum { - DEBUG_CONTROL_MODE_ENABLE_LOW_FOUR_UPDATE_FLAGS = 0, - DEBUG_CONTROL_MODE_CLEAR_UPDATE_FLAGS = 1, - DEBUG_CONTROL_MODE_CAPTURE_HERO_CAMERA_OFFSET = 2, - DEBUG_CONTROL_MODE_ENABLE_SECOND_AND_THIRD_UPDATE_FLAGS = 3 + DEBUG_OCCLUSION_MODE_COUNT = 3, + DEBUG_COLLISION_MODE_COUNT = 3, + DEBUG_CONTROL_MODE_COUNT = 4, + DEBUG_PROFILER_MODE_COUNT = 8, + DEBUG_CAPTURE_STATUS_NO = 110, + DEBUG_CAPTURE_STATUS_YES = 121 + }; + enum { + DEBUG_OCCLUSION_MODE_NO_DATA_FALLBACK = 0 }; DebugRowCounts row_counts; union { @@ -525,8 +538,8 @@ void update_debug_menu(void) { set_background_color(level_view_context.background_color[0], level_view_context.background_color[1], level_view_context.background_color[2]); - g_debug_menu.start_capture_status = 110; - g_debug_menu.sample_capture_status = 110; + g_debug_menu.start_capture_status = DEBUG_CAPTURE_STATUS_NO; + g_debug_menu.sample_capture_status = DEBUG_CAPTURE_STATUS_NO; g_debug_menu.unknown_94 = (s32)l00_camera.pos.f[0] >> 2; g_debug_menu.unknown_98 = (s32)l00_camera.pos.f[1] >> 2; g_debug_menu.unknown_9c = (s32)l00_camera.pos.f[2] >> 2; @@ -575,12 +588,14 @@ void update_debug_menu(void) { case DEBUG_OPTION_ROW_CONTROL_MODE: if (controller_words.buttons.w.pressed & 0x50) { if (controller_words.buttons.w.pressed & 0x40) { - if (++g_debug_menu.control_mode >= 4) - g_debug_menu.control_mode = 0; + if (++g_debug_menu.control_mode >= DEBUG_CONTROL_MODE_COUNT) + g_debug_menu.control_mode = DEBUG_CONTROL_MODE_ENABLE_LOW_FOUR_UPDATE_FLAGS; } if (controller_words.buttons.w.pressed & 0x10) { - if (--g_debug_menu.control_mode < 0) - g_debug_menu.control_mode = 3; + if (--g_debug_menu.control_mode < + DEBUG_CONTROL_MODE_ENABLE_LOW_FOUR_UPDATE_FLAGS) + g_debug_menu.control_mode = + DEBUG_CONTROL_MODE_ENABLE_SECOND_AND_THIRD_UPDATE_FLAGS; } switch (g_debug_menu.control_mode) { case DEBUG_CONTROL_MODE_ENABLE_LOW_FOUR_UPDATE_FLAGS: @@ -608,7 +623,7 @@ void update_debug_menu(void) { break; case DEBUG_OPTION_ROW_PROFILER_MODE: if (controller_words.buttons.w.pressed & 0x40) { - if (++g_debug_menu.profiler_mode >= 8) + if (++g_debug_menu.profiler_mode >= DEBUG_PROFILER_MODE_COUNT) g_debug_menu.profiler_mode = 0; } if (controller_words.buttons.w.pressed & 0x10) { @@ -618,15 +633,15 @@ void update_debug_menu(void) { break; case DEBUG_OPTION_ROW_OCCLUSION_MODE: if (!D_L00_0015F600) { - g_debug_menu.occlusion_mode = 0; + g_debug_menu.occlusion_mode = DEBUG_OCCLUSION_MODE_NO_DATA_FALLBACK; break; } if (controller_words.buttons.w.pressed & 0x40) { - if (++g_debug_menu.occlusion_mode >= 3) - g_debug_menu.occlusion_mode = 0; + if (++g_debug_menu.occlusion_mode >= DEBUG_OCCLUSION_MODE_COUNT) + g_debug_menu.occlusion_mode = DEBUG_OCCLUSION_MODE_NO_DATA_FALLBACK; } if (controller_words.buttons.w.pressed & 0x10) { - if (--g_debug_menu.occlusion_mode < 0) + if (--g_debug_menu.occlusion_mode < DEBUG_OCCLUSION_MODE_NO_DATA_FALLBACK) g_debug_menu.occlusion_mode = 2; } break; @@ -658,7 +673,7 @@ void update_debug_menu(void) { break; case DEBUG_OPTION_ROW_COLLISION_MODE: if (controller_words.buttons.w.pressed & 0x40) { - if (++g_debug_menu.collision_mode >= 3) + if (++g_debug_menu.collision_mode >= DEBUG_COLLISION_MODE_COUNT) g_debug_menu.collision_mode = 0; } if (controller_words.buttons.w.pressed & 0x10) { @@ -898,7 +913,7 @@ void update_debug_menu(void) { sceLseek(fd, 0, 2); sceWrite(fd, scratch.sample.line, strlen(scratch.sample.line)); sceClose(fd); - g_debug_menu.sample_capture_status = 121; + g_debug_menu.sample_capture_status = DEBUG_CAPTURE_STATUS_YES; } { f32 *samples = occlusion_samples; @@ -945,7 +960,7 @@ void update_debug_menu(void) { sceLseek(fd, 0, 2); sceWrite(fd, scratch.start_point.line, strlen(scratch.start_point.line)); sceClose(fd); - g_debug_menu.start_capture_status = 121; + g_debug_menu.start_capture_status = DEBUG_CAPTURE_STATUS_YES; } } break; diff --git a/src/overlays/shared/rendering/effects/beam_slots.c b/src/overlays/shared/rendering/effects/beam_slots.c index 202a158d7b..fba72101cb 100644 --- a/src/overlays/shared/rendering/effects/beam_slots.c +++ b/src/overlays/shared/rendering/effects/beam_slots.c @@ -35,6 +35,11 @@ void beam_slots_update(unsigned char *moby) { SLOT_UPDATE_STATE_INITIALIZE = 0, SLOT_UPDATE_STATE_PROCESS_SLOTS = 1 }; + enum { + BEAM_SLOT_STATE_UNUSED = 0, + BEAM_SLOT_STATE_REGISTERED = 1, + BEAM_SLOT_STATE_PENDING_RELEASE = 4 + }; int i; int j; int started_slot_count; @@ -46,21 +51,21 @@ void beam_slots_update(unsigned char *moby) { D_L14_00162148[j] = 0; D_L14_001621D8[j] = 0; } - MOBY(moby)->state = 1; + MOBY(moby)->state = SLOT_UPDATE_STATE_PROCESS_SLOTS; MOBY(moby)->update_dist = 0xFF; break; case SLOT_UPDATE_STATE_PROCESS_SLOTS: started_slot_count = 0; for (i = 0; i < 3; i++) { slot_state = D_L14_00162148[i]; - if (slot_state == 1) { + if (slot_state == BEAM_SLOT_STATE_REGISTERED) { if (((signed char *)D_L14_001621D8[i])[0x20] < 0) { D_L14_00162148[i] = 0; D_L14_001621D8[i] = 0; } - } else if (slot_state == 4) { + } else if (slot_state == BEAM_SLOT_STATE_PENDING_RELEASE) { release_beam_slot(i); - } else if (slot_state != 0) { + } else if (slot_state != BEAM_SLOT_STATE_UNUSED) { started_slot_count++; update_slot_panes_and_effects(D_L14_001621D8[i], i); D_L14_00162148[i] = 4; diff --git a/src/overlays/shared/rendering/effects/explosion_light.c b/src/overlays/shared/rendering/effects/explosion_light.c index 915d08f08d..63bfbbc1b6 100644 --- a/src/overlays/shared/rendering/effects/explosion_light.c +++ b/src/overlays/shared/rendering/effects/explosion_light.c @@ -147,6 +147,10 @@ void explosion_light_update(unsigned char *moby) __asm__("FUN_L00_002d3a10"); /* Moby class 639 */ void explosion_light_update(unsigned char *moby) { + enum { + EXPLOSION_LIGHT_STATE_UNINITIALIZED = 0, + EXPLOSION_LIGHT_STATE_INITIALIZED = 1 + }; ExplosionLightVars *animated_point_light_vars; Vx tp; Vx base_position; @@ -166,7 +170,7 @@ void explosion_light_update(unsigned char *moby) { radius_reset_this_update = 0; if (animated_point_light_vars == 0) return; - if (MOBY(moby)->state == 0) { + if (MOBY(moby)->state == EXPLOSION_LIGHT_STATE_UNINITIALIZED) { unsigned char b1c; MOBY(moby)->update_dist = 0xFF; b1c = animated_point_light_vars->start_delay; @@ -199,7 +203,7 @@ void explosion_light_update(unsigned char *moby) { if (animated_point_light_vars->radius_fall_rate < 0.0f) animated_point_light_vars->radius_fall_rate = -animated_point_light_vars->radius_fall_rate; - MOBY(moby)->state = 1; + MOBY(moby)->state = EXPLOSION_LIGHT_STATE_INITIALIZED; } if (MOBY(moby)->command != 0) { MOBY(moby)->command = MOBY(moby)->command - 1; diff --git a/src/overlays/shared/rendering/effects/ground_particle_scatter.c b/src/overlays/shared/rendering/effects/ground_particle_scatter.c index 7bacc1f1db..44b8bf6447 100644 --- a/src/overlays/shared/rendering/effects/ground_particle_scatter.c +++ b/src/overlays/shared/rendering/effects/ground_particle_scatter.c @@ -167,7 +167,7 @@ void ground_particle_scatter_update(Moby *moby) { switch (moby->state) { case GROUND_PARTICLES_STATE_INITIALIZE: - moby->state = 2; + moby->state = GROUND_PARTICLES_STATE_SCATTER; moby->update_dist = 0xFF; randomize_ground_particle_scatter_parameters(flag); break; diff --git a/src/overlays/shared/rendering/effects/particles.c b/src/overlays/shared/rendering/effects/particles.c index c3714b6774..11a2ea06b6 100644 --- a/src/overlays/shared/rendering/effects/particles.c +++ b/src/overlays/shared/rendering/effects/particles.c @@ -915,22 +915,35 @@ void update_color_tween_emitter_particle(struct EffectParticle *particle) { } extern unsigned char *D_L00_001B2080_lui[] __asm__("D_L00_001B2080") NOT_SDA; -unsigned char * -FUN_L00_00272f68(u128 *a, int c, unsigned char b, int idx, int flag, int n, int mode, float f); -unsigned char *FUN_L00_00272f68(u128 *position, - int packed_color, - unsigned char initial_rotation, - int particle_texture_index, - int flag, - int lifetime_frames, - int mode, - - float size_scale) { +unsigned char *spawn_timed_hero_relative_particle(u128 *position, + int packed_color, + unsigned char initial_rotation, + int particle_texture_index, + int flag, + int lifetime_frames, + int mode, + + float size_scale) __asm__("FUN_L00_00272f68"); + +unsigned char *spawn_timed_hero_relative_particle( + u128 *a, int c, unsigned char b, int idx, int flag, int n, int mode, float f); +unsigned char *spawn_timed_hero_relative_particle(u128 *position, + int packed_color, + unsigned char initial_rotation, + int particle_texture_index, + int flag, + int lifetime_frames, + int mode, + + float size_scale) { + enum { + PARTICLE_MODE_HERO_RELATIVE = 1 + }; unsigned char *particle = create_part(0x3B); if (particle) { int *particle_data = (int *)(particle + 0x20); particle_data[4] = mode; - if (mode == 1) + if (mode == PARTICLE_MODE_HERO_RELATIVE) fast_vec_sub(particle_data, position, D_0013F3D0); qcopy(particle + 0x10, position); *(int *)(particle + 4) = packed_color; @@ -1166,6 +1179,10 @@ unsigned char *spawn_mode_controlled_alpha_fade_particle(void *position, int alpha_fade_divisor, int particle_mode) { + enum { + PARTICLE_MODE_STATIONARY_ALPHA_FADE = 0, + PARTICLE_MODE_PARENT_RELATIVE_ALPHA_FADE = 2 + }; unsigned char *particle = create_part(0x3E); if (particle != 0) { unsigned char *particle_data = particle + 0x20; @@ -1177,8 +1194,8 @@ unsigned char *spawn_mode_controlled_alpha_fade_particle(void *position, *(float *)(particle + 0xC) = 30000.0f; particle[8] = random_integer_below(0xFF); *(short *)(particle_data + 2) = particle_mode; - if (particle_mode >= 2) - particle_mode = 0; + if (particle_mode >= PARTICLE_MODE_PARENT_RELATIVE_ALPHA_FADE) + particle_mode = PARTICLE_MODE_STATIONARY_ALPHA_FADE; particle[2] = D_L00_001B2178[particle_mode]; *(short *)(particle + 0x20) = truncate_float_to_s32(127.0f / convert_integer_to_float(alpha_fade_divisor)); diff --git a/src/overlays/shared/rendering/effects/spawn_explosion.c b/src/overlays/shared/rendering/effects/spawn_explosion.c index 801e4ad462..7677eb0468 100644 --- a/src/overlays/shared/rendering/effects/spawn_explosion.c +++ b/src/overlays/shared/rendering/effects/spawn_explosion.c @@ -96,19 +96,23 @@ void set_moby_color(s32, s32, s32, s32) __asm__("FUN_L00_002502f0"); void trooper_anim_finish(s32 id, S_25d538 *s) __asm__("FUN_L00_0025d538"); void trooper_anim_finish(s32 id, S_25d538 *animation_state) { + enum { + MOBY_COLOR_PHASE_TO_SECONDARY_COLOR = 0, + MOBY_COLOR_PHASE_TO_ORIGINAL_COLOR = 1 + }; f32 phase_duration_frames, phase_progress; s32 r, g, b; if (animation_state->t == 0) return; if (fast_dec_timer_s16(animation_state)) { - if (animation_state->phase != 0) { + if (animation_state->phase != MOBY_COLOR_PHASE_TO_SECONDARY_COLOR) { set_moby_color(id, animation_state->r0, animation_state->g0, animation_state->b0); return; } - animation_state->phase = 1; + animation_state->phase = MOBY_COLOR_PHASE_TO_ORIGINAL_COLOR; animation_state->t = scale_game_frames(animation_state->d1); } - if (animation_state->phase == 0) { + if (animation_state->phase == MOBY_COLOR_PHASE_TO_SECONDARY_COLOR) { phase_duration_frames = convert_integer_to_float(scale_game_frames(animation_state->d0)); phase_progress = (phase_duration_frames - animation_state->t) / phase_duration_frames; if (animation_state->r1 != 0) @@ -613,7 +617,7 @@ extern void *spawn_shrinking_effect_particle_with_gravity_and_secondary_spawns( extern void *spawn_debris(void *, void *, int, int, int) __asm__("FUN_L00_002af450"); extern void spawn_particle(void *, void *, int, int, float, int, int, int, int, float) __asm__("FUN_L00_0026a9f0"); extern void -func_L00_0026B368_25e450(void *, void *, int, int, int, float) __asm__("FUN_L00_0026a4c8"); +spawn_particle_alt_9768(void *, void *, int, int, int, float) __asm__("FUN_L00_0026a4c8"); extern int spawn_glow_particle(void *, void *, void *, float, int, int, int, int, int) __asm__("FUN_L00_002ac910"); extern void mine_camera_blast(void *, void *, int, int) __asm__("FUN_L00_002d3838"); @@ -830,7 +834,7 @@ void spawn_explosion(char *owner_moby, fF * (random_float_between(0.0f, 3.0f) * frame_time_macro)); first_packed_color = swap_packed_color_channels(c0.v[random_integer_below(6)], flag); second_packed_color = swap_packed_color_channels(c1.v[random_integer_below(6)], flag); - func_L00_0026B368_25e450( + spawn_particle_alt_9768( explosion_position, &randomized_particle_vector, first_packed_color, diff --git a/src/overlays/shared/rendering/effects/spawn_type_10_particle.c b/src/overlays/shared/rendering/effects/spawn_type_10_particle.c index 2f0c73ff43..8c362b85d5 100644 --- a/src/overlays/shared/rendering/effects/spawn_type_10_particle.c +++ b/src/overlays/shared/rendering/effects/spawn_type_10_particle.c @@ -98,12 +98,15 @@ char *draw_number(float scale, short particle_lifetime, unsigned char kind) { + enum { + DRAW_NUMBER_KIND_FROM_FLAGS = 0xFF + }; char *particle = create_part(0x29); if (particle != 0) { int *tail = (int *)(particle + 0x20); qcopy(particle + 0x10, particle_spawn_position); *(int *)(particle + 4) = particle_color; - if (kind == 0xFF) { + if (kind == DRAW_NUMBER_KIND_FROM_FLAGS) { particle[9] = (flags >> 5) * 16 + truncate_float_to_s32(4.0f); if (flags & 1) { particle[3] = 0x48; diff --git a/src/overlays/shared/rendering/effects/timed_sprite_effect.c b/src/overlays/shared/rendering/effects/timed_sprite_effect.c index 1d3e56b517..b1a5aa5610 100644 --- a/src/overlays/shared/rendering/effects/timed_sprite_effect.c +++ b/src/overlays/shared/rendering/effects/timed_sprite_effect.c @@ -10,6 +10,11 @@ #include "rnc/overlay/shared/mobys/entities.h" #include "qcopy.h" +enum { + SPRITE_EFFECT_STATE_REMOVE = 0, + SPRITE_EFFECT_STATE_ANIMATE = 1 +}; + extern char *create_moby(int) __asm__("FUN_0020c4f8"); extern void mark_moby_for_removal(void *) __asm__("FUN_0020c828"); extern u32 fast_tween_color(f32, s32, s32) __asm__("FUN_001fa6e0"); @@ -31,10 +36,6 @@ void timed_sprite_effect_update(struct Moby *moby) __asm__("FUN_L06_0030be60"); /* Moby class 1898 */ void timed_sprite_effect_update(struct Moby *moby) { - enum { - SPRITE_EFFECT_STATE_REMOVE = 0, - SPRITE_EFFECT_STATE_ANIMATE = 1 - }; float *effect_data = ((float *)moby->pvars); switch ((unsigned char)((char)moby->state)) { case SPRITE_EFFECT_STATE_REMOVE: @@ -74,7 +75,7 @@ void spawn_timed_projected_sprite_effect(char *world_position, *(int *)(effect_data + 0x8) = start_color; *(float *)(effect_data + 0x4) = 2.0f / duration_as_float; MOBY(effect_moby)->update_dist = 0xFF; - MOBY(effect_moby)->state = 1; + MOBY(effect_moby)->state = SPRITE_EFFECT_STATE_ANIMATE; } } diff --git a/src/overlays/shared/rendering/effects/update_three_phase_effect_particle.c b/src/overlays/shared/rendering/effects/update_three_phase_effect_particle.c index a2e43c7337..37e7edea3c 100644 --- a/src/overlays/shared/rendering/effects/update_three_phase_effect_particle.c +++ b/src/overlays/shared/rendering/effects/update_three_phase_effect_particle.c @@ -199,16 +199,16 @@ void update_drifting_effect_particle_with_distance_fade(struct EffectParticle *p unsigned char *FUN_L00_002678b8_00269958(int) __asm__("FUN_L00_002678b8"); int FUN_001160d8_00269958(void) __asm__("FUN_001160d8"); extern unsigned char *D_L00_001B2090 NOT_SDA; -void FUN_L00_00269958(u128 *a, u128 *b, int c, int d, int n, int s1, int s2, int flag); -void FUN_L00_00269958(u128 *spawn_position, - u128 *initial_velocity, - int initial_color, - int color_endpoint, - int lifetime, - int scalar_base, - int scalar_delta, - - int flag) { +void spawn_effect(u128 *a, u128 *b, int c, int d, int n, int s1, int s2, int flag) __asm__("FUN_L00_00269958"); +void spawn_effect(u128 *spawn_position, + u128 *initial_velocity, + int initial_color, + int color_endpoint, + int lifetime, + int scalar_base, + int scalar_delta, + + int flag) { unsigned char *particle = FUN_L00_002678b8_00269958(4); if (particle) { int *particle_data; @@ -501,14 +501,14 @@ void update_colliding_effect_particle(struct EffectParticle *particle) { extern unsigned char *D_L00_001B20A0_0026a4c8 __asm__("D_L00_001B20A0") __attribute__((section(".data"))); unsigned char *FUN_L00_002678b8_0026a4c8(int) __asm__("FUN_L00_002678b8"); -void FUN_L00_0026a4c8(u128 *a, u128 *b, int c, int d, int n, float f); -void FUN_L00_0026a4c8(u128 *spawn_position, - u128 *initial_velocity, - int initial_color, - int final_color, - int lifetime, - - float particle_scalar_change) { +void spawn_particle_alt_9768(u128 *a, u128 *b, int c, int d, int n, float f) __asm__("FUN_L00_0026a4c8"); +void spawn_particle_alt_9768(u128 *spawn_position, + u128 *initial_velocity, + int initial_color, + int final_color, + int lifetime, + + float particle_scalar_change) { if (lifetime) { unsigned char *particle = FUN_L00_002678b8_0026a4c8(8); if (particle) { @@ -1351,6 +1351,9 @@ extern int hud_counter_update(int, int, float) __asm__("FUN_L00_002371e0"); void update_fading_debris_particle_with_landing_spawn(Part *particle) __asm__("FUN_L00_0026c088"); void update_fading_debris_particle_with_landing_spawn(Part *particle) { + enum { + DEBRIS_KIND_UPWARD_ACCELERATING = 3 + }; float saved[4]; float grav[4] = { D_0015ED70 * 4.8f, D_0015ED70 * 24.5f, D_0015ED70 * 9.8f, -(D_0015ED70 * 0.24f)}; @@ -1358,7 +1361,7 @@ void update_fading_debris_particle_with_landing_spawn(Part *particle) { int alpha, spawn_lifetime, k; float reference_distance_or_spawn_size; - if (particle_data->kind == 3 && D_L00_0015F5D0 > 0.95f) + if (particle_data->kind == DEBRIS_KIND_UPWARD_ACCELERATING && D_L00_0015F5D0 > 0.95f) fast_dec_timer_s16(&particle->timer); if (fast_dec_timer_s16(&particle->timer)) { free_effect_particle(particle); @@ -2962,14 +2965,19 @@ spawn_random_planar_drift_particle(void *, int, float, float) __asm__("FUN_L00_0 void update_ballistic_effect_particle_with_contact_spawns(struct EffectParticle *) __asm__("FUN_L00_0026f660"); void update_ballistic_effect_particle_with_contact_spawns(struct EffectParticle *particle) { + enum { + BALLISTIC_PARTICLE_MODE_NO_CONTACT_TEST = 0, + BALLISTIC_PARTICLE_MODE_LINE_CONTACT_HEIGHT_SNAPPED_SPAWN = 1, + BALLISTIC_PARTICLE_MODE_WATER_SURFACE_CONTACT_SPAWN = 3 + }; char *particle_data = particle->data; int mode = *(int *)(particle_data + 0x10); V next_position; char *particle_position; - if (mode == 0) { + if (mode == BALLISTIC_PARTICLE_MODE_NO_CONTACT_TEST) { fast_vec_add(particle->pos.f, particle->pos.f, particle_data); - } else if (mode == 1) { + } else if (mode == BALLISTIC_PARTICLE_MODE_LINE_CONTACT_HEIGHT_SNAPPED_SPAWN) { particle_position = particle->pos.f; fast_vec_add(&next_position, particle_position, particle_data); if (collision_line(particle_position, &next_position, 2, 0, 0)) { @@ -2981,7 +2989,7 @@ void update_ballistic_effect_particle_with_contact_spawns(struct EffectParticle return; } qcopy(particle_position, &next_position); - } else if (mode == 3) { + } else if (mode == BALLISTIC_PARTICLE_MODE_WATER_SURFACE_CONTACT_SPAWN) { float water_surface_z; particle_position = particle->pos.f; fast_vec_add(particle_position, particle_position, particle_data); diff --git a/src/overlays/shared/rendering/render_water_grids.c b/src/overlays/shared/rendering/render_water_grids.c index aebb9bb63f..87917381c2 100644 --- a/src/overlays/shared/rendering/render_water_grids.c +++ b/src/overlays/shared/rendering/render_water_grids.c @@ -66,6 +66,14 @@ void cull_and_submit_water_grid_tile(f32 *grid_center_position, s32 mode) __asm__("FUN_L01_002b8cb0"); void cull_and_submit_water_grid_tile(f32 *grid_center_position, s32 index, s32 mode) { + enum { + WATER_TILE_MODE_SKIP_CLIP_TESTS = 0, + WATER_TILE_MODE_TEST_FAR_CLIP = 1 + }; + enum { + WATER_TILE_VU_ENTRY_NO_FAR_CLIP = 0xc, + WATER_TILE_VU_ENTRY_FAR_CLIP_PENDING = 0xe + }; f32 corners[4][4]; f32 near_clip[4]; f32 far_clip[4]; @@ -76,7 +84,7 @@ void cull_and_submit_water_grid_tile(f32 *grid_center_position, s32 index, s32 m u32 near_bits, far_bits; s32 i, tile_vertex_offset, row, column; - if (mode != 0) { + if (mode != WATER_TILE_MODE_SKIP_CLIP_TESTS) { row = index >> 2; column = index & 3; half_x = 0.5f * -pool_light[2]; @@ -122,7 +130,7 @@ void cull_and_submit_water_grid_tile(f32 *grid_center_position, s32 index, s32 m far_bits = (far_bits << 8) | is_vector_outside_clip(far_clip); near_bits = (near_bits << 8) | is_vector_outside_clip(near_clip); } - if (mode == 1) { + if (mode == WATER_TILE_MODE_TEST_FAR_CLIP) { if ((near_bits & 0x01010101) == 0x01010101) return; if ((near_bits & 0x02020202) == 0x02020202) @@ -132,7 +140,7 @@ void cull_and_submit_water_grid_tile(f32 *grid_center_position, s32 index, s32 m if ((near_bits & 0x08080808) == 0x08080808) return; if (far_bits == 0) - mode = 0; + mode = WATER_TILE_MODE_SKIP_CLIP_TESTS; if ((near_bits & 0x20202020) == 0x20202020) return; } else { @@ -146,14 +154,14 @@ void cull_and_submit_water_grid_tile(f32 *grid_center_position, s32 index, s32 m return; if ((near_bits & 0x20202020) == 0x20202020) return; - mode = 0; + mode = WATER_TILE_MODE_SKIP_CLIP_TESTS; } } tile_vertex_offset = (index & 3) * 4 + (index >> 2) * 0x44; - if (mode != 0) { - mode = 0xe; + if (mode != WATER_TILE_MODE_SKIP_CLIP_TESTS) { + mode = WATER_TILE_VU_ENTRY_FAR_CLIP_PENDING; } else { - mode = 0xc; + mode = WATER_TILE_VU_ENTRY_NO_FAR_CLIP; } FUN_L01_00262388(mode, tile_vertex_offset); } @@ -220,6 +228,10 @@ void build_water_render_setup_packet(void) { void render_water_grids(f32 *water_record, s32 count) __asm__("FUN_L01_002b91c8"); void render_water_grids(f32 *water_record, s32 count) { + enum { + WATER_GRID_MODE_SKIP_CLIP_TESTS = 0, + WATER_GRID_MODE_TEST_NEAR_CLIP = 2 + }; f32 corners[4][4]; f32 near_clip[4]; f32 far_clip[4]; @@ -310,9 +322,9 @@ void render_water_grids(f32 *water_record, s32 count) { } mode = (far_bits & 0x2f2f2f2f) != 0; if (!mode) { - mode = 2; + mode = WATER_GRID_MODE_TEST_NEAR_CLIP; if (!(near_bits & 0x2f2f2f2f)) - mode = 0; + mode = WATER_GRID_MODE_SKIP_CLIP_TESTS; } mask = *(u16 *)((u8 *)water_record + 0x1e); if (*(u32 *)(water_record + 5) != cached_water_texture_id_gp || diff --git a/src/overlays/shared/rendering/sky/sky_particle_effects.c b/src/overlays/shared/rendering/sky/sky_particle_effects.c index 09411f5efc..8308aed23c 100644 --- a/src/overlays/shared/rendering/sky/sky_particle_effects.c +++ b/src/overlays/shared/rendering/sky/sky_particle_effects.c @@ -178,6 +178,10 @@ extern char D_L00_001BD7E0[] __asm__("D_L00_001BD7E0"); void draw_four_sky_shells_with_animated_particles(void) __asm__("FUN_L00_002895a0"); void draw_four_sky_shells_with_animated_particles(void) { + enum { + FOUR_SHELL_PARTICLE_PHASE_ORBIT = 0, + FOUR_SHELL_PARTICLE_RANDOM_COLOR = 3 + }; int i, j; SkyParticle *particle; f32 a, polar_angle_radians; @@ -192,7 +196,7 @@ void draw_four_sky_shells_with_animated_particles(void) { particle = &SKY->stars[i]; if (i >= 0xF6) { u16 *h; - particle->type = 0; + particle->type = FOUR_SHELL_PARTICLE_PHASE_ORBIT; h = &particle->c.h.a; h[0] = rand() >> 16; h[1] = rand() >> 16; @@ -200,7 +204,7 @@ void draw_four_sky_shells_with_animated_particles(void) { particle->b3 = 0x48; particle->f1C = 0.16f; } else { - particle->type = 3; + particle->type = FOUR_SHELL_PARTICLE_RANDOM_COLOR; particle->c.h.a = random_integer_below(0x100); { int random_high_half = rand() >> 16; @@ -235,7 +239,7 @@ void draw_four_sky_shells_with_animated_particles(void) { } for (j = 0; j < SKY->count; j++) { particle = &SKY->stars[j]; - if (particle->type == 0) { + if (particle->type == FOUR_SHELL_PARTICLE_PHASE_ORBIT) { u16 *h = &particle->c.h.a; h[0]++; h[1]++; @@ -248,7 +252,7 @@ void draw_four_sky_shells_with_animated_particles(void) { particle->color = 0x702020F0; else particle->color = 0x202020F0; - } else if (particle->type == 3) { + } else if (particle->type == FOUR_SHELL_PARTICLE_RANDOM_COLOR) { random_color_bits = rand() >> 16; { u32 u = ((random_color_bits & 0x1F00) << 10) + 0xFFDFDFE0; @@ -317,6 +321,11 @@ extern u8 D_L00_001BD7B0[] NOT_SDA; void draw_three_sky_shells_with_three_particle_types(void) __asm__("FUN_L00_00289cb8"); void draw_three_sky_shells_with_three_particle_types(void) { + enum { + THREE_SHELL_PARTICLE_PHASE_ORBIT = 0, + THREE_SHELL_PARTICLE_COLOR_HIGH_BYTE_PULSE = 2, + THREE_SHELL_PARTICLE_RANDOM_COLOR = 3 + }; Part *init_particle; Part *update_particle; PU *update_state; @@ -340,7 +349,7 @@ void draw_three_sky_shells_with_three_particle_types(void) { for (i = 0; i < D_L00_0016051C_c3->count; i++) { init_particle = &D_L00_0016051C_c3->parts[i]; if (i >= 0xF0) { - init_particle->type = 0; + init_particle->type = THREE_SHELL_PARTICLE_PHASE_ORBIT; init_phases = &init_particle->u; init_phases->h.h0 = rand() >> 16; init_phases->h.h2 = rand() >> 16; @@ -355,7 +364,7 @@ void draw_three_sky_shells_with_three_particle_types(void) { init_particle->b3 = 0x48; j = r & 1; init_particle->f8 = random_angle_radians(); - init_particle->type = 2; + init_particle->type = THREE_SHELL_PARTICLE_COLOR_HIGH_BYTE_PULSE; init_particle->col = sky_type2_base_colors[k]; qcopy(&init_particle->f10, D_L00_001BD7B0 + k * 16); init_particle->u.c.c0 = k; @@ -365,7 +374,7 @@ void draw_three_sky_shells_with_three_particle_types(void) { qq->c.c2 = j * 0x18; } } else { - init_particle->type = 3; + init_particle->type = THREE_SHELL_PARTICLE_RANDOM_COLOR; init_particle->u.h.h0 = random_integer_below(0x100); init_particle->b2 = (rand() >> 16) & 1; init_particle->b3 = 0x48; @@ -397,7 +406,7 @@ void draw_three_sky_shells_with_three_particle_types(void) { } for (i2 = 0; i2 < D_L00_0016051C_c3->count; i2++) { update_particle = &D_L00_0016051C_c3->parts[i2]; - if (update_particle->type == 0) { + if (update_particle->type == THREE_SHELL_PARTICLE_PHASE_ORBIT) { update_state = &update_particle->u; update_particle->u.h.h0++; update_state->h.h2++; @@ -416,7 +425,7 @@ void draw_three_sky_shells_with_three_particle_types(void) { } else { update_particle->col |= 0x24000000; } - } else if (update_particle->type == 2) { + } else if (update_particle->type == THREE_SHELL_PARTICLE_COLOR_HIGH_BYTE_PULSE) { update_state = &update_particle->u; update_state->c.c2 = (update_state->c.c2 + 1) % 0x30; if (update_state->c.c2 == 0) { @@ -437,7 +446,7 @@ void draw_three_sky_shells_with_three_particle_types(void) { x += k2 << 24; update_particle->col = x; } - } else if (update_particle->type == 3) { + } else if (update_particle->type == THREE_SHELL_PARTICLE_RANDOM_COLOR) { s32 rs = rand() >> 16; u32 x; { @@ -464,6 +473,10 @@ extern u32 D_L00_00160500[2] __attribute__((sda)); void render_three_shell_particle_sky(void) __asm__("FUN_L00_0028ac88"); void render_three_shell_particle_sky(void) { + enum { + SKY_PARTICLE_PHASE_ORBIT = 0, + SKY_PARTICLE_RANDOM_COLOR = 1 + }; int i, j; SkyParticle *particle; f32 a, polar_angle_radians; @@ -477,7 +490,7 @@ void render_three_shell_particle_sky(void) { particle = &SKY->stars[i]; if (i >= 0xF0) { u16 *h; - particle->type = 0; + particle->type = SKY_PARTICLE_PHASE_ORBIT; h = &particle->c.h.a; h[0] = rand() >> 16; h[1] = rand() >> 16; @@ -486,7 +499,7 @@ void render_three_shell_particle_sky(void) { particle->f1C = 0.18f; particle->color = D_L00_00160500[(rand() >> 16) & 3]; } else { - particle->type = 1; + particle->type = SKY_PARTICLE_RANDOM_COLOR; particle->c.h.a = random_integer_below(0x100); { int random_high_half = rand() >> 16; @@ -520,7 +533,7 @@ void render_three_shell_particle_sky(void) { } for (j = 0; j < SKY->count; j++) { particle = &SKY->stars[j]; - if (particle->type == 0) { + if (particle->type == SKY_PARTICLE_PHASE_ORBIT) { u16 *h = &particle->c.h.a; h[0]++; h[1]++; diff --git a/src/overlays/shared/streaming/load_scene_chunks_with_fade.c b/src/overlays/shared/streaming/load_scene_chunks_with_fade.c index 020ca8ff67..0dc110d0a1 100644 --- a/src/overlays/shared/streaming/load_scene_chunks_with_fade.c +++ b/src/overlays/shared/streaming/load_scene_chunks_with_fade.c @@ -6,6 +6,10 @@ #include "rnc/rendering/effects/fade_to_black.h" #include "rnc/audio/streaming/update_audio_stream_until_idle.h" +enum { + PAL_MODE_DISABLED = 0 +}; + typedef struct { u8 pad[0x5C]; u8 *buf; @@ -19,7 +23,7 @@ void load_scene_chunks_with_fade(s32 i) __asm__("FUN_L00_002454c8"); void load_scene_chunks_with_fade(s32 i) { s32 pointer_index; s32 *offset_entry; - if (pal_mode == 0) { + if (pal_mode == PAL_MODE_DISABLED) { start_audio_stream_read( D_L00_0016C860.buf, disc_table.unk1530[i].sector, disc_table.unk1530[i].size); } else { @@ -55,7 +59,7 @@ void load_chunks_with_optional_fade(s32 i, s32 p) __asm__("FUN_L00_00245610"); void load_chunks_with_optional_fade(s32 i, s32 fade_frame_count) { s32 pointer_index; s32 *offset_entry; - if (pal_mode == 0) { + if (pal_mode == PAL_MODE_DISABLED) { start_audio_stream_read( H245610.buf, disc_table.unk12E8[i].sector, disc_table.unk12E8[i].size); } else { diff --git a/src/overlays/shared/streaming/start_indexed_disc_stream.c b/src/overlays/shared/streaming/start_indexed_disc_stream.c index 5747204717..383816bc73 100644 --- a/src/overlays/shared/streaming/start_indexed_disc_stream.c +++ b/src/overlays/shared/streaming/start_indexed_disc_stream.c @@ -11,21 +11,21 @@ void hero_respawn() __asm__("FUN_L00_00211250"); void start_indexed_disc_stream(s32 i) __asm__("FUN_L02_00298c68"); void start_indexed_disc_stream(s32 i) { - s32 a, b; + s32 sector, stream_size; struct Hero *hero_ptr; if (i < 0) return; if (pal_mode) { - a = disc_table.unk1A10[i].sector; - b = disc_table.unk1A10[i].size; + sector = disc_table.unk1A10[i].sector; + stream_size = disc_table.unk1A10[i].size; } else { - a = disc_table.unk19F8[i].sector; - b = disc_table.unk19F8[i].size; + sector = disc_table.unk19F8[i].sector; + stream_size = disc_table.unk19F8[i].size; } hero_ptr = &hero; if (hero_ptr->health.hp == 0) { hero_respawn(); } else if (hero_ptr->fall_fade_pending == 0) { - prepare_movie_playback(a, b, game_language); + prepare_movie_playback(sector, stream_size, game_language); } } diff --git a/src/overlays/shared/ui/help/help_request.c b/src/overlays/shared/ui/help/help_request.c index 7a1596298c..1709fa2e5c 100644 --- a/src/overlays/shared/ui/help/help_request.c +++ b/src/overlays/shared/ui/help/help_request.c @@ -25,8 +25,11 @@ extern P00203908 D_00141968_00203908[] __asm__("D_00141968"); s32 help_request(s32 a, s32 b) __asm__("FUN_L00_00203908"); s32 help_request(s32 message_id, s32 help_record_index) { + enum { + HELP_STATE_INACTIVE = 0 + }; S00203908 *help_state_ptr = &D_L00_00179410_00203908; - if (help_state_ptr->state == 0 && help_state_ptr->cur == -1 && + if (help_state_ptr->state == HELP_STATE_INACTIVE && help_state_ptr->cur == -1 && music_stream_state.secondary.handle == 0 && music_stream_state.queued_secondary_track == help_state_ptr->cur && D_00141968_00203908[help_record_index].id != 0xFFFF) { diff --git a/src/overlays/shared/ui/hud/decompress_and_relocate_selected_groups.c b/src/overlays/shared/ui/hud/decompress_and_relocate_selected_groups.c index 040eea36b1..3c948f6208 100644 --- a/src/overlays/shared/ui/hud/decompress_and_relocate_selected_groups.c +++ b/src/overlays/shared/ui/hud/decompress_and_relocate_selected_groups.c @@ -28,6 +28,10 @@ extern int D_L00_0017E520 NOT_SDA; void decompress_and_relocate_selected_groups(int mode) __asm__("FUN_L00_00234fd0"); void decompress_and_relocate_selected_groups(int mode) { + enum { + HUD_DECOMPRESS_OPTIONAL_BANK_3 = 0, + HUD_DECOMPRESS_BOTH_OPTIONAL_BANKS = 2 + }; G_234fd0 *decompression_slot_state = &D_L00_0017E4D8_lui; int decompression_destination = D_L00_001B9CF0.unk104; void *compressed_data_buffer = (void *)D_L00_001B9CF0.unk10; @@ -57,7 +61,7 @@ void decompress_and_relocate_selected_groups(int mode) { decompression_destination += slot_3_size; } } - if (mode == 0 || mode == 2) { + if (mode == HUD_DECOMPRESS_OPTIONAL_BANK_3 || mode == HUD_DECOMPRESS_BOTH_OPTIONAL_BANKS) { { int slot_4_size; if ((slot_4_size = decompression_slot_state->t->sz[4])) { diff --git a/src/overlays/shared/ui/hud/draw_hud_item_selector_panel.c b/src/overlays/shared/ui/hud/draw_hud_item_selector_panel.c index b7cbe63df7..ce43922d31 100644 --- a/src/overlays/shared/ui/hud/draw_hud_item_selector_panel.c +++ b/src/overlays/shared/ui/hud/draw_hud_item_selector_panel.c @@ -34,7 +34,7 @@ void update_hud_counter_cap_and_visibility(char *hud_element) { *(int *)(hud_element + 8) = 10; else *(int *)(hud_element + 8) = 5; - if (hero.items[0].item_id == 9 && hero.vehicle_mode == 0) { + if (hero.items[0].item_id == 9 && hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { *(int *)(hud_element + 0x7C) = scale_game_frames(0x78) + 30; } else if (*(int *)(hud_element + 0x7C) > 30) { *(int *)(hud_element + 0x7C) = 30; @@ -71,58 +71,63 @@ extern void append_screen_rect_packet(s32, s32, s32, s32, u64, s32) __asm__("fun int hud_draw_gauge_frame(HudElem_237840 *e) __asm__("FUN_L00_00237840"); -int hud_draw_gauge_frame(HudElem_237840 *e) { - int pos[2]; +int hud_draw_gauge_frame(HudElem_237840 *gauge_element) { + int screen_position[2]; int left, top, right, bottom, w, h, bh, step, i; { int ww = D_L00_0015F760; - pos[0] = e->unk50; - pos[1] = e->unk54; - e->w = ww; + screen_position[0] = gauge_element->unk50; + screen_position[1] = gauge_element->unk54; + gauge_element->w = ww; { - int *src = (int *)&(*(short *)&D_L00_0015F764); - int *dst = &e->h; - __builtin_memcpy(dst, src, 4); + int *vertical_scale_source = (int *)&(*(short *)&D_L00_0015F764); + int *gauge_height_destination = &gauge_element->h; + __builtin_memcpy(gauge_height_destination, vertical_scale_source, 4); } } - hud_screen_position(e, &pos[0], &pos[1]); - apply_hud_slide_offset(e, &pos[0], &pos[1], e->unk6C, 0); + hud_screen_position(gauge_element, &screen_position[0], &screen_position[1]); + apply_hud_slide_offset( + gauge_element, &screen_position[0], &screen_position[1], gauge_element->unk6C, 0); w = D_L00_0015F760 * 0xD0; h = D_L00_0015F764 * 0xA0; bh = D_L00_0015F760 * 0x260; bottom = D_L00_0015F764 * 0xEA0; - left = (pos[0] + e->unk48) << 4; - top = (pos[1] + e->unk4A) << 4; + left = (screen_position[0] + gauge_element->unk48) << 4; + top = (screen_position[1] + gauge_element->unk4A) << 4; left += w / 64; top += h / 256; right = left + bh / 64; bottom = top + bottom / 256; append_screen_rect_packet(left, top, right, bottom, 0x80000000, 1); { - int st = D_L00_0015F764 * 0xEA0; + int gauge_height_numerator = D_L00_0015F764 * 0xEA0; h = D_L00_0015F764; - top = (pos[1] + e->unk4A) << 4; + top = (screen_position[1] + gauge_element->unk4A) << 4; top += (h * 0xF40) / 256; - bh = (e->unk74 * st) / (e->unk08 << 8); + bh = (gauge_element->unk74 * gauge_height_numerator) / (gauge_element->unk08 << 8); append_screen_rect_packet(left, top, right, top - bh, 0x80829E00, 1); } i = 1; - if (i < e->unk74) + if (i < gauge_element->unk74) do { int hh = D_L00_0015F764; - top = (pos[1] + e->unk4A) << 4; + top = (screen_position[1] + gauge_element->unk4A) << 4; top += (hh * 0xF40) / 256; step = D_L00_0015F764 * 0xEA0; - step = i * step / (e->unk08 << 8); + step = i * step / (gauge_element->unk08 << 8); i++; top -= step; top -= 16; append_screen_rect_packet(left, top, right, top + 32, 0x80000000, 1); - } while (i < e->unk74); - w = get_icon_frame(*(int *)e, 0); - draw_rotated_hud_sprite( - w, pos[0] + e->unk48, pos[1] + e->unk4A, D_L00_0015F760, D_L00_0015F764, 0x80); - return e->w; + } while (i < gauge_element->unk74); + w = get_icon_frame(*(int *)gauge_element, 0); + draw_rotated_hud_sprite(w, + screen_position[0] + gauge_element->unk48, + screen_position[1] + gauge_element->unk4A, + D_L00_0015F760, + D_L00_0015F764, + 0x80); + return gauge_element->w; } typedef struct { @@ -204,7 +209,7 @@ typedef struct { extern int D_L00_0017E504 NOT_SDA; extern int D_L00_0015FA90; -extern int D_L00_0015F780_gp __asm__("D_L00_0015F780") __attribute__((sda)); +extern int l00_hud_selector_fade_counter_limit_gp __asm__("D_L00_0015F780") __attribute__((sda)); extern int saved_hud_selector_slot_index_gp __asm__("D_L00_0015FA9C") __attribute__((sda)); extern Ent **D_L00_0015FAC0_c __asm__("D_L00_0015FAC0"); extern int D_L00_0017DC38 NOT_SDA; @@ -343,7 +348,7 @@ void update_hud_item_selector_selection_and_visibility(Obj *hud_element) { } if (hud_element->w74 != previous_selected_slot_index) counters[1] = 0; - else if (counters[1] < D_L00_0015F780_gp) + else if (counters[1] < l00_hud_selector_fade_counter_limit_gp) counters[1]++; if (!(((s32)controller_state.held_unmasked) & 0x10)) { int sel = hud_element->w74; @@ -368,7 +373,7 @@ void update_hud_item_selector_selection_and_visibility(Obj *hud_element) { } if (counters[0]) counters[0]--; - } else if (counters[0] < D_L00_0015F780_gp) + } else if (counters[0] < l00_hud_selector_fade_counter_limit_gp) counters[0]++; if (counters[0] == 0) { { @@ -435,12 +440,14 @@ int draw_hud_item_selector_panel(HudElem *rec) { unsigned char *counters = rec->cnt; char formatted[80]; - open = convert_integer_to_float(counters[0]) / convert_integer_to_float(D_L00_0015F780_gp); + open = convert_integer_to_float(counters[0]) / + convert_integer_to_float(l00_hud_selector_fade_counter_limit_gp); if (1.0f < open) open = 1.0f; else if (open < 0.0f) open = 0.0f; - fade = convert_integer_to_float(counters[1]) / convert_integer_to_float(D_L00_0015F780_gp); + fade = convert_integer_to_float(counters[1]) / + convert_integer_to_float(l00_hud_selector_fade_counter_limit_gp); if (1.0f < fade) fade = 1.0f; else if (fade < 0.0f) @@ -684,7 +691,7 @@ void update_hud_radial_selector_selection_and_visibility(Obj *hud_element) { } if (hud_element->w74 != previous_slot_index) { counters[1] = 0; - } else if (counters[1] < D_L00_0015F780_gp) { + } else if (counters[1] < l00_hud_selector_fade_counter_limit_gp) { counters[1]++; } if (!(((s32)controller_state.held_unmasked) & 0x10)) { @@ -694,7 +701,7 @@ void update_hud_radial_selector_selection_and_visibility(Obj *hud_element) { D_00141610[0] = D_L00_0015FAC0_c[D_L00_0015F72C][hud_element->w74].unk18; if (counters[0] != 0) counters[0]--; - } else if (counters[0] < D_L00_0015F780_gp) { + } else if (counters[0] < l00_hud_selector_fade_counter_limit_gp) { counters[0]++; } if (counters[0] == 0) { @@ -789,7 +796,7 @@ int draw_hud_radial_selector_panel(Elem *element) { counters = element->cnt; { float frames = convert_integer_to_float(element->cnt[0]); - open_fade = frames / convert_integer_to_float(D_L00_0015F780_gp); + open_fade = frames / convert_integer_to_float(l00_hud_selector_fade_counter_limit_gp); } if (1.0f < open_fade) { open_fade = 1.0f; @@ -798,7 +805,7 @@ int draw_hud_radial_selector_panel(Elem *element) { } { float frames = convert_integer_to_float(counters[1]); - text_fade = frames / convert_integer_to_float(D_L00_0015F780_gp); + text_fade = frames / convert_integer_to_float(l00_hud_selector_fade_counter_limit_gp); } if (1.0f < text_fade) { text_fade = 1.0f; @@ -921,7 +928,7 @@ typedef struct { short unk6; } HudCounter; -extern s32 D_L00_0015F7F0_gp __asm__("D_L00_0015F7F0") __attribute__((sda)); +extern s32 l00_hud_panel_visibility_counter_limit_gp __asm__("D_L00_0015F7F0") __attribute__((sda)); void update_health_hud_animation_and_visibility(HudElem *hud_element) __asm__("FUN_L00_00239630"); @@ -970,9 +977,9 @@ void update_health_hud_animation_and_visibility(HudElem *hud_element) { hud_element->unk74 = hud_element->unk78; } if (hud_element->unk7C >= scale_game_frames(5)) { - if (*(int *)&D_L00_0015F7F0_gp > visibility_counters[0]) { + if (*(int *)&l00_hud_panel_visibility_counter_limit_gp > visibility_counters[0]) { visibility_counters[0]++; - } else if (visibility_counters[1] < *(int *)&D_L00_0015F7F0_gp) { + } else if (visibility_counters[1] < *(int *)&l00_hud_panel_visibility_counter_limit_gp) { visibility_counters[1]++; } } else { @@ -1016,6 +1023,10 @@ extern Pt l00_health_hud_five_capacity_icon_offsets[] __asm__("D_L00_0017E460") s32 draw_health_hud_panel(Hud *hud_element) __asm__("FUN_L00_00239810"); s32 draw_health_hud_panel(Hud *hud_element) { + enum { + HEALTH_HUD_FIVE_ICON_CAPACITY = 5, + HEALTH_HUD_EIGHT_ICON_CAPACITY = 8 + }; s32 x; s32 y; s32 cnt; @@ -1038,12 +1049,12 @@ s32 draw_health_hud_panel(Hud *hud_element) { Pt *e; u8 *visibility_counters; - if (hero.vehicle_mode == 2) + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) goto out; if (hero.state.current == 0x32) goto out; x = hud_element->x; - if (pal_mode != 0) + if (pal_mode != FALSE) y = health_hud_base_y_offset + 10; else y = health_hud_base_y_offset + 0x12; @@ -1052,13 +1063,13 @@ s32 draw_health_hud_panel(Hud *hud_element) { if (visibility_counters[0] == 0) goto out; ratio_x = convert_integer_to_float(visibility_counters[0]) / - convert_integer_to_float(D_L00_0015F7F0_gp); + convert_integer_to_float(l00_hud_panel_visibility_counter_limit_gp); if (1.0f < ratio_x) ratio_x = 1.0f; else if (ratio_x < 0.0f) ratio_x = 0.0f; ratio_y = convert_integer_to_float(visibility_counters[1]) / - convert_integer_to_float(D_L00_0015F7F0_gp); + convert_integer_to_float(l00_hud_panel_visibility_counter_limit_gp); if (1.0f < ratio_y) ratio_y = 1.0f; else if (ratio_y < 0.0f) @@ -1070,13 +1081,13 @@ s32 draw_health_hud_panel(Hud *hud_element) { mode = hero_max_health; if (cnt == 0) sel = 0x1E; - if (hero.vehicle_mode == 1) + if (hero.vehicle_mode == HERO_VEHICLE_MODE_CLANK) mode = hero.health.vehicle_mode_hp; - if (mode == 8) { + if (mode == HEALTH_HUD_EIGHT_ICON_CAPACITY) { tab = l00_health_hud_eight_capacity_icon_offsets; first_panel_half_width = truncate_float_to_s32(ratio_x * 48.0f); second_panel_half_width = truncate_float_to_s32(ratio_x * 48.0f); - } else if (mode == 5) { + } else if (mode == HEALTH_HUD_FIVE_ICON_CAPACITY) { tab = l00_health_hud_five_capacity_icon_offsets; first_panel_half_width = truncate_float_to_s32(ratio_x * 32.0f); second_panel_half_width = truncate_float_to_s32(ratio_x * 16.0f); @@ -1185,6 +1196,9 @@ extern s32 bolt_text_fade_steps_gp __asm__("D_L00_0015F828") __attribute__((sda) void update_bolt_counter_hud_animation_and_visibility(T00239d00 *hud_element) __asm__("FUN_L00_00239d00"); void update_bolt_counter_hud_animation_and_visibility(T00239d00 *hud_element) { + enum { + BOLT_COUNTER_HUD_STATE_CLOSING = 1 + }; u8 *visibility_counters = &hud_element->a; s32 icon_cycle_period = 60; s32 bolt_count_snapshot; @@ -1201,7 +1215,7 @@ void update_bolt_counter_hud_animation_and_visibility(T00239d00 *hud_element) { visibility_counters[1]++; } } else { - hud_element->state = 1; + hud_element->state = BOLT_COUNTER_HUD_STATE_CLOSING; if (visibility_counters[1] != 0) { visibility_counters[1]--; } else if (hud_element->a != 0) { @@ -1329,7 +1343,7 @@ void update_hud_panel_visibility(u8 *hud_element) { u8 *visibility_counters = hud_element + 0x70; if (D_00141398) { s32 scaled_duration_frames = scale_game_frames(10); - s32 visibility_counter_limit = D_L00_0015F7F0_gp; + s32 visibility_counter_limit = l00_hud_panel_visibility_counter_limit_gp; *(s32 *)(hud_element + 0x7C) = scaled_duration_frames; if (hud_element[0x70] < visibility_counter_limit) { hud_element[0x70]++; @@ -1377,11 +1391,11 @@ s32 draw_hud_bolt_exclamation_panel(Hud *hud_element) { s32 panel_y = frame_size - 42; s32 alternate_y = frame_size - 50; y = panel_y; - if (*(volatile s32 *)&pal_mode == 0) + if (*(volatile s32 *)&pal_mode == FALSE) y = alternate_y; } x = hud_element->x; - if (hero.vehicle_mode == 2) + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK) return hud_element->ret; if (hero.state.current == 50) return hud_element->ret; @@ -1390,13 +1404,13 @@ s32 draw_hud_bolt_exclamation_panel(Hud *hud_element) { return hud_element->ret; open = convert_integer_to_float(visibility_counters[0]) / - convert_integer_to_float(D_L00_0015F7F0_gp); + convert_integer_to_float(l00_hud_panel_visibility_counter_limit_gp); if (1.0f < open) open = 1.0f; else if (open < 0.0f) open = 0.0f; text = convert_integer_to_float(visibility_counters[1]) / - convert_integer_to_float(D_L00_0015F7F0_gp); + convert_integer_to_float(l00_hud_panel_visibility_counter_limit_gp); if (1.0f < text) text = 1.0f; else if (text < 0.0f) diff --git a/src/overlays/shared/ui/hud/draw_hud_segment_meter.c b/src/overlays/shared/ui/hud/draw_hud_segment_meter.c index 817d9b3755..634b59762a 100644 --- a/src/overlays/shared/ui/hud/draw_hud_segment_meter.c +++ b/src/overlays/shared/ui/hud/draw_hud_segment_meter.c @@ -11,20 +11,22 @@ #include "rnc/ui/hud.h" extern s32 frame_size __asm__("D_0013E504") NOT_SDA; -extern s32 D_L06_0015F8E8 __attribute__((sda)); -extern f32 D_L06_0015F8F0 __attribute__((sda)); -extern f32 D_L06_0015F8F4 __attribute__((sda)); +extern s32 l06_hud_segment_meter_center_x __asm__("D_L06_0015F8E8") __attribute__((sda)); +extern f32 l06_hud_segment_meter_last_segment_fill_scale __asm__("D_L06_0015F8F0") + __attribute__((sda)); +extern f32 l06_hud_segment_meter_first_segment_fill_scale __asm__("D_L06_0015F8F4") + __attribute__((sda)); extern s32 fast_tween_color(s32, s32, f32) __asm__("FUN_001fa6e0"); s32 draw_hud_segment_meter(u8 *p) __asm__("FUN_L06_00249738"); -s32 draw_hud_segment_meter(u8 *p) { +s32 draw_hud_segment_meter(u8 *meter_state) { s32 y; s32 ntsc_y; s32 level; s32 segments = 3; s32 x, start_x, inner, i, color, remaining, tile_count, k; - s32 center_x = D_L06_0015F8E8; + s32 center_x = l06_hud_segment_meter_center_x; f32 alpha, scaled_alpha, fill, step, limit; /* Fakematch: computing this row before the default one gives retail's order. */ @@ -37,15 +39,15 @@ s32 draw_hud_segment_meter(u8 *p) { segments = 6; if (level == 18) segments = 7; - if (p[0x70] == 0) - return *(s32 *)(p + 0x58); + if (meter_state[0x70] == 0) + return *(s32 *)(meter_state + 0x58); { if (level == 13) { y = 18; - if (pal_mode != 0) + if (pal_mode != FALSE) y = 10; } - alpha = convert_integer_to_float(p[0x70]) * 0.125f; + alpha = convert_integer_to_float(meter_state[0x70]) * 0.125f; if (alpha > 1.0f) alpha = 1.0f; else if (alpha < 0.0f) @@ -62,17 +64,18 @@ s32 draw_hud_segment_meter(u8 *p) { } x = 0; color = 0x800000ff; - if (*(s32 *)(p + 0x74) != 0) { - fill = (f32) * (s32 *)(p + 0x74) / convert_integer_to_float(*(s32 *)(p + 8)); + if (*(s32 *)(meter_state + 0x74) != 0) { + fill = (f32) * (s32 *)(meter_state + 0x74) / + convert_integer_to_float(*(s32 *)(meter_state + 8)); step = 1.0f / convert_integer_to_float(segments); limit = remaining * step; if (limit < fill) { fill -= limit; - fill *= D_L06_0015F8F0; + fill *= l06_hud_segment_meter_last_segment_fill_scale; fill += limit; } else if (fill < step) { fill -= step; - fill *= D_L06_0015F8F4; + fill *= l06_hud_segment_meter_first_segment_fill_scale; fill += step; } x = truncate_float_to_s32((f32)(segments << 5) * fill); @@ -97,7 +100,7 @@ s32 draw_hud_segment_meter(u8 *p) { draw_hud_sprite(get_icon_frame(0x7562, 4), segments, y - 8, 48, 48, i); draw_hud_sprite(get_icon_frame(0x7562, 0), segments, y - 8, 48, 48, i); } - return *(s32 *)(p + 0x58); + return *(s32 *)(meter_state + 0x58); } s32 D_L07_0015F8E8 = 0x114; diff --git a/src/overlays/shared/ui/hud/draw_weapon_ammo_hud_panel.c b/src/overlays/shared/ui/hud/draw_weapon_ammo_hud_panel.c index 4630645fee..dc2fc4b471 100644 --- a/src/overlays/shared/ui/hud/draw_weapon_ammo_hud_panel.c +++ b/src/overlays/shared/ui/hud/draw_weapon_ammo_hud_panel.c @@ -262,7 +262,7 @@ void update_weapon_hud_state(void) { draw_weapon_ammo_hud_panel, &weapon_ammo_counts[weapon_item_id], D_L00_001C40B0[weapon_item_id].hE); - } else if (k = -1, mode == 2) { + } else if (k = -1, mode == HERO_VEHICLE_MODE_GIANT_CLANK) { if (D_L00_0015F970 != k) { set_animation_parameter(D_L00_0015F970, 0); D_L00_0015F970 = k; diff --git a/src/overlays/shared/ui/hud/hud_keep_visible.c b/src/overlays/shared/ui/hud/hud_keep_visible.c index c6b947cf7e..cb380c384e 100644 --- a/src/overlays/shared/ui/hud/hud_keep_visible.c +++ b/src/overlays/shared/ui/hud/hud_keep_visible.c @@ -651,7 +651,7 @@ int draw_hud_text_panel(HudElem *hud_element) { int text_color; int never = 0; - if (pal_mode != 0) { + if (pal_mode != FALSE) { y = l00_hud_text_panel_base_y + 0xa; } else { y = l00_hud_text_panel_base_y + 0x12; @@ -727,7 +727,7 @@ int draw_hud_text_panel(HudElem *hud_element) { elapsed = freeze_stats_time_ref[current_level_index == 0x10]; score = freeze_stats_score_ref_a[current_level_index == 0x10]; if (elapsed != 0) { - interval = pal_mode != 0 ? 3000 : 3600; + interval = pal_mode != FALSE ? 3000 : 3600; unit = interval / 60; minutes = elapsed / interval; rest = elapsed - minutes * interval; diff --git a/src/overlays/shared/ui/map/reveal_map_around_position.c b/src/overlays/shared/ui/map/reveal_map_around_position.c index 687ebca56c..31dbbb785a 100644 --- a/src/overlays/shared/ui/map/reveal_map_around_position.c +++ b/src/overlays/shared/ui/map/reveal_map_around_position.c @@ -97,10 +97,10 @@ void reveal_map_around_position(f32 *position) { if (level >= 19) { level = 0; } - state = 0; + state = FALSE; if (hero.state.control_mode == 17 || hero.state.control_mode == 18 || hero.base_condition == 1) { - state = 1; + state = TRUE; } mode16 = hero.state.control_mode == 16; mode15 = hero.state.control_mode == 15; diff --git a/src/overlays/shared/ui/menus/initialize_pause_menu.c b/src/overlays/shared/ui/menus/initialize_pause_menu.c index 7a6db104f4..49bb1ad501 100644 --- a/src/overlays/shared/ui/menus/initialize_pause_menu.c +++ b/src/overlays/shared/ui/menus/initialize_pause_menu.c @@ -42,6 +42,23 @@ #include "rnc/ui/menus/item_preview/create_menu_preview_moby.h" #include "rnc/ui/menus/stream_buffers/initialize_menu_stream_buffers.h" +enum { + PAUSE_MENU_PENDING_STATE_CLEARED = 0, + PAUSE_MENU_STATE_EXIT_GUARDED = 0x22 +}; + +enum { + SCENE_STATE_DEFAULT = 2 +}; + +enum { + PAUSE_MENU_STATE_PAGE_TRANSITION = 1, + PAUSE_MENU_STATE_LEVEL_TRANSITION_ENTRY = 0xE, + PAUSE_MENU_STATE_RESTORE_GAMEPLAY_AND_DISPATCH_ACTION = 0x14, + PAUSE_MENU_STATE_EXIT_GUARDED_ENTRY = 0x21, + PAUSE_MENU_STATE_PRESERVE_STATE_ENTRY = 0x23 +}; + typedef unsigned int u128d __attribute__((mode(TI), aligned(16))); typedef union { @@ -165,7 +182,7 @@ extern void queue_movie_with_game_language(void *) __asm__("FUN_L00_00299560"); extern void start_slideshow(void) __asm__("FUN_L00_00299a68"); extern Own l00_pause_menu_default_page_owner __asm__("D_L00_001B2588"); extern Own D_L00_001B3518; -extern Own D_L00_001B6088; +extern Own l00_pause_menu_level_transition_on_action_page_owner __asm__("D_L00_001B6088"); extern Own l00_pause_menu_state_preserving_entry_page_owner __asm__("D_L00_001B6B38"); extern Own D_L00_001B86C8; @@ -193,6 +210,9 @@ extern void FUN_L00_002df638(Ent *); /* Ported from rac1-decomp (src/overlays/shared/pause_00277208.c: func_L00_00277208). */ void initialize_pause_menu(void) { + enum { + PAUSE_MENU_STATE_LEVEL_TRANSITION_ON_ACTION = 15 + }; struct GameState *state = &D_L00_001B9CF0; Own *page; s32 small_buffers = 0; @@ -210,13 +230,13 @@ void initialize_pause_menu(void) { state->unk8 = page; small_buffers = 1; } else if (state_id == 14) { - D_L00_001B9CF0.state = 15; - page = &D_L00_001B6088; + D_L00_001B9CF0.state = PAUSE_MENU_STATE_LEVEL_TRANSITION_ON_ACTION; + page = &l00_pause_menu_level_transition_on_action_page_owner; state->owner = page; state->unk8 = page; small_buffers = 1; } else if (state_id == 0x21) { - D_L00_001B9CF0.state = 0x22; + D_L00_001B9CF0.state = PAUSE_MENU_STATE_EXIT_GUARDED; page = &l00_pause_menu_exit_guarded_page_owner; state->owner = page; state->unk8 = page; @@ -227,12 +247,12 @@ void initialize_pause_menu(void) { state->unk8 = page; } else if (state_id == 0x2D) { page = &D_L00_001B86C8; - D_L00_001B9CF0.state = 2; + D_L00_001B9CF0.state = SCENE_STATE_DEFAULT; state->owner = page; state->unk8 = page; } else { page = &l00_pause_menu_default_page_owner; - D_L00_001B9CF0.state = 2; + D_L00_001B9CF0.state = SCENE_STATE_DEFAULT; state->owner = page; state->unk8 = page; } @@ -244,12 +264,12 @@ void initialize_pause_menu(void) { D_L00_001B9CF0.unk8 = D_L00_001B9CF0.pending_owner; pending_state = D_L00_001B9CF0.pending_state; D_L00_001B9CF0.state = pending_state; - if (pending_state == 11 || pending_state == 15) { + if (pending_state == 11 || pending_state == PAUSE_MENU_STATE_LEVEL_TRANSITION_ON_ACTION) { small_buffers = 1; D_L00_001841F0.w224 = (s32)D_L00_001B9CF0.unkE4; } D_L00_001B9CF0.pending_owner = 0; - D_L00_001B9CF0.pending_state = 0; + D_L00_001B9CF0.pending_state = PAUSE_MENU_PENDING_STATE_CLEARED; } { @@ -314,11 +334,14 @@ void initialize_pause_menu(void) { D_L00_0015F578 = 0x2000; vu1_init_chain(); - if (D_L00_001B9CF0.state == 11 || D_L00_001B9CF0.state == 15) { + if (D_L00_001B9CF0.state == 11 || + D_L00_001B9CF0.state == PAUSE_MENU_STATE_LEVEL_TRANSITION_ON_ACTION) { initialize_render_archive_transfer(); } apply_group_entry_adjustment(0); - if (D_L00_001B9CF0.state == 11 || D_L00_001B9CF0.state == 15 || D_L00_001B9CF0.state == 0x12) { + if (D_L00_001B9CF0.state == 11 || + D_L00_001B9CF0.state == PAUSE_MENU_STATE_LEVEL_TRANSITION_ON_ACTION || + D_L00_001B9CF0.state == 0x12) { decompress_and_relocate_selected_groups(1); } else { decompress_and_relocate_selected_groups(0); @@ -326,7 +349,8 @@ void initialize_pause_menu(void) { transfer_draw_buffer_chunks(D_L00_001B9CF0.unk10, draw_buffer_address, frame_size << 11); texture_start = gs_texture_allocation_start; D_L00_001B9CF0.saved_texture_start = texture_start; - if (D_L00_001B9CF0.state == 11 || D_L00_001B9CF0.state == 15) { + if (D_L00_001B9CF0.state == 11 || + D_L00_001B9CF0.state == PAUSE_MENU_STATE_LEVEL_TRANSITION_ON_ACTION) { D_L00_001841F0.unk240 = texture_start; texture_region_end = texture_start + 0x40000; D_L00_001841F0.unk244 = texture_region_end; @@ -448,7 +472,7 @@ void close_pause_menu(void) { ¤t_bolt_count, 9999999); hud_keep_visible(handle, scale_game_frames(0xb4)); - D_L00_001B9CF0.state = 0x14; + D_L00_001B9CF0.state = PAUSE_MENU_STATE_RESTORE_GAMEPLAY_AND_DISPATCH_ACTION; D_L00_001B9CF0.unk14 = 2; { s32 value = D_L00_001B9CF0.saved_seq_count; @@ -477,9 +501,6 @@ void close_pause_menu(void) { void update_pause_menu(void) __asm__("FUN_L00_00276bd0"); void update_pause_menu(void) { - enum { - SCENE_STATE_DEFAULT = 2 - }; Own *owner; Own *u8p; Mth *active_callback_object; @@ -501,7 +522,7 @@ void update_pause_menu(void) { D_L00_0015F5AC = 1; break; } - if (D_L00_001B9CF0.state == 0x14) { + if (D_L00_001B9CF0.state == PAUSE_MENU_STATE_RESTORE_GAMEPLAY_AND_DISPATCH_ACTION) { if (D_L00_001B9CF0.unk14 != 0) { D_L00_001B9CF0.unk14 = D_L00_001B9CF0.unk14 - 1; if (D_L00_001B9CF0.unk14 != 0) { @@ -576,8 +597,10 @@ void update_pause_menu(void) { return; } scene_state = D_L00_001B9CF0.state; - if (scene_state == 0 || scene_state == 0xA || scene_state == 0xE || scene_state == 0x11 || - scene_state == 0x21 || scene_state == 0x2D || scene_state == 0x23) { + if (scene_state == 0 || scene_state == 0xA || + scene_state == PAUSE_MENU_STATE_LEVEL_TRANSITION_ENTRY || scene_state == 0x11 || + scene_state == PAUSE_MENU_STATE_EXIT_GUARDED_ENTRY || scene_state == 0x2D || + scene_state == PAUSE_MENU_STATE_PRESERVE_STATE_ENTRY) { initialize_pause_menu(); } if ((mode_freeze_flags & 1) && !(level_timer < 8)) { @@ -585,7 +608,7 @@ void update_pause_menu(void) { return; } process_unlock_code_input(); - if (D_L00_001B9CF0.state == 1) { + if (D_L00_001B9CF0.state == PAUSE_MENU_STATE_PAGE_TRANSITION) { D_L00_001B9CF0.unk14 = (D_L00_001B9CF0.unk14 < 1) ? 0 : D_L00_001B9CF0.unk14 - 1; if (D_L00_001B9CF0.unk14 == 0) { u8p = D_L00_001B9CF0.unk8; @@ -618,7 +641,7 @@ void update_pause_menu(void) { D_L00_001B9CF0.owner != &D_L00_001B7DD0 && D_L00_001B9CF0.owner != &D_L00_001B80E0 && D_L00_001B9CF0.owner != &l00_pause_menu_self_transition_animation_guard_page_owner && D_L00_001B9CF0.owner != &D_L00_001B78F0 && D_L00_001B9CF0.owner != &D_L00_001B6820) { - if (D_L00_001B9CF0.state != 0x23) { + if (D_L00_001B9CF0.state != PAUSE_MENU_STATE_PRESERVE_STATE_ENTRY) { flag = flag ^ 1; } } @@ -637,7 +660,7 @@ void update_pause_menu(void) { l00_pause_menu_page_mobys[j]->anim_speed = 1.0f; } } - D_L00_001B9CF0.state = 1; + D_L00_001B9CF0.state = PAUSE_MENU_STATE_PAGE_TRANSITION; D_L00_001B9CF0.unk14 = 12; D_L00_001B9CF0.unkD0 = D_L00_001B9CF0.owner; D_L00_001B9CF0.owner = 0; @@ -733,7 +756,7 @@ void draw_pause_menu_pages(int transfer_only) { } reset_gs_registers(); emit_rgba_draw_packet(0, 0, 0, 0x30); - if (D_L00_001B9CF0.state == 0x14) { + if (D_L00_001B9CF0.state == PAUSE_MENU_STATE_RESTORE_GAMEPLAY_AND_DISPATCH_ACTION) { return; } vu1_add_g_sregister(0x47, 0x5360B); diff --git a/src/overlays/shared/ui/text/draw_timed_text.c b/src/overlays/shared/ui/text/draw_timed_text.c index bf6f8277ee..6defbf6b6c 100644 --- a/src/overlays/shared/ui/text/draw_timed_text.c +++ b/src/overlays/shared/ui/text/draw_timed_text.c @@ -59,6 +59,9 @@ typedef struct { void draw_timed_text(LevelTextEntry *entry, s32 frame) __asm__("FUN_L00_001fcca0"); void draw_timed_text(LevelTextEntry *timed_text_entry, s32 frame) { + enum { + TEXT_SEPARATOR_JOIN_WITH_HYPHEN = 1 + }; int start = timed_text_entry->start; int end = start + timed_text_entry->duration; float scale, alpha; @@ -91,7 +94,7 @@ void draw_timed_text(LevelTextEntry *timed_text_entry, s32 frame) { alpha = 0.0f; } source = (unsigned char *)get_help_message_text(timed_text_entry->text_id); - if (timed_text_entry->separator_mode == 1) { + if (timed_text_entry->separator_mode == TEXT_SEPARATOR_JOIN_WITH_HYPHEN) { text_write_cursor = formatted_text; joined_text: while (*source != 0) { diff --git a/src/overlays/shared/vehicles/background_ship_1.c b/src/overlays/shared/vehicles/background_ship_1.c index 29c9ea1b41..0ae78b7a4f 100644 --- a/src/overlays/shared/vehicles/background_ship_1.c +++ b/src/overlays/shared/vehicles/background_ship_1.c @@ -227,7 +227,7 @@ void background_ship_1_update(char *moby) { qcopy(&MOBY(moby)->pos, D_L02_001B0AB0[moby_data->unk60] + 0x10); moby_data->unk68 = random_angle_radians(); moby_data->unk6C = invalid_index; - MOBY(moby)->state = 1; + MOBY(moby)->state = BACKGROUND_SHIP_1_FOLLOW_PATH; MOBY(moby)->flags |= 0x10; moby_data->unk64 = moby_data->unk74 * (float)*(int *)path; break; @@ -263,7 +263,7 @@ void background_ship_1_update(char *moby) { flag = 1; } if (flag) { - MOBY(moby)->state = 2; + MOBY(moby)->state = BACKGROUND_SHIP_1_REMOVE; } break; case BACKGROUND_SHIP_1_REMOVE: diff --git a/src/overlays/shared/vehicles/background_ship_2.c b/src/overlays/shared/vehicles/background_ship_2.c index e7956cdbc4..2db701114b 100644 --- a/src/overlays/shared/vehicles/background_ship_2.c +++ b/src/overlays/shared/vehicles/background_ship_2.c @@ -253,7 +253,7 @@ void background_ship_2_update(char *moby) { qcopy(&MOBY(moby)->pos, D_L02_001B0AB0[moby_data->unk60] + 0x10); moby_data->unk68 = random_angle_radians(); moby_data->unk6C = invalid_index; - MOBY(moby)->state = 1; + MOBY(moby)->state = BACKGROUND_SHIP_2_FOLLOW_PATH; MOBY(moby)->flags |= 0x10; moby_data->unk64 = moby_data->unk74 * (float)*(int *)path; break; @@ -300,7 +300,7 @@ void background_ship_2_update(char *moby) { flag = 1; } if (flag) { - MOBY(moby)->state = 2; + MOBY(moby)->state = BACKGROUND_SHIP_2_REMOVE; } break; case BACKGROUND_SHIP_2_REMOVE: diff --git a/src/overlays/shared/vehicles/fighter_jet_missile.c b/src/overlays/shared/vehicles/fighter_jet_missile.c index 3ccd0699f2..68769c0b34 100644 --- a/src/overlays/shared/vehicles/fighter_jet_missile.c +++ b/src/overlays/shared/vehicles/fighter_jet_missile.c @@ -164,6 +164,9 @@ void fighter_jet_missile_update(struct Moby *moby) __asm__("FUN_L11_003089d0"); /* Moby class 1009 */ void fighter_jet_missile_update(struct Moby *moby) { + enum { + MOBY_STATE_PENDING_REMOVAL = 0xFE + }; MissileVars *missile_vars = (MissileVars *)moby->pvars; float previous_missile_position[4]; float look[4]; @@ -182,7 +185,7 @@ void fighter_jet_missile_update(struct Moby *moby) { copy_xyz_089d0(look, missile_vars->target_pos); ((int *)look)[3] = 0; target = missile_vars->target; - if (target == 0 || target->state == 0xFE || target->state == 0xFD || + if (target == 0 || target->state == MOBY_STATE_PENDING_REMOVAL || target->state == 0xFD || fast_vec_dist(&target->pos, look) > 3.0f) missile_vars->target = (struct Moby *)select_homing_missile_target( (float *)&moby->pos, (float *)&moby->rot, 0.2617994f, 0.2617994f, 60.0f); diff --git a/src/overlays/shared/vehicles/fighter_jet_rocket.c b/src/overlays/shared/vehicles/fighter_jet_rocket.c index da77fdf641..9368b37b0f 100644 --- a/src/overlays/shared/vehicles/fighter_jet_rocket.c +++ b/src/overlays/shared/vehicles/fighter_jet_rocket.c @@ -34,13 +34,16 @@ unsigned char *spawn_fighter_jet_rocket(struct Moby *firing_moby, int lifetime_frames, float scale) { + enum { + FIGHTER_JET_ROCKET_STATE_INITIAL = 0 + }; unsigned char *moby = create_moby(0x127); if (moby != 0) { char *rocket_private_state = ((char *)MOBY(moby)->pvars); MOBY(moby)->update_dist = 0xFF; MOBY(moby)->draw_dist = 0xFF; MOBY(moby)->visible = 1; - MOBY(moby)->state = 0; + MOBY(moby)->state = FIGHTER_JET_ROCKET_STATE_INITIAL; *(char **)(rocket_private_state + 0x20) = firing_moby; *(char **)(rocket_private_state + 0x24) = target; qcopy(&MOBY(moby)->pos, spawn_position); @@ -111,10 +114,9 @@ typedef struct Tex { unsigned char *p5C; } Tex; -extern float D_0015ED6C; -extern int collision_line() __asm__("FUN_001efa68"); -extern int FUN_L00_0024f7c8(); -float FUN_L00_0025be00(float *cur, float *vel, float target, float lim, float accel, float maxv); +extern float D_0015ED6C; +extern int collision_line() __asm__("FUN_001efa68"); +extern int FUN_L00_0024f7c8(); unsigned char *spawn_particle(void *pos, float *vec, int s, diff --git a/src/overlays/shared/vehicles/giant_clank_charged_blast.c b/src/overlays/shared/vehicles/giant_clank_charged_blast.c index 1e314bb9c3..c2b41fc355 100644 --- a/src/overlays/shared/vehicles/giant_clank_charged_blast.c +++ b/src/overlays/shared/vehicles/giant_clank_charged_blast.c @@ -12,6 +12,10 @@ #include "rnc/overlay/shared/math/vu0_vector_ops.h" #include "sda.h" +enum { + GIANT_CLANK_CHARGED_BLAST_CHARGING = 0 +}; + extern int D_L00_0015F320; extern int D_L00_0015F330; extern int allocate_packed_color_point_light_slot(float *pos, @@ -37,7 +41,7 @@ void *spawn_giant_clank_charged_blast(int unused, float *spawn_position) { char *spawned_moby = create_moby(0x5F3); if (spawned_moby != 0 && *(int *)&D_L00_001613C8_gp == 0) { char *moby_vars; - MOBY(spawned_moby)->state = 0; + MOBY(spawned_moby)->state = GIANT_CLANK_CHARGED_BLAST_CHARGING; MOBY(spawned_moby)->update_dist = 0xFF; MOBY(spawned_moby)->draw_dist = 0xFF; MOBY(spawned_moby)->visible = 1; @@ -90,7 +94,7 @@ void remove_giant_clank_charged_blast(void) { if (tracked_moby->oclass == 0x5F3) { char *tracked_moby_vars; int point_light_slot_index; - if (tracked_moby->state != 0) + if (tracked_moby->state != GIANT_CLANK_CHARGED_BLAST_CHARGING) return; tracked_moby_vars = ((char *)tracked_moby->pvars); D_L00_0015F320 = 0; @@ -360,7 +364,7 @@ void giant_clank_charged_blast_update(Moby29FF90 *moby) { moby_data->vel[0] = fast_cos(((Hero29FF90 *)&hero)->f98) * (D_0015ED6C * 40.0f); moby_data->vel[1] = fast_sin(((Hero29FF90 *)&hero)->f98) * (D_0015ED6C * 40.0f); moby_data->vel[2] = 0.0f; - moby->state = 1; + moby->state = EXPANDING_BLAST; moby_data->f14 = 0; } break; @@ -419,16 +423,16 @@ void giant_clank_charged_blast_update(Moby29FF90 *moby) { int i; for (i = 0; i < 8; i++) { - Part29FF90 *p; + Part29FF90 *offset_particle; random_spherical_offset( random_effect_vector, r * D_0015ED6C, r * 2.0f * D_0015ED6C); random_spherical_offset(effect_vector_scratch, 0.0f, r * 0.5f); add_vectors(temporary_position, effect_vector_scratch, moby->pos); - p = (Part29FF90 *)spawn_mode_controlled_rotating_alpha_fade_particle( + offset_particle = (Part29FF90 *)spawn_mode_controlled_rotating_alpha_fade_particle( effect_vector_scratch, random_effect_vector, 0x7F, moby); - if (p != 0) { - p->fC = random_float_between(6000.0f, 32000.0f) * r * 0.4f; + if (offset_particle != 0) { + offset_particle->fC = random_float_between(6000.0f, 32000.0f) * r * 0.4f; } } } @@ -436,20 +440,22 @@ void giant_clank_charged_blast_update(Moby29FF90 *moby) { int i; for (i = 0; i < 12; i++) { - Part29FF90 *p = (Part29FF90 *)spawn_mode_controlled_rotating_alpha_fade_particle( - moby->pos, D_L15_0015F580, 0x7F, moby); + Part29FF90 *blast_center_particle = + (Part29FF90 *)spawn_mode_controlled_rotating_alpha_fade_particle( + moby->pos, D_L15_0015F580, 0x7F, moby); - if (p != 0) { - PartSub29FF90 *particle_subrecord = &p->sub; + if (blast_center_particle != 0) { + PartSub29FF90 *particle_subrecord = &blast_center_particle->sub; if (i == 2 && random_integer_below(8) == 0) { - p->fC = 180000.0f; + blast_center_particle->fC = 180000.0f; } else { - p->fC = random_float_between(80000.0f, 120000.0f); + blast_center_particle->fC = random_float_between(80000.0f, 120000.0f); } - p->fC = p->fC * r; - p->fA = scale_game_frames(2); - particle_subrecord->f10 = 1.0f / convert_integer_to_float(p->fA); + blast_center_particle->fC = blast_center_particle->fC * r; + blast_center_particle->fA = scale_game_frames(2); + particle_subrecord->f10 = + 1.0f / convert_integer_to_float(blast_center_particle->fA); particle_subrecord->f18 = 0x7F7F7F; particle_subrecord->f16 = 3; } diff --git a/src/overlays/shared/vehicles/giant_clank_missile.c b/src/overlays/shared/vehicles/giant_clank_missile.c index bd04e08665..853cac0df2 100644 --- a/src/overlays/shared/vehicles/giant_clank_missile.c +++ b/src/overlays/shared/vehicles/giant_clank_missile.c @@ -46,7 +46,7 @@ extern char *select_auto_aim_target_moby( void *, void *, void *, float *, float *, float *, float) __asm__("FUN_L00_002630c8"); extern char D_0013F490[]; extern void *D_001413D0; -extern float D_L00_001613C4 __attribute__((sda)); +extern float l00_missile_spawn_scale_multiplier __asm__("D_L00_001613C4") __attribute__((sda)); extern short D_L00_001B0770[]; extern void append_unique_moby_index(void *, short *, int) __asm__("FUN_L00_0025f780"); @@ -64,75 +64,94 @@ char *spawn_giant_clank_missile(void *owner, char *spawn_giant_clank_missile( - void *owner, void *pos, float a, float b, float c, char *tgt, float rz, float ry) { - char *m; - char *d; - BoltVector t; - BoltVector p; - m = (char *)create_moby(0x100); - if (m != 0) { - ((unsigned char *)m)[0x30] = 0xFF; - m[0x31] = 1; - m[0x20] = 0; - *(float *)(m + 0x2C) *= D_L00_001613C4; - *(short *)(m + 0x32) = 0xFF; - d = *(char **)(m + 0x78); - *(float *)(m + 0x48) = rz; - *(float *)(m + 0x44) = ry; - if (tgt == 0) { - build_spherical_offset(&t, D_0015ED6C * 20.0f, rz, ry); - p.q = *(Q_2aa998 *)pos; - tgt = select_auto_aim_target_moby(owner, &p, &t, &a, &b, &c, 0.34906584f); + void *firing_moby, + void *spawn_position, + float fallback_yaw, + float fallback_pitch, + float target_height_offset, + char *target_moby, + float rz, + + float ry) { + char *spawned_missile; + char *missile_spawn_data; + BoltVector aim_direction_or_collision_start; + BoltVector auto_aim_position; + spawned_missile = (char *)create_moby(0x100); + if (spawned_missile != 0) { + ((unsigned char *)spawned_missile)[0x30] = 0xFF; + spawned_missile[0x31] = 1; + spawned_missile[0x20] = 0; + *(float *)(spawned_missile + 0x2C) *= l00_missile_spawn_scale_multiplier; + *(short *)(spawned_missile + 0x32) = 0xFF; + missile_spawn_data = *(char **)(spawned_missile + 0x78); + *(float *)(spawned_missile + 0x48) = rz; + *(float *)(spawned_missile + 0x44) = ry; + if (target_moby == 0) { + build_spherical_offset(&aim_direction_or_collision_start, D_0015ED6C * 20.0f, rz, ry); + auto_aim_position.q = *(Q_2aa998 *)spawn_position; + target_moby = select_auto_aim_target_moby(firing_moby, + &auto_aim_position, + &aim_direction_or_collision_start, + &fallback_yaw, + &fallback_pitch, + &target_height_offset, + 0.34906584f); } - *(void **)(d + 0x10) = owner; - qcopy(m + 0x10, pos); - *(float *)(d + 0x34) = D_0015ED6C * 100.0f; - *(int *)(d + 0x38) = 1; - *(int *)(d + 0x24) = 0; - *(int *)(d + 0x28) = 0; - *(int *)(d + 0x20) = 0; - *(char **)(d + 0x18) = tgt; - if (tgt != 0) { - unsigned char *e = (unsigned char *)get_moby_target_info(tgt); - if (e != 0) { - *(unsigned short *)(e + 0x1E) |= 0x80; - if (e[0xB] != 0) - *(int *)(d + 0x38) = 0; - if (e[0xC] != 0) - *(float *)(d + 0x34) = (float)e[0xC] * D_0015ED6C; + *(void **)(missile_spawn_data + 0x10) = firing_moby; + qcopy(spawned_missile + 0x10, spawn_position); + *(float *)(missile_spawn_data + 0x34) = D_0015ED6C * 100.0f; + *(int *)(missile_spawn_data + 0x38) = 1; + *(int *)(missile_spawn_data + 0x24) = 0; + *(int *)(missile_spawn_data + 0x28) = 0; + *(int *)(missile_spawn_data + 0x20) = 0; + *(char **)(missile_spawn_data + 0x18) = target_moby; + if (target_moby != 0) { + unsigned char *target_aim_bounds = (unsigned char *)get_moby_target_info(target_moby); + if (target_aim_bounds != 0) { + *(unsigned short *)(target_aim_bounds + 0x1E) |= 0x80; + if (target_aim_bounds[0xB] != 0) + *(int *)(missile_spawn_data + 0x38) = 0; + if (target_aim_bounds[0xC] != 0) + *(float *)(missile_spawn_data + 0x34) = + (float)target_aim_bounds[0xC] * D_0015ED6C; } } - *(float *)(d + 0x2C) = a; - *(float *)(d + 0x30) = b; - *(int *)(d + 0x14) = scale_game_frames(0x96); - if (tgt != 0) { - qcopy(d, tgt + 0x10); - *(float *)(d + 8) += c; - *(float *)(d + 0x1C) = c; + *(float *)(missile_spawn_data + 0x2C) = fallback_yaw; + *(float *)(missile_spawn_data + 0x30) = fallback_pitch; + *(int *)(missile_spawn_data + 0x14) = scale_game_frames(0x96); + if (target_moby != 0) { + qcopy(missile_spawn_data, target_moby + 0x10); + *(float *)(missile_spawn_data + 8) += target_height_offset; + *(float *)(missile_spawn_data + 0x1C) = target_height_offset; } { - int r; + int velocity_inheritance_frame_count; if (fast_vec_length((float *)(D_0013F490)) > D_0015ED6C * 0.1f) { - r = scale_game_frames(0x3C); - *(short *)(d + 0x3E) = r; - *(short *)(d + 0x3C) = r; + velocity_inheritance_frame_count = scale_game_frames(0x3C); + *(short *)(missile_spawn_data + 0x3E) = velocity_inheritance_frame_count; + *(short *)(missile_spawn_data + 0x3C) = velocity_inheritance_frame_count; } else { - r = scale_game_frames(1); - *(short *)(d + 0x3E) = r; - *(short *)(d + 0x3C) = r; + velocity_inheritance_frame_count = scale_game_frames(1); + *(short *)(missile_spawn_data + 0x3E) = velocity_inheritance_frame_count; + *(short *)(missile_spawn_data + 0x3C) = velocity_inheritance_frame_count; } } - t.q = ((BoltOwner *)owner)->position.q; - t.f[2] = ((float *)pos)[2]; - if (FUN_001efa68(&t, pos, 0, *(int *)(((char *)&D_001413D0)), 0) != 0) { - m[0xBC] = 1; - qcopy(m + 0x10, &D_L00_00173E60); + aim_direction_or_collision_start.q = ((BoltOwner *)firing_moby)->position.q; + aim_direction_or_collision_start.f[2] = ((float *)spawn_position)[2]; + if (FUN_001efa68(&aim_direction_or_collision_start, + spawn_position, + 0, + *(int *)(((char *)&D_001413D0)), + 0) != 0) { + spawned_missile[0xBC] = 1; + qcopy(spawned_missile + 0x10, &D_L00_00173E60); } - update_entity(m); - append_unique_moby_index(m, D_L00_001B0770, 0x1F); - *(float *)(m + 0x2C) += *(float *)(m + 0x2C); + update_entity(spawned_missile); + append_unique_moby_index(spawned_missile, D_L00_001B0770, 0x1F); + *(float *)(spawned_missile + 0x2C) += *(float *)(spawned_missile + 0x2C); } - return m; + return spawned_missile; } short D_L01_001B0BF0 NOT_SDA = 0; @@ -260,7 +279,8 @@ extern void FUN_L00_001ffd48(void *, void *, float); extern void FUN_L00_001ffe20(void *, void *, void *); extern void FUN_L00_0025a9f8(void *, void *, void *, int, int, int, int, int, float, float, float); extern void mine_spawn_drops(void *, void *) __asm__("FUN_L00_0025f800"); -extern void FUN_L00_0026a4c8(void *pos, void *vel, int color, int tag, int life, float size); +extern void spawn_particle_alt_9768( + void *pos, void *vel, int color, int tag, int life, float size) __asm__("FUN_L00_0026a4c8"); extern void spawn_particle(void *, void *, int, int, float, int, int, float, int, int) __asm__("FUN_L00_0026a9f0"); extern void spawn_burst(void *, void *, int, int, int, int, float) __asm__("FUN_L00_0026cbb0"); extern void FUN_L00_002ac910(char *, char *, int, int, float, int, int, int, int); @@ -305,9 +325,11 @@ void giant_clank_missile_update(M_29E8A0 *missile_moby) { missile_data->speed + (missile_data->speed_end - missile_data->speed) / 10.0f * D_0015ED64; fast_dec_timer_s16(&missile_data->f3C); { - float a = convert_integer_to_float(missile_data->f3C); - float b = convert_integer_to_float(missile_data->f3E); - fast_vec_scale(up, ((char *)&D_0013F490), a / b); + float velocity_inheritance_frames_remaining = convert_integer_to_float(missile_data->f3C); + float velocity_inheritance_frames_total = convert_integer_to_float(missile_data->f3E); + fast_vec_scale(up, + ((char *)&D_0013F490), + velocity_inheritance_frames_remaining / velocity_inheritance_frames_total); } { float delta[4]; @@ -336,18 +358,25 @@ void giant_clank_missile_update(M_29E8A0 *missile_moby) { tp[2] = tp[2] + missile_data->zoff; fast_vec_sub(delta, tp, missile_moby->pos); if (missile_data->f38 != 0) { - float a, b, c, intercept_time_plus_root, intercept_time_minus_root, - discriminant_sqrt; + float intercept_quadratic_coefficient, intercept_linear_coefficient, c, + intercept_time_plus_root, intercept_time_minus_root, discriminant_sqrt; fast_vec_sub(dv, tp, missile_data->v); FUN_L00_001ff2c0(ip, dv, up); qcopy(missile_data->v, tp); c = FUN_L00_001ff430(dv); - b = (dv[0] * delta[0] + dv[1] * delta[1] + dv[2] * delta[2]) * -2.0f; - a = missile_data->speed * missile_data->speed - c; + intercept_linear_coefficient = + (dv[0] * delta[0] + dv[1] * delta[1] + dv[2] * delta[2]) * -2.0f; + intercept_quadratic_coefficient = missile_data->speed * missile_data->speed - c; c = -FUN_L00_001ff430(delta); - discriminant_sqrt = square_root(b * b - a * 4.0f * c); - intercept_time_plus_root = (-b + discriminant_sqrt) / (a + a); - intercept_time_minus_root = (-b - discriminant_sqrt) / (a + a); + discriminant_sqrt = + square_root(intercept_linear_coefficient * intercept_linear_coefficient - + intercept_quadratic_coefficient * 4.0f * c); + intercept_time_plus_root = + (-intercept_linear_coefficient + discriminant_sqrt) / + (intercept_quadratic_coefficient + intercept_quadratic_coefficient); + intercept_time_minus_root = + (-intercept_linear_coefficient - discriminant_sqrt) / + (intercept_quadratic_coefficient + intercept_quadratic_coefficient); if (intercept_time_plus_root > 0.0f && intercept_time_minus_root > 0.0f) { if (intercept_time_minus_root < intercept_time_plus_root) intercept_time = intercept_time_plus_root; @@ -699,7 +728,7 @@ void giant_clank_missile_update(M_29E8A0 *missile_moby) { { int *p1 = &c1.c[random_integer_below(6)]; int *p2 = &c2.c[random_integer_below(6)]; - FUN_L00_0026a4c8( + spawn_particle_alt_9768( missile_moby->pos, burst_particle_velocity, *p1, diff --git a/src/overlays/shared/vehicles/giant_clank_pad.c b/src/overlays/shared/vehicles/giant_clank_pad.c index 0d55e8dea8..035eba9a61 100644 --- a/src/overlays/shared/vehicles/giant_clank_pad.c +++ b/src/overlays/shared/vehicles/giant_clank_pad.c @@ -31,6 +31,9 @@ void giant_clank_pad_update(struct Moby *moby) { GIANT_CLANK_PAD_ARM_ACTIVATION = 1, GIANT_CLANK_PAD_CHECK_ACTIVATION = 2 }; + enum { + GIANT_CLANK_PAD_ACTIVATION_DISABLED = 3 + }; struct Moby *linked = moby->pvars; struct Moby *linked_vehicle_moby; struct Moby *pad; @@ -56,23 +59,24 @@ void giant_clank_pad_update(struct Moby *moby) { case GIANT_CLANK_PAD_ARM_ACTIVATION: /* Fakematch: the second store gives retail's register for moby. */ if (moby) - moby->state = 2; + moby->state = GIANT_CLANK_PAD_CHECK_ACTIVATION; else - moby->state = 2; + moby->state = GIANT_CLANK_PAD_CHECK_ACTIVATION; return; case GIANT_CLANK_PAD_CHECK_ACTIVATION: if (hero.ground_moby == moby && hero.air_frames.s == 0 && D_L15_0015F5C4 != 2 && hero.state.current != 0x1d) { - if (hero.vehicle_mode == 0) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_ON_FOOT) { try_set_help_message(4, 0x3aa4); - } else if (hero.vehicle_mode == 2 && current_level_index != 0x12) { + } else if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK && + current_level_index != 0x12) { try_set_help_message(4, 0x3aa5); } if (!(((u32)pad_pressed_lui) & 0x10)) return; if (D_L15_0015F594 != 4) return; - if (hero.vehicle_mode == 2 && current_level_index == 0xf) { + if (hero.vehicle_mode == HERO_VEHICLE_MODE_GIANT_CLANK && current_level_index == 0xf) { pad = l15_moby_array; pad += *(int *)((u8 *)linked + 0x60); pad->flags |= 1; @@ -86,7 +90,7 @@ void giant_clank_pad_update(struct Moby *moby) { request_music_track(0, 5); return; } - if (hero.vehicle_mode != 0) + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT) return; pad = l15_moby_array; pad += *(int *)((u8 *)linked + 0x60); @@ -109,7 +113,7 @@ void giant_clank_pad_update(struct Moby *moby) { start_scene(6); *(u128 *)hero.saved_pos_rot = *(u128 *)&hero.motion.pos; *(u128 *)(hero.saved_pos_rot + 16) = *(u128 *)&hero.motion.rot; - moby->state = 3; + moby->state = GIANT_CLANK_PAD_ACTIVATION_DISABLED; return; } break; diff --git a/src/overlays/shared/vehicles/gunship.c b/src/overlays/shared/vehicles/gunship.c index 39c71ee842..ecef6e1262 100644 --- a/src/overlays/shared/vehicles/gunship.c +++ b/src/overlays/shared/vehicles/gunship.c @@ -97,7 +97,7 @@ typedef struct { u16 kind; } HitInfo; -extern char D_L01_00167240[]; +extern char camera_pos[] __asm__("D_L01_00167240"); extern int D_0015ED84; extern void FUN_0022da68(int, int, char *); @@ -225,7 +225,8 @@ void gunship_update(struct Moby *moby) { return; } path_cursor = &v->path; - if (moby->group != 0xFF && moby->state != 0 && moby->state != 3) { + if (moby->group != 0xFF && moby->state != GUNSHIP_PATH_STATE_INITIALIZE && + moby->state != GUNSHIP_PATH_STATE_WAIT_FOR_RESUME_TIMER) { s32 bad = 0; get_first_moby_in_group(&it, moby->group, 0, 0); if (it == moby) { @@ -253,8 +254,8 @@ void gunship_update(struct Moby *moby) { } if ((moby->oclass == 0x33 || moby->oclass == 0x46A || moby->oclass == 0x473 || moby->oclass == 0x474) && - (level_frame_count & 7) == (((s32)moby >> 8) & 7) && v->unk13A <= 0 && moby->state != 0 && - FUN_L00_0028d8c0(moby, v->unk11E) == 0) { + (level_frame_count & 7) == (((s32)moby >> 8) & 7) && v->unk13A <= 0 && + moby->state != GUNSHIP_PATH_STATE_INITIALIZE && FUN_L00_0028d8c0(moby, v->unk11E) == 0) { v->unk11E = allocate_voice_for_target_entry(0, 4, moby); } switch ((s16)(moby->oclass - 0x33)) { @@ -264,7 +265,7 @@ void gunship_update(struct Moby *moby) { if (v->unk138 != -1) { if (!fast_dec_timer_s16(&v->unk138)) break; - if (fast_vec_dist(&moby->pos, D_L01_00167240) < 30.0f) + if (fast_vec_dist(&moby->pos, camera_pos) < 30.0f) allocate_voice_for_target_entry(1, 0, moby); } v->unk138 = scale_game_frames(random_int_between(v->unk13C, v->unk13C + v->unk13E)); @@ -301,7 +302,7 @@ void gunship_update(struct Moby *moby) { if (500.0f < v->unk134) v->unk134 = FUN_002132a8(-1.0f, 1.0f) * v->unk134 / 1000.0f; if (path_cursor->path_id == -1) { - moby->state = 2; + moby->state = GUNSHIP_PATH_STATE_WAIT_FOR_PATH; return; } v->unk121 = (moby - (struct Moby *)D_L01_0015FFD8) / 2 % 7; @@ -364,18 +365,18 @@ void gunship_update(struct Moby *moby) { } } if (v->unk11C > 0) { - moby->state = 3; + moby->state = GUNSHIP_PATH_STATE_WAIT_FOR_RESUME_TIMER; return; } if (D_0015ED84 == 3 || D_0015ED84 == 9) v->unk13A = 0; - moby->state = 1; + moby->state = GUNSHIP_PATH_STATE_FOLLOW_PATH; return; case GUNSHIP_PATH_STATE_WAIT_FOR_PATH: if (path_cursor->path_id == -1) return; - moby->state = 0; + moby->state = GUNSHIP_PATH_STATE_INITIALIZE; if (v->unk11E != -1) { u8 *e = (u8 *)((char *)&voice_pool) + v->unk11E * 0x70; if (*(struct Moby **)(e + 0x88) == moby && e[0x74] != 0) @@ -387,7 +388,7 @@ void gunship_update(struct Moby *moby) { case GUNSHIP_PATH_STATE_WAIT_FOR_RESUME_TIMER: if (fast_dec_timer_s16(&v->unk11C)) { v->unk11C = 0; - moby->state = 1; + moby->state = GUNSHIP_PATH_STATE_FOLLOW_PATH; } return; diff --git a/src/overlays/shared/vehicles/hoverboard.c b/src/overlays/shared/vehicles/hoverboard.c index 00a0969968..da6500cd21 100644 --- a/src/overlays/shared/vehicles/hoverboard.c +++ b/src/overlays/shared/vehicles/hoverboard.c @@ -22,8 +22,8 @@ extern unsigned short D_00141938 NOT_SDA; extern unsigned short D_00141C60 NOT_SDA; extern int D_L05_0015F6A8; -extern int D_L05_0016190C __attribute__((sda)); -extern int D_L05_00161910 __attribute__((sda)); +extern int l05_hoverboard_effect_initial_color __asm__("D_L05_0016190C") __attribute__((sda)); +extern int l05_hoverboard_effect_color_endpoint __asm__("D_L05_00161910") __attribute__((sda)); void hoverboard_update(unsigned char *moby) __asm__("FUN_L05_002f87a8"); @@ -95,20 +95,38 @@ void hoverboard_update(unsigned char *moby) { effect_position[3] = (float)hoverboard_effect_displacement_w_gp; if ((unsigned char)MOBY(moby)->command == 0) { int size = random_int_between(scale_game_frames(10), scale_game_frames(13)); - spawn_effect( - position, effect_position, D_L05_0016190C, D_L05_00161910, size, 15, 15, 1); + spawn_effect(position, + effect_position, + l05_hoverboard_effect_initial_color, + l05_hoverboard_effect_color_endpoint, + size, + 15, + 15, + 1); MOBY(moby)->command = 0; return; } fast_vec_scale(second_position, delta, 0.920f); { int size = random_int_between(scale_game_frames(15), scale_game_frames(18)); - spawn_effect(position, second_position, 0x5032f0d2, D_L05_00161910, size, 30, 20, 1); + spawn_effect(position, + second_position, + 0x5032f0d2, + l05_hoverboard_effect_color_endpoint, + size, + 30, + 20, + 1); } { int size = random_int_between(scale_game_frames(8), scale_game_frames(17)); - FUN_L00_0026cbb0( - position, effect_position, D_L05_0016190C, D_L05_00161910, size, 1, 15000.0f); + FUN_L00_0026cbb0(position, + effect_position, + l05_hoverboard_effect_initial_color, + l05_hoverboard_effect_color_endpoint, + size, + 1, + 15000.0f); } } MOBY(moby)->command = 0; diff --git a/src/overlays/shared/vehicles/ship_rocket.c b/src/overlays/shared/vehicles/ship_rocket.c index 85dbee7f99..c80d508c40 100644 --- a/src/overlays/shared/vehicles/ship_rocket.c +++ b/src/overlays/shared/vehicles/ship_rocket.c @@ -55,6 +55,10 @@ void ship_rocket_update(struct Moby *moby) __asm__("FUN_L11_003094f8"); /* Moby class 1034 */ void ship_rocket_update(struct Moby *moby) { + enum { + MOBY_STATE_PENDING_REMOVAL_BELOW_BOUNDARY = 0xfd, + MOBY_STATE_PENDING_REMOVAL_AT_OR_ABOVE_BOUNDARY = 0xfe + }; Missile_94f8 *rocket_vars = (Missile_94f8 *)moby->pvars; Vec4f *pos; Vec4 previous_pos, spray, offset, velocity, random; @@ -118,7 +122,8 @@ void ship_rocket_update(struct Moby *moby) { } pos = &moby->pos; target = rocket_vars->target; - if (target != 0 && target->state != 0xfe && target->state != 0xfd && + if (target != 0 && target->state != MOBY_STATE_PENDING_REMOVAL_AT_OR_ABOVE_BOUNDARY && + target->state != MOBY_STATE_PENDING_REMOVAL_BELOW_BOUNDARY && fast_vec_dist(&rocket_vars->target_pos, &target->pos) < 3.0f) { moby->rot.z = fast_arc_tan(rocket_vars->target->pos.x - moby->pos.x, rocket_vars->target->pos.y - moby->pos.y); diff --git a/src/overlays/shared/vehicles/veldin_ship.c b/src/overlays/shared/vehicles/veldin_ship.c index 4a7212beed..d7175b43dd 100644 --- a/src/overlays/shared/vehicles/veldin_ship.c +++ b/src/overlays/shared/vehicles/veldin_ship.c @@ -10,6 +10,12 @@ #include "rnc/overlay/shared/camera/level_camera.h" #include "rnc/rendering/debug/debug_menu.h" +enum { + VELDIN_SHIP_STATE_UNINITIALIZED = 0, + VELDIN_SHIP_STATE_REFLECTION_INIT_PENDING = 1, + VELDIN_SHIP_STATE_REFLECTION_INITIALIZED = 2 +}; + typedef struct { u128 points[4]; u32 colors[4]; @@ -84,7 +90,7 @@ void veldin_ship_draw(struct Moby *moby) { if (absolute_float(l00_camera.pos.f[0] - moby->pos.x) < 16.0f && absolute_float(l00_camera.pos.f[1] - moby->pos.y) < 16.0f) active = 1; - if (active || moby->state == 1) { + if (active || moby->state == VELDIN_SHIP_STATE_REFLECTION_INIT_PENDING) { moby->command = 1; fast_dec_timer((s32 *)(ship_render_state + 0x40)); blend = convert_integer_to_float(*(s32 *)(ship_render_state + 0x40)); @@ -103,7 +109,8 @@ void veldin_ship_draw(struct Moby *moby) { reflection.z += 1.0f; reflection_projection_factor = square_root(reflection.z + reflection.z); reflection_projection_factor += reflection_projection_factor; - if (moby->state == 1 || *(s32 *)(ship_render_state + 0x40) == 0) { + if (moby->state == VELDIN_SHIP_STATE_REFLECTION_INIT_PENDING || + *(s32 *)(ship_render_state + 0x40) == 0) { ship_reflection_uvs[i][0] = reflection.x / reflection_projection_factor + 0.5f; ship_reflection_uvs[i][1] = reflection.y / reflection_projection_factor + 0.5f; } else { @@ -114,8 +121,8 @@ void veldin_ship_draw(struct Moby *moby) { ship_reflection_uvs[i][1] = x + (ship_previous_uvs[i][1] - x) * blend; } } - if (moby->state == 1) - moby->state = 2; + if (moby->state == VELDIN_SHIP_STATE_REFLECTION_INIT_PENDING) + moby->state = VELDIN_SHIP_STATE_REFLECTION_INITIALIZED; } else { if (moby->command == 1) { moby->command = 0; @@ -146,8 +153,8 @@ void veldin_ship_update(M2d1e80 *m) __asm__("FUN_L00_002d1e80"); /* Moby class 530 */ void veldin_ship_update(M2d1e80 *moby) { s32 *ship_vars = moby->vars; - if (moby->state == 0) { - moby->state = 1; + if (moby->state == VELDIN_SHIP_STATE_UNINITIALIZED) { + moby->state = VELDIN_SHIP_STATE_REFLECTION_INIT_PENDING; moby->bc = 1; ship_vars[0x10] = 0; } diff --git a/src/overlays/shared/vendor/draw_vendor_purchase_text.c b/src/overlays/shared/vendor/draw_vendor_purchase_text.c index efa7068fe3..602b306400 100644 --- a/src/overlays/shared/vendor/draw_vendor_purchase_text.c +++ b/src/overlays/shared/vendor/draw_vendor_purchase_text.c @@ -131,9 +131,9 @@ typedef struct { f32 origin_x, origin_z, cell_width, cell_height; } HeightGridLayout; -extern HeightGridLayout D_L00_001CA880; -extern s32 D_L00_00161218 __attribute__((sda)); -extern s32 D_L00_00161220 __attribute__((sda)); +extern HeightGridLayout l00_pool_height_grid_layout __asm__("D_L00_001CA880"); +extern s32 l00_pool_height_write_bank_index __asm__("D_L00_00161218") __attribute__((sda)); +extern s32 l00_pool_height_additive_read_bank_index __asm__("D_L00_00161220") __attribute__((sda)); /* Splash on the pool height tiles: raises the heights around (x, z) and copies the edges into the neighbour tiles. */ void pool_splash(HeightTile *tile, @@ -147,14 +147,18 @@ void pool_splash(HeightTile *tile, void pool_splash( HeightTile *tile, int count, int mode, float x, float z, float radius, float amount) { + enum { + POOL_SPLASH_KEEP_GREATER_MAGNITUDE = 0 + }; HeightTile *tiles = tile; int row; int i; for (i = 0; i < count; i++) { - float tile_z = tile->z + D_L00_001CA880.origin_z; - float cell_z = (z - tile_z) / D_L00_001CA880.cell_height; - float cell_x = (x - (tile->x + D_L00_001CA880.origin_x)) / D_L00_001CA880.cell_width; + float tile_z = tile->z + l00_pool_height_grid_layout.origin_z; + float cell_z = (z - tile_z) / l00_pool_height_grid_layout.cell_height; + float cell_x = (x - (tile->x + l00_pool_height_grid_layout.origin_x)) / + l00_pool_height_grid_layout.cell_width; int row_first, row_last, col_first, col_last; float row_z; @@ -170,11 +174,11 @@ void pool_splash( col_last = 15; if (col_first < 0) col_first = 0; - row_z = tile_z + D_L00_001CA880.cell_height * (float)row_first; + row_z = tile_z + l00_pool_height_grid_layout.cell_height * (float)row_first; for (row = row_first; row <= row_last; row++) { - float col_x = - (tile->x + D_L00_001CA880.origin_x) + D_L00_001CA880.cell_width * (float)col_first; + float col_x = (tile->x + l00_pool_height_grid_layout.origin_x) + + l00_pool_height_grid_layout.cell_width * (float)col_first; int col; for (col = col_first; col <= col_last; col++) { @@ -186,16 +190,17 @@ void pool_splash( } else { height = amount / square_root(dist_sq); } - if (mode == 0) { + if (mode == POOL_SPLASH_KEEP_GREATER_MAGNITUDE) { float magnitude = absolute_float(height); - if (magnitude < absolute_float(tile->heights[D_L00_00161218][row][col])) { - height = tile->heights[D_L00_00161218][row][col]; + if (magnitude < + absolute_float(tile->heights[l00_pool_height_write_bank_index][row][col])) { + height = tile->heights[l00_pool_height_write_bank_index][row][col]; } } else { - height += tile->heights[D_L00_00161220][row][col]; + height += tile->heights[l00_pool_height_additive_read_bank_index][row][col]; } { - int cur = D_L00_00161218; + int cur = l00_pool_height_write_bank_index; tile->heights[cur][row][col] = height; if (row < 2 && tile->neighbours[0] != 0xFF) { @@ -209,51 +214,53 @@ void pool_splash( } if (col < 2 && tile->neighbours[1] != 0xFF) { if (col == 0) { - tiles[tile->neighbours[1]].heights[D_L00_00161218][19][row] = - tile->heights[D_L00_00161218][row][0]; + tiles[tile->neighbours[1]] + .heights[l00_pool_height_write_bank_index][19][row] = + tile->heights[l00_pool_height_write_bank_index][row][0]; } else { - tiles[tile->neighbours[1]].heights[D_L00_00161218][21][row] = - tile->heights[D_L00_00161218][row][col]; + tiles[tile->neighbours[1]] + .heights[l00_pool_height_write_bank_index][21][row] = + tile->heights[l00_pool_height_write_bank_index][row][col]; } } if (row == 15 && tile->neighbours[2] != 0xFF) { - int cur = D_L00_00161218; + int cur = l00_pool_height_write_bank_index; tiles[tile->neighbours[2]].heights[cur][16][col] = tile->heights[cur][row][col]; } if (col == 15 && tile->neighbours[3] != 0xFF) { - int cur = D_L00_00161218; + int cur = l00_pool_height_write_bank_index; tiles[tile->neighbours[3]].heights[cur][17][row] = tile->heights[cur][row][col]; } if (tile->neighbours[4] != 0xFF) { if (col == 0 && row == 0) { - int cur = D_L00_00161218; + int cur = l00_pool_height_write_bank_index; tiles[tile->neighbours[4]].heights[cur][22][3] = tile->heights[cur][row][col]; } if (col == 1 && row == 0) { - int cur = D_L00_00161218; + int cur = l00_pool_height_write_bank_index; tiles[tile->neighbours[4]].heights[cur][22][4] = tile->heights[cur][0][1]; } if (col == 0 && row == 1) { - int cur = D_L00_00161218; + int cur = l00_pool_height_write_bank_index; tiles[tile->neighbours[4]].heights[cur][22][5] = tile->heights[cur][1][0]; } } if (tile->neighbours[5] != 0xFF && col == 15 && row == 0) { - int cur = D_L00_00161218; + int cur = l00_pool_height_write_bank_index; tiles[tile->neighbours[5]].heights[cur][22][2] = tile->heights[cur][0][15]; } if (tile->neighbours[6] != 0xFF && col == 0 && row == 15) { - int cur = D_L00_00161218; + int cur = l00_pool_height_write_bank_index; tiles[tile->neighbours[6]].heights[cur][22][1] = tile->heights[cur][15][0]; } if (tile->neighbours[7] != 0xFF && col == 15 && row == 15) { - int cur = D_L00_00161218; + int cur = l00_pool_height_write_bank_index; tiles[tile->neighbours[7]].heights[cur][22][0] = tile->heights[cur][15][15]; } - col_x += D_L00_001CA880.cell_width; + col_x += l00_pool_height_grid_layout.cell_width; } - row_z += D_L00_001CA880.cell_height; + row_z += l00_pool_height_grid_layout.cell_height; } tile++; } diff --git a/src/overlays/shared/vendor/initialize_vendor_screen.c b/src/overlays/shared/vendor/initialize_vendor_screen.c index 972260a799..a19df2d4e8 100644 --- a/src/overlays/shared/vendor/initialize_vendor_screen.c +++ b/src/overlays/shared/vendor/initialize_vendor_screen.c @@ -18,6 +18,9 @@ #include "rnc/audio/voices/sound_update.h" #include "rnc/overlay/shared/hero/hero_switch_item.h" #include "rnc/overlay/shared/hero/set_hero_animation.h" + +void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); + #include "rnc/overlay/shared/streaming.h" #include "rnc/overlay/shared/ui/help/help_request.h" @@ -53,6 +56,9 @@ extern short D_L01_0015F400 __attribute__((sda)); void initialize_vendor_screen(char *vendor_moby, int lvl) __asm__("FUN_L01_002aea70"); void initialize_vendor_screen(char *vendor_moby, int lvl) { + enum { + CUTSCENE_MODE_VENDOR_SCREEN = 5 + }; struct Hero *hero_state = &hero; char *vendor_screen_state = vendor_screen_state_storage; char *relocated_address_block = fx_cutscene; @@ -69,7 +75,7 @@ void initialize_vendor_screen(char *vendor_moby, int lvl) { D_L01_0015F5D8 = 1; fill_transfer_words(vendor_screen_state, 0, 0x220); *(int *)vendor_screen_state_storage = 3; - cutscene_mode = 5; + cutscene_mode = CUTSCENE_MODE_VENDOR_SCREEN; *(int *)(vendor_screen_state + 4) = 0; *(char **)(vendor_screen_state + 0x28) = vendor_moby; sc = vendor_screen_state + 0xC0; @@ -78,7 +84,7 @@ void initialize_vendor_screen(char *vendor_moby, int lvl) { l01_hero_set_state(100, 1); *(char *)&hero_state->item_use_locked = 1; *(char *)&hero_state->unk20A5 = 1; - FUN_L00_00232fe8(); + set_hero_item_moby_flag_bit0(); transform_vector_by_basis(sc, &vendor_camera_local_position_offset, vendor_moby + 0xC0); fast_vec_add(sc, sc, &MOBY(vendor_moby)->pos); *(float *)(vendor_screen_state + 0xC8) = probe_ground_height(sc, 0, 0.5f); diff --git a/src/overlays/shared/vendor/vendor.c b/src/overlays/shared/vendor/vendor.c index c494c70c34..6668001293 100644 --- a/src/overlays/shared/vendor/vendor.c +++ b/src/overlays/shared/vendor/vendor.c @@ -344,8 +344,9 @@ void vendor_update(P_2a57a8 *vendor_moby) { q->mC->h34 &= 0xFFFE; } add_draw_callback(FUN_L00_002a5040_2a57a8, vendor_moby); - rotation_2D5FA8((u8 *)q + 0x20, 2, vendor_manipulator_rotation_phase); - rotation_2D5FA8((u8 *)q + 0x60, 2, vendor_manipulator_counter_rotation_phase); + build_axis_rotation_quaternion((u8 *)q + 0x20, 2, vendor_manipulator_rotation_phase); + build_axis_rotation_quaternion( + (u8 *)q + 0x60, 2, vendor_manipulator_counter_rotation_phase); vendor_manipulator_rotation_phase = fast_add_rotations(vendor_manipulator_rotation_phase, 0.01f); vendor_manipulator_counter_rotation_phase = @@ -367,8 +368,9 @@ void vendor_update(P_2a57a8 *vendor_moby) { add_draw_callback(FUN_L00_002a5040_2a57a8, vendor_moby); interaction_allowed = 1; help_message_allowed = 1; - rotation_2D5FA8((u8 *)q + 0x20, 2, vendor_manipulator_rotation_phase); - rotation_2D5FA8((u8 *)q + 0x60, 2, vendor_manipulator_counter_rotation_phase); + build_axis_rotation_quaternion((u8 *)q + 0x20, 2, vendor_manipulator_rotation_phase); + build_axis_rotation_quaternion( + (u8 *)q + 0x60, 2, vendor_manipulator_counter_rotation_phase); vendor_manipulator_rotation_phase = fast_add_rotations(vendor_manipulator_rotation_phase, 0.01f); vendor_manipulator_counter_rotation_phase = diff --git a/src/overlays/shared/vendor/vendor_menu.c b/src/overlays/shared/vendor/vendor_menu.c index e5b55b0f83..1c02e303bd 100644 --- a/src/overlays/shared/vendor/vendor_menu.c +++ b/src/overlays/shared/vendor/vendor_menu.c @@ -48,6 +48,20 @@ #include "rnc/overlay/shared/camera/level_camera.h" /* Clears D_L00_0015F424..0015F434, D_L00_0017E504[0] and D_L00_0015F2F0/2F4. */ +enum { + VENDOR_MENU_MODE_EXISTING_VENDOR = 0, + VENDOR_MENU_OPENING = 0, + VENDOR_PURCHASE_INACTIVE = 0, + VENDOR_MENU_MODE_SPAWNED_VENDOR = 1, + VENDOR_MENU_OPEN = 1, + VENDOR_PURCHASE_INITIALIZE = 1, + VENDOR_MENU_CLOSING = 2, + VENDOR_PURCHASE_AWAIT_INPUT = 2, + VENDOR_MENU_EXIT_CUTSCENE = 3, + VENDOR_PURCHASE_WAIT_DECISION_ANIMATION = 3, + VENDOR_PURCHASE_FINALIZE = 4 +}; + void reset_frame_counters(void) __asm__("FUN_L00_00297e30"); void update_game_frame_and_idle_counters(void) __asm__("FUN_L00_00297e70"); @@ -331,10 +345,10 @@ typedef struct { extern VendorMenu vendor_menu __asm__("D_L00_001CA4C0"); extern VendorSlot vendor_slots[4] __asm__("D_L00_00165E80"); -extern s32 D_L00_00161E18; -extern s32 D_L00_00161E20; +extern s32 l00_vendor_close_pending __asm__("D_L00_00161E18"); +extern s32 l00_vendor_opening_countdown_active __asm__("D_L00_00161E20"); extern s32 D_L00_00161E24_29a6b0 __asm__("D_L00_00161E24"); -extern s32 D_L00_00161E30; +extern s32 l00_vendor_previous_pressed_buttons __asm__("D_L00_00161E30"); extern s32 D_L00_00161E34; extern unsigned char D_0013F350[]; extern Vec4 D_L00_00180260_29a6b0 __asm__("D_L00_00180260"); @@ -345,7 +359,7 @@ extern void snd_flush_sound_commands(void) __asm__("FUN_0012dc80"); extern void reset_hud_and_suspend_weapon_updates(void) __asm__("FUN_L00_0023aef8"); extern void initialize_numeric_hud_timer_and_base_dimensions(void) __asm__("FUN_L00_0023a760"); extern void draw_weapon_ammo_hud_panel(void) __asm__("FUN_L00_0023a7a8"); -extern void FUN_L00_00232fe8_29a6b0(void) __asm__("FUN_L00_00232fe8"); +extern void set_hero_item_moby_flag_bit0(void) __asm__("FUN_L00_00232fe8"); typedef unsigned int Q_29a6b0 __attribute__((mode(TI), aligned(16))); extern u8 vendor_extra[] __asm__("D_L00_001CA6E0"); @@ -384,7 +398,7 @@ void open_vendor_menu(void *vendor_moby_arg) { vendor_moby->rot.f[2] = 3.1415927f; update_entity(vendor_moby); vendor_moby->state = 3; - vendor_menu.mode = 1; + vendor_menu.mode = VENDOR_MENU_MODE_SPAWNED_VENDOR; } if ((vendor_menu.timer = game_language_macro - 1) < 0) { vendor_menu.timer = 0; @@ -392,16 +406,16 @@ void open_vendor_menu(void *vendor_moby_arg) { vendor_menu.unk44 = 0; vendor_menu.purchased_item = vendor_menu.title_text = vendor_menu.item_text = -1; vendor_menu.cursor = 0; - D_L00_00161E18 = 0; - D_L00_00161E20 = 0; - D_L00_00161E30 = 0; - vendor_menu.purchase_state = 0; + l00_vendor_close_pending = 0; + l00_vendor_opening_countdown_active = 0; + l00_vendor_previous_pressed_buttons = 0; + vendor_menu.purchase_state = VENDOR_PURCHASE_INACTIVE; D_L00_00161E34 = 0; D_L00_00161E24_29a6b0 = 0; snd_pause_all_sounds_in_group(0x1D); FUN_00216050_29a6b0(0); snd_flush_sound_commands(); - build_vendor_menu_rows(vendor_menu.mode != 0); + build_vendor_menu_rows(vendor_menu.mode != VENDOR_MENU_MODE_EXISTING_VENDOR); half = vendor_menu.row_count; sel = half / 2; if (half < 3) @@ -430,13 +444,13 @@ void open_vendor_menu(void *vendor_moby_arg) { (D_L00_001C40B0 + item)->hE); } D_L00_0015F5D8 = 1; - vendor_menu.state = 0; + vendor_menu.state = VENDOR_MENU_OPENING; vendor_menu.unk10 = D_L00_00173E00[2] + 0x60000; vendor_menu.unk14 = (struct VendorMoby *)(D_L00_00173E00[1] + 0x60000); vendor_menu.unk08 = 0; vendor_menu.vendor_moby = (struct VendorMoby *)vendor_moby; allocate_voice_for_target_entry(3, 0, vendor_moby); - if (vendor_menu.mode == 0) { + if (vendor_menu.mode == VENDOR_MENU_MODE_EXISTING_VENDOR) { fade_to_black(4); } clear_active_help_record(); @@ -446,14 +460,14 @@ void open_vendor_menu(void *vendor_moby_arg) { hero_set_state(100, 1); D_0013F350[0x20AC] = 1; D_0013F350[0x20A5] = 1; - FUN_L00_00232fe8_29a6b0(); - if (vendor_menu.mode != 0) { + set_hero_item_moby_flag_bit0(); + if (vendor_menu.mode != VENDOR_MENU_MODE_EXISTING_VENDOR) { set_moby_animation(vendor_moby, 3, 0); } else { set_moby_animation(vendor_moby, 2, 0); } vendor_moby->f58 = frame_scale_macro * 0.5f; - if (vendor_menu.mode == 0) { + if (vendor_menu.mode == VENDOR_MENU_MODE_EXISTING_VENDOR) { transform_vector_by_basis(&vendor_menu.eye, &vendor_camera_eye_local_offset_x_gp, ((char *)vendor_menu.vendor_moby) + 0xC0); @@ -498,7 +512,7 @@ typedef struct { float x, y, z, w; } __attribute__((aligned(16))) Vec4_29ab70; -extern void FUN_L00_002330d0(void); +extern void update_hero_item_moby_flags(void) __asm__("FUN_L00_002330d0"); extern void decrement_resource_counter(void) __asm__("FUN_001ff768"); extern void music_unpause(void) __asm__("FUN_00216088"); extern int vendor_close_hero_local_offset_gp __asm__("D_L00_00161070") __attribute__((sda)); @@ -519,7 +533,7 @@ void close_vendor_menu(int exit_cutscene_completed) { D_L00_0015F5C4 = 0; hero_set_state(HERO_STATE_IDLE, 1); hero.unk20A5 = 0; - FUN_L00_002330d0(); + update_hero_item_moby_flags(); if (*(int *)(vendor_state_base + 0x40) == 0) { transform_vector_by_basis(&world_position, &vendor_close_hero_local_offset_gp, @@ -564,6 +578,9 @@ extern void sce_gs_sync_v(s32) __asm__("FUN_00122298"); void start_vendor_exit_cutscene(void) __asm__("FUN_L00_0029ad08"); void start_vendor_exit_cutscene(void) { + enum { + SECONDARY_MUSIC_STREAM_READY_TO_CONTINUE = 3 + }; VendorMenu *vendor_state; VendorMoby_29a6b0 *moby; s32 index, exit_cutscene_id, offset; @@ -578,7 +595,7 @@ void start_vendor_exit_cutscene(void) { vendor_state = &vendor_menu; D_L00_0015F5D8 = 1; ((VendorMoby_29a6b0 *)vendor_state->vendor_moby)->state = 1; - vendor_state->state = 3; + vendor_state->state = VENDOR_MENU_EXIT_CUTSCENE; vendor_state->frames = 0; cutscene_world_origin = (f32 *)((char *)vendor_state + 0xC0); transform_vector_by_basis(cutscene_world_origin, @@ -616,7 +633,7 @@ void start_vendor_exit_cutscene(void) { state->queued_secondary_track = 0x2734; FUN_L00_002455c0(0); mode = music_stream_state.secondary.state; - while (mode != 3) { + while (mode != SECONDARY_MUSIC_STREAM_READY_TO_CONTINUE) { sound_update(); sce_gs_sync_v(0); mode = music_stream_state.secondary.state; @@ -625,7 +642,7 @@ void start_vendor_exit_cutscene(void) { } extern int D_L00_0015F5D8; -void FUN_L00_002330d0(void); +void update_hero_item_moby_flags(void) __asm__("FUN_L00_002330d0"); void restore_hero_after_vendor_exit_cutscene(void) __asm__("FUN_L00_0029af80"); void restore_hero_after_vendor_exit_cutscene(void) { @@ -636,7 +653,7 @@ void restore_hero_after_vendor_exit_cutscene(void) { D_L00_0015F5C4 = 0; hero_set_state(HERO_STATE_IDLE, 1); hero.unk20A5 = 0; - FUN_L00_002330d0(); + update_hero_item_moby_flags(); vendor_state_base = (char *)&vendor_menu; transform_vector_by_basis(&world_position, &vendor_exit_hero_local_offset_gp, @@ -672,6 +689,10 @@ void handle_vendor_auxiliary_moby_event(int vendor_event) { VENDOR_ITEM_PURCHASE = 2, VENDOR_AMMO_PURCHASE = 3 }; + enum { + VENDOR_AUXILIARY_STATE_READY_REACTION = 10, + VENDOR_AUXILIARY_STATE_SELECTION_REACTION = 0xB + }; char *vendor_state_base; struct Moby *auxiliary_moby; int auxiliary_moby_state; @@ -696,7 +717,7 @@ void handle_vendor_auxiliary_moby_event(int vendor_event) { D_L00_00161194 = 0; *(int *)(queued_dialogue_id) = (selection_variant_index * 3 + 2) * 6 + *(int *)(vendor_state_base + 0x38) + 10000; - auxiliary_moby->state = 0xB; + auxiliary_moby->state = VENDOR_AUXILIARY_STATE_SELECTION_REACTION; } } } @@ -710,7 +731,7 @@ void handle_vendor_auxiliary_moby_event(int vendor_event) { ready_variant_index * 0x12 + *(int *)(vendor_state_base + 0x38) + 10000; if (auxiliary_moby->prev_seq != vendor_event) blend_moby_animation(auxiliary_moby, 1, 0, 10); - auxiliary_moby->state = 10; + auxiliary_moby->state = VENDOR_AUXILIARY_STATE_READY_REACTION; break; case VENDOR_ITEM_PURCHASE: case VENDOR_AMMO_PURCHASE: @@ -894,10 +915,10 @@ void update_vendor_purchase(void) { s32 purchase_cost, k, last_row_index; purchase_state = vendor_menu.purchase_state; - if (purchase_state == 0) { + if (purchase_state == VENDOR_PURCHASE_INACTIVE) { return; } - if (purchase_state == 1) { + if (purchase_state == VENDOR_PURCHASE_INITIALIZE) { D_L00_00161E34 = 1; vendor_purchase_confirmed_gp = 0; init_moby_instance(&vendor_menu.menu_mobys[4], 0x471); @@ -932,10 +953,10 @@ void update_vendor_purchase(void) { allocate_voice_for_target_entry(2, 0, vendor_menu.vendor_moby); } } - vendor_menu.purchase_state = 2; + vendor_menu.purchase_state = VENDOR_PURCHASE_AWAIT_INPUT; return; } - if (purchase_state == 2) { + if (purchase_state == VENDOR_PURCHASE_AWAIT_INPUT) { if (vendor_ammo_quantity_adjustment_enabled_gp == 1) { if (controller_state.held_unmasked & 0x8000) { vendor_ammo_decrease_held_frames++; @@ -981,8 +1002,8 @@ void update_vendor_purchase(void) { } } if (controller_state.pressed_unmasked & 0x10) { - if (!(D_L00_00161E30 & 0x10)) { - vendor_menu.purchase_state = 3; + if (!(l00_vendor_previous_pressed_buttons & 0x10)) { + vendor_menu.purchase_state = VENDOR_PURCHASE_WAIT_DECISION_ANIMATION; vendor_purchase_confirmed_gp = 0; blend_moby_animation(&vendor_menu.menu_mobys[4], 0, @@ -993,8 +1014,8 @@ void update_vendor_purchase(void) { } } if (controller_state.pressed_unmasked & 0x40) { - if (!(D_L00_00161E30 & 0x40)) { - vendor_menu.purchase_state = 3; + if (!(l00_vendor_previous_pressed_buttons & 0x40)) { + vendor_menu.purchase_state = VENDOR_PURCHASE_WAIT_DECISION_ANIMATION; vendor_purchase_confirmed_gp = 1; blend_moby_animation(&vendor_menu.menu_mobys[4], 0, @@ -1011,16 +1032,16 @@ void update_vendor_purchase(void) { update_entity(&vendor_menu.menu_mobys[4]); return; } - if (purchase_state == 3) { + if (purchase_state == VENDOR_PURCHASE_WAIT_DECISION_ANIMATION) { advance_moby_animation(&vendor_menu.menu_mobys[4]); if (!vendor_menu.menu_mobys[4].b53 && (vendor_menu.menu_mobys[4].b70 & 2)) { vendor_menu.menu_mobys[4].f58 = -1.0f; - vendor_menu.purchase_state = 4; + vendor_menu.purchase_state = VENDOR_PURCHASE_FINALIZE; } update_entity(&vendor_menu.menu_mobys[4]); return; } - if (purchase_state != 4) { + if (purchase_state != VENDOR_PURCHASE_FINALIZE) { return; } advance_moby_animation(&vendor_menu.menu_mobys[4]); @@ -1056,7 +1077,8 @@ void update_vendor_purchase(void) { ammo_bought_stats[CUR_ITEM.item] += k; handle_vendor_auxiliary_moby_event(3); D_0015ED98 = D_0015ED98 - purchase_cost; - build_vendor_menu_rows(vendor_menu.mode != 0); + build_vendor_menu_rows(vendor_menu.mode != + VENDOR_MENU_MODE_EXISTING_VENDOR); set_scrolling_status_message(get_help_message_text(0x4F5F)); allocate_voice_for_target_entry(7, 0, vendor_menu.vendor_moby); } else { @@ -1076,7 +1098,7 @@ void update_vendor_purchase(void) { vendor_item_0x18_purchased[0] = 1; } D_0015ED98 = D_0015ED98 - purchase_cost; - build_vendor_menu_rows(vendor_menu.mode != 0); + build_vendor_menu_rows(vendor_menu.mode != VENDOR_MENU_MODE_EXISTING_VENDOR); if (vendor_menu.item_text != -1) { set_animation_parameter(vendor_menu.item_text, 0); } @@ -1109,7 +1131,7 @@ void update_vendor_purchase(void) { } else { allocate_voice_for_target_entry(0, 0, vendor_menu.vendor_moby); } - vendor_menu.purchase_state = 0; + vendor_menu.purchase_state = VENDOR_PURCHASE_INACTIVE; } update_entity(&vendor_menu.menu_mobys[4]); } @@ -1118,10 +1140,7 @@ void update_vendor_menu(void) __asm__("FUN_L00_0029c648"); void update_vendor_menu(void) { enum { - VENDOR_MENU_OPENING = 0, - VENDOR_MENU_OPEN = 1, - VENDOR_MENU_CLOSING = 2, - VENDOR_MENU_EXIT_CUTSCENE = 3 + VENDOR_ROW_PURCHASE_REQUEST_ENABLED = 0 }; Vec4 position_scratch; Vec4 position_contribution_scratch; @@ -1150,7 +1169,8 @@ void update_vendor_menu(void) { switch (vendor_menu.state) { case VENDOR_MENU_OPENING: case VENDOR_MENU_CLOSING: - if (vendor_menu.mode == 0 || vendor_menu.state == 2) { + if (vendor_menu.mode == VENDOR_MENU_MODE_EXISTING_VENDOR || + vendor_menu.state == VENDOR_MENU_CLOSING) { if ((g_debug_menu.update_flags & 2) || ((g_debug_menu.update_flags & 0x10) && (((u32)pad_pressed_lui) & 0x200))) { reset_frame_counters(); @@ -1173,32 +1193,35 @@ void update_vendor_menu(void) { noop_main_callback(vendor_part_update_label, 5); } vendor_menu_state = vendor_menu.state; - if (vendor_menu_state == 0) { + if (vendor_menu_state == VENDOR_MENU_OPENING) { fade_level -= 0.34f; if (fade_level < 0.0f) { fade_level = 0.0f; } vendor_menu.frames++; - if (vendor_menu.frames >= scale_game_frames(40) || vendor_menu.mode != 0) { + if (vendor_menu.frames >= scale_game_frames(40) || + vendor_menu.mode != VENDOR_MENU_MODE_EXISTING_VENDOR) { fade_level = 0.0f; vendor_menu.unk0C = 1; - vendor_menu.state = 1; + vendor_menu.state = VENDOR_MENU_OPEN; vendor_menu.frames = 0; FUN_00212f90(vendor_menu.vendor_moby, 3, 0, 8); vendor_menu.vendor_moby->f58 = 1.0f; - D_L00_00161E20 = 1; + l00_vendor_opening_countdown_active = 1; vendor_opening_countdown_frames = 8; allocate_voice_for_target_entry(4, 0, vendor_menu.vendor_moby); } - } else if (vendor_menu_state == 2) { + } else if (vendor_menu_state == VENDOR_MENU_CLOSING) { ok = 0; - if (vendor_menu.mode == 0 && vendor_menu.purchased_item >= 0) { + if (vendor_menu.mode == VENDOR_MENU_MODE_EXISTING_VENDOR && + vendor_menu.purchased_item >= 0) { if (vendor_exit_cutscene_ids_by_item[vendor_menu.purchased_item] >= 0) { ok = 1; } } vendor_menu.frames++; - if (vendor_menu.frames >= scale_game_frames(40) || vendor_menu.mode != 0) { + if (vendor_menu.frames >= scale_game_frames(40) || + vendor_menu.mode != VENDOR_MENU_MODE_EXISTING_VENDOR) { FUN_00212f90(vendor_menu.vendor_moby, 1, 0, 8); row = vendor_slots; for (k = 0; k < 4; k++) { @@ -1219,7 +1242,7 @@ void update_vendor_menu(void) { if (vendor_menu.frames <= scale_game_frames(36)) { add_draw_callback(draw_vendor_inset_quads, vendor_menu.vendor_moby); } - if (vendor_menu.mode == 0) { + if (vendor_menu.mode == VENDOR_MENU_MODE_EXISTING_VENDOR) { set_camera_position(&vendor_menu.eye); set_camera_rotation(&vendor_menu.look); } @@ -1339,9 +1362,11 @@ void update_vendor_menu(void) { &vendor_menu.menu_mobys[3].pos, &position_contribution_scratch); vendor_menu.frames++; - if (vendor_menu.purchase_state == 0 && D_L00_00161E18 == 0) { + if (vendor_menu.purchase_state == VENDOR_PURCHASE_INACTIVE && + l00_vendor_close_pending == 0) { if (vendor_menu.row_count < 8) { - if ((controller_state.pressed_unmasked & 0x2000) && !(D_L00_00161E30 & 0x2000)) { + if ((controller_state.pressed_unmasked & 0x2000) && + !(l00_vendor_previous_pressed_buttons & 0x2000)) { if (vendor_menu.cursor < vendor_menu.row_count - 1) { D_L00_00161E38 = 1; handle_vendor_auxiliary_moby_event(0); @@ -1364,7 +1389,8 @@ void update_vendor_menu(void) { } } } - if ((controller_state.pressed_unmasked & 0x8000) && !(D_L00_00161E30 & 0x8000)) { + if ((controller_state.pressed_unmasked & 0x8000) && + !(l00_vendor_previous_pressed_buttons & 0x8000)) { if (vendor_menu.cursor > 0) { D_L00_00161E38 = 1; handle_vendor_auxiliary_moby_event(0); @@ -1388,7 +1414,8 @@ void update_vendor_menu(void) { } } } else { - if ((controller_state.pressed_unmasked & 0x2000) && !(D_L00_00161E30 & 0x2000)) { + if ((controller_state.pressed_unmasked & 0x2000) && + !(l00_vendor_previous_pressed_buttons & 0x2000)) { if (vendor_menu.scroll <= 0x38) { D_L00_00161E38 = 1; vendor_menu.scroll += 0x38; @@ -1416,7 +1443,8 @@ void update_vendor_menu(void) { } } } - if ((controller_state.pressed_unmasked & 0x8000) && !(D_L00_00161E30 & 0x8000)) { + if ((controller_state.pressed_unmasked & 0x8000) && + !(l00_vendor_previous_pressed_buttons & 0x8000)) { if (vendor_menu.scroll >= -0x38) { D_L00_00161E38 = 1; vendor_menu.scroll -= 0x38; @@ -1445,39 +1473,40 @@ void update_vendor_menu(void) { } } } - if ((controller_state.pressed_unmasked & 0x40) && !(D_L00_00161E30 & 0x40) && - CUR_ITEM.state == 0) { - vendor_menu.purchase_state = 1; + if ((controller_state.pressed_unmasked & 0x40) && + !(l00_vendor_previous_pressed_buttons & 0x40) && + CUR_ITEM.state == VENDOR_ROW_PURCHASE_REQUEST_ENABLED) { + vendor_menu.purchase_state = VENDOR_PURCHASE_INITIALIZE; allocate_voice_for_target_entry(0, 0, vendor_menu.vendor_moby); } if ((controller_state.pressed_unmasked & 0x10) && D_L00_0016118C == 0) { vendor_close_delay_frames_remaining = 8; - D_L00_00161E18 = 1; + l00_vendor_close_pending = 1; allocate_voice_for_target_entry(5, 0, vendor_menu.vendor_moby); } } update_vendor_purchase(); - D_L00_00161E30 = controller_state.pressed_unmasked; - if (D_L00_00161E20 == 1) { + l00_vendor_previous_pressed_buttons = controller_state.pressed_unmasked; + if (l00_vendor_opening_countdown_active == 1) { if (vendor_opening_countdown_frames == 0) { - D_L00_00161E20 = 0; + l00_vendor_opening_countdown_active = 0; } else { vendor_opening_countdown_frames--; } } - if (D_L00_00161E18 == 1) { + if (l00_vendor_close_pending == 1) { if (--vendor_close_delay_frames_remaining == 0) { D_L00_0015F5D8 = 1; select_level_vu_chain(); FUN_00212f90(vendor_menu.vendor_moby, 4, 9, 8); vendor_menu.vendor_moby->f58 = frame_scale * -0.5f; - if (vendor_menu.mode != 0) { + if (vendor_menu.mode != VENDOR_MENU_MODE_EXISTING_VENDOR) { qcopy(g_debug_camera.angles, &vendor_menu.look); } ((Vec4 *)g_debug_camera.basis)[0].q = D_L00_00165F80[0].q; ((Vec4 *)g_debug_camera.basis)[1].q = D_L00_00165F80[1].q; ((Vec4 *)g_debug_camera.basis)[2].q = D_L00_00165F80[2].q; - vendor_menu.state = 2; + vendor_menu.state = VENDOR_MENU_CLOSING; vendor_menu.unk08 = 0; vendor_menu.frames = 0; if (hero.items[0].moby != 0) { diff --git a/src/overlays/shared/vendor/vendor_orb.c b/src/overlays/shared/vendor/vendor_orb.c index 50e755e6e3..9ea72e904b 100644 --- a/src/overlays/shared/vendor/vendor_orb.c +++ b/src/overlays/shared/vendor/vendor_orb.c @@ -8,7 +8,7 @@ #include "rnc/math/random.h" #include "rnc/mobys/attach_manipulator.h" -void FUN_L00_001fff28(char *, int, float); +void build_axis_rotation_quaternion(char *, int, float) __asm__("FUN_L00_001fff28"); float vendor_orb_rotation_rate_degrees_gp __asm__("D_L00_00161BB0") = 45.0f; @@ -43,7 +43,7 @@ void vendor_orb_update(unsigned char *moby) { float rotation_step_radians; switch (MOBY(moby)->state) { case VENDOR_ORB_INITIALIZE: - MOBY(moby)->state = 1; + MOBY(moby)->state = VENDOR_ORB_ROTATE; MOBY(moby)->unk73 = 0x20; *(float *)(manipulator + 0x40) = random_angle_radians(); attach_manipulator(moby, 1, manipulator); @@ -53,7 +53,7 @@ void vendor_orb_update(unsigned char *moby) { MOBY(moby)->rot.z = fast_add_rotations(MOBY(moby)->rot.z, rotation_step_radians); *(float *)(manipulator + 0x40) = fast_add_rotations(*(float *)(manipulator + 0x40), rotation_step_radians * -2.0f); - FUN_L00_001fff28(manipulator + 0x10, 2, *(float *)(manipulator + 0x40)); + build_axis_rotation_quaternion(manipulator + 0x10, 2, *(float *)(manipulator + 0x40)); break; } } diff --git a/src/overlays/shared/weapons/blaster.c b/src/overlays/shared/weapons/blaster.c index c271e19fc1..a81fe1584b 100644 --- a/src/overlays/shared/weapons/blaster.c +++ b/src/overlays/shared/weapons/blaster.c @@ -210,6 +210,10 @@ void blaster_update(struct Moby *moby) __asm__("FUN_L00_002b49a8"); /* Moby class 168 */ void blaster_update(struct Moby *moby) { + enum { + BLASTER_STATE_UNINITIALIZED = 0, + BLASTER_STATE_INITIALIZED = 1 + }; BlasterVec velocity; BlasterVec aim_point; BlasterVec launch; @@ -232,8 +236,8 @@ void blaster_update(struct Moby *moby) { never = 0; pitch = 0.0f; blaster_vars = (BlasterVars *)moby->pvars; - if (moby->state == 0) { - moby->state = 1; + if (moby->state == BLASTER_STATE_UNINITIALIZED) { + moby->state = BLASTER_STATE_INITIALIZED; blaster_vars->light = -1; blaster_vars->glow = 0; } diff --git a/src/overlays/shared/weapons/bomb_glove.c b/src/overlays/shared/weapons/bomb_glove.c index 39f6131686..30045edcfd 100644 --- a/src/overlays/shared/weapons/bomb_glove.c +++ b/src/overlays/shared/weapons/bomb_glove.c @@ -168,6 +168,9 @@ void bomb_glove_update(struct Moby *moby) { BOMB_GLOVE_BEGIN_HELD_MOBY_REMOVAL = 5, BOMB_GLOVE_REMOVE_HELD_MOBY = 6 }; + enum { + BOMB_GLOVE_READY = 2 + }; CarrierVars_2c26c8 *bomb_glove_vars; OvlVec4 local[4], saved, offset, rotatedOffset, pos, target, basis[3], matrix[4]; OvlVec4 launch; @@ -212,7 +215,7 @@ void bomb_glove_update(struct Moby *moby) { (hero.state.current == 0x23 && hero.state_timer == scale_game_frames(0x10))) { allocate_hero_voice_for_entry(0x1A, 0); use_ammo(-1, 1); - moby->state = 3; + moby->state = BOMB_GLOVE_RELEASE_HELD_MOBY; } } if (bomb_glove_vars->held != 0) { @@ -339,12 +342,12 @@ void bomb_glove_update(struct Moby *moby) { case BOMB_GLOVE_INITIALIZE: bomb_glove_vars->held = 0; if (!(moby->anim_flags & 2)) - moby->state = 1; + moby->state = BOMB_GLOVE_WAIT_FOR_ANIMATION; else - moby->state = 2; + moby->state = BOMB_GLOVE_READY; case BOMB_GLOVE_WAIT_FOR_ANIMATION: if (moby->anim_flags & 2) - moby->state = 2; + moby->state = BOMB_GLOVE_READY; break; case BOMB_GLOVE_RELEASE_HELD_MOBY: if (bomb_glove_vars->held == 0) { @@ -364,16 +367,16 @@ void bomb_glove_update(struct Moby *moby) { (((DeliveryStats_2c26c8 *)item_usage)->levels | (1u << current_level_index)) | 0x80000000; bomb_glove_vars->held = 0; - moby->state = 4; + moby->state = BOMB_GLOVE_POST_RELEASE_WAIT; bomb_glove_vars->timer = scale_game_frames(0x14); } break; case BOMB_GLOVE_POST_RELEASE_WAIT: if (hero.state.current != 0x23 && !hero.item_anim_active) - moby->state = 2; + moby->state = BOMB_GLOVE_READY; break; case BOMB_GLOVE_BEGIN_HELD_MOBY_REMOVAL: - moby->state = 6; + moby->state = BOMB_GLOVE_REMOVE_HELD_MOBY; break; case BOMB_GLOVE_REMOVE_HELD_MOBY: /* Retail reloads held after destruction before the common tail. */ diff --git a/src/overlays/shared/weapons/bomb_glove_bomb.c b/src/overlays/shared/weapons/bomb_glove_bomb.c index b2e8b434c9..db446b3622 100644 --- a/src/overlays/shared/weapons/bomb_glove_bomb.c +++ b/src/overlays/shared/weapons/bomb_glove_bomb.c @@ -21,6 +21,14 @@ #include "rnc/overlay/shared/weapons/mine.h" #include "rnc/overlay/shared/weapons/bomb_glove_bomb.h" +enum { + BOMB_STATE_HELD = 0 +}; + +enum { + THROW_LANDING_MODE_SKIP_LINKED_MOBY_MARKER = 2 +}; + typedef struct { char p0[0x80]; float pos[4]; @@ -819,7 +827,7 @@ unsigned char *spawn_bomb(int bomb_holder_moby, void *spawn_position) { MOBY(bomb_moby)->update_dist = 0xFF; MOBY(bomb_moby)->draw_dist = 0xFF; MOBY(bomb_moby)->visible = 1; - MOBY(bomb_moby)->state = 0; + MOBY(bomb_moby)->state = BOMB_STATE_HELD; *(int *)(v + 0x50) = bomb_holder_moby; *(short *)(v + 0x56) = 0; *(short *)(v + 0x6A) = 0; @@ -946,7 +954,7 @@ int predict_throw_landing(LandingVars *v, M910 *thrown_moby, int mode) { if (D_L00_0015F5C4_002acbf0 != 0) return 0; qcopy(&previous, &thrown_moby->pos); - if (thrown_moby->state == 0) { + if (thrown_moby->state == BOMB_STATE_HELD) { position.f[0] = fast_cos(fast_add_rotations(-0.361968f, fast_arc_tan(hero.facing_x, hero.facing_y))) * 0.859039f; @@ -1065,7 +1073,8 @@ int predict_throw_landing(LandingVars *v, M910 *thrown_moby, int mode) { if (!FUN_L00_002603d0_2ad410(coll_hit.moby)) goto return_zero; } - if (mode != 2 || !coll_hit.moby || !FUN_L00_002603d0_2ad410(coll_hit.moby)) + if (mode != THROW_LANDING_MODE_SKIP_LINKED_MOBY_MARKER || !coll_hit.moby || + !FUN_L00_002603d0_2ad410(coll_hit.moby)) add_draw_callback(draw_bomb_landing_marker, thrown_moby); if (!object_hit && v->last_hit) { if (v->last_hit->state == 0xfe) { @@ -1153,7 +1162,7 @@ void bomb_update(BombMoby *bomb_moby) { Vec_2adb30 spark_velocity; Vec_2adb30 v2; Vec_2adb30 random_velocity_offset; - int p0; + int spark_primary_color; int spark_secondary_color; int spark_random_frame_count; int spark_vertical_offset_scale; @@ -1168,9 +1177,9 @@ void bomb_update(BombMoby *bomb_moby) { random_float_between(*(float *)&D_L00_0016140C, *(float *)&D_L00_00161410); v2.f[3] = random_float_between(*(float *)&D_L00_00161414, *(float *)&D_L00_00161418); - p0 = fast_tween_color(*(int *)&bomb_spark_primary_color_start, - *(int *)&bomb_spark_primary_color_end, - random_float_between(0.0f, 1.0f)); + spark_primary_color = fast_tween_color(*(int *)&bomb_spark_primary_color_start, + *(int *)&bomb_spark_primary_color_end, + random_float_between(0.0f, 1.0f)); spark_secondary_color = fast_tween_color(*(int *)&bomb_spark_secondary_color_start, *(int *)&bomb_spark_secondary_color_end, @@ -1194,7 +1203,7 @@ void bomb_update(BombMoby *bomb_moby) { spawn_spark(&bomb_moby->pos, &spark_velocity, &v2, - p0, + spark_primary_color, spark_secondary_color, spark_random_frame_count, spark_vertical_offset_scale, @@ -1412,14 +1421,16 @@ void bomb_update(BombMoby *bomb_moby) { for (i = 0; i < blast_effect_count; i++) { float spd = s * random_float_between(8.0f, 10.0f) * frame_time_macro - g * frame_time_macro; - Colors6 c1 = l00_bomb_blast_effect_primary_palette; + Colors6 blast_effect_primary_palette = + l00_bomb_blast_effect_primary_palette; Colors6 blast_effect_secondary_palette = l00_bomb_blast_effect_secondary_palette; FUN_L00_0026a9f0_2adb30( &bomb_moby->pos, &blast_velocity, - swap_packed_color_channels(c1.c[random_integer_below(6)], - (unsigned char)item_text_variant[0xA]), + swap_packed_color_channels( + blast_effect_primary_palette.c[random_integer_below(6)], + (unsigned char)item_text_variant[0xA]), swap_packed_color_channels( blast_effect_secondary_palette.c[random_integer_below(6)], (unsigned char)item_text_variant[0xA]), @@ -1586,7 +1597,7 @@ void bomb_update(BombMoby *bomb_moby) { hud_counter_update(0x7F << 24, (0x7F << 24) | (cb << 16) | (cg << 8) | cr, random_float_between(0.25f, 1.0f)); - int c1 = + int shrinking_particle_secondary_color = hud_counter_update(0, ((cb / 2) << 16) | ((cg / 2) << 8) | (cr / 2), random_float_between(0.5f, 1.0f)); @@ -1611,7 +1622,7 @@ void bomb_update(BombMoby *bomb_moby) { &v2, &particle_work_vector, shrinking_particle_primary_color, - c1, + shrinking_particle_secondary_color, sz, life, 1, diff --git a/src/overlays/shared/weapons/decoy.c b/src/overlays/shared/weapons/decoy.c index 422c1c9b13..b4bc9f1778 100644 --- a/src/overlays/shared/weapons/decoy.c +++ b/src/overlays/shared/weapons/decoy.c @@ -22,6 +22,22 @@ #include "qzero.h" #include "rnc/runtime/callbacks/add_draw_callback.h" +enum { + DECOY_INITIALIZE = 0, + DECOY_HELD = 1, + DECOY_THROWN_MOVEMENT = 2, + DECOY_SETTLED_MOVEMENT = 3, + DECOY_PRE_REMOVAL_DELAY = 4, + DECOY_WAIT_TO_SHRINK = 5, + DECOY_SHRINK_FOR_REMOVAL = 6, + DECOY_RESET_TO_INITIALIZE = 7 +}; + +enum { + LANDING_REQUIRE_MOBY_PVARS_LINK = 0, + LANDING_SKIP_LINKED_MOBY_DRAW = 2 +}; + typedef struct DecoyVars { u8 pad0[0x10]; f32 unk10[4]; @@ -217,7 +233,7 @@ u8 *spawn_decoy(s32 owner_moby, u128 *position, u128 *other_position) { *(u16 *)(spawned_moby + 0x32) = 0xff; MOBY(spawned_moby)->visible = 1; decoy_vars = *(u8 **)(spawned_moby + 0x78); - MOBY(spawned_moby)->state = 0; + MOBY(spawned_moby)->state = DECOY_INITIALIZE; qcopy(&MOBY(spawned_moby)->pos, position); qcopy(decoy_vars + 0x10, other_position); speed = frame_scale * -0.5f; @@ -240,7 +256,7 @@ u8 *spawn_decoy(s32 owner_moby, u128 *position, u128 *other_position) { u8 *listed_moby = (u8 *)(moby_table + (D_L00_001B0830_lui[i] << 8)); if (listed_moby != 0 && (MOBY(listed_moby)->oclass == 0xcb || MOBY(listed_moby)->oclass == 0x76c) && - MOBY(listed_moby)->state < 5) { + MOBY(listed_moby)->state < DECOY_WAIT_TO_SHRINK) { current_value = *(s32 *)(*(u8 **)(listed_moby + 0x78) + 0x54); if (best_value <= current_value) { candidate = listed_moby; @@ -301,7 +317,7 @@ void release_moby_with_collision_check(float *release_position, float smoothing; qcopy(&MOBY(moby)->pos, D_00173F60_alias); qzero(state + 0x10); - MOBY(moby)->state = 4; + MOBY(moby)->state = DECOY_PRE_REMOVAL_DELAY; *(short *)(state + 0x44) = scale_game_frames_c(30); MOBY(moby)->pos.z = ((S173E40 *)D_L00_00173E40)->height; qcopy(collision_normal, ((S173E40 *)D_L00_00173E40)->vector); @@ -332,7 +348,7 @@ void release_moby_with_collision_check(float *release_position, fast_subtract_rotations(*(float *)(state + 0x50), MOBY(moby)->rot.y) * (frame_scale * smoothing)); } else - MOBY(moby)->state = 2; + MOBY(moby)->state = DECOY_THROWN_MOVEMENT; } /* @@ -357,7 +373,7 @@ s32 predict_thrown_moby_landing(ThrowVars *throw_vars, struct Moby *thrown_moby, if (D_L00_0015F5C4 != 0) return 0; qcopy(&position_scratch, &thrown_moby->pos); - if (thrown_moby->state == 1) { + if (thrown_moby->state == DECOY_HELD) { predicted_position.f[0] = fast_cos(fast_add_rotations(-0.36196801066398620605f, fast_arc_tan(hero.facing_x, hero.facing_y))) * @@ -438,13 +454,14 @@ s32 predict_thrown_moby_landing(ThrowVars *throw_vars, struct Moby *thrown_moby, } if (prediction_countdown == 0) return 0; - if (mode == 0) { + if (mode == LANDING_REQUIRE_MOBY_PVARS_LINK) { if (coll_hit.moby == 0) return 0; if (FUN_L00_002603d0(coll_hit.moby) == 0) goto ret0; } - if (mode != 2 || coll_hit.moby == 0 || !FUN_L00_002603d0(coll_hit.moby)) + if (mode != LANDING_SKIP_LINKED_MOBY_DRAW || coll_hit.moby == 0 || + !FUN_L00_002603d0(coll_hit.moby)) add_draw_callback(draw_moby_oscillating_textured_quads, thrown_moby); throw_vars->normal.q = coll_hit_normal.q; fast_vec_sub(&position_scratch, &throw_vars->landing, &D_L00_00166DC0); @@ -533,16 +550,6 @@ void decoy_update(char *moby) __asm__("FUN_L00_002c4380"); /* Moby classes 203, 1900 */ void decoy_update(char *moby) { - enum { - DECOY_INITIALIZE = 0, - DECOY_HELD = 1, - DECOY_THROWN_MOVEMENT = 2, - DECOY_SETTLED_MOVEMENT = 3, - DECOY_PRE_REMOVAL_DELAY = 4, - DECOY_WAIT_TO_SHRINK = 5, - DECOY_SHRINK_FOR_REMOVAL = 6, - DECOY_RESET_TO_INITIALIZE = 7 - }; int active = ((unsigned char *)&D_0013E533)[6]; DecoyVars *decoy_instance_vars = (DecoyVars *)(*(char **)(moby + 0x78)); char *target; @@ -566,18 +573,18 @@ void decoy_update(char *moby) { return; } if ((hero.items[0].moby == 0 || hero.items[0].moby->oclass != 0x232) && - (u8)MOBY(moby)->state == 1) { + (u8)MOBY(moby)->state == DECOY_HELD) { mine_spawn_drops(moby, D_L00_001B0830_lui); mark_moby_for_removal(moby); return; } - if (hero.vehicle_mode != 0 && (u8)MOBY(moby)->state == 1) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && (u8)MOBY(moby)->state == DECOY_HELD) { mine_spawn_drops(moby, D_L00_001B0830_lui); mark_moby_for_removal(moby); return; } ++decoy_instance_vars->unk54; - if (hero.unk20A5 != 0 && (u8)MOBY(moby)->state < 2) + if (hero.unk20A5 != 0 && (u8)MOBY(moby)->state < DECOY_THROWN_MOVEMENT) MOBY(moby)->flags |= 0x41; else MOBY(moby)->flags &= 0xffbe; @@ -591,7 +598,7 @@ void decoy_update(char *moby) { } switch ((u8)MOBY(moby)->state) { case DECOY_INITIALIZE: - MOBY(moby)->state = 1; + MOBY(moby)->state = DECOY_HELD; decoy_instance_vars->unk44 = 0; MOBY(moby)->collision_disable = -1; decoy_instance_vars->unk6C = 0; @@ -673,7 +680,7 @@ void decoy_update(char *moby) { *(int *)(moby + 0x94) = *(int *)(*(char **)(moby + 0x24) + 0x10); MOBY(moby)->collision_disable = 0; qzero(&decoy_instance_vars->unk10); - MOBY(moby)->state = 3; + MOBY(moby)->state = DECOY_SETTLED_MOVEMENT; decoy_instance_vars->unk44 = FUN_001fef20_2c4380(600); MOBY(moby)->pos.z = coll_hit.point.f[2]; qcopy(scratch.x, &coll_hit.normal_x); @@ -801,7 +808,7 @@ void decoy_update(char *moby) { blend_moby_animation(moby, 2, 0, FUN_001fef20_2c4380(10)); MOBY(moby)->anim_speed = random_float_between(0.7f, 1.05f); } - if ((u8)MOBY(moby)->state != 4) { + if ((u8)MOBY(moby)->state != DECOY_PRE_REMOVAL_DELAY) { len = probe_ground_height(&MOBY(moby)->pos, 0, 0.5f); if (len != 0.0f) { destroy_decoy_on_selected_materials(moby); @@ -847,7 +854,7 @@ void decoy_update(char *moby) { if (((u8 *)moby)[0x53]) blend_moby_animation(moby, 0, 0, FUN_001fef20_2c4380(60)); mine_spawn_drops(moby, D_L00_001B0830_lui); - MOBY(moby)->state = 5; + MOBY(moby)->state = DECOY_WAIT_TO_SHRINK; } } break; @@ -859,7 +866,7 @@ void decoy_update(char *moby) { if (MOBY(moby)->anim_flags & 2) *(int *)(moby + 0x58) = 0; if (fast_dec_timer_s16(&decoy_instance_vars->unk44) || (MOBY(moby)->anim_flags & 2)) - MOBY(moby)->state = 6; + MOBY(moby)->state = DECOY_SHRINK_FOR_REMOVAL; break; case DECOY_SHRINK_FOR_REMOVAL: { float len; @@ -877,6 +884,6 @@ void decoy_update(char *moby) { } case DECOY_RESET_TO_INITIALIZE: default: - MOBY(moby)->state = 0; + MOBY(moby)->state = DECOY_INITIALIZE; } } diff --git a/src/overlays/shared/weapons/decoy_glove.c b/src/overlays/shared/weapons/decoy_glove.c index 6dfd3447db..8d2f661223 100644 --- a/src/overlays/shared/weapons/decoy_glove.c +++ b/src/overlays/shared/weapons/decoy_glove.c @@ -103,10 +103,10 @@ void decoy_glove_aim_throw(int collision_arg, Moby_2D3608 *carrier, float *posit Vec_2D3608 direction, aim, launch, origin_copy, endpoint; Moby_2D3608 *target; float *output; - float value, distance, heading, vertical, pitch, length, fall_time; - int hit; - float range; - float *anchor_ptr = anchor; + float aim_slope_or_extension_scale, distance, heading, vertical, pitch, length, fall_time; + int hit; + float range; + float *anchor_ptr = anchor; *(u128_2D3608 *)anchor_ptr = *(u128_2D3608 *)position; copy_matrix3x4(rotation, l00_camera.unk0); @@ -153,15 +153,16 @@ void decoy_glove_aim_throw(int collision_arg, Moby_2D3608 *carrier, float *posit { float rise = launch[2]; if (length != 0.0f) { - value = rise / length; + aim_slope_or_extension_scale = rise / length; } else { - value = rise / 0.00999999978f; + aim_slope_or_extension_scale = rise / 0.00999999978f; } } fall_time = square_root(D_0015ED70 * 9.0f * ((controller_state.held & 5) ? 3.5f : 2.5f) * 0.5f); - distance = (fall_time + fall_time) * fall_time * (1.0f - value) / (D_0015ED70 * 9.0f); - vertical = value * distance; + distance = (fall_time + fall_time) * fall_time * (1.0f - aim_slope_or_extension_scale) / + (D_0015ED70 * 9.0f); + vertical = aim_slope_or_extension_scale * distance; if (0.0f < distance) { launch[0] = func_001F9F90_2D3608(heading) * distance; launch[1] = func_001F9FA8_2D3608(heading) * distance; @@ -175,10 +176,12 @@ void decoy_glove_aim_throw(int collision_arg, Moby_2D3608 *carrier, float *posit heading = fast_arc_tan(aim[0] - anchor_ptr[0], aim[1] - anchor_ptr[1]); } if (hit == 0) { - value = 5.0f; - aim[0] = func_001F9F90_2D3608(heading) * distance * value; - aim[1] = func_001F9FA8_2D3608(heading) * distance * value; - aim[2] = vertical * value; + aim_slope_or_extension_scale = 5.0f; + aim[0] = + func_001F9F90_2D3608(heading) * distance * aim_slope_or_extension_scale; + aim[1] = + func_001F9FA8_2D3608(heading) * distance * aim_slope_or_extension_scale; + aim[2] = vertical * aim_slope_or_extension_scale; fast_vec_add(aim, aim, g_debug_camera.position); } } @@ -275,7 +278,7 @@ void decoy_glove_update(unsigned char *moby) { L3D10: allocate_hero_voice_for_entry(0x1A, 0); use_ammo(-1, 1); - MOBY(moby)->state = 3; + MOBY(moby)->state = DECOY_GLOVE_RELEASE_DECOY; L3D34: *(u128_D3B20 *)&loc = *(u128_D3B20 *)(&glove_vars->unk40); decoy_glove_aim_throw((int)moby, (void *)glove_vars, (float *)&loc); @@ -284,12 +287,12 @@ void decoy_glove_update(unsigned char *moby) { case DECOY_GLOVE_INITIALIZE: *(int *)&glove_vars->unk50 = 0; if (!(MOBY(moby)->anim_flags & 2)) - MOBY(moby)->state = 1; + MOBY(moby)->state = DECOY_GLOVE_WAIT_FOR_MOBY_FLAG; else - MOBY(moby)->state = 2; + MOBY(moby)->state = DECOY_GLOVE_TARGET_FOLLOW_AND_SPAWN; case DECOY_GLOVE_WAIT_FOR_MOBY_FLAG: if (MOBY(moby)->anim_flags & 2) - MOBY(moby)->state = 2; + MOBY(moby)->state = DECOY_GLOVE_TARGET_FOLLOW_AND_SPAWN; break; case DECOY_GLOVE_TARGET_FOLLOW_AND_SPAWN: break; @@ -309,17 +312,17 @@ void decoy_glove_update(unsigned char *moby) { } else { allocate_voice_for_target_entry(0, 0, (int)moby); } - MOBY(moby)->state = 4; + MOBY(moby)->state = DECOY_GLOVE_WAIT_AFTER_RELEASE; glove_vars->unk54 = scale_game_frames(0x14); break; case DECOY_GLOVE_WAIT_AFTER_RELEASE: { struct Hero *h = &hero; if (h->state.current != 0x23 && h->item_anim_active == 0) - MOBY(moby)->state = 2; + MOBY(moby)->state = DECOY_GLOVE_TARGET_FOLLOW_AND_SPAWN; break; } case DECOY_GLOVE_ENTER_SKIP_TARGET_FOLLOW_AND_SPAWN: - MOBY(moby)->state = 6; + MOBY(moby)->state = DECOY_GLOVE_SKIP_TARGET_FOLLOW_AND_SPAWN; break; case DECOY_GLOVE_SKIP_TARGET_FOLLOW_AND_SPAWN: return; diff --git a/src/overlays/shared/weapons/devastator.c b/src/overlays/shared/weapons/devastator.c index fcf90795f8..d037627b21 100644 --- a/src/overlays/shared/weapons/devastator.c +++ b/src/overlays/shared/weapons/devastator.c @@ -298,6 +298,10 @@ void devastator_update(struct Moby *m) __asm__("FUN_L00_002b2100"); /* Moby class 157 */ void devastator_update(struct Moby *devastator_moby) { + enum { + DEVASTATOR_STATE_UNINITIALIZED = 0, + DEVASTATOR_STATE_INITIALIZED = 1 + }; Matrix3 rotation; Matrix4 inverse; Vec_2b2100 velocity; @@ -318,8 +322,8 @@ void devastator_update(struct Moby *devastator_moby) { emit_object_offset_particles(devastator_moby); height = 0.75f; limit = 10000.0f; - if ((unsigned char)devastator_moby->state == 0) { - devastator_moby->state = 1; + if ((unsigned char)devastator_moby->state == DEVASTATOR_STATE_UNINITIALIZED) { + devastator_moby->state = DEVASTATOR_STATE_INITIALIZED; devastator_vars->light = -1; devastator_vars->glow = 0; } diff --git a/src/overlays/shared/weapons/doom_bot.c b/src/overlays/shared/weapons/doom_bot.c index b955a70784..fe3c00467d 100644 --- a/src/overlays/shared/weapons/doom_bot.c +++ b/src/overlays/shared/weapons/doom_bot.c @@ -120,7 +120,7 @@ extern int try_start_moby_hop(void *, void *, void *, int) __asm__("FUN_L00_00 extern void initialize_moby_hop_trajectory(void *, void *, void *) __asm__("FUN_L00_002bf8b0"); extern int compute_moby_state_from_vertical_probe(void *) __asm__("FUN_L00_002bfec8"); extern int update_arc_motion(void *, void *) __asm__("FUN_L00_0025b440"); -extern int FUN_L00_00259028(void *, void *, void *, void *); +extern int step_mover_2e3f20(void *, void *, void *, void *) __asm__("FUN_L00_00259028"); extern void fast_vec_scale(void *, void *, f32) __asm__("FUN_001f9a68"); extern CollisionHit coll_hit __asm__("D_L00_00173E40") NOT_SDA; @@ -175,6 +175,9 @@ void doom_bot_update(struct Moby *moby) { DOOM_BOT_INITIAL_FALL = 14, DOOM_BOT_RESET_TO_INITIALIZE = 15 }; + enum { + MOBY_STATE_PENDING_REMOVAL = 0xFE + }; OvlVec4 movement_and_detonation_vectors[4]; float clearance; DoomBotVars *doom_bot_vars; @@ -196,7 +199,7 @@ void doom_bot_update(struct Moby *moby) { return; } if (find_moby_hit(moby, 0x800001, 0)) - moby->state = 11; + moby->state = DOOM_BOT_DETONATE; scale = convert_integer_to_float(item_text_variant[0x14]) + 1.0f; moby->scale += (moby->pclass->scale * scale - moby->scale) * 0.05f; speed = convert_integer_to_float(item_text_variant[0x14]) * 0.5f + 1.0f; @@ -204,13 +207,13 @@ void doom_bot_update(struct Moby *moby) { moby->anim_speed = speed / scale; else moby->anim_speed = 1.0f; - if (moby->state != 11) { + if (moby->state != DOOM_BOT_DETONATE) { int damage = truncate_float_to_s32(scale * 183.296f) + 1; DoomBotParams *hp = (DoomBotParams *)&hero; hp->damage = damage; hp->f1EF0 = 0; hp->f1EC4 = scale * 0.198f + 0.02f; - if (moby->state == 0) { + if (moby->state == DOOM_BOT_INITIALIZE) { float frame, turn; memset(&hp->config, 0, 64); frame = frame_scale; @@ -238,7 +241,7 @@ void doom_bot_update(struct Moby *moby) { hp->config.rate = frame * 0.01f; hp->config.max = frame * 0.045f; doom_bot_vars->target_moby = 0; - moby->state = 14; + moby->state = DOOM_BOT_INITIAL_FALL; doom_bot_vars->timer = 0; doom_bot_vars->turn_rate = frame_scale * 0.1f * speed; save_state_fields_to_hero((char *)doom_bot_vars); @@ -246,7 +249,7 @@ void doom_bot_update(struct Moby *moby) { if (moby->prev_seq != 5) blend_moby_animation(moby, 5, 0, scale_game_frames(5)); } - if (moby->state == 13) { + if (moby->state == DOOM_BOT_SQUIRM) { if (!doom_bot_vars->owner || doom_bot_vars->owner->state == 0xFE || doom_bot_vars->owner->state == 0xFD || moby->pos.x < 2.0f || moby->pos.x > 1021.0f || moby->pos.y < 2.0f || moby->pos.y > 1021.0f || @@ -258,7 +261,7 @@ void doom_bot_update(struct Moby *moby) { } doom_bot_vars->age++; if (scale_game_frames(3600) < doom_bot_vars->age) - moby->state = 11; + moby->state = DOOM_BOT_DETONATE; fast_dec_timer(&doom_bot_vars->timer); qcopy(&doom_bot_vars->previous_position, &moby->pos); if (probe_moby_raised_sphere_collision((char *)moby, 5, 0)) { @@ -266,7 +269,7 @@ void doom_bot_update(struct Moby *moby) { (((struct Moby *)coll_hit.moby)->flags & 0x1000) && ((struct Moby *)coll_hit.moby)->pclass && ((struct Moby *)coll_hit.moby)->pclass->type == 5) { - moby->state = 11; + moby->state = DOOM_BOT_DETONATE; } else if (!coll_hit.moby || coll_hit.unk1C < 0) { z = moby->pos.z; qcopy_nc(&moby->pos, coll_hit.pad30); @@ -277,7 +280,7 @@ void doom_bot_update(struct Moby *moby) { &doom_bot_vars->velocity, &doom_bot_vars->velocity, frame_scale * 0.05f); FUN_L00_001ff600( frame_scale * 0.05f, &doom_bot_vars->velocity, &doom_bot_vars->velocity); - moby->state = 8; + moby->state = DOOM_BOT_COLLISION_RECOVERY_FALL; if (doom_bot_vars->target_moby) { doom_bot_vars->last = doom_bot_vars->target_moby; doom_bot_vars->timer += 500; @@ -291,14 +294,14 @@ void doom_bot_update(struct Moby *moby) { return; } if (doom_bot_vars->timer >= 4001) - moby->state = 11; + moby->state = DOOM_BOT_DETONATE; } if (probe_ground_height(&moby->pos, 0, 0.5f) != 0 && coll_hit.moby) FUN_L00_00260400(moby, coll_hit.moby, &moby->pos, &moby->rot, &moby->pos, &moby->rot); switch (moby->state) { case DOOM_BOT_INITIALIZE: debug_print(D_L00_001E9B48); - moby->state = 1; + moby->state = DOOM_BOT_WAIT_FOR_ANIMATION_BEFORE_MOVEMENT; break; case DOOM_BOT_COLLISION_RECOVERY_FALL: { DoomBotParams *hp; @@ -319,7 +322,7 @@ void doom_bot_update(struct Moby *moby) { if (moby->prev_seq != 5) blend_moby_animation(moby, 5, 0, scale_game_frames(5)); } else - moby->state = 2; + moby->state = DOOM_BOT_SELECT_MOVEMENT_MODE; } goto Falling; } @@ -327,14 +330,14 @@ void doom_bot_update(struct Moby *moby) { case DOOM_BOT_WAIT_FOR_ANIMATION_TO_SELECT_MOVEMENT: case DOOM_BOT_WAIT_FOR_ANIMATION_COMPLETION: if (moby->anim_flags & 2) - moby->state = 2; + moby->state = DOOM_BOT_SELECT_MOVEMENT_MODE; goto Contact; case DOOM_BOT_SELECT_MOVEMENT_MODE: case DOOM_BOT_UPDATE_TARGET_AND_MOVEMENT: case DOOM_BOT_MOVE_HIGH_TURN_RATE: case DOOM_BOT_MOVE_LOW_TURN_RATE: { target = doom_bot_vars->target_moby; - if (target && target->state != 0xFE && target->state != 0xFD) { + if (target && target->state != MOBY_STATE_PENDING_REMOVAL && target->state != 0xFD) { height = target->pos.z; aim = (AimInfo *)get_moby_target_info((char *)doom_bot_vars->target_moby); reach = speed; @@ -344,7 +347,7 @@ void doom_bot_update(struct Moby *moby) { } if (fast_vec_dist(&moby->pos, &doom_bot_vars->target_moby->pos) < reach && coll_sphere(&moby->pos, speed, 1, moby)) { - moby->state = 11; + moby->state = DOOM_BOT_DETONATE; break; } if (vector_distance(&moby->pos, &doom_bot_vars->target_moby->pos) < reach * 0.5f && @@ -357,7 +360,7 @@ void doom_bot_update(struct Moby *moby) { doom_bot_vars->turn_rate = frame_scale * 0.066f * speed; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(2)); - moby->state = 6; + moby->state = DOOM_BOT_ALIGN_TO_TARGET; } } qcopy(&movement_and_detonation_vectors[0], &moby->pos); @@ -366,7 +369,7 @@ void doom_bot_update(struct Moby *moby) { doom_bot_vars->target_moby = select_class5_target_or_hero( moby, &movement_and_detonation_vectors[0], &moby->rot, doom_bot_vars->last, 1); doom_bot_vars->turn_rate = frame_scale * 0.1f * speed; - moby->state = 4; + moby->state = DOOM_BOT_MOVE_HIGH_TURN_RATE; if (!doom_bot_vars->target_moby) { angle = random_float_between(-3.1415927f, 3.1415927f); if (random_integer_below(4) == 0) { @@ -394,13 +397,13 @@ void doom_bot_update(struct Moby *moby) { doom_bot_vars->target_moby->pclass->type != 5 || !(doom_bot_vars->target_moby->flags & 0x1000))) { doom_bot_vars->target_moby = 0; - moby->state = 2; + moby->state = DOOM_BOT_SELECT_MOVEMENT_MODE; doom_bot_vars->turn_rate = frame_scale * 0.0273f * speed; break; } old_state = moby->state; if (!doom_bot_vars->target_moby) { - moby->state = 5; + moby->state = DOOM_BOT_MOVE_LOW_TURN_RATE; if (moby->prev_seq != 6) blend_moby_animation(moby, 6, 0, scale_game_frames(10)); doom_bot_vars->turn_rate = frame_scale * 0.0273f * speed; @@ -411,26 +414,26 @@ void doom_bot_update(struct Moby *moby) { doom_bot_vars->turn_rate = frame_scale * 0.066f * speed; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(2)); - moby->state = 6; + moby->state = DOOM_BOT_ALIGN_TO_TARGET; break; } distance = vector_distance(&moby->pos, &doom_bot_vars->target_moby->pos); { DoomBotParams *hp = (DoomBotParams *)&hero; if (doom_bot_vars->target_moby == hp->moby) { - moby->state = 5; + moby->state = DOOM_BOT_MOVE_LOW_TURN_RATE; if ((moby->anim_flags & 2) && moby->prev_seq != 6) blend_moby_animation(moby, 6, 0, scale_game_frames(0)); doom_bot_vars->turn_rate = frame_scale * 0.0273f * speed; } } if (!(distance < 8.0f) && distance > 20.0f) { - moby->state = 5; + moby->state = DOOM_BOT_MOVE_LOW_TURN_RATE; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(10)); doom_bot_vars->turn_rate = frame_scale * 0.0273f * speed; } else { - moby->state = 4; + moby->state = DOOM_BOT_MOVE_HIGH_TURN_RATE; if (moby->prev_seq != 7) blend_moby_animation(moby, 7, 0, scale_game_frames(10)); doom_bot_vars->turn_rate = frame_scale * 0.1f * speed; @@ -453,8 +456,9 @@ void doom_bot_update(struct Moby *moby) { } else clearance = 5.0f; } - if (moby->state == 4 && old_state == 5) { - moby->state = 12; + if (moby->state == DOOM_BOT_MOVE_HIGH_TURN_RATE && + old_state == DOOM_BOT_MOVE_LOW_TURN_RATE) { + moby->state = DOOM_BOT_WAIT_FOR_TRANSITION_ANIMATION; if (moby->prev_seq != 1) blend_moby_animation(moby, 1, 0, scale_game_frames(10)); goto Contact; @@ -488,7 +492,7 @@ void doom_bot_update(struct Moby *moby) { (coll_hit.moby && ((struct Moby *)coll_hit.moby)->pclass && ((struct Moby *)coll_hit.moby)->pclass->type == 5)) { z = moby->pos.z; - move_flags = FUN_L00_00259028( + move_flags = step_mover_2e3f20( moby, &((DoomBotParams *)&hero)->damage, doom_bot_vars, &doom_bot_vars->velocity); if (absolute_float(moby->pos.z - z) > 1.0f) { moby->pos.z = z; @@ -512,7 +516,7 @@ void doom_bot_update(struct Moby *moby) { doom_bot_vars->turn_rate = frame_scale * 0.066f * speed; if (moby->prev_seq != 0) blend_moby_animation(moby, 0, 0, scale_game_frames(2)); - moby->state = 6; + moby->state = DOOM_BOT_ALIGN_TO_TARGET; goto Contact; } if (doom_bot_vars->target_moby) { @@ -523,7 +527,7 @@ void doom_bot_update(struct Moby *moby) { doom_bot_vars->velocity.f[1] = moby->pos.y - doom_bot_vars->target.f[1]; doom_bot_vars->velocity.f[2] = 0.01f; fast_vec_normalize(&doom_bot_vars->velocity, &doom_bot_vars->velocity, 0.1f); - moby->state = 8; + moby->state = DOOM_BOT_COLLISION_RECOVERY_FALL; if (moby->prev_seq != 5) blend_moby_animation(moby, 5, 0, scale_game_frames(5)); break; @@ -543,7 +547,7 @@ void doom_bot_update(struct Moby *moby) { restore_state_fields_from_hero((char *)doom_bot_vars); if (fast_difference_between_rotations(moby->rot.z, heading) < 0.08726646f) { blend_moby_animation(moby, hp->config.anim2C, 0, scale_game_frames(3)); - moby->state = 7; + moby->state = DOOM_BOT_EXECUTE_JUMP; } goto Contact; } @@ -609,7 +613,7 @@ void doom_bot_update(struct Moby *moby) { return; case DOOM_BOT_WAIT_FOR_TRANSITION_ANIMATION: if (moby->anim_flags & 2) { - moby->state = 4; + moby->state = DOOM_BOT_MOVE_HIGH_TURN_RATE; if (moby->prev_seq != 7) blend_moby_animation(moby, 7, 0, scale_game_frames(10)); doom_bot_vars->turn_rate = frame_scale * 0.1f * speed; @@ -647,7 +651,7 @@ void doom_bot_update(struct Moby *moby) { if (moby->prev_seq != 5) blend_moby_animation(moby, 5, 0, scale_game_frames(5)); } else - moby->state = 2; + moby->state = DOOM_BOT_SELECT_MOVEMENT_MODE; } /* Fakematch: the do-while(0) splits the scheduling region. */ Falling: @@ -672,10 +676,10 @@ void doom_bot_update(struct Moby *moby) { compute_moby_state_from_vertical_probe(moby) | ((unsigned char)(int)doom_bot_vars >> 8); break; case DOOM_BOT_RESET_TO_INITIALIZE: - moby->state = 0; + moby->state = DOOM_BOT_INITIALIZE; break; default: - moby->state = 0; + moby->state = DOOM_BOT_INITIALIZE; break; } if (moby->pos.x < 2.0f || moby->pos.x > 1021.0f || moby->pos.y < 2.0f || diff --git a/src/overlays/shared/weapons/doom_bot_movement.c b/src/overlays/shared/weapons/doom_bot_movement.c index 0c17767724..acaeeb67dc 100644 --- a/src/overlays/shared/weapons/doom_bot_movement.c +++ b/src/overlays/shared/weapons/doom_bot_movement.c @@ -10,6 +10,10 @@ #include "qzero.h" #include "rnc/overlay/shared/math/interpolation/spring_turn.h" +enum { + COLLISION_MATERIAL_WATER = 0 +}; + typedef struct { float x, y, z, w; } Vx __attribute__((aligned(16))); @@ -225,9 +229,6 @@ float probe_moby_landing_height(Vec4_2bec80 *probe_position, void *probing_moby) __asm__("FUN_L00_002bec80"); float probe_moby_landing_height(Vec4_2bec80 *probe_position, void *probing_moby) { - enum { - COLLISION_MATERIAL_WATER = 0 - }; Vec4_2bec80 lower_probe_point, upper_probe_point; float f, unclamped_lower_z; qcopy(&lower_probe_point, probe_position); @@ -666,7 +667,7 @@ int compute_moby_state_from_vertical_probe(unsigned char *moby) __asm__("FUN_L00 int compute_moby_state_from_vertical_probe(unsigned char *moby) { enum { - COLLISION_MATERIAL_WATER = 0 + DOOM_BOT_DETONATE = 11 }; Vec4 lower_probe_point, upper_probe_point; int resulting_moby_state = MOBY(moby)->state; @@ -678,7 +679,7 @@ int compute_moby_state_from_vertical_probe(unsigned char *moby) { char *hit_moby = (char *)coll_hit_moby; if (hit_moby && ((char *)MOBY(hit_moby)->pclass) && *(short *)(((char *)MOBY(hit_moby)->pclass) + 0x46) == 5) { - resulting_moby_state = 11; + resulting_moby_state = DOOM_BOT_DETONATE; } else { switch (collision_hit_material()) { case COLLISION_MATERIAL_WATER: @@ -688,7 +689,7 @@ int compute_moby_state_from_vertical_probe(unsigned char *moby) { case 11: case 12: case 13: - resulting_moby_state = 11; + resulting_moby_state = DOOM_BOT_DETONATE; break; } } diff --git a/src/overlays/shared/weapons/drone.c b/src/overlays/shared/weapons/drone.c index 892b72e1b8..4d7128935a 100644 --- a/src/overlays/shared/weapons/drone.c +++ b/src/overlays/shared/weapons/drone.c @@ -351,6 +351,15 @@ void drone_update(struct Moby *updated_moby) __asm__("FUN_L00_002ce358"); /* Moby class 479 */ void drone_update(struct Moby *updated_moby) { + enum { + DRONE_STATE_ORBIT = 2, + DRONE_STATE_PURSUE_TARGET = 3, + DRONE_STATE_FADE = 4, + DRONE_STATE_REMOVE = 5 + }; + enum { + MOBY_STATE_MARKED_FOR_REMOVAL = 0xFE + }; DroneVars *drone_vars = (DroneVars *)updated_moby->pvars; Vec4 collision_data[1], old_pos; Vec4 direction, rotated; @@ -370,7 +379,7 @@ void drone_update(struct Moby *updated_moby) { return; } updated_moby->flags &= 0xFFBE; - if (updated_moby->state < 5) { + if (updated_moby->state < DRONE_STATE_REMOVE) { ((DroneSlots *)&hero)->counter++; if (((DroneSlots *)&hero)->ammo_used < ((DroneSlots *)&hero)->counter) { closest = 0; @@ -384,7 +393,7 @@ void drone_update(struct Moby *updated_moby) { drone = ((DroneSlots *)&hero)->slots[k]; if (drone != 0) { if (drone->oclass == 0x1DF) { - if (drone->state == 0xFE) { + if (drone->state == MOBY_STATE_MARKED_FOR_REMOVAL) { ((DroneSlots *)&hero)->slots[k] = 0; } else if (drone->state == 0xFD) { ((DroneSlots *)&hero)->slots[k] = 0; @@ -392,7 +401,7 @@ void drone_update(struct Moby *updated_moby) { ((DroneSlots *)&hero)->exclusions[count] = *(struct Moby **)(drone->pvars + 0x30); count++; - if (drone->state < 4) + if (drone->state < DRONE_STATE_FADE) ((DroneSlots *)&hero)->ammo_capacity++; if (count > 8) break; @@ -416,7 +425,8 @@ void drone_update(struct Moby *updated_moby) { drone = ((DroneSlots *)&hero)->slots[i]; if (drone != 0) { struct Moby *drone_target = *(struct Moby **)(drone->pvars + 0x30); - if (drone_target == 0 || drone_target->state == 0xFE || + if (drone_target == 0 || + drone_target->state == MOBY_STATE_MARKED_FOR_REMOVAL || drone_target->state == 0xFD) { f32 candidate_distance = vector_distance_xy(&drone->pos, &old_pos); if (candidate_distance < distance) { @@ -436,7 +446,7 @@ void drone_update(struct Moby *updated_moby) { if (target_height_data != 0) old_pos.f[2] += *(f32 *)(target_height_data + 0x10); qcopy(&assigned->offset, &old_pos); - closest->state = 3; + closest->state = DRONE_STATE_PURSUE_TARGET; random = rand_2cc608() % 3; allocate_voice_for_target_entry(random + (random > 0), 0, updated_moby); ((DroneSlots *)&hero)->exclusions[count] = assigned->target; @@ -468,22 +478,22 @@ void drone_update(struct Moby *updated_moby) { if (cat >= 5) { if (hit == 0 || h == 0 || *(s16 *)(h + 0xA6) != 0x4D6 || fast_dec_timer_s16(&drone_vars->health)) - updated_moby->state = 4; + updated_moby->state = DRONE_STATE_FADE; } } } } dispatch_state: state = updated_moby->state; - if (state == 3) + if (state == DRONE_STATE_PURSUE_TARGET) goto state3; - if (state < 4) { - if (state == 2) + if (state < DRONE_STATE_FADE) { + if (state == DRONE_STATE_ORBIT) goto state2; } else { - if (state == 4) + if (state == DRONE_STATE_FADE) goto state4; - if (state == 5) + if (state == DRONE_STATE_REMOVE) goto state5; } goto update_effects; @@ -574,7 +584,7 @@ state2: { 1, -1, 0); - updated_moby->state = 4; + updated_moby->state = DRONE_STATE_FADE; } } } @@ -609,8 +619,8 @@ state3: { updated_moby->collision = pclass->collision; func_L00_002CF328_2CF808(updated_moby); target = drone_vars->target; - if (target != 0 && target->oclass == drone_vars->target_oclass && target->state != 0xFE && - target->state != 0xFD) { + if (target != 0 && target->oclass == drone_vars->target_oclass && + target->state != MOBY_STATE_MARKED_FOR_REMOVAL && target->state != 0xFD) { char *h = get_moby_target_info(target); qcopy(&target_pos, &drone_vars->target->pos); if (h != 0) @@ -625,8 +635,8 @@ state3: { qcopy(&collision_data[0], &updated_moby->pos); if (coll_sphere(0.25f, &collision_data[0], 0, updated_moby)) { struct Moby *hm = (struct Moby *)coll_hit.moby; - if (!hm || hm->state == 0xFE || hm->state == 0xFD || hm != drone_vars->target || - hm->oclass == 0) { + if (!hm || hm->state == MOBY_STATE_MARKED_FOR_REMOVAL || hm->state == 0xFD || + hm != drone_vars->target || hm->oclass == 0) { qcopy(&updated_moby->pos, &coll_hit_position); } else { s32 cat2 = hm->pclass ? *(u8 *)((u8 *)hm->pclass + 0x46) : 0; @@ -667,13 +677,13 @@ state3: { 1, -1, 0); - updated_moby->state = 4; + updated_moby->state = DRONE_STATE_FADE; } } } } } else { - updated_moby->state = 2; + updated_moby->state = DRONE_STATE_ORBIT; drone_vars->target_oclass = -1; drone_vars->target = 0; } @@ -689,7 +699,7 @@ state4: { goto fade_clear; if (target->oclass != drone_vars->target_oclass) goto fade_clear; - if (target->state == 0xFE) + if (target->state == MOBY_STATE_MARKED_FOR_REMOVAL) goto fade_clear; if (target->state == 0xFD) goto fade_clear; @@ -709,7 +719,7 @@ state4: { fade_alpha: updated_moby->alpha -= 4; if (updated_moby->alpha < 6) - updated_moby->state = 5; + updated_moby->state = DRONE_STATE_REMOVE; goto update_effects; } state5: { diff --git a/src/overlays/shared/weapons/effect_slots_fire.c b/src/overlays/shared/weapons/effect_slots_fire.c index 69226cd5c6..3d516727de 100644 --- a/src/overlays/shared/weapons/effect_slots_fire.c +++ b/src/overlays/shared/weapons/effect_slots_fire.c @@ -43,11 +43,11 @@ extern float D_L02_00174460[]; extern float FUN_L04_001f1978(float); extern float fast_vec_dist(void *, void *); extern int D_L02_0015F5CC MACRO_ADDR; -extern float D_L02_001600D0 __attribute__((sda)); -extern int D_L02_001600D4 __attribute__((sda)); -extern int D_L02_001600D8 __attribute__((sda)); -extern float D_L02_001600DC __attribute__((sda)); -extern float D_L02_001600E0 __attribute__((sda)); +extern float l02_effect_particle_travel_step_limit __asm__("D_L02_001600D0") __attribute__((sda)); +extern int l02_effect_alternate_particle_count __asm__("D_L02_001600D4") __attribute__((sda)); +extern int l02_effect_default_particle_count __asm__("D_L02_001600D8") __attribute__((sda)); +extern float l02_effect_particle_full_travel_spread __asm__("D_L02_001600DC") __attribute__((sda)); +extern float l02_effect_particle_zero_travel_spread __asm__("D_L02_001600E0") __attribute__((sda)); void effect_slots_fire(char *slots, float *position, @@ -55,6 +55,9 @@ void effect_slots_fire(char *slots, float distance) __asm__("FUN_L02_00264e70"); void effect_slots_fire(char *slots, float *position, float *direction, float distance) { + enum { + EFFECT_SHOT_TRACKING_PHASE = 0 + }; float origin[4] __attribute__((aligned(16))); float end[4] __attribute__((aligned(16))); float adjusted[4] __attribute__((aligned(16))); @@ -64,7 +67,7 @@ void effect_slots_fire(char *slots, float *position, float *direction, float dis float speed = 0.0f; float travel; float acceleration; - int n; + int default_particle_count; int first_count; int i; int save_shot; @@ -73,7 +76,7 @@ void effect_slots_fire(char *slots, float *position, float *direction, float dis { int phase = D_L02_0015F5CC & 3; - save_shot = phase == 0; + save_shot = phase == EFFECT_SHOT_TRACKING_PHASE; } qcopy(origin, position); fast_vec_normalize(adjusted, direction, distance + 0.75f); @@ -91,17 +94,19 @@ void effect_slots_fire(char *slots, float *position, float *direction, float dis travel, 1.0f, acceleration * 48.0f, - (D_L02_001600D0)*frame_time_macro); + (l02_effect_particle_travel_step_limit)*frame_time_macro); ((float (*)(void *, void *, float))fast_vec_normalize)(adjusted, adjusted, travel_step); - n = (D_L02_001600D8); - first_count = (D_L02_001600D4); + default_particle_count = (l02_effect_default_particle_count); + first_count = (l02_effect_alternate_particle_count); if (travel < 4.0f) first_count = 1; - for (i = 0; i < n + first_count; i++) { + for (i = 0; i < default_particle_count + first_count; i++) { random_vector( offset, 0.0f, - (((D_L02_001600DC) - (D_L02_001600E0)) * (travel / distance) + (D_L02_001600E0)) * + (((l02_effect_particle_full_travel_spread) - (l02_effect_particle_zero_travel_spread)) * + (travel / distance) + + (l02_effect_particle_zero_travel_spread)) * frame_time_macro); fast_vec_add(offset, offset, adjusted); fast_vec_scale(velocity, adjusted, random_float_between(0.0f, 1.0f)); @@ -122,9 +127,9 @@ void effect_slots_fire(char *slots, float *position, float *direction, float dis } } if (fast_dec_timer_s16(slots + 0x1c)) { - float sp2 = random_float_between(10.0f, 30.0f); - sp2 = FUN_L04_001f1978(sp2); - ((Slots *)slots)->timer = truncate_float_to_s32(sp2); + float color_particle_spawn_delay = random_float_between(10.0f, 30.0f); + color_particle_spawn_delay = FUN_L04_001f1978(color_particle_spawn_delay); + ((Slots *)slots)->timer = truncate_float_to_s32(color_particle_spawn_delay); random_vector(offset, 0.0f, frame_time_macro + frame_time_macro); fast_vec_scale(velocity, adjusted, random_float_between(0.5f, 0.1f)); fast_vec_add(velocity, velocity, offset); diff --git a/src/overlays/shared/weapons/glove_of_doom.c b/src/overlays/shared/weapons/glove_of_doom.c index 8a12048f8c..526c2e4ff1 100644 --- a/src/overlays/shared/weapons/glove_of_doom.c +++ b/src/overlays/shared/weapons/glove_of_doom.c @@ -320,7 +320,7 @@ void glove_of_doom_update(struct Moby *moby) { (hero.state.current == 0x23 && hero.state_timer == scale_game_frames(0x10))) { allocate_hero_voice_for_entry(0x1A, 0); use_ammo(-1, 1); - moby->state = 3; + moby->state = GLOVE_RELEASE_HELD_MOBY; } } grip.q = glove_carrier_vars->grip.q; @@ -329,13 +329,13 @@ void glove_of_doom_update(struct Moby *moby) { case GLOVE_INITIALIZE: glove_carrier_vars->held = 0; if (moby->anim_flags & 2) { - moby->state = 2; + moby->state = GLOVE_IDLE; } else { - moby->state = 1; + moby->state = GLOVE_WAIT_FOR_ANIMATION; } case GLOVE_WAIT_FOR_ANIMATION: if (moby->anim_flags & 2) { - moby->state = 2; + moby->state = GLOVE_IDLE; } break; case GLOVE_IDLE: @@ -356,16 +356,16 @@ void glove_of_doom_update(struct Moby *moby) { } else { allocate_voice_for_target_entry(0, 0, moby); } - moby->state = 4; + moby->state = GLOVE_POST_RELEASE_WAIT; glove_carrier_vars->timer = scale_game_frames(0x14); break; case GLOVE_POST_RELEASE_WAIT: if (hero.state.current != 0x23 && !hero.item_anim_active) { - moby->state = 2; + moby->state = GLOVE_IDLE; } break; case GLOVE_BEGIN_SKIP_HELD_MOBY_SYNC_AND_SPAWN: - moby->state = 6; + moby->state = GLOVE_SKIP_HELD_MOBY_SYNC_AND_SPAWN; break; case GLOVE_SKIP_HELD_MOBY_SYNC_AND_SPAWN: return; @@ -455,6 +455,9 @@ void release_glove_of_doom_held_moby(Vec4_2c82f0 *release_position, u8 *released_moby, void *initial_velocity) { + enum { + GLOVE_HELD_MOBY_RELEASED = 2 + }; char *q = *(char **)(released_moby + 0x78); struct Hero *P; char *released_moby_position, *collision_reference_moby; @@ -485,5 +488,5 @@ void release_glove_of_doom_held_moby(Vec4_2c82f0 *release_position, reflect_vector(q, q, collision_hit_cursor); FUN_001f9a68_002c82f0(q, q, 0.6f); } - MOBY(released_moby)->state = 2; + MOBY(released_moby)->state = GLOVE_HELD_MOBY_RELEASED; } diff --git a/src/overlays/shared/weapons/glove_of_doom_bomb.c b/src/overlays/shared/weapons/glove_of_doom_bomb.c index d02f665d06..3d26884163 100644 --- a/src/overlays/shared/weapons/glove_of_doom_bomb.c +++ b/src/overlays/shared/weapons/glove_of_doom_bomb.c @@ -16,6 +16,20 @@ #include "rnc/overlay/shared/weapons.h" /* Vars of a thrown moby, as ThrowVars in trespasser.c without its first 0x10 bytes. */ +enum { + DOOM_LANDING_MODE_REQUIRE_LINKED_MOBY = 0, + DOOM_LANDING_MODE_SKIP_LINKED_MOBY_DRAW_CALLBACK = 2 +}; + +enum { + THROWN_MOBY_STATE_INITIALIZE = 0, + THROWN_MOBY_STATE_GROW_TO_QUARTER_SCALE = 1, + THROWN_MOBY_STATE_MOVE_WITH_COLLISION = 2, + THROWN_MOBY_STATE_SPAWN_SEQUENCE = 3, + THROWN_MOBY_STATE_FADE_OUT = 4, + THROWN_MOBY_STATE_RESET_TO_INITIALIZE = 5 +}; + typedef struct { Vec4 vel; /* 0x00: velocity per step */ Vec4 landing; /* 0x10: predicted landing point */ @@ -71,7 +85,7 @@ s32 predict_doom_bot_spawner_landing(ThrowVars *throw_vars, struct Moby *thrown_ if (D_L00_0015F5C4 != 0) return 0; qcopy(&position_scratch, &thrown_moby->pos); - if (thrown_moby->state == 1) { + if (thrown_moby->state == THROWN_MOBY_STATE_GROW_TO_QUARTER_SCALE) { simulated_position.f[0] = fast_cos(fast_add_rotations(-0.36196801066398620605f, fast_arc_tan(hero.facing_x, hero.facing_y))) * @@ -156,13 +170,14 @@ s32 predict_doom_bot_spawner_landing(ThrowVars *throw_vars, struct Moby *thrown_ } if (prediction_timer == 0) return 0; - if (mode == 0) { + if (mode == DOOM_LANDING_MODE_REQUIRE_LINKED_MOBY) { if (coll_hit.moby == 0) return 0; if (get_moby_pvars_link(coll_hit.moby) == 0) goto ret0; } - if (mode != 2 || coll_hit.moby == 0 || !get_moby_pvars_link(coll_hit.moby)) + if (mode != DOOM_LANDING_MODE_SKIP_LINKED_MOBY_DRAW_CALLBACK || coll_hit.moby == 0 || + !get_moby_pvars_link(coll_hit.moby)) add_draw_callback(FUN_L00_002c7df8_2c8440, thrown_moby); throw_vars->normal.q = coll_hit_normal.q; fast_vec_sub(&position_scratch, &throw_vars->landing, &g_debug_camera_lui); @@ -181,14 +196,6 @@ void doom_bot_spawner_update(struct Moby *thrown_moby) __asm__("FUN_L00_002c89e8 /* Moby class 230 */ void doom_bot_spawner_update(struct Moby *thrown_moby) { - enum { - THROWN_MOBY_STATE_INITIALIZE = 0, - THROWN_MOBY_STATE_GROW_TO_QUARTER_SCALE = 1, - THROWN_MOBY_STATE_MOVE_WITH_COLLISION = 2, - THROWN_MOBY_STATE_SPAWN_SEQUENCE = 3, - THROWN_MOBY_STATE_FADE_OUT = 4, - THROWN_MOBY_STATE_RESET_TO_INITIALIZE = 5 - }; Vec4 next_pos, start, end, probe; ThrowVars *spawner_throw_vars; struct Moby *population_scan_moby; @@ -209,7 +216,7 @@ void doom_bot_spawner_update(struct Moby *thrown_moby) { if (thrown_moby->pos.x < 2.0f || 1021.0f < thrown_moby->pos.x || thrown_moby->pos.y < 2.0f || 1021.0f < thrown_moby->pos.y || thrown_moby->pos.z < 2.0f || 1021.0f < thrown_moby->pos.z) goto remove; - if (hero.unk20A5 && thrown_moby->state < 2) + if (hero.unk20A5 && thrown_moby->state < THROWN_MOBY_STATE_MOVE_WITH_COLLISION) thrown_moby->flags |= 0x41; else thrown_moby->flags &= 0xffbe; @@ -222,7 +229,7 @@ void doom_bot_spawner_update(struct Moby *thrown_moby) { } switch (thrown_moby->state) { case THROWN_MOBY_STATE_INITIALIZE: - thrown_moby->state = 1; + thrown_moby->state = THROWN_MOBY_STATE_GROW_TO_QUARTER_SCALE; spawner_throw_vars->effect_timer = scale_game_frames(4); spawner_throw_vars->timer = 0; spawner_throw_vars->spawn_count = 0; @@ -310,7 +317,7 @@ void doom_bot_spawner_update(struct Moby *thrown_moby) { spawner_throw_vars->timer = settled; if (!coll_hit.moby || coll_hit.unk1C > 0 || (settled_frames = (s16)settled, scale_game_frames(240) < settled_frames)) { - thrown_moby->state = 3; + thrown_moby->state = THROWN_MOBY_STATE_SPAWN_SEQUENCE; spawner_throw_vars->timer = 0; } } @@ -368,7 +375,7 @@ void doom_bot_spawner_update(struct Moby *thrown_moby) { s32 spawned = spawner_throw_vars->spawn_count + 1; spawner_throw_vars->spawn_count = spawned; if (spawned > 3) - thrown_moby->state = 4; + thrown_moby->state = THROWN_MOBY_STATE_FADE_OUT; } } } @@ -399,6 +406,6 @@ void doom_bot_spawner_update(struct Moby *thrown_moby) { } case THROWN_MOBY_STATE_RESET_TO_INITIALIZE: default: - thrown_moby->state = 0; + thrown_moby->state = THROWN_MOBY_STATE_INITIALIZE; } } diff --git a/src/overlays/shared/weapons/gold_devastator_missile.c b/src/overlays/shared/weapons/gold_devastator_missile.c index a93872b03e..49a5e5b1e8 100644 --- a/src/overlays/shared/weapons/gold_devastator_missile.c +++ b/src/overlays/shared/weapons/gold_devastator_missile.c @@ -174,7 +174,8 @@ extern void FUN_L00_001ff290_c(void *, void *, void *) __asm__("FUN_L00_001ff290 extern int collision1688(void *, void *, int, void *, void *) __asm__("FUN_001efa68"); extern void FUN_L00_001ffd48_c(void *, void *, float) __asm__("FUN_L00_001ffd48"); extern void FUN_L00_001ffe20_c(void *, void *, void *) __asm__("FUN_L00_001ffe20"); -extern void FUN_L00_0026a4c8_c(void *, void *, int, int, float, int) __asm__("FUN_L00_0026a4c8"); +extern void +spawn_particle_alt_9768(void *, void *, int, int, float, int) __asm__("FUN_L00_0026a4c8"); extern E D_0013E520; extern char *active_mobies[] __asm__("D_L00_001ABA00"); @@ -413,6 +414,9 @@ unsigned char *spawn_devastator_missile(unsigned char *missile_source_moby, float initial_yaw, float initial_pitch) { + enum { + DEVASTATOR_MISSILE_STATE_FLYING = 0 + }; V_2afc70 collision_start; unsigned char *missile_moby; GoldDevastatorMissileVars *missile_data; @@ -429,7 +433,7 @@ unsigned char *spawn_devastator_missile(unsigned char *missile_source_moby, MOBY(missile_moby)->visible = 1; MOBY(missile_moby)->rot.z = initial_yaw; MOBY(missile_moby)->rot.y = initial_pitch; - MOBY(missile_moby)->state = 0; + MOBY(missile_moby)->state = DEVASTATOR_MISSILE_STATE_FLYING; missile_data->unk10 = missile_source_moby; qcopy(&MOBY(missile_moby)->pos, spawn_position); default_desired_speed = frame_time * 20.0f; @@ -1028,7 +1032,7 @@ void gold_devastator_missile_update(M910 *missile_moby) { debris_scale = size * 200000.0f; life = random_int_between(scale_game_frames(20), scale_game_frames(35)) - particle_reduction * 10; - FUN_L00_0026a4c8_c((&missile_moby->pos), &v, c, f, debris_scale, life); + spawn_particle_alt_9768((&missile_moby->pos), &v, c, f, debris_scale, life); } if (D_L00_0015F5D0 < 0.95f && distance > 9.0f) { int c = 127, f = 127; diff --git a/src/overlays/shared/weapons/linked_moby_states_update.c b/src/overlays/shared/weapons/linked_moby_states_update.c index b89eafb3e3..578eb6afaf 100644 --- a/src/overlays/shared/weapons/linked_moby_states_update.c +++ b/src/overlays/shared/weapons/linked_moby_states_update.c @@ -70,7 +70,7 @@ void linked_moby_states_update(unsigned char *source_moby) { int matching_owned_record, i; switch (MOBY(source_moby)->state) { case STATE_INITIALIZE: - MOBY(source_moby)->state = 1; + MOBY(source_moby)->state = STATE_ACTIVE; moby_vars->w4 = linked_moby_selection_delay_gp; moby_vars->w8 = 3; moby_vars->p[0] = moby_table + (moby_vars->idx[0] << 8); diff --git a/src/overlays/shared/weapons/metal_detector.c b/src/overlays/shared/weapons/metal_detector.c index bb21070aff..f8a3da2039 100644 --- a/src/overlays/shared/weapons/metal_detector.c +++ b/src/overlays/shared/weapons/metal_detector.c @@ -229,6 +229,10 @@ void metal_detector_update(struct Moby *moby) { METAL_DETECTOR_ACTIVE = 1, METAL_DETECTOR_TRACK_AND_COLLECT = 2 }; + enum { + MOBY_STATE_REMOVAL_BELOW_INSTANCE_END = 0xFD, + MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END = 0xFE + }; Vars2d2ee8 *metal_detector_vars; struct Moby *target_moby; TargetVars2d2ee8 *tv; @@ -268,7 +272,7 @@ void metal_detector_update(struct Moby *moby) { metal_detector_vars->unk28 = 0; qzero(&D_L00_001E1160); attach_manipulator(moby, 3, &D_L00_001E1160); - moby->state = 1; + moby->state = METAL_DETECTOR_ACTIVE; break; case 3: case 4: @@ -369,7 +373,8 @@ void metal_detector_update(struct Moby *moby) { } target_moby = hero.metal_detector_target; if (target_moby != 0 && target_moby->oclass == 0x25D && - target_moby->state != 0xFE && target_moby->state != 0xFD && + target_moby->state != MOBY_STATE_REMOVAL_AT_OR_ABOVE_INSTANCE_END && + target_moby->state != MOBY_STATE_REMOVAL_BELOW_INSTANCE_END && hero.detector_target_dist < 1.0f) { tv = (TargetVars2d2ee8 *)target_moby->pvars; while (tv->count > 0) { diff --git a/src/overlays/shared/weapons/mine.c b/src/overlays/shared/weapons/mine.c index 45f5f581b5..ba3374f1f9 100644 --- a/src/overlays/shared/weapons/mine.c +++ b/src/overlays/shared/weapons/mine.c @@ -24,6 +24,13 @@ #include "rnc/runtime/callbacks/add_draw_callback.h" #include "rnc/world/collision/collision_hit_material.h" +enum { + MINE_STATE_OWNER_ATTACHED = 0, + MINE_HOMING_RISE_PHASE = 1, + MINE_STATE_FREE_MOTION = 1, + MINE_HOMING_FALL_PHASE = 2 +}; + typedef struct MineVars { u8 pad0[0x30]; s32 unk30; @@ -62,12 +69,13 @@ extern int FUN_L00_001f0d60(float, void *, int, void *); extern int collect_mobies_in_sphere(void *, int, void *, void *, float) __asm__("FUN_L00_001f2868"); extern int hud_counter_update(int, int, float) __asm__("FUN_L00_002371e0"); extern int FUN_L00_00257b90(int, int); -extern int FUN_L00_00258490(void *, void *, void *, float, float, float, float, int); -extern int FUN_L00_00260400(void *, void *, void *, void *, void *, void *); -extern int random_integer_below_cf(void *, void *, float, float) __asm__("FUN_L00_0026f080"); -extern int voice_is_playing(void *, int) __asm__("FUN_L00_0028d8c0"); -extern s32 is_moby_in_class_range_500_to_540(s32) __asm__("FUN_L00_0025e3b8"); -extern unsigned swap_packed_color_channels(unsigned c, int mask) __asm__("FUN_L00_0025c0e8"); +extern int move_moby_xy_with_collision_constraints( + void *, void *, void *, float, float, float, float, int) __asm__("FUN_L00_00258490"); +extern int FUN_L00_00260400(void *, void *, void *, void *, void *, void *); +extern int random_integer_below_cf(void *, void *, float, float) __asm__("FUN_L00_0026f080"); +extern int voice_is_playing(void *, int) __asm__("FUN_L00_0028d8c0"); +extern s32 is_moby_in_class_range_500_to_540(s32) __asm__("FUN_L00_0025e3b8"); +extern unsigned swap_packed_color_channels(unsigned c, int mask) __asm__("FUN_L00_0025c0e8"); extern unsigned char *FUN_002141f8_cf(unsigned char *) __asm__("FUN_L00_002603d0"); extern void *find_moby_hit(void *, int, int) __asm__("FUN_L00_0025a420"); extern void *spawn_shrinking_effect_particle_with_gravity_and_secondary_spawns( @@ -409,7 +417,7 @@ unsigned char *spawn_mine(int mine_owner_moby, OvlQuad *spawn_position) { MOBY(mine_moby)->draw_dist = 0x7F; MOBY(mine_moby)->visible = 1; MOBY(mine_moby)->scale = MOBY(mine_moby)->scale * 0.5f; - MOBY(mine_moby)->state = 0; + MOBY(mine_moby)->state = MINE_STATE_OWNER_ATTACHED; mine_vars->unk30 = mine_owner_moby; mine_vars->unk36 = 0; mine_vars->unk78 = 0; @@ -512,6 +520,10 @@ void initialize_moby_motion_at_position(V_2aa008 *requested_position, int predict_mine_impact(char *trajectory_state, char *moby, int mode) __asm__("FUN_L00_002aa2a8"); int predict_mine_impact(char *trajectory_state, char *moby, int mode) { + enum { + MINE_PREDICTION_REQUIRE_LINKED_MOBY_HIT = 0, + MINE_PREDICTION_HIDE_LINKED_MOBY_HIT_MARKER = 2 + }; float trajectory_position[4]; float B[4]; float C[4]; @@ -525,7 +537,7 @@ int predict_mine_impact(char *trajectory_state, char *moby, int mode) { if (D_L00_0015F5C4_c != 0) return 0; qcopy(C, &MOBY(moby)->pos); - if (MOBY(moby)->state == 0) { + if (MOBY(moby)->state == MINE_STATE_OWNER_ATTACHED) { trajectory_position[0] = fast_cos(fast_add_rotations( -0.36196801f, @@ -541,7 +553,8 @@ int predict_mine_impact(char *trajectory_state, char *moby, int mode) { trajectory_position[2] = trajectory_position[2] + 0.49082f; qcopy(B, trajectory_state); if (*(int *)(hero_state + 0x2FC) != 0 && - FUN_L00_002603d0_u((void *)*(int *)(hero_state + 0x2FC)) != 0 && mode != 0) { + FUN_L00_002603d0_u((void *)*(int *)(hero_state + 0x2FC)) != 0 && + mode != MINE_PREDICTION_REQUIRE_LINKED_MOBY_HIT) { fast_vec_add(B, B, hero_state + 0x100); } x = scale_game_frames(0x78); @@ -585,13 +598,14 @@ int predict_mine_impact(char *trajectory_state, char *moby, int mode) { } } if (x != 0) { - if (mode == 0) { + if (mode == MINE_PREDICTION_REQUIRE_LINKED_MOBY_HIT) { if (coll_hit_moby == 0) return 0; if (FUN_L00_002603d0_u(coll_hit_moby) == 0) return 0; } - if (mode != 2 || coll_hit_moby == 0 || FUN_L00_002603d0_u(coll_hit_moby) == 0) { + if (mode != MINE_PREDICTION_HIDE_LINKED_MOBY_HIT_MARKER || coll_hit_moby == 0 || + FUN_L00_002603d0_u(coll_hit_moby) == 0) { add_draw_callback(FUN_L00_002a9c50_c, moby); } { @@ -635,17 +649,18 @@ void mine_update(M910 *mine_moby) { up.f[2] = 1.0f; collision_response_velocity.q = mine_pre_motion_position.q; v = mine_moby->v; - if ((hero.unk20A5 != 0 || hero.unk20AF != 0) && mine_moby->state == 0) { + if ((hero.unk20A5 != 0 || hero.unk20AF != 0) && mine_moby->state == MINE_STATE_OWNER_ATTACHED) { mine_moby->flags |= 0x41; } else { mine_moby->flags &= 0xFFBE; } if ((hero.items[0].moby == 0 || ((M910 *)hero.items[0].moby)->cls != 0xBE) && - mine_moby->state == 0) { + mine_moby->state == MINE_STATE_OWNER_ATTACHED) { mark_moby_for_removal(mine_moby); return; } - if (hero.vehicle_mode != 0 && mine_moby->state == 0) { + if (hero.vehicle_mode != HERO_VEHICLE_MODE_ON_FOOT && + mine_moby->state == MINE_STATE_OWNER_ATTACHED) { mark_moby_for_removal(mine_moby); return; } @@ -775,7 +790,7 @@ void mine_update(M910 *mine_moby) { coll_hit.moby->cls != mine_moby->cls && coll_hit.moby != hero.moby && coll_hit.moby != v->owner) { mine_moby->bBC = 1; - if (mine_moby->state != 1) { + if (mine_moby->state != MINE_STATE_FREE_MOTION) { qcopy(&mine_moby->pos, &coll_hit.pos); mine_moby->pos.f[2] = probe_ground_height(&mine_moby->pos, 0, 0.5f); } @@ -890,7 +905,7 @@ void mine_update(M910 *mine_moby) { if (hd == 0) { int s; - mine_moby->state = 1; + mine_moby->state = MINE_STATE_FREE_MOTION; s = v->i68; if (s != -1) { char *tab = ((char *)&voice_pool); @@ -917,7 +932,7 @@ void mine_update(M910 *mine_moby) { } else { int s; - mine_moby->state = 1; + mine_moby->state = MINE_STATE_FREE_MOTION; s = v->i68; if (s != -1) { char *tab = ((char *)&voice_pool); @@ -938,7 +953,7 @@ void mine_update(M910 *mine_moby) { (mine_moby->state & 0x10)) { int s; - mine_moby->state = 1; + mine_moby->state = MINE_STATE_FREE_MOTION; s = v->i68; if (s != -1) { char *tab = ((char *)&voice_pool); @@ -982,13 +997,13 @@ void mine_update(M910 *mine_moby) { v->f40 = max_homing_step; } mode = v->h52; - if (mode == 1) { + if (mode == MINE_HOMING_RISE_PHASE) { mine_moby->pos.f[2] += frame_scale * 0.05f; if (fast_dec_timer(&v->i48) != 0) { v->i48 = scale_game_frames(7); v->h52 = 2; } - } else if (mode == 2) { + } else if (mode == MINE_HOMING_FALL_PHASE) { mine_moby->pos.f[2] -= frame_scale * 0.05f; if (fast_dec_timer(&v->i48) != 0) { v->h52 = 0; @@ -1063,7 +1078,7 @@ void mine_update(M910 *mine_moby) { fast_vec_normalize(t, t, 0.75f); fast_vec_add(r, &((M910 *)hero.moby)->pos, t); *(OvlQuad *)n = *(OvlQuad *)r; - FUN_L00_00258490( + move_moby_xy_with_collision_constraints( mine_moby, &mine_moby->pos, n, 0.4f, 0.25f, 0.25f, 0.5235988f, 0); } } else { @@ -1316,7 +1331,9 @@ void mine_update(M910 *mine_moby) { r[1] = random_float_between(frame_time * -0.5f, frame_time * 0.5f) * sc; r[2] = random_float_between(frame_time * 4.0f, tbl[kind]) * sc; *(OvlQuad *)n = *(OvlQuad *)r; - rr = random_float_between(0.0f, kind == 1 ? 0.5f : 0.25f) * sc; + rr = random_float_between( + 0.0f, kind == MINE_DEBRIS_FIXED_LIFETIME ? 0.5f : 0.25f) * + sc; ang = random_angle_radians(); r[0] = fast_cos(ang) * rr; r[1] = fast_sin(ang) * rr; diff --git a/src/overlays/shared/weapons/mine_glove.c b/src/overlays/shared/weapons/mine_glove.c index 5584bd02ca..673046b156 100644 --- a/src/overlays/shared/weapons/mine_glove.c +++ b/src/overlays/shared/weapons/mine_glove.c @@ -142,6 +142,9 @@ void mine_glove_update(struct Moby *moby) { MINE_GLOVE_BEGIN_HELD_MOBY_REMOVAL = 5, MINE_GLOVE_REMOVE_HELD_MOBY = 6 }; + enum { + MINE_GLOVE_IDLE = 2 + }; GloveVars *mine_glove_vars; Vec4 saved, offset, rotatedOffset; Vec4 local[4]; @@ -185,7 +188,7 @@ void mine_glove_update(struct Moby *moby) { (hero.state.current == 0x23 && hero.state_timer == scale_game_frames(0x10))) { allocate_hero_voice_for_entry(0x1A, 0); use_ammo(-1, 1); - moby->state = 3; + moby->state = MINE_GLOVE_RELEASE_HELD_MOBY; } } if (mine_glove_vars->held != 0 && !hero.item_use_locked) { @@ -274,12 +277,12 @@ void mine_glove_update(struct Moby *moby) { case MINE_GLOVE_INITIALIZE: mine_glove_vars->held = 0; if (!(moby->anim_flags & 2)) - moby->state = 1; + moby->state = MINE_GLOVE_WAIT_FOR_ANIMATION; else - moby->state = 2; + moby->state = MINE_GLOVE_IDLE; case MINE_GLOVE_WAIT_FOR_ANIMATION: if (moby->anim_flags & 2) - moby->state = 2; + moby->state = MINE_GLOVE_IDLE; break; case MINE_GLOVE_RELEASE_HELD_MOBY: if (mine_glove_vars->held != 0) { @@ -301,15 +304,15 @@ void mine_glove_update(struct Moby *moby) { mine_glove_vars->held = 0; mine_glove_vars->timer54 = scale_game_frames(10); } - moby->state = 4; + moby->state = MINE_GLOVE_POST_RELEASE_WAIT; mine_glove_vars->timer58 = scale_game_frames(0x14); break; case MINE_GLOVE_POST_RELEASE_WAIT: if (hero.state.current != 0x23 && !hero.item_anim_active) - moby->state = 2; + moby->state = MINE_GLOVE_IDLE; break; case MINE_GLOVE_BEGIN_HELD_MOBY_REMOVAL: - moby->state = 6; + moby->state = MINE_GLOVE_REMOVE_HELD_MOBY; break; case MINE_GLOVE_REMOVE_HELD_MOBY: if (mine_glove_vars->held != 0) { diff --git a/src/overlays/shared/weapons/morphoray.c b/src/overlays/shared/weapons/morphoray.c index 3fbf2847a9..758d178ef8 100644 --- a/src/overlays/shared/weapons/morphoray.c +++ b/src/overlays/shared/weapons/morphoray.c @@ -232,44 +232,47 @@ extern float D_L00_001616DC_gp __asm__("D_L00_001616DC") __attrib extern int D_L00_00161818; extern int D_L00_00161824; extern float D_L00_001616F0_gp __asm__("D_L00_001616F0") __attribute__((sda)); -extern int D_L00_001616F4_gp __asm__("D_L00_001616F4") __attribute__((sda)); -extern float D_L00_001616F8_gp __asm__("D_L00_001616F8") __attribute__((sda)); -extern float D_L00_001616FC_gp __asm__("D_L00_001616FC") __attribute__((sda)); -extern float D_L00_00161704_gp __asm__("D_L00_00161704") __attribute__((sda)); -extern float D_L00_00161708_gp __asm__("D_L00_00161708") __attribute__((sda)); -extern float D_L00_0016170C_gp __asm__("D_L00_0016170C") __attribute__((sda)); -extern float D_L00_0016172C_gp __asm__("D_L00_0016172C") __attribute__((sda)); -extern float D_L00_00161730_gp __asm__("D_L00_00161730") __attribute__((sda)); -extern float D_L00_00161734_gp __asm__("D_L00_00161734") __attribute__((sda)); -extern float D_L00_0016173C_gp __asm__("D_L00_0016173C") __attribute__((sda)); -extern float D_L00_00161740_gp __asm__("D_L00_00161740") __attribute__((sda)); -extern float D_L00_00161748_gp __asm__("D_L00_00161748") __attribute__((sda)); -extern int D_L00_0016174C_gp __asm__("D_L00_0016174C") __attribute__((sda)); -extern int D_L00_00161750_gp __asm__("D_L00_00161750") __attribute__((sda)); -extern float D_L00_00161758_gp __asm__("D_L00_00161758") __attribute__((sda)); -extern float D_L00_0016175C_gp __asm__("D_L00_0016175C") __attribute__((sda)); -extern float D_L00_00161768_gp __asm__("D_L00_00161768") __attribute__((sda)); -extern signed char D_L00_00161763_macro[] __asm__("D_L00_00161763") MACRO_ADDR; -extern float D_L00_001617CC_macro __asm__("D_L00_001617CC") MACRO_ADDR; -extern int D_L00_00161824_macro __asm__("D_L00_00161824") MACRO_ADDR; -extern float D_0015ED6C_gp __asm__("D_0015ED6C") MACRO_ADDR; -extern int D_L00_001617D8_macro[3] __asm__("D_L00_001617D8") MACRO_ADDR; -extern float D_L00_001618B8_2BE3A8[3] __asm__("D_L00_001617E8") MACRO_ADDR; -extern float D_L00_001617F8_macro[3] __asm__("D_L00_001617F8") MACRO_ADDR; -extern float D_L00_001618D8_2BE3A8[3] __asm__("D_L00_00161808") MACRO_ADDR; -extern int D_L00_001618E8_2BE3A8[3] __asm__("D_L00_00161818") MACRO_ADDR; -extern Vec_2BE3A8 beam_rail_a_points[12] __asm__("D_L00_001DC020"); -extern Vec_2BE3A8 beam_rail_b_points[12] __asm__("D_L00_001DC0E0"); -extern Vec_2BE3A8 beam_pulse_positions[3] __asm__("D_L00_001DD0A0"); -extern Vec_2BE3A8 D_L00_00173F60_2BE3A8 __asm__("D_L00_00173E60"); -extern Tab l00_beam_origin_particle_color_palette __asm__("D_L00_001E9AB0"); -extern u8 D_0013E535 NOT_SDA; -extern float D_L00_00161718 __attribute__((sda)); -extern float D_L00_00161720 __attribute__((sda)); -extern float D_L00_00161724 __attribute__((sda)); -extern int D_L00_00161798 __attribute__((sda)); -extern OvlQuad D_L00_001DC060[][20] NOT_SDA; -extern OvlQuad D_L00_001DC1A0[][20] NOT_SDA; +extern int l00_beam_target_bend_after_node_index __asm__("D_L00_001616F4") __attribute__((sda)); +extern float l00_beam_rail_wave_phase_increment __asm__("D_L00_001616F8") __attribute__((sda)); +extern float l00_beam_rail_wave_phase_step_per_node __asm__("D_L00_001616FC") __attribute__((sda)); +extern float D_L00_00161704_gp __asm__("D_L00_00161704") __attribute__((sda)); +extern float l00_beam_ring_start_radius __asm__("D_L00_00161708") __attribute__((sda)); +extern float l00_beam_ring_end_radius __asm__("D_L00_0016170C") __attribute__((sda)); +extern float l00_beam_rail_wave_start_amplitude __asm__("D_L00_0016172C") __attribute__((sda)); +extern float l00_beam_rail_wave_end_amplitude __asm__("D_L00_00161730") __attribute__((sda)); +extern float l00_beam_origin_particle_speed __asm__("D_L00_00161734") __attribute__((sda)); +extern float l00_beam_origin_particle_angular_spread __asm__("D_L00_0016173C") __attribute__((sda)); +extern float l00_beam_origin_particle_basis_offset_length __asm__("D_L00_00161740") + __attribute__((sda)); +extern float l00_beam_pulse_travel_speed __asm__("D_L00_00161748") __attribute__((sda)); +extern int l00_beam_pulse_lifetime_frames __asm__("D_L00_0016174C") __attribute__((sda)); +extern int l00_beam_pulse_alpha_fade_remaining_frames_threshold __asm__("D_L00_00161750") + __attribute__((sda)); +extern float l00_beam_pulse_end_corner_scale __asm__("D_L00_00161758") __attribute__((sda)); +extern float l00_beam_pulse_start_corner_scale __asm__("D_L00_0016175C") __attribute__((sda)); +extern float l00_beam_pulse_alpha_decrement_per_update __asm__("D_L00_00161768") + __attribute__((sda)); +extern signed char D_L00_00161763_macro[] __asm__("D_L00_00161763") MACRO_ADDR; +extern float D_L00_001617CC_macro __asm__("D_L00_001617CC") MACRO_ADDR; +extern int D_L00_00161824_macro __asm__("D_L00_00161824") MACRO_ADDR; +extern float D_0015ED6C_gp __asm__("D_0015ED6C") MACRO_ADDR; +extern int D_L00_001617D8_macro[3] __asm__("D_L00_001617D8") MACRO_ADDR; +extern float D_L00_001618B8_2BE3A8[3] __asm__("D_L00_001617E8") MACRO_ADDR; +extern float D_L00_001617F8_macro[3] __asm__("D_L00_001617F8") MACRO_ADDR; +extern float D_L00_001618D8_2BE3A8[3] __asm__("D_L00_00161808") MACRO_ADDR; +extern int D_L00_001618E8_2BE3A8[3] __asm__("D_L00_00161818") MACRO_ADDR; +extern Vec_2BE3A8 beam_rail_a_points[12] __asm__("D_L00_001DC020"); +extern Vec_2BE3A8 beam_rail_b_points[12] __asm__("D_L00_001DC0E0"); +extern Vec_2BE3A8 beam_pulse_positions[3] __asm__("D_L00_001DD0A0"); +extern Vec_2BE3A8 D_L00_00173F60_2BE3A8 __asm__("D_L00_00173E60"); +extern Tab l00_beam_origin_particle_color_palette __asm__("D_L00_001E9AB0"); +extern u8 D_0013E535 NOT_SDA; +extern float D_L00_00161718 __attribute__((sda)); +extern float D_L00_00161720 __attribute__((sda)); +extern float D_L00_00161724 __attribute__((sda)); +extern int D_L00_00161798 __attribute__((sda)); +extern OvlQuad D_L00_001DC060[][20] NOT_SDA; +extern OvlQuad D_L00_001DC1A0[][20] NOT_SDA; extern int beam_rail_first_pass_base_vertex_color_gp __asm__("D_L00_00161780") __attribute__((sda)); extern int beam_rail_first_pass_texture_index_gp __asm__("D_L00_001617A4") __attribute__((sda)); extern int beam_rail_second_pass_texture_index_gp __asm__("D_L00_001617A8") __attribute__((sda)); @@ -1503,6 +1506,10 @@ void morphoray_update(Moby *moby) __asm__("FUN_L00_002bc7e8"); /* Moby class 185 */ void morphoray_update(Moby *moby) { + enum { + MORPHORAY_STATE_UNINITIALIZED = 0, + MORPHORAY_STATE_INITIALIZED = 1 + }; Vq direction; Vq points[3]; Vq matrix[4]; @@ -1517,8 +1524,8 @@ void morphoray_update(Moby *moby) { busy = 1; } morphoray_state = (struct Ray *)moby->pvars; - if (moby->state == 0) { - moby->state = 1; + if (moby->state == MORPHORAY_STATE_UNINITIALIZED) { + moby->state = MORPHORAY_STATE_INITIALIZED; morphoray_point_light_slot = -1; D_L00_001617C8 = -1; morphoray_light_fade_countdown = 0; @@ -1752,7 +1759,7 @@ void update_beam_ring_rail_and_pulse_effects(struct Moby *moby) { wave_offset.w = 1.0f; wave_offset.x = 0.0f; func_L00_002BE2A0_2BE3A8(); - D_L00_001617D0 = normalize_angle(D_L00_001617D0 + D_L00_001616F8_gp); + D_L00_001617D0 = normalize_angle(D_L00_001617D0 + l00_beam_rail_wave_phase_increment); build_spherical_offset( &aim, D_L00_001617CC_macro, beam_effect_state->f48, beam_effect_state->f4C); if (beam_effect_state->target != 0 && @@ -1786,7 +1793,7 @@ void update_beam_ring_rail_and_pulse_effects(struct Moby *moby) { func_001F9BF0_2BE3A8(&segment, &beam_nodes[i], &beam_nodes[i - 1]); progress = func_001FA888_2BE3A8(i) * D_L00_001616F0_gp; factor = progress * -0.49999997f + 0.9f; - if (D_L00_001616F4_gp < i && beam_effect_state->target != 0) { + if (l00_beam_target_bend_after_node_index < i && beam_effect_state->target != 0) { func_001F9BF0_2BE3A8(&point, &beam_effect_state->target->pos, &beam_nodes[i]); func_L00_001FF4B0_2BE3A8(&point, &point, D_L00_001617CC_macro); func_001F9C08_2BE3A8(&aim, &aim, &point, 0.2f); @@ -1803,8 +1810,9 @@ void update_beam_ring_rail_and_pulse_effects(struct Moby *moby) { func_001F9CA0_2BE3A8(&side, &beam_segment_direction, D_0013F5E0_r); func_L00_001FF4B0_2BE3A8(&side, &side, - D_L00_00161708_gp + - (D_L00_0016170C_gp - D_L00_00161708_gp) * progress); + l00_beam_ring_start_radius + + (l00_beam_ring_end_radius - l00_beam_ring_start_radius) * + progress); { Vec_2BE3A8 ring; Vec_2BE3A8 fwd; @@ -1824,10 +1832,11 @@ void update_beam_ring_rail_and_pulse_effects(struct Moby *moby) { func_L00_001FF4B0_2BE3A8(&fwd, &beam_segment_direction, 1.0f); func_L00_001FF4B0_2BE3A8(&out, &side, 1.0f); func_001F9CA0_2BE3A8(&up, &out, &fwd); - wave_width = D_L00_0016172C_gp; - wave_width = wave_width + (D_L00_00161730_gp - wave_width) * progress; - factor = - normalize_angle(D_L00_001617D0 + D_L00_001616FC_gp * func_001FA888_2BE3A8(i)); + wave_width = l00_beam_rail_wave_start_amplitude; + wave_width = + wave_width + (l00_beam_rail_wave_end_amplitude - wave_width) * progress; + factor = normalize_angle(D_L00_001617D0 + l00_beam_rail_wave_phase_step_per_node * + func_001FA888_2BE3A8(i)); wave_offset.y = wave_width * func_001F9FA8_2BE3A8(factor); wave_width = wave_width * func_001F9F90_2BE3A8(factor); wave_offset.z = wave_width; @@ -1888,10 +1897,12 @@ void update_beam_ring_rail_and_pulse_effects(struct Moby *moby) { 0.003f); } func_001F9BF0_2BE3A8(&beam_segment_direction, &beam_nodes[1], &beam_nodes[0]); - func_L00_001FF4B0_2BE3A8( - &beam_segment_direction, &beam_segment_direction, D_L00_00161734_gp * frame_scale); + func_L00_001FF4B0_2BE3A8(&beam_segment_direction, + &beam_segment_direction, + l00_beam_origin_particle_speed * frame_scale); if (random_integer_below(2) == 0) { - func_L00_001FF4B0_2BE3A8(&side, &moby->rot_row1, D_L00_00161740_gp); + func_L00_001FF4B0_2BE3A8( + &side, &moby->rot_row1, l00_beam_origin_particle_basis_offset_length); func_001F9BD8_2BE3A8(&point, &beam_nodes[0], &side); { Tab colors; @@ -1900,13 +1911,15 @@ void update_beam_ring_rail_and_pulse_effects(struct Moby *moby) { colors = l00_beam_origin_particle_color_palette; color = colors.c[random_integer_below(5)]; - wave_width = randf_sym(0.0f, D_L00_0016173C_gp); - build_look_at_matrix( - &out, &beam_segment_direction, D_0013F5E0_r, randf_sym(0.0f, D_L00_0016173C_gp)); + wave_width = randf_sym(0.0f, l00_beam_origin_particle_angular_spread); + build_look_at_matrix(&out, + &beam_segment_direction, + D_0013F5E0_r, + randf_sym(0.0f, l00_beam_origin_particle_angular_spread)); func_001F9CA0_2BE3A8(&up, &beam_segment_direction, D_0013F5E0_r); build_look_at_matrix(&out, &out, &up, wave_width); - node_index = - func_001FA898_2BE3A8(beam_length * 1.2f / (D_L00_00161734_gp * frame_scale)); + node_index = func_001FA898_2BE3A8(beam_length * 1.2f / + (l00_beam_origin_particle_speed * frame_scale)); if (beam_effect_state->target != 0) { node_index = node_index * 3; } @@ -1935,9 +1948,9 @@ void update_beam_ring_rail_and_pulse_effects(struct Moby *moby) { for (slot = 0; slot < 3; slot++) { if (D_L00_001618E8_2BE3A8[slot] == 0) { D_L00_001618E8_2BE3A8[slot] = 1; - D_L00_001617D8_macro[slot] = func_001F9850_2BE3A8(D_L00_0016174C_gp); + D_L00_001617D8_macro[slot] = func_001F9850_2BE3A8(l00_beam_pulse_lifetime_frames); D_L00_001617F8_macro[slot] = 0.0f; - D_L00_001618D8_2BE3A8[slot] = D_L00_0016175C_gp; + D_L00_001618D8_2BE3A8[slot] = l00_beam_pulse_start_corner_scale; D_L00_001618B8_2BE3A8[slot] = func_001FA888_2BE3A8(D_L00_00161763_macro[0]); qcopy(&beam_pulse_positions[slot], beam_effect_state); func_001F9BF0_2BE3A8(&side, &beam_nodes[1], &beam_nodes[0]); @@ -1962,10 +1975,11 @@ void update_beam_ring_rail_and_pulse_effects(struct Moby *moby) { D_L00_001618E8_2BE3A8[pulse] = 0; continue; } - if (D_L00_001617D8_macro[pulse] < D_L00_00161750_gp) { - D_L00_001618B8_2BE3A8[pulse] = D_L00_001618B8_2BE3A8[pulse] - D_L00_00161768_gp; + if (D_L00_001617D8_macro[pulse] < l00_beam_pulse_alpha_fade_remaining_frames_threshold) { + D_L00_001618B8_2BE3A8[pulse] = + D_L00_001618B8_2BE3A8[pulse] - l00_beam_pulse_alpha_decrement_per_update; } - dt = D_L00_00161748_gp * D_0015ED6C_gp; + dt = l00_beam_pulse_travel_speed * D_0015ED6C_gp; travelled = D_L00_001617F8_macro[pulse] + dt; max_length = D_L00_001616DC_gp; ratio = travelled / max_length; @@ -1974,7 +1988,8 @@ void update_beam_ring_rail_and_pulse_effects(struct Moby *moby) { ratio = 1.0f; } D_L00_001618D8_2BE3A8[pulse] = - D_L00_0016175C_gp + (D_L00_00161758_gp - D_L00_0016175C_gp) * ratio; + l00_beam_pulse_start_corner_scale + + (l00_beam_pulse_end_corner_scale - l00_beam_pulse_start_corner_scale) * ratio; if (max_length <= travelled) { func_001F9C30_2BE3A8(&side, &beam_pulse_directions[pulse], dt); func_001F9BD8_2BE3A8(&beam_pulse_positions[pulse], &beam_pulse_positions[pulse], &side); diff --git a/src/overlays/shared/weapons/morphoray_chicken.c b/src/overlays/shared/weapons/morphoray_chicken.c index 375024ee68..d19e853076 100644 --- a/src/overlays/shared/weapons/morphoray_chicken.c +++ b/src/overlays/shared/weapons/morphoray_chicken.c @@ -17,6 +17,15 @@ #include "rnc/overlay/shared/math/random/random_int_between.h" #include "rnc/math/fast_math.h" +enum { + CHICKEN_STATE_INITIALIZE = 0, + CHICKEN_STATE_IDLE = 1, + CHICKEN_STATE_TURN_AWAY_FROM_HERO = 2, + CHICKEN_STATE_FLEE_FROM_HERO = 3, + CHICKEN_STATE_CLOSE_RANGE_FLEE_FROM_HERO = 4, + CHICKEN_STATE_EMIT_FEATHERS = 5 +}; + typedef union { u128 q; f32 f[4]; @@ -174,20 +183,21 @@ void spawn_explosion(char *m, extern void send_blast_hits(void *, void *, void *, int, int, int, int, int, float, float, float) __asm__("FUN_L00_0025a9f8"); unsigned char *spawn_feather_moby(int unused, void *pos, float *vel) __asm__("FUN_L00_002cbf68"); -extern int FUN_L00_00258490(void *, void *, void *, int, float, float, float, float); -extern void FUN_L00_00258278(void *, float *, float, float, float, float); -extern float FUN_L00_00259710(void *); -extern int FUN_L00_002dc9f0(void *, void *); -extern float D_L00_0015F5D0; -extern float D_L00_0015F5D4; -extern int chicken_manipulator_joint __asm__("D_L00_00161850") __attribute__((sda)); -float feather_pitch_deg __asm__("D_L00_00161858") = 7e+01f; -float feather_speed_min __asm__("D_L00_0016185C") = 5.0f; -float feather_speed_max __asm__("D_L00_00161860") = 9.0f; -float feather_height __asm__("D_L00_00161864") = 0.25f; -float feather_radius_min __asm__("D_L00_00161868") = 0; -float feather_radius_max __asm__("D_L00_0016186C") = 0.35f; -extern char D_L00_00177F00[]; +extern int move_moby_xy_with_collision_constraints( + void *, void *, void *, int, float, float, float, float) __asm__("FUN_L00_00258490"); +extern void FUN_L00_00258278(void *, float *, float, float, float, float); +extern float FUN_L00_00259710(void *); +extern int FUN_L00_002dc9f0(void *, void *); +extern float D_L00_0015F5D0; +extern float D_L00_0015F5D4; +extern int chicken_manipulator_joint __asm__("D_L00_00161850") __attribute__((sda)); +float feather_pitch_deg __asm__("D_L00_00161858") = 7e+01f; +float feather_speed_min __asm__("D_L00_0016185C") = 5.0f; +float feather_speed_max __asm__("D_L00_00161860") = 9.0f; +float feather_height __asm__("D_L00_00161864") = 0.25f; +float feather_radius_min __asm__("D_L00_00161868") = 0; +float feather_radius_max __asm__("D_L00_0016186C") = 0.35f; +extern char D_L00_00177F00[]; extern int process_moby_suck_cannon_suction(void *) __asm__("FUN_L00_002db8f8"); @@ -233,6 +243,10 @@ void reset_morphoray_chicken_slot_defaults(char *morphoray_chicken_slot_record) struct Moby *spawn_morphoray_chicken(State *source_state) __asm__("FUN_L00_002c9348"); struct Moby *spawn_morphoray_chicken(State *source_state) { + enum { + MOBY_STATE_NON_SPAWN_POOL_REMOVAL = 0xFD, + MOBY_STATE_SPAWN_POOL_REMOVAL = 0xFE + }; struct Moby *spawned_moby; Sub *moby_vars; Loc loc; @@ -285,7 +299,7 @@ struct Moby *spawn_morphoray_chicken(State *source_state) { } spawned_moby->collision = ((Part *)spawned_moby->pclass)->unk10; allocate_voice_for_target_entry(1, 0, spawned_moby); - spawned_moby->state = 1; + spawned_moby->state = CHICKEN_STATE_IDLE; moby_vars->unk66 = 0; moby_vars->unk64 = FUN_L00_00257b90(scale_game_frames(0x78), scale_game_frames(0x12C)); ground_height_pitch_and_variant_scratch = convert_integer_to_float(D_0013E520[0x15]); @@ -311,8 +325,9 @@ struct Moby *spawn_morphoray_chicken(State *source_state) { fill_transfer_words(moby_vars, 0, 0x20); previous_slot_moby = D_L00_001DD100[D_L00_00161854]; if (previous_slot_moby != NULL && previous_slot_moby->oclass == 0x10E && - previous_slot_moby->state != 0xFE && previous_slot_moby->state != 0xFD) { - if (previous_slot_moby->state == 5) { + previous_slot_moby->state != MOBY_STATE_SPAWN_POOL_REMOVAL && + previous_slot_moby->state != MOBY_STATE_NON_SPAWN_POOL_REMOVAL) { + if (previous_slot_moby->state == CHICKEN_STATE_EMIT_FEATHERS) { moby_vars->unk78 = yaw_cosine_scratch; spawned_moby->flags &= ~0x20; } else if (!moby_vars->unk74) { @@ -350,12 +365,7 @@ void morphoray_chicken_update(Moby *chicken_moby) __asm__("FUN_L00_002c97e0"); /* Moby class 270 */ void morphoray_chicken_update(Moby *chicken_moby) { enum { - CHICKEN_STATE_INITIALIZE = 0, - CHICKEN_STATE_IDLE = 1, - CHICKEN_STATE_TURN_AWAY_FROM_HERO = 2, - CHICKEN_STATE_FLEE_FROM_HERO = 3, - CHICKEN_STATE_CLOSE_RANGE_FLEE_FROM_HERO = 4, - CHICKEN_STATE_EMIT_FEATHERS = 5 + CHICKEN_STATE_DEAD = 6 }; Vec4A next_pos; Vec4A ahead; @@ -381,15 +391,15 @@ void morphoray_chicken_update(Moby *chicken_moby) { anim_speed = chicken_moby->anim_speed; flee_angle = fast_arc_tan(chicken_moby->pos.x - player->motion.pos.f[0], chicken_moby->pos.y - player->motion.pos.f[1]); - if (chicken_moby->state == 0) { - chicken_moby->state = 1; + if (chicken_moby->state == CHICKEN_STATE_INITIALIZE) { + chicken_moby->state = CHICKEN_STATE_IDLE; chicken_vars->flee_timer = 0; chicken_vars->expire_timer = -1; chicken_vars->sound_timer = random_int_between(scale_game_frames(0x78), scale_game_frames(0x12C)); chicken_vars->health = 1.0f; } - if (chicken_moby->state == 6) { + if (chicken_moby->state == CHICKEN_STATE_DEAD) { return; } if (D_0013E520[0x15] != 0) { @@ -521,7 +531,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { chicken_moby->collision = 0; chicken_moby->flags = (chicken_moby->flags & 0xEFFF) | 0x41; chicken_vars->gold = 0; - chicken_moby->state = 6; + chicken_moby->state = CHICKEN_STATE_DEAD; chicken_moby->command = 0; return; } @@ -549,7 +559,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { ahead.y = fast_sin(chicken_moby->rot.z) * frame_time * size; ahead.z = 0.0f; fast_vec_add(&ahead, &ahead, &next_pos); - path_clear = FUN_L00_00258490( + path_clear = move_moby_xy_with_collision_constraints( chicken_moby, &next_pos, &ahead, 0, size * 0.2f, size * 0.5f, speed, 0.2617994f); if (path_clear != 0 || (fast_difference_between_rotations(chicken_moby->rot.z, @@ -557,7 +567,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { next_pos.y - chicken_moby->pos.y)) < 1.5707964f && fast_vec_dist(&chicken_moby->pos, &next_pos) > size * 0.01f)) { - chicken_moby->state = 3; + chicken_moby->state = CHICKEN_STATE_FLEE_FROM_HERO; blend_moby_animation(chicken_moby, 3, 0, scale_game_frames(10)); } else { chicken_vars->flee_timer = @@ -566,12 +576,12 @@ void morphoray_chicken_update(Moby *chicken_moby) { } else if (vector_distance_xy(&chicken_moby->pos, &hero.motion.pos) < size * 5.0f && 0.5235988f < fast_difference_between_rotations(flee_angle, chicken_moby->rot.z)) { - FUN_L00_00258490( + move_moby_xy_with_collision_constraints( chicken_moby, &next_pos, &next_pos, 0, size * 0.2f, size * 0.5f, speed, 0.2617994f); - chicken_moby->state = 2; + chicken_moby->state = CHICKEN_STATE_TURN_AWAY_FROM_HERO; blend_moby_animation(chicken_moby, 3, 0, scale_game_frames(10)); } else { - FUN_L00_00258490( + move_moby_xy_with_collision_constraints( chicken_moby, &next_pos, &next_pos, 0, size * 0.2f, size * 0.5f, speed, 0.2617994f); } break; @@ -582,7 +592,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { frame_time_sq * 0.7853982f, frame_time_sq * 1.5707964f, frame_time * 0.7853982f); - FUN_L00_00258490( + move_moby_xy_with_collision_constraints( chicken_moby, &next_pos, &next_pos, 0, size * 0.2f, size * 0.5f, speed, 0.2617994f); if (fast_dec_timer_s16(&chicken_vars->flee_timer) != 0 && vector_distance_xy(&chicken_moby->pos, &hero.motion.pos) < size * 5.0f) { @@ -592,13 +602,13 @@ void morphoray_chicken_update(Moby *chicken_moby) { fast_vec_add(&ahead, &ahead, &next_pos); if (absolute_float(probe_ground_height(&ahead, 0, 0.5f) - ahead.z) <= (frame_time + frame_time) * size) { - chicken_moby->state = 3; + chicken_moby->state = CHICKEN_STATE_FLEE_FROM_HERO; blend_moby_animation(chicken_moby, 3, 0, scale_game_frames(10)); } } else if (fast_difference_between_rotations(flee_angle, chicken_moby->rot.z) < 0.08726646f || vector_distance_xy(&chicken_moby->pos, &hero.motion.pos) > size * 6.0f) { - chicken_moby->state = 1; + chicken_moby->state = CHICKEN_STATE_IDLE; chicken_vars->flee_timer = random_int_between(scale_game_frames(0x3C), scale_game_frames(0xB4)); blend_moby_animation( @@ -607,12 +617,12 @@ void morphoray_chicken_update(Moby *chicken_moby) { break; case CHICKEN_STATE_FLEE_FROM_HERO: if (vector_distance_xy(&chicken_moby->pos, &hero.motion.pos) > size * 6.0f) { - chicken_moby->state = 1; + chicken_moby->state = CHICKEN_STATE_IDLE; chicken_vars->flee_timer = random_int_between(scale_game_frames(0x3C), scale_game_frames(0xB4)); blend_moby_animation( chicken_moby, random_integer_below(2) == 0, 0, scale_game_frames(5)); - FUN_L00_00258490( + move_moby_xy_with_collision_constraints( chicken_moby, &next_pos, &next_pos, 0, size * 0.2f, size * 0.5f, speed, 0.2617994f); } else if (vector_distance_xy(&chicken_moby->pos, &hero.motion.pos) < size * 3.0f) { FUN_L00_00258278(chicken_moby, @@ -625,7 +635,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { ahead.y = fast_sin(chicken_moby->rot.z) * (frame_time + frame_time); ahead.z = 0.0f; fast_vec_add(&ahead, &ahead, &next_pos); - path_clear = FUN_L00_00258490( + path_clear = move_moby_xy_with_collision_constraints( chicken_moby, &next_pos, &ahead, 0, size * 0.2f, size * 0.5f, speed, 0.2617994f); if (path_clear == 0 && (1.5707964f < fast_difference_between_rotations( @@ -633,13 +643,13 @@ void morphoray_chicken_update(Moby *chicken_moby) { fast_arc_tan(next_pos.x - chicken_moby->pos.x, next_pos.y - chicken_moby->pos.y)) || fast_vec_dist(&chicken_moby->pos, &next_pos) < size * 0.01f)) { - chicken_moby->state = 1; + chicken_moby->state = CHICKEN_STATE_IDLE; chicken_vars->flee_timer = random_int_between(scale_game_frames(0x3C), scale_game_frames(0xB4)); blend_moby_animation( chicken_moby, random_integer_below(2) == 0, 0, scale_game_frames(5)); } else { - chicken_moby->state = 4; + chicken_moby->state = CHICKEN_STATE_CLOSE_RANGE_FLEE_FROM_HERO; blend_moby_animation(chicken_moby, 2, 0, scale_game_frames(10)); } } else { @@ -653,7 +663,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { ahead.y = fast_sin(chicken_moby->rot.z) * frame_time * size; ahead.z = 0.0f; fast_vec_add(&ahead, &ahead, &next_pos); - path_clear = FUN_L00_00258490( + path_clear = move_moby_xy_with_collision_constraints( chicken_moby, &next_pos, &ahead, 0, size * 0.2f, size * 0.5f, speed, 0.2617994f); if (path_clear == 0 && (1.5707964f < fast_difference_between_rotations( @@ -661,7 +671,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { fast_arc_tan(next_pos.x - chicken_moby->pos.x, next_pos.y - chicken_moby->pos.y)) || fast_vec_dist(&chicken_moby->pos, &next_pos) < size * 0.01f)) { - chicken_moby->state = 1; + chicken_moby->state = CHICKEN_STATE_IDLE; chicken_vars->flee_timer = random_int_between(scale_game_frames(0x3C), scale_game_frames(0xB4)); blend_moby_animation( @@ -682,7 +692,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { ahead.y = fast_sin(chicken_moby->rot.z) * frame_time * size; ahead.z = 0.0f; fast_vec_add(&ahead, &ahead, &next_pos); - path_clear = FUN_L00_00258490( + path_clear = move_moby_xy_with_collision_constraints( chicken_moby, &next_pos, &ahead, 0, size * 0.2f, size * 0.5f, speed, 0.2617994f); if (path_clear == 0 && (1.5707964f < fast_difference_between_rotations( @@ -690,13 +700,13 @@ void morphoray_chicken_update(Moby *chicken_moby) { fast_arc_tan(next_pos.x - chicken_moby->pos.x, next_pos.y - chicken_moby->pos.y)) || fast_vec_dist(&chicken_moby->pos, &next_pos) < size * 0.01f)) { - chicken_moby->state = 1; + chicken_moby->state = CHICKEN_STATE_IDLE; chicken_vars->flee_timer = random_int_between(scale_game_frames(0x3C), scale_game_frames(0xB4)); blend_moby_animation( chicken_moby, random_integer_below(2) == 0, 0, scale_game_frames(5)); } else { - chicken_moby->state = 3; + chicken_moby->state = CHICKEN_STATE_FLEE_FROM_HERO; blend_moby_animation(chicken_moby, 3, 0, scale_game_frames(10)); } } else { @@ -710,7 +720,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { ahead.y = fast_sin(chicken_moby->rot.z) * (frame_time + frame_time) * size; ahead.z = 0.0f; fast_vec_add(&ahead, &ahead, &next_pos); - path_clear = FUN_L00_00258490( + path_clear = move_moby_xy_with_collision_constraints( chicken_moby, &next_pos, &ahead, 0, size * 0.2f, size * 0.5f, speed, 0.2617994f); if (path_clear == 0 && (1.5707964f < fast_difference_between_rotations( @@ -718,7 +728,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { fast_arc_tan(next_pos.x - chicken_moby->pos.x, next_pos.y - chicken_moby->pos.y)) || fast_vec_dist(&chicken_moby->pos, &next_pos) < size * 0.01f)) { - chicken_moby->state = 1; + chicken_moby->state = CHICKEN_STATE_IDLE; chicken_vars->flee_timer = random_int_between(scale_game_frames(0x3C), scale_game_frames(0xB4)); blend_moby_animation( @@ -728,7 +738,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { break; case CHICKEN_STATE_EMIT_FEATHERS: if (FUN_L00_002dc9f0(chicken_moby, chicken_vars->unk10) != 0) { - chicken_moby->state = 0; + chicken_moby->state = CHICKEN_STATE_INITIALIZE; *(short *)(chicken_vars->unk14 + 0x68) = 0; } if (random_integer_below(4) != 0) { @@ -782,7 +792,7 @@ void morphoray_chicken_update(Moby *chicken_moby) { if (collision_hit_material() == 0) { chicken_vars->health = 0.0f; } - if (chicken_moby->state != 5) { + if (chicken_moby->state != CHICKEN_STATE_EMIT_FEATHERS) { float pitch; float roll; chicken_moby->pos.z = coll_hit.point.f[2]; @@ -817,10 +827,10 @@ int moby_set_state_from_check(struct Moby *a) __asm__("FUN_L00_002cadc0"); int moby_set_state_from_check(struct Moby *checked_moby) { int suction_result = process_moby_suck_cannon_suction(checked_moby); if (suction_result == 0) { - if (checked_moby->state == 5) - checked_moby->state = 1; + if (checked_moby->state == CHICKEN_STATE_EMIT_FEATHERS) + checked_moby->state = CHICKEN_STATE_IDLE; } else { - checked_moby->state = 5; + checked_moby->state = CHICKEN_STATE_EMIT_FEATHERS; } return suction_result; } @@ -842,9 +852,9 @@ int launch_suck_cannon_projectile_and_update_moby_state(struct Moby *moby, int projectile_launch_result = launch_suck_cannon_projectile( moby, launch_vector_address, target_moby, target_height_offset); if (projectile_launch_result != 0) { - moby->state = 5; + moby->state = CHICKEN_STATE_EMIT_FEATHERS; } else if ((unsigned char)((char)moby->state) == 5) { - moby->state = 1; + moby->state = CHICKEN_STATE_IDLE; } if (*(short *)(class_callback_data + 0x68) == 6) { allocate_voice_for_target_entry(1, 0, moby); @@ -866,7 +876,9 @@ int cancel_suck_cannon_suction_and_set_moby_state_5(struct Moby *moby) { /* Returns the word at +0x14 of the moby data, or 0 when either pointer is null. */ -s32 FUN_L00_002caf40(s32 moby_address) { +s32 get_morphoray_chicken_slot_record(s32 moby_address) __asm__("FUN_L00_002caf40"); + +s32 get_morphoray_chicken_slot_record(s32 moby_address) { s32 moby_vars_address; if (moby_address != 0) { moby_vars_address = *(s32 *)((u8 *)moby_address + 0x78); diff --git a/src/overlays/shared/weapons/pyrocitor.c b/src/overlays/shared/weapons/pyrocitor.c index 55ff660c9a..6019a58bb8 100644 --- a/src/overlays/shared/weapons/pyrocitor.c +++ b/src/overlays/shared/weapons/pyrocitor.c @@ -19,6 +19,14 @@ #include "rnc/overlay/shared/weapons/devastator.h" /* Ported from rac1-decomp (nonmatching/shared/func_L00_002B8AE8.c: func_L00_002B8AE8). */ +enum { + PYROCITOR_STATE_INITIALIZE = 0, + PYROCITOR_STATE_WAIT_FOR_READY = 1, + PYROCITOR_STATE_READY = 2, + PYROCITOR_STATE_FIRING = 3, + PYROCITOR_STATE_CLEANUP = 4 +}; + typedef struct PyrocitorVars { struct Moby *other; char pad4[0x40]; @@ -518,12 +526,6 @@ void pyrocitor_update(struct Moby *moby) __asm__("FUN_L00_002b77f0"); /* Moby class 176 */ void pyrocitor_update(struct Moby *moby) { - enum { - PYROCITOR_STATE_INITIALIZE = 0, - PYROCITOR_STATE_WAIT_FOR_READY = 1, - PYROCITOR_STATE_READY = 2, - PYROCITOR_STATE_FIRING = 3 - }; PyrocitorVars *pyrocitor_vars = (PyrocitorVars *)moby->pvars; Vec_2b2100 pos, light_offset_and_flame_velocity, light_color_and_flame_origin, endpoint, particle_pos, random_vec; @@ -544,11 +546,11 @@ void pyrocitor_update(struct Moby *moby) { case PYROCITOR_STATE_INITIALIZE: pyrocitor_vars->light = -1; pyrocitor_vars->voice = -1; - moby->state = 1; + moby->state = PYROCITOR_STATE_WAIT_FOR_READY; break; case PYROCITOR_STATE_WAIT_FOR_READY: if (moby->seq == 1) - moby->state = 2; + moby->state = PYROCITOR_STATE_READY; if (moby->seq != 0) break; if (compute_interpolated_record_value(moby) > 10.0f && @@ -580,7 +582,7 @@ void pyrocitor_update(struct Moby *moby) { /* Fakematch: the second pad name rebuilds the address for these button tests. */ if ((controller_state_lui.held & hero.items[0].button_mask) && !hero.item_use_locked && get_ammo(-1)) { - moby->state = 3; + moby->state = PYROCITOR_STATE_FIRING; start_equipped_item_animation(); pyrocitor_vars->timer = scale_game_frames(10); if (pyrocitor_vars->light == -1) @@ -592,7 +594,7 @@ void pyrocitor_update(struct Moby *moby) { case PYROCITOR_STATE_FIRING: if (!voice_is_playing(moby, pyrocitor_vars->voice)) pyrocitor_vars->voice = FUN_0022da68(1, 4, moby); - if (pyrocitor_vars->light != -1 && moby->state == 3) { + if (pyrocitor_vars->light != -1 && moby->state == PYROCITOR_STATE_FIRING) { light_offset_and_flame_velocity.q = 0; light_offset_and_flame_velocity.f.x = 2.0f; light_offset_and_flame_velocity.f.z = 2.0f; @@ -714,7 +716,7 @@ void pyrocitor_update(struct Moby *moby) { if ((controller_state.held & hero.items[0].button_mask) && !hero.item_use_locked && ready) break; - moby->state = 2; + moby->state = PYROCITOR_STATE_READY; cancel_hero_item_animation(); firing_voice_slot_index = pyrocitor_vars->voice; if (firing_voice_slot_index != -1) { @@ -747,7 +749,7 @@ void update_pyrocitor_usage_and_cleanup(struct Moby *pyrocitor_moby) { unsigned char *voice; int voice_slot_or_time_stat, firing_frame_count; if (pyrocitor_moby->prev_seq == 2) { - pyrocitor_moby->state = 4; + pyrocitor_moby->state = PYROCITOR_STATE_CLEANUP; if (*(void **)pyrocitor_vars) mark_moby_for_removal(*(void **)pyrocitor_vars); if (*(short *)(pyrocitor_vars + 0x44) != -1) { @@ -768,7 +770,7 @@ void update_pyrocitor_usage_and_cleanup(struct Moby *pyrocitor_moby) { P = &usage_stats; if (P->stat[10].count) return; - if (pyrocitor_moby->state == 3) { + if (pyrocitor_moby->state == PYROCITOR_STATE_FIRING) { (*(unsigned short *)(pyrocitor_vars + 0x50))++; return; } @@ -796,6 +798,12 @@ void update_pyrocitor_usage_and_cleanup(struct Moby *pyrocitor_moby) { void update_pyrocitor_flame_effect_slots(char *moby) __asm__("FUN_L00_002b8438"); void update_pyrocitor_flame_effect_slots(char *moby) { + enum { + PYROCITOR_FLAME_SUBTYPE_SPARK_BURST = 10 + }; + enum { + PYROCITOR_FLAME_MIN_TRACKED_FRAME_COUNT = 2 + }; float hit_direction_vector[4]; char hit_descriptor[0x30]; char qv[16]; @@ -828,7 +836,7 @@ void update_pyrocitor_flame_effect_slots(char *moby) { collect_mobies_in_sphere( (flame_effect + 0x10), hit_sphere_radius, 0, moby, hit_descriptor); sub_type = *(short *)(flame_effect + 0xA); - if (sub_type == 10) { + if (sub_type == PYROCITOR_FLAME_SUBTYPE_SPARK_BURST) { int j; for (j = 0; j < *(int *)&pyrocitor_spark_burst_count_gp; j++) { int spark_initial_color; @@ -872,7 +880,7 @@ void update_pyrocitor_flame_effect_slots(char *moby) { spark_third_frame_count, *(int *)&pyrocitor_spark_lookup_index_and_flags_gp); } - } else if (sub_type < 2) { + } else if (sub_type < PYROCITOR_FLAME_MIN_TRACKED_FRAME_COUNT) { *(int *)(slots_base - (-(i * 4))) = 0; } } else { diff --git a/src/overlays/shared/weapons/ryno.c b/src/overlays/shared/weapons/ryno.c index b7e5f9790a..ed9f13de08 100644 --- a/src/overlays/shared/weapons/ryno.c +++ b/src/overlays/shared/weapons/ryno.c @@ -285,12 +285,12 @@ void ryno_update(struct Moby *ryno_moby) { case RYNO_STATE_INITIALIZE: ryno_vars->target = 0; hero.items[0].switch_lock = 0; - ryno_moby->state = 1; + ryno_moby->state = RYNO_STATE_WAIT_ANIMATION; ryno_vars->track_timer = 0; break; case RYNO_STATE_WAIT_ANIMATION: if (ryno_moby->anim_flags & 2) - ryno_moby->state = 2; + ryno_moby->state = RYNO_STATE_READY_TO_FIRE; break; case RYNO_STATE_READY_TO_FIRE: if (hero.state.current == 1) @@ -312,7 +312,7 @@ void ryno_update(struct Moby *ryno_moby) { s->stat[23].level_mask = s->stat[23].level_mask | (1 << D_0015ED84) | 0x80000000; } hero.items[0].switch_lock = 2; - ryno_moby->state = 4; + ryno_moby->state = RYNO_STATE_FIRE_SALVO; ryno_vars->shot_timer = 0; ryno_vars->slot = 0; ryno_vars->shots = 0; @@ -327,7 +327,7 @@ void ryno_update(struct Moby *ryno_moby) { case RYNO_STATE_READY_TO_FIRE_WITH_RETICLE: suck_draw_reticle(ryno_moby, 0xFF0F0FFF, 1.0f, 0.0f, 0, 0x23, -1, 90.0f, 4); if ((controller_state.held & 5) == 0) { - ryno_moby->state = 2; + ryno_moby->state = RYNO_STATE_READY_TO_FIRE; return; } if ((controller_state.pressed & hero.items[0].button_mask) == 0) @@ -347,7 +347,7 @@ void ryno_update(struct Moby *ryno_moby) { s->stat[23].level_mask = s->stat[23].level_mask | (1 << D_0015ED84) | 0x80000000; } hero.items[0].switch_lock = 2; - ryno_moby->state = 4; + ryno_moby->state = RYNO_STATE_FIRE_SALVO; ryno_vars->shot_timer = 0; ryno_vars->slot = 0; ryno_vars->shots = 0; @@ -396,7 +396,7 @@ void ryno_update(struct Moby *ryno_moby) { if (ryno_vars->shots >= 7) { hero.items[0].switch_lock = 0; cancel_hero_item_animation(); - ryno_moby->state = 5; + ryno_moby->state = RYNO_STATE_COOLDOWN; ryno_vars->shot_timer = scale_game_frames(60); ryno_vars->track_timer = scale_game_frames(60); } @@ -433,7 +433,7 @@ void ryno_update(struct Moby *ryno_moby) { return; ryno_vars->shots = 0; ryno_vars->target = 0; - ryno_moby->state = 2; + ryno_moby->state = RYNO_STATE_READY_TO_FIRE; break; case 6: case 7: diff --git a/src/overlays/shared/weapons/suckcannon.c b/src/overlays/shared/weapons/suckcannon.c index cecdd74703..579a8eb411 100644 --- a/src/overlays/shared/weapons/suckcannon.c +++ b/src/overlays/shared/weapons/suckcannon.c @@ -604,13 +604,13 @@ extern E04 D_L00_001E4C80[]; extern char D_L00_00161B60[] MACRO_ADDR; extern char D_L00_00161B70[] MACRO_ADDR; extern char D_L00_00166FD0[]; -extern char D_L00_001E5F30[]; +extern char l00_suck_beam_previous_segment_positions[] __asm__("D_L00_001E5F30"); extern char D_L00_001E5F40[]; extern float D_L00_00161B80 MACRO_ADDR; extern float D_L00_00161B84 MACRO_ADDR; extern int suck_beam_reset_pending __asm__("D_L00_00161B40") __attribute__((sda)); extern int suck_beam_particles_reset_pending __asm__("D_L00_00161B44") __attribute__((sda)); -extern int D_L00_00161B54 __attribute__((sda)); +extern int l00_suck_beam_step_blend_elapsed_frames __asm__("D_L00_00161B54") __attribute__((sda)); extern int suck_beam_wave_phase __asm__("D_L00_00161B58") __attribute__((sda)); extern short D_L00_001E6008[]; extern V41 l00_suck_beam_ring_source_offsets[] __asm__("D_L00_001E4B40"); @@ -1418,6 +1418,9 @@ void suckcannon_update(SuckMoby *suck_cannon_moby) { SUCKCANNON_STATE_LOADED_AIM = 4, SUCKCANNON_STATE_FIRE_STORED_MOBY = 5 }; + enum { + SUCKCANNON_ANIMATION_SUCTION_LOOP = 3 + }; SuckWork aim_and_fire_scratch; SuckCannon *cannon; SuckStats *stats; @@ -1433,7 +1436,8 @@ void suckcannon_update(SuckMoby *suck_cannon_moby) { 5); cannon = suck_cannon_moby->data; slot_released = ((SuckHero *)&hero)->slot_state == 3; - if ((u8)suck_cannon_moby->state != 3 && (u8)suck_cannon_moby->state != 0) + if ((u8)suck_cannon_moby->state != SUCKCANNON_STATE_SUCTION_ACTIVE && + (u8)suck_cannon_moby->state != SUCKCANNON_STATE_INITIALIZE) suck_beam_queue_draw((int)suck_cannon_moby); refresh_suck_cannon_slots(); switch ((u8)suck_cannon_moby->state) { @@ -1448,10 +1452,10 @@ void suckcannon_update(SuckMoby *suck_cannon_moby) { if (((SuckHero *)&hero)->count > 0) { cannon->blocked = 1; blend_moby_animation(suck_cannon_moby, 6, 0, scale_game_frames(4)); - suck_cannon_moby->state = 4; + suck_cannon_moby->state = SUCKCANNON_STATE_LOADED_AIM; } else { cannon->cooldown = 0; - suck_cannon_moby->state = 1; + suck_cannon_moby->state = SUCKCANNON_STATE_EMPTY_IDLE; } suck_reset(suck_cannon_moby); break; @@ -1463,7 +1467,7 @@ void suckcannon_update(SuckMoby *suck_cannon_moby) { cancel_hero_item_animation(); if (((SuckHero *)&hero)->count > 0) { blend_moby_animation(suck_cannon_moby, 6, 0, scale_game_frames(4)); - suck_cannon_moby->state = 4; + suck_cannon_moby->state = SUCKCANNON_STATE_LOADED_AIM; break; } if ((controller_state.held & ((SuckHero *)&hero)->fire_buttons) && cannon->cooldown == 0 && @@ -1479,7 +1483,7 @@ void suckcannon_update(SuckMoby *suck_cannon_moby) { if (scale_game_frames(D_0015EEA4) / 600 > stats->longest) stats->longest = scale_game_frames(D_0015EEA4) / 600; stats->level_mask = (stats->level_mask | (1 << current_level_index)) | 0x80000000; - suck_cannon_moby->state = 2; + suck_cannon_moby->state = SUCKCANNON_STATE_SUCTION_STARTUP; } break; case SUCKCANNON_STATE_SUCTION_STARTUP: @@ -1498,22 +1502,22 @@ void suckcannon_update(SuckMoby *suck_cannon_moby) { ((SuckHero *)&hero)->firing = 0; if (((SuckHero *)&hero)->count > 0) { blend_moby_animation(suck_cannon_moby, 6, 0, scale_game_frames(4)); - next_state = 4; + next_state = SUCKCANNON_STATE_LOADED_AIM; goto changed; } else { cannon->cooldown = 0; blend_moby_animation(suck_cannon_moby, 1, 0, scale_game_frames(4)); - next_state = 1; + next_state = SUCKCANNON_STATE_EMPTY_IDLE; goto changed; } } else if (fast_dec_timer(&cannon->cooldown)) { cannon->cooldown = scale_game_frames(20); - next_state = 3; + next_state = SUCKCANNON_STATE_SUCTION_ACTIVE; goto changed; } break; case SUCKCANNON_STATE_SUCTION_ACTIVE: - if (suck_cannon_moby->anim_state != 3 && + if (suck_cannon_moby->anim_state != SUCKCANNON_ANIMATION_SUCTION_LOOP && (suck_cannon_moby->anim_state != 0 || (suck_cannon_moby->anim_flags & 2))) blend_moby_animation(suck_cannon_moby, 3, 0, scale_game_frames(5)); fast_dec_timer(&cannon->cooldown); @@ -1536,12 +1540,12 @@ void suckcannon_update(SuckMoby *suck_cannon_moby) { blend_moby_animation(suck_cannon_moby, 6, 0, scale_game_frames(4)); cannon->cooldown = 0; cannon->blocked = 1; - suck_cannon_moby->state = 4; + suck_cannon_moby->state = SUCKCANNON_STATE_LOADED_AIM; goto done; } else { cannon->cooldown = 0; blend_moby_animation(suck_cannon_moby, 1, 0, scale_game_frames(4)); - suck_cannon_moby->state = 1; + suck_cannon_moby->state = SUCKCANNON_STATE_EMPTY_IDLE; goto done; } } else { @@ -1620,7 +1624,7 @@ void suckcannon_update(SuckMoby *suck_cannon_moby) { if (scale_game_frames(D_0015EEA4) / 600 > stats->longest) stats->longest = scale_game_frames(D_0015EEA4) / 600; stats->level_mask = (stats->level_mask | (1 << current_level_index)) | 0x80000000; - suck_cannon_moby->state = 5; + suck_cannon_moby->state = SUCKCANNON_STATE_FIRE_STORED_MOBY; } break; case 6: @@ -1774,11 +1778,11 @@ void suckcannon_update(SuckMoby *suck_cannon_moby) { ((SuckHero *)&hero)->count--; if (((SuckHero *)&hero)->count > 0) { ((SuckHero *)&hero)->firing = 0; - suck_cannon_moby->state = 4; + suck_cannon_moby->state = SUCKCANNON_STATE_LOADED_AIM; goto done; } else { cannon->cooldown = scale_game_frames(20); - next_state = 1; + next_state = SUCKCANNON_STATE_EMPTY_IDLE; ((SuckHero *)&hero)->firing = 0; suck_cannon_moby->state = next_state; goto done; @@ -2842,7 +2846,8 @@ void suck_beam_build(char *cannon_moby, char *suction_origin) { D_L00_00161B84 = 1.7f; suck_beam_reset_pending = 0; hero_state = hero.state.current; - if ((hero_state == 0x1E || hero_state == 1) && (hero.moby->flags & 1)) { + if ((hero_state == HERO_STATE_LOOK_RELEASE_WAIT || hero_state == HERO_STATE_LOOK) && + (hero.moby->flags & 1)) { qcopy((char *)beam_initialization_vectors, D_L00_00166FD0); qcopy((char *)beam_initialization_vectors + 0x10, D_L00_00166FD0 + 0x10); qcopy((char *)beam_initialization_vectors + 0x20, D_L00_00166FD0 + 0x20); @@ -2867,7 +2872,7 @@ void suck_beam_build(char *cannon_moby, char *suction_origin) { D_L00_001E6008[0] = 0; for (i = 1; i < 10; i++) { fast_vec_add(D_L00_001E5F40 + i * 0x10, - D_L00_001E5F30 + i * 0x10, + l00_suck_beam_previous_segment_positions + i * 0x10, (char *)beam_initialization_vectors + 0x30); D_L00_001E6008[i] = 0; } @@ -2887,7 +2892,7 @@ void suck_beam_build(char *cannon_moby, char *suction_origin) { D_L00_00161B80 = initial_random_angle; } suck_beam_texture_v_step = 0.006f; - D_L00_00161B54 = 0; + l00_suck_beam_step_blend_elapsed_frames = 0; suck_beam_wave_phase = 0; if (suck_beam_particles_reset_pending != 0) { suck_beam_particles_reset_pending = 0; @@ -2954,13 +2959,13 @@ void suck_beam_update(void *moby, void *position) { fast_vec_add(&start, &start, &step); transform_vector_by_basis(&end, &(*(V41 *)D_L00_00161B70), orientation); fast_vec_add(&end, &end, &step); - beam_step_blend_fraction = - (float)D_L00_00161B54 / convert_integer_to_float(scale_game_frames(60)); - D_L00_00161B54++; + beam_step_blend_fraction = (float)l00_suck_beam_step_blend_elapsed_frames / + convert_integer_to_float(scale_game_frames(60)); + l00_suck_beam_step_blend_elapsed_frames++; step.f.x = start.f.x + (end.f.x - start.f.x) * beam_step_blend_fraction; step.f.y = start.f.y + (end.f.y - start.f.y) * beam_step_blend_fraction; step.f.z = start.f.z + (end.f.z - start.f.z) * beam_step_blend_fraction; - if (D_L00_00161B54 >= scale_game_frames(60)) { + if (l00_suck_beam_step_blend_elapsed_frames >= scale_game_frames(60)) { qcopy(&(*(V41 *)D_L00_00161B60), &(*(V41 *)D_L00_00161B70)); fast_vec_normalize(&axis, orientation, D_L00_00161B84); tmp_a.q = 0; @@ -2973,7 +2978,7 @@ void suck_beam_update(void *moby, void *position) { fast_add_rotations(D_L00_00161B80, random_float_between(45.0f, 315.0f) * 0.0174532924f); build_look_at_matrix(&(*(V41 *)D_L00_00161B70), &tmp_a, angle, &tmp_b); D_L00_00161B80 = angle; - D_L00_00161B54 = 0; + l00_suck_beam_step_blend_elapsed_frames = 0; } (*(float *)&suck_beam_wave_phase_gp) = fast_add_rotations((*(float *)&suck_beam_wave_phase_gp), 0.1f); @@ -2994,7 +2999,7 @@ void suck_beam_update(void *moby, void *position) { int i; for (i = 1; i < 10; i++) { anchor = (V41 *)(D_L00_001E5F40 + i * 16); - previous = (V41 *)(D_L00_001E5F30 + i * 16); + previous = (V41 *)(l00_suck_beam_previous_segment_positions + i * 16); fast_vec_sub(&tmp_a, anchor, previous); qcopy(&tmp_b, &step); fast_vec_cross(&tmp_c, &tmp_b, &tmp_a); @@ -3105,7 +3110,8 @@ void suck_beam_update(void *moby, void *position) { } if (D_L00_001E4C80_lui[i].p) { fast_vec_sub(&tmp_a, - D_L00_001E5F30 + D_L00_001E4C80_lui[i].idx * 16, + l00_suck_beam_previous_segment_positions + + D_L00_001E4C80_lui[i].idx * 16, D_L00_001E5F40 + D_L00_001E4C80_lui[i].idx * 16); length = fast_vec_length(&tmp_a); D_L00_001E4C80_lui[i].f += D_L00_001E4C80_lui[i].speed; @@ -3118,7 +3124,8 @@ void suck_beam_update(void *moby, void *position) { } else { D_L00_001E4C80_lui[i].f -= length; fast_vec_sub(&tmp_a, - D_L00_001E5F30 + D_L00_001E4C80_lui[i].idx * 16, + l00_suck_beam_previous_segment_positions + + D_L00_001E4C80_lui[i].idx * 16, D_L00_001E5F40 + D_L00_001E4C80_lui[i].idx * 16); length = fast_vec_length(&tmp_a); } @@ -3156,7 +3163,8 @@ void suck_beam_update(void *moby, void *position) { fast_vec_sub(&tmp_c, (char *)((V41 *)D_L00_001E5EE0) + D_L00_001E4C80_lui[i].idx * 320 + j * 16, - D_L00_001E5F30 + D_L00_001E4C80_lui[i].idx * 16); + l00_suck_beam_previous_segment_positions + + D_L00_001E4C80_lui[i].idx * 16); interpolate_vector(&motion, &tmp_b, &tmp_c, amount); j = (j + 19) % 20; fast_vec_sub(&tmp_d, @@ -3166,7 +3174,8 @@ void suck_beam_update(void *moby, void *position) { fast_vec_sub(&tmp_e, (char *)((V41 *)D_L00_001E5EE0) + D_L00_001E4C80_lui[i].idx * 320 + j * 16, - D_L00_001E5F30 + D_L00_001E4C80_lui[i].idx * 16); + l00_suck_beam_previous_segment_positions + + D_L00_001E4C80_lui[i].idx * 16); interpolate_vector(&interp, &tmp_d, &tmp_e, amount); interpolate_vector(&motion, &motion, &interp, D_L00_001E4C80_lui[i].phase); D_L00_001E4C80_lui[i].phase += D_L00_001E4C80_lui[i].phase_step; @@ -3215,7 +3224,7 @@ void stop_suck_cannon_suction_effect(int callback_context) { if (p != 0) { D_L00_001E4C80[i].p = 0; fast_vec_sub(segment_offset, - D_L00_001E5F30 + D_L00_001E4C80[i].idx * 16, + l00_suck_beam_previous_segment_positions + D_L00_001E4C80[i].idx * 16, D_L00_001E5F40 + D_L00_001E4C80[i].idx * 16); segment_length = vector_length_xyz(segment_offset); scale_vector_xyz(segment_offset, segment_offset, D_L00_001E4C80[i].f / segment_length); diff --git a/src/overlays/shared/weapons/swingshot_hook.c b/src/overlays/shared/weapons/swingshot_hook.c index a40a89ba79..384ab07359 100644 --- a/src/overlays/shared/weapons/swingshot_hook.c +++ b/src/overlays/shared/weapons/swingshot_hook.c @@ -10,6 +10,17 @@ #include "rnc/overlay/shared/rendering/set_moby_color.h" #include "rnc/overlay/shared/mobys/evaluate_moby_animation_pose.h" +enum { + HOOK_INITIAL_ANIMATION = 0, + HOOK_IDLE_ANIMATION = 1, + HOOK_REMOVAL_ANIMATION = 2, + HOOK_LAUNCH_ANIMATION = 3, + HOOK_FLIGHT_ANIMATION = 4, + HOOK_ATTACHED_ANIMATION = 5, + HOOK_SKIP_ANIMATION_TRANSITIONS = 6, + HOOK_RETURN_ANIMATION = 7 +}; + extern int scale_game_frames(int) __asm__("FUN_001f96f8"); int FUN_001f96f8_2c7070(int) __asm__("FUN_001f96f8"); @@ -35,7 +46,7 @@ unsigned char *spawn_swingshot_hook(unsigned char *owner_moby, float initial_hoo if (MOBY(spawned_moby)->prev_seq) blend_moby_animation(spawned_moby, 0, 0, scale_game_frames(10)); update_entity(spawned_moby); - MOBY(spawned_moby)->state = 0; + MOBY(spawned_moby)->state = HOOK_INITIAL_ANIMATION; MOBY(spawned_moby)->flags |= 4; } return spawned_moby; @@ -46,14 +57,10 @@ void swingshot_hook_update(unsigned char *m) __asm__("FUN_L00_002c7070"); /* Moby class 209 */ void swingshot_hook_update(unsigned char *hook_moby) { enum { - HOOK_INITIAL_ANIMATION = 0, - HOOK_IDLE_ANIMATION = 1, - HOOK_REMOVAL_ANIMATION = 2, - HOOK_LAUNCH_ANIMATION = 3, - HOOK_FLIGHT_ANIMATION = 4, - HOOK_ATTACHED_ANIMATION = 5, - HOOK_SKIP_ANIMATION_TRANSITIONS = 6, - HOOK_RETURN_ANIMATION = 7 + MOBY_STATE_MARKED_FOR_REMOVAL = 0xFE + }; + enum { + MOBY_STATE_REMOVAL_PENDING = 0xFD }; unsigned char **hook_vars; struct Moby *owner_moby; @@ -63,8 +70,9 @@ void swingshot_hook_update(unsigned char *hook_moby) { if (hook_vars == 0) return; owner_moby = hook_vars[0]; - if (owner_moby == 0 || owner_moby->oclass != 0xD0 || owner_moby->state == 0xFE || - owner_moby->state == 0xFD || + if (owner_moby == 0 || owner_moby->oclass != 0xD0 || + owner_moby->state == MOBY_STATE_MARKED_FOR_REMOVAL || + owner_moby->state == MOBY_STATE_REMOVAL_PENDING || *(unsigned char **)(((unsigned char *)owner_moby->pvars) + 0x14) != hook_moby) { goto kill; } @@ -78,7 +86,7 @@ void swingshot_hook_update(unsigned char *hook_moby) { if (MOBY(hook_moby)->anim_flags & 2) { if (MOBY(hook_moby)->prev_seq != 1) blend_moby_animation(hook_moby, 1, 0, FUN_001f96f8_2c7070(10)); - MOBY(hook_moby)->state = 1; + MOBY(hook_moby)->state = HOOK_IDLE_ANIMATION; MOBY(hook_moby)->anim_speed = 1.0f; } break; @@ -86,12 +94,12 @@ void swingshot_hook_update(unsigned char *hook_moby) { if (hook_vars[0][0x20] == 2) { if (MOBY(hook_moby)->prev_seq != 3) blend_moby_animation(hook_moby, 3, 0, FUN_001f96f8_2c7070(10)); - MOBY(hook_moby)->state = 3; + MOBY(hook_moby)->state = HOOK_LAUNCH_ANIMATION; MOBY(hook_moby)->anim_speed = 1.0f; } else if (hook_vars[0][0x20] == 8) { if (MOBY(hook_moby)->prev_seq != 2) blend_moby_animation(hook_moby, 2, 0, FUN_001f96f8_2c7070(10)); - MOBY(hook_moby)->state = 2; + MOBY(hook_moby)->state = HOOK_REMOVAL_ANIMATION; MOBY(hook_moby)->anim_speed = 1.0f; } break; @@ -106,14 +114,14 @@ void swingshot_hook_update(unsigned char *hook_moby) { if (MOBY(hook_moby)->anim_flags & 2) { if (MOBY(hook_moby)->prev_seq != 4) blend_moby_animation(hook_moby, 4, 0, FUN_001f96f8_2c7070(10)); - MOBY(hook_moby)->state = 4; + MOBY(hook_moby)->state = HOOK_FLIGHT_ANIMATION; } break; case HOOK_FLIGHT_ANIMATION: if ((unsigned char)(hook_vars[0][0x20] - 3) < 3) { if (MOBY(hook_moby)->prev_seq != 5) blend_moby_animation(hook_moby, 5, 0, FUN_001f96f8_2c7070(10)); - MOBY(hook_moby)->state = 5; + MOBY(hook_moby)->state = HOOK_ATTACHED_ANIMATION; } break; case HOOK_ATTACHED_ANIMATION: @@ -123,7 +131,7 @@ void swingshot_hook_update(unsigned char *hook_moby) { MOBY(hook_moby)->anim_speed = 1.0f; if (MOBY(hook_moby)->prev_seq != 7) blend_moby_animation(hook_moby, 7, 0, FUN_001f96f8_2c7070(10)); - MOBY(hook_moby)->state = 7; + MOBY(hook_moby)->state = HOOK_RETURN_ANIMATION; } break; case HOOK_SKIP_ANIMATION_TRANSITIONS: @@ -134,7 +142,7 @@ void swingshot_hook_update(unsigned char *hook_moby) { default: if (MOBY(hook_moby)->prev_seq != 1) blend_moby_animation(hook_moby, 1, 0, FUN_001f96f8_2c7070(10)); - MOBY(hook_moby)->state = 1; + MOBY(hook_moby)->state = HOOK_IDLE_ANIMATION; break; } refresh_moby_spatial_bounds_from_basis(hook_moby); diff --git a/src/overlays/shared/weapons/taunter.c b/src/overlays/shared/weapons/taunter.c index a8e89e12b7..3c0f101543 100644 --- a/src/overlays/shared/weapons/taunter.c +++ b/src/overlays/shared/weapons/taunter.c @@ -378,7 +378,7 @@ s32 apply_taunter_to_nearby_mobies(Moby *taunter_moby, f32 radius) { do { state = FUN_L00_0025c338_b6bc8(taunter_candidate_moby); } while (0); - if (state != 0) { + if (state != NULL) { /* Fakematch: &hero through the motion label keeps retail's &hero + 0x98 load below. */ player = (struct Hero *)(D_0013F3D0 - 0x80); distance = vector_distance_xy(&pos, (u8 *)taunter_candidate_moby + 0x10); @@ -455,6 +455,16 @@ void taunter_update(Moby *m) __asm__("FUN_L00_002b6f10"); /* Moby class 175 */ void taunter_update(Moby *taunter_moby) { + enum { + TAUNTER_STATE_INITIALIZE = 0, + TAUNTER_STATE_ACTIVE = 2 + }; + enum { + TAUNTER_STATE_WAIT_FOR_ENABLE_FLAG = 1 + }; + enum { + TAUNTER_STATE_ACTIVATION_DISABLED = 3 + }; Vars *taunter_vars; s32 taunter_state; s32 voice_slot_index; @@ -473,22 +483,22 @@ void taunter_update(Moby *taunter_moby) { if (taunter_vars->radius == 0.0f) taunter_vars->radius = 30.0f; if (taunter_moby->type == 2) - taunter_moby->state = 3; + taunter_moby->state = TAUNTER_STATE_ACTIVATION_DISABLED; taunter_effect_emission_disabled = 1; - if (taunter_moby->state == 0) { + if (taunter_moby->state == TAUNTER_STATE_INITIALIZE) { taunter_vars->anim = -1; taunter_moby->state++; taunter_effect_reset_pending = 1; } taunter_state = taunter_moby->state; - if ((u8)taunter_state == 1) { + if ((u8)taunter_state == TAUNTER_STATE_WAIT_FOR_ENABLE_FLAG) { if (taunter_moby->flags & 2) { taunter_moby->state = taunter_state + 1; taunter_vars->retry = 0; } goto end; } - if ((u8)taunter_state != 2) + if ((u8)taunter_state != TAUNTER_STATE_ACTIVE) goto end; if (taunter_moby->type == 3 && hero.item_use_locked == 0) { taunter_effect_emission_disabled = 0; diff --git a/src/overlays/shared/weapons/tesla_claw.c b/src/overlays/shared/weapons/tesla_claw.c index d7bc8908a0..d7e47e4517 100644 --- a/src/overlays/shared/weapons/tesla_claw.c +++ b/src/overlays/shared/weapons/tesla_claw.c @@ -515,8 +515,10 @@ void tesla_claw_update(struct Moby *tesla_claw_moby) { if ((unsigned int)hero.state.control_mode < 2 || hero.state.control_mode == 9) help_request(0x4E30, 0x81); } - if ((controller_state.held & hero.items[0].button_mask) && tesla_claw_moby->state != 4 && - tesla_claw_moby->state != 0 && !hero.item_use_locked && hero.state.current != 0x72) { + if ((controller_state.held & hero.items[0].button_mask) && + tesla_claw_moby->state != TESLA_CLAW_STATE_FINISHED && + tesla_claw_moby->state != TESLA_CLAW_STATE_INITIALIZE && !hero.item_use_locked && + hero.state.current != 0x72) { if (tesla_claw_vars->timer == 0) { if (ready > 0) { if (fast_dec_timer_s16(&tesla_claw_vars->tick)) { @@ -668,7 +670,7 @@ void tesla_claw_update(struct Moby *tesla_claw_moby) { tesla_claw_vars->timer = scale_game_frames(16); tesla_claw_vars->light = FUN_L00_0023e5e0_2b2100(&tesla_claw_vars->pos, 0.0f, 0.0f, 0); tesla_beam_restart_pending = 1; - tesla_claw_moby->state = 1; + tesla_claw_moby->state = TESLA_CLAW_STATE_WAIT_FOR_FIRE; tesla_claw_vars->f3E = 20; tesla_claw_vars->sound = -1; tesla_claw_vars->target2 = 0; @@ -682,25 +684,26 @@ void tesla_claw_update(struct Moby *tesla_claw_moby) { fast_dec_timer(&tesla_claw_vars->timer); if (active) { start_equipped_item_animation(); - tesla_claw_moby->state = 3; + tesla_claw_moby->state = TESLA_CLAW_STATE_FIRING; } if ((controller_state.pressed & (player_hero = &hero)->items[0].button_mask) && !player_hero->item_use_locked) { if (active) { - Stats *st = (Stats *)(D_0014161B + 0x65); - if (st->uses < 65535) - st->uses++; - if (scale_game_frames(D_0015EEA4) / 600 > st->longest) - st->longest = scale_game_frames(D_0015EEA4) / 600; - st->levels = (st->levels | (1 << current_level_index)) | 0x80000000; + Stats *firing_start_stats = (Stats *)(D_0014161B + 0x65); + if (firing_start_stats->uses < 65535) + firing_start_stats->uses++; + if (scale_game_frames(D_0015EEA4) / 600 > firing_start_stats->longest) + firing_start_stats->longest = scale_game_frames(D_0015EEA4) / 600; + firing_start_stats->levels = + (firing_start_stats->levels | (1 << current_level_index)) | 0x80000000; start_equipped_item_animation(); - tesla_claw_moby->state = 3; + tesla_claw_moby->state = TESLA_CLAW_STATE_FIRING; } else { tesla_claw_vars->target = 0; tesla_claw_vars->target2 = 0; tesla_claw_vars->lock = 0; tesla_claw_vars->lock2 = 0; - tesla_claw_moby->state = 1; + tesla_claw_moby->state = TESLA_CLAW_STATE_WAIT_FOR_FIRE; allocate_voice_for_target_entry(0, 0, tesla_claw_moby); cancel_hero_item_animation(); } @@ -731,7 +734,7 @@ void tesla_claw_update(struct Moby *tesla_claw_moby) { tesla_claw_vars->lock2 = 0; tesla_claw_vars->reach = 0.0f; cancel_hero_item_animation(); - tesla_claw_moby->state = 1; + tesla_claw_moby->state = TESLA_CLAW_STATE_WAIT_FOR_FIRE; } break; case TESLA_CLAW_STATE_FINISHED: @@ -764,7 +767,7 @@ void tesla_claw_update(struct Moby *tesla_claw_moby) { } } if (done && tesla_claw_vars->light == -1) - tesla_claw_moby->state = 4; + tesla_claw_moby->state = TESLA_CLAW_STATE_FINISHED; } /* Starts the beam when one is pending: lays 19 points from the moby toward its target and resets the segment state. */ diff --git a/src/overlays/shared/weapons/thruster_pack_flame.c b/src/overlays/shared/weapons/thruster_pack_flame.c index d935a37f30..cedf69fd5d 100644 --- a/src/overlays/shared/weapons/thruster_pack_flame.c +++ b/src/overlays/shared/weapons/thruster_pack_flame.c @@ -16,6 +16,14 @@ #include "rnc/overlay/shared/hero/hero_switch_item.h" #include "rnc/ui/text/font/font_queue_vu_state.h" +enum { + STATE_INITIALIZE = 0, + STATE_WAIT_FOR_BEAM = 1, + STATE_BEAM_GROW = 2, + STATE_BEAM_ACTIVE = 3, + STATE_BEAM_SHRINK = 4 +}; + #define BEAM_QUAD_YZ \ { \ {0.0f, -2.0f, 2.0f, 1.0f}, {0.0f, -2.0f, -2.0f, 1.0f}, {0.0f, 2.0f, 2.0f, 1.0f}, { \ @@ -818,9 +826,9 @@ void emit_beam_trail_particles(X *x) { fast_vec_sub(&previous_position_delta, &trail_state->v10, &emission_position); hero_state = hero.state.current; trail_sample_limit = 4; - if (hero_state == 8) + if (hero_state == HERO_STATE_LAND) trail_sample_limit = 2; - if (hero_state == 0x81) + if (hero_state == HERO_STATE_DELAYED_JUMP_OR_R1_REPEAT_EXIT_WAIT) trail_sample_limit = 1; for (i = 1; i < trail_sample_limit; i++) { fast_vec_normalize( @@ -857,7 +865,7 @@ char *spawn_thruster_pack_flame(int instance_index) { MOBY(spawned_moby)->update_dist = 0xFF; MOBY(spawned_moby)->draw_dist = 0x7E; MOBY(spawned_moby)->visible = 0; - MOBY(spawned_moby)->state = 0; + MOBY(spawned_moby)->state = STATE_INITIALIZE; } return spawned_moby; } @@ -866,13 +874,6 @@ void thruster_pack_flame_update(void *moby) __asm__("FUN_L00_002b4198"); /* Moby class 167 */ void thruster_pack_flame_update(void *moby) { - enum { - STATE_INITIALIZE = 0, - STATE_WAIT_FOR_BEAM = 1, - STATE_BEAM_GROW = 2, - STATE_BEAM_ACTIVE = 3, - STATE_BEAM_SHRINK = 4 - }; O_4198 *beam_moby = (O_4198 *)moby; V_4198 *v = beam_moby->v; s32 flag = 0; @@ -880,10 +881,10 @@ void thruster_pack_flame_update(void *moby) { s32 lim; if (hero.items[3].item_id == 3) { - if (beam_moby->state == 1 || beam_moby->state == 3) { + if (beam_moby->state == STATE_WAIT_FOR_BEAM || beam_moby->state == STATE_BEAM_ACTIVE) { hero_state = hero.state.current; if ((u32)(hero_state - 0xB) < 4 || - (hero_state == 0x1C && + (hero_state == HERO_STATE_LEDGE_JUMP && ((u8 *)((void *)hero.moby))[0x52] == ((u8 *)((void *)hero.moby))[0x53] && hero.anim_frame >= 6.0f && hero.anim_frame <= 16.0f)) { if (!hero.past_jump_apex) @@ -908,7 +909,7 @@ void thruster_pack_flame_update(void *moby) { switch (beam_moby->state) { case STATE_INITIALIZE: beam_moby->f18 += 0.5f; - beam_moby->state = 1; + beam_moby->state = STATE_WAIT_FOR_BEAM; beam_moby->u30 = 0xFF; beam_moby->u34 |= 1; break; @@ -916,7 +917,7 @@ void thruster_pack_flame_update(void *moby) { if (hero_slot_item_id(3) != 3) { mark_moby_for_removal(beam_moby); } else if (flag != 0) { - beam_moby->state = 2; + beam_moby->state = STATE_BEAM_GROW; v->i0 = scale_game_frames(2); v->f30 = 0.0125f / scale_game_frames(2); v->f34 = 0.2f / scale_game_frames(2); @@ -936,7 +937,7 @@ void thruster_pack_flame_update(void *moby) { v->i8 = ((s32)hero.items[3].moby); add_draw_callback(FUN_L00_002b3628_4198, beam_moby); if (fast_dec_timer(v) != 0) { - beam_moby->state = 3; + beam_moby->state = STATE_BEAM_ACTIVE; v->f20 = 0.0125f; v->f24 = 0.2f; v->f28 = 0.05f; @@ -948,7 +949,7 @@ void thruster_pack_flame_update(void *moby) { v->i8 = ((s32)hero.items[3].moby); add_draw_callback(FUN_L00_002b3628_4198, beam_moby); if (flag == 0) { - beam_moby->state = 4; + beam_moby->state = STATE_BEAM_SHRINK; v->i0 = scale_game_frames(8); v->f30 = 0.0125f / scale_game_frames(8); v->f34 = 0.2f / scale_game_frames(8); @@ -961,7 +962,7 @@ void thruster_pack_flame_update(void *moby) { break; case STATE_BEAM_SHRINK: if (fast_dec_timer(v) != 0) { - beam_moby->state = 1; + beam_moby->state = STATE_WAIT_FOR_BEAM; } else { v->f20 -= v->f30; v->f24 -= v->f34; diff --git a/src/overlays/shared/weapons/turret_rocket.c b/src/overlays/shared/weapons/turret_rocket.c index 540cf61e05..a6312d9987 100644 --- a/src/overlays/shared/weapons/turret_rocket.c +++ b/src/overlays/shared/weapons/turret_rocket.c @@ -33,9 +33,12 @@ extern void spawn_spark(void *, void *, void *, int, int, int, int, int, int) __asm__("FUN_00218888"); extern int D_L08_0015F5CC __asm__("D_L08_0015F5CC"); -extern int D_L08_00161D08_gp __asm__("D_L08_00161D08") __attribute__((sda)); -extern int D_L08_00161D0C_gp __asm__("D_L08_00161D0C") __attribute__((sda)); -extern int D_L08_00161D10_gp __asm__("D_L08_00161D10") __attribute__((sda)); +extern int l08_turret_rocket_spark_first_frame_count_base __asm__("D_L08_00161D08") + __attribute__((sda)); +extern int l08_turret_rocket_spark_second_frame_count_base __asm__("D_L08_00161D0C") + __attribute__((sda)); +extern int l08_turret_rocket_spark_third_frame_count_base __asm__("D_L08_00161D10") + __attribute__((sda)); extern float moby_creation_default_timer_frames_gp __asm__("D_L08_00161CD8") __attribute__((sda)); extern float moby_creation_particle_count_limit_gp __asm__("D_L08_00161CE0") __attribute__((sda)); @@ -151,13 +154,16 @@ char *spawn_turret_rocket(int firing_moby, float *position, float *rotation, int 1, 20000.0f); particle_frame_count = truncate_float_to_s32(FUN_L08_00211a20(random_float_between( - (float)D_L08_00161D08_gp, (float)D_L08_00161D08_gp * 1.2f))); + (float)l08_turret_rocket_spark_first_frame_count_base, + (float)l08_turret_rocket_spark_first_frame_count_base * 1.2f))); particle_second_frame_count = truncate_float_to_s32(FUN_L08_00211a20(random_float_between( - (float)D_L08_00161D0C_gp, (float)D_L08_00161D0C_gp * 1.2f))); + (float)l08_turret_rocket_spark_second_frame_count_base, + (float)l08_turret_rocket_spark_second_frame_count_base * 1.2f))); particle_third_frame_count = truncate_float_to_s32(FUN_L08_00211a20(random_float_between( - (float)D_L08_00161D10_gp, (float)D_L08_00161D10_gp * 1.5f))); + (float)l08_turret_rocket_spark_third_frame_count_base, + (float)l08_turret_rocket_spark_third_frame_count_base * 1.5f))); spawn_spark(&MOBY(moby)->pos, velocity_ptr, offset_ptr, @@ -221,11 +227,14 @@ void turret_rocket_update(char *moby) { offset[3] = homing_projectile_trail_secondary_motion_w_gp; i++; particle_frame_count = truncate_float_to_s32(scale_game_frames_002e8210( - random_float_between((float)D_L08_00161D08_gp, (float)D_L08_00161D08_gp * 1.2f))); + random_float_between((float)l08_turret_rocket_spark_first_frame_count_base, + (float)l08_turret_rocket_spark_first_frame_count_base * 1.2f))); particle_second_frame_count = truncate_float_to_s32(scale_game_frames_002e8210( - random_float_between((float)D_L08_00161D0C_gp, (float)D_L08_00161D0C_gp * 1.2f))); + random_float_between((float)l08_turret_rocket_spark_second_frame_count_base, + (float)l08_turret_rocket_spark_second_frame_count_base * 1.2f))); particle_third_frame_count = truncate_float_to_s32(scale_game_frames_002e8210( - random_float_between((float)D_L08_00161D10_gp, (float)D_L08_00161D10_gp * 1.5f))); + random_float_between((float)l08_turret_rocket_spark_third_frame_count_base, + (float)l08_turret_rocket_spark_third_frame_count_base * 1.5f))); spawn_spark(position, velocity, offset, diff --git a/src/overlays/shared/weapons/visibomb_missile.c b/src/overlays/shared/weapons/visibomb_missile.c index d16f0bb5e2..bbc3d846cf 100644 --- a/src/overlays/shared/weapons/visibomb_missile.c +++ b/src/overlays/shared/weapons/visibomb_missile.c @@ -933,16 +933,18 @@ void visibomb_missile_update(struct Moby *missile_moby) { func_L00_002B6E90_2b6140(missile_moby, missile_vars); { struct Moby *skip = missile_moby; - rotation_2D5FA8(&missile_vars->f24->pos, - 1, - -(missile_vars->f1C * 0.5f + absolute_float(missile_vars->f18 / 3.0f) + - (missile_vars->f18 - missile_moby->rot.x) * 1.1f) * - 0.7f); - rotation_2D5FA8(&missile_vars->f28->pos, - 1, - -(missile_vars->f1C * 0.5f + absolute_float(missile_vars->f18 / 3.0f) - - (missile_vars->f18 - missile_moby->rot.x) * 1.1f) * - 0.7f); + build_axis_rotation_quaternion(&missile_vars->f24->pos, + 1, + -(missile_vars->f1C * 0.5f + + absolute_float(missile_vars->f18 / 3.0f) + + (missile_vars->f18 - missile_moby->rot.x) * 1.1f) * + 0.7f); + build_axis_rotation_quaternion(&missile_vars->f28->pos, + 1, + -(missile_vars->f1C * 0.5f + + absolute_float(missile_vars->f18 / 3.0f) - + (missile_vars->f18 - missile_moby->rot.x) * 1.1f) * + 0.7f); ev.moby = missile_moby; ev.flags = 0x830000; ev.f1C = 6.0f; diff --git a/src/overlays/shared/weapons/walloper.c b/src/overlays/shared/weapons/walloper.c index d2db7d00f1..790769c148 100644 --- a/src/overlays/shared/weapons/walloper.c +++ b/src/overlays/shared/weapons/walloper.c @@ -748,7 +748,7 @@ void walloper_update(char *walloper_moby) { } switch (MOBY(walloper_moby)->state) { case WALLOPER_STATE_INITIALIZE: - MOBY(walloper_moby)->state = 2; + MOBY(walloper_moby)->state = WALLOPER_STATE_ANIMATION_DRIVEN_EFFECTS; for (arc_init_index = 0; arc_init_index < 10; arc_init_index++) { D_L00_001DBEC0[arc_init_index] = 0; D_L00_001DBEF0[arc_init_index] = 2; diff --git a/src/overlays/shared/weapons/wrench.c b/src/overlays/shared/weapons/wrench.c index 1f2597d126..c7b6adabf2 100644 --- a/src/overlays/shared/weapons/wrench.c +++ b/src/overlays/shared/weapons/wrench.c @@ -628,10 +628,16 @@ void wrench_update(WrenchMoby *wrench_moby) { WRENCH_THROW_OUTBOUND = 10, WRENCH_THROW_RETURNING = 11 }; + enum { + HERO_WRENCH_STATUS_THROWN = 2 + }; + enum { + HERO_WRENCH_STATUS_NONE = 0 + }; WrenchVars *wrench_vars = wrench_moby->data; WrenchScratch wrench_collision_scratch; WrenchHero *player = wrench_hero(); - player->wrench_state = 0; + player->wrench_state = HERO_WRENCH_STATUS_NONE; if (player->mode == 3) return; switch (wrench_moby->state) { @@ -645,7 +651,7 @@ void wrench_update(WrenchMoby *wrench_moby) { float difference, yaw; wrench_moby->parent = player->moby; player_state = player->state; - if (player_state == 1) { + if (player_state == HERO_STATE_LOOK) { if (pad_held_words[0] & 0xA) draw_target_reticle( (int)wrench_moby, 0xFF917267, 1.0f, 0.0f, 0, 0x25, -1, 90.0f, 4); @@ -684,8 +690,11 @@ void wrench_update(WrenchMoby *wrench_moby) { FUN_L00_002a7c70_c((char *)wrench_moby); { int current_state = wrench_hero()->state; - if (current_state != 19 && current_state != 33 && current_state != 43 && - current_state != 112 && current_state != 20) { + if (current_state != HERO_STATE_WRENCH_COMBO && + current_state != HERO_STATE_WAIT_FOR_ANIMATION_THEN_IDLE && + current_state != HERO_STATE_GRIND_ATTACK && + current_state != HERO_STATE_ATTACK_RECORD_FRAME_EXIT_WAIT && + current_state != HERO_STATE_WRENCH_SLAM) { int current = wrench_moby->current_animation; if ((unsigned int)current >= 3 && wrench_moby->current_animation < 6) blend_moby_animation(wrench_moby, 1, 0, scale_game_frames(4)); @@ -897,8 +906,8 @@ void wrench_update(WrenchMoby *wrench_moby) { WrenchHero *control_player = (WrenchHero *)(control - 0x17B0); update_moby_transform_history(control, 0); wrench_moby->parent = control_player->moby; - control_player->wrench_state = 2; - if (wrench_moby->state == 10 && control_player->thrown_sound == -1) + control_player->wrench_state = HERO_WRENCH_STATUS_THROWN; + if (wrench_moby->state == WRENCH_THROW_OUTBOUND && control_player->thrown_sound == -1) control_player->thrown_sound = allocate_voice_for_target_entry(14, 4, control_player->moby); } @@ -917,7 +926,7 @@ void wrench_update(WrenchMoby *wrench_moby) { } } qcopy(wrench_collision_scratch.v[0], position); - if (wrench_moby->state == 10) { + if (wrench_moby->state == WRENCH_THROW_OUTBOUND) { qcopy(wrench_collision_scratch.v[1], hero_velocity()); fast_vec_scale(wrench_collision_scratch.v[1], wrench_collision_scratch.v[1], 0.7f); fast_vec_add(position, position, wrench_collision_scratch.v[1]); @@ -927,7 +936,7 @@ void wrench_update(WrenchMoby *wrench_moby) { wrench_vars->acceleration += frame_time_cube * 170.0f; approach_value(&wrench_vars->speed, 0.0f, wrench_vars->acceleration); if (wrench_vars->speed == 0.0f) - wrench_moby->state = 11; + wrench_moby->state = WRENCH_THROW_RETURNING; } else { int arrived = 0; float length, steps; @@ -973,7 +982,7 @@ void wrench_update(WrenchMoby *wrench_moby) { wrench_hero()->thrown_sound = -1; clear_moby_transform_history((char *)wrench_hero() + 0x17B0); wrench_hero()->thrown = 0; - wrench_moby->state = 0; + wrench_moby->state = WRENCH_NORMAL; } } collided = 0; @@ -988,14 +997,14 @@ void wrench_update(WrenchMoby *wrench_moby) { wrench_hero()->attack_cooldown = 1; allocate_voice_for_target_entry(2, 0, wrench_moby); } - if (wrench_moby->state == 10) { + if (wrench_moby->state == WRENCH_THROW_OUTBOUND) { spawn_wrench_impact_effects((char *)wrench_moby); wrench_vars->speed *= 0.5f; - wrench_moby->state = 11; + wrench_moby->state = WRENCH_THROW_RETURNING; } } radius = 1.2f; - if (wrench_moby->state == 11) + if (wrench_moby->state == WRENCH_THROW_RETURNING) radius = -0.37f; fast_vec_normalize(wrench_collision_scratch.v[4], wrench_vars->direction, radius); make_hit_descriptor(wrench_collision_scratch.v[1], diff --git a/src/overlays/shared/world/load_level_gameplay.c b/src/overlays/shared/world/load_level_gameplay.c index bb05a788b6..b00b56f2c6 100644 --- a/src/overlays/shared/world/load_level_gameplay.c +++ b/src/overlays/shared/world/load_level_gameplay.c @@ -83,20 +83,23 @@ extern int fptodp(float) __asm__("FUN_00120478"); void print_moby_class_sizes(int *record, int n) __asm__("FUN_L00_00241788"); -void print_moby_class_sizes(int *record, int n) { +void print_moby_class_sizes(int *moby_class_record_cursor, int moby_class_record_count) { MobyClassSize entries[512]; int i, j, k, done; - for (i = 0; i < n; i++, record += 8) { - entries[i].class_id = (float)record[1]; - if (record[0] == 0) { + for (i = 0; i < moby_class_record_count; i++, moby_class_record_cursor += 8) { + entries[i].class_id = (float)moby_class_record_cursor[1]; + if (moby_class_record_cursor[0] == 0) { entries[i].size = 0; } else { - if (record[8] != 0) { - entries[i].size = convert_integer_to_float(record[8] - record[0]) * 0.0009765625f; + if (moby_class_record_cursor[8] != 0) { + entries[i].size = convert_integer_to_float(moby_class_record_cursor[8] - + moby_class_record_cursor[0]) * + 0.0009765625f; } else { - entries[i].size = - convert_integer_to_float(record[0x10] - record[0]) * 0.0009765625f; + entries[i].size = convert_integer_to_float(moby_class_record_cursor[0x10] - + moby_class_record_cursor[0]) * + 0.0009765625f; } entries[i + 1].class_id = -1.0f; entries[i + 1].size = 0; @@ -104,7 +107,7 @@ void print_moby_class_sizes(int *record, int n) { } do { done = 1; - for (j = 0; j < n; j++) { + for (j = 0; j < moby_class_record_count; j++) { if (entries[j].size < entries[j + 1].size) { float class_id = entries[j].class_id; float size = entries[j].size; @@ -116,7 +119,7 @@ void print_moby_class_sizes(int *record, int n) { } } } while (!done); - for (k = 0; k < n; k++) { + for (k = 0; k < moby_class_record_count; k++) { int class_id = truncate_float_to_s32(entries[k].class_id); debug_print(moby_class_size_format, class_id, fptodp(entries[k].size)); } @@ -501,6 +504,9 @@ extern s32 pal_mode __asm__("D_0015ED80") MACRO_ADDR; extern s32 game_language __asm__("D_0015ED88") MACRO_ADDR; char *load_level_gameplay(int skip_gameplay_read) { + enum { + OCCLUSION_MODE_DISABLED = 0 + }; LevelHeader *hdr; char *mem; float *ship; @@ -511,7 +517,7 @@ char *load_level_gameplay(int skip_gameplay_read) { hdr = D_L00_00173E00.f4; mem = D_L00_00173E00.f18; if (skip_gameplay_read == 0) { - if (pal_mode != 0) { + if (pal_mode != FALSE) { read_disc_sectors_and_wait( mem, disc_table.sound_archive_alt.sector, disc_table.sound_archive_alt.size); } else { @@ -527,7 +533,7 @@ char *load_level_gameplay(int skip_gameplay_read) { FillTransferWords(&l00_camera, 0, 0x3A0); FillTransferWords(D_L00_0018EB40, 0, 0x180); srand(0x4D2); - if (pal_mode != 0) { + if (pal_mode != FALSE) { if (frame_scale == 1.0f) { set_video_timing(1); } @@ -1632,7 +1638,7 @@ char *load_level_gameplay(int skip_gameplay_read) { for (i = 0; i < D_L00_00160F50; i++) { D_L00_00160F4C[i].f3A = 0x7F80; } - g_debug_menu.occlusion_mode = 0; + g_debug_menu.occlusion_mode = OCCLUSION_MODE_DISABLED; } reset_draw_globals(); initialize_hero(); @@ -2152,7 +2158,7 @@ s32 start_cutscene_chunk_read(s32 i) { s32 start; s32 size; - if (pal_mode != 0) { + if (pal_mode != FALSE) { size = disc_table.sector_lists[D_L00_0016C860.list].sectors_alt[i + 1] - disc_table.sector_lists[D_L00_0016C860.list].sectors_alt[i]; start = disc_table.sector_lists[D_L00_0016C860.list].sectors_alt[i]; diff --git a/src/rendering/debug/draw_debug_profiler.c b/src/rendering/debug/draw_debug_profiler.c index c41b964f40..4ece0321f5 100644 --- a/src/rendering/debug/draw_debug_profiler.c +++ b/src/rendering/debug/draw_debug_profiler.c @@ -111,6 +111,10 @@ extern float sequence_macro __asm__("D_0015F43C") MACRO_ADDR; extern s32 game_mode_macro __asm__("D_0015F604") MACRO_ADDR; void draw_debug_profiler(void) { + enum { + FONT_STATE_EFFECTS_DATA = 6, + FONT_STATE_PART_DRAW = 8 + }; f32 rcnt1_count_float; f32 div; @@ -137,7 +141,7 @@ void draw_debug_profiler(void) { } append_dma_tag(0x02010000); if (draw_enable_mask & 4) { - if (pal_mode != 0) { + if (pal_mode != FALSE) { draw_ties_2(); } else { draw_ties_1(); @@ -177,9 +181,10 @@ void draw_debug_profiler(void) { } append_dma_tag(0x02080000); setup_gif_paging(0); - if ((draw_enable_mask & 0x20) && draw_config.unk30 != 0 && font_state != 6) { + if ((draw_enable_mask & 0x20) && draw_config.unk30 != 0 && + font_state != FONT_STATE_EFFECTS_DATA) { vu1_add_data_ref(D_0010FAA0, D_0010FA90[0]); - font_state = 6; + font_state = FONT_STATE_EFFECTS_DATA; } noop_core_callback_secondary(vu_effects_label, 4); noop_core_callback(vu_effects_label, 4); @@ -201,7 +206,7 @@ void draw_debug_profiler(void) { vu1_gs_regs_alt(); FlushCache(0); part_proc(); - font_state = 8; + font_state = FONT_STATE_PART_DRAW; } noop_core_callback(part_draw_label, 8); noop_core_callback_secondary(part_draw_label, 8); @@ -265,7 +270,7 @@ void draw_debug_profiler(void) { vu0_load_micro_program(D_00100AE0); FlushCache(0); rcnt1_count_float = convert_integer_to_float(*(volatile s32 *)0x10000800); - D_0015F614 = rcnt1_count_float / (pal_mode != 0 ? 11520.0f : 9600.0f); + D_0015F614 = rcnt1_count_float / (pal_mode != FALSE ? 11520.0f : 9600.0f); vu1_sync_chain(2); noop_core_callback(dma_sync_empty_label, 0x11); if (draw_enable_mask & 2) { @@ -279,7 +284,7 @@ void draw_debug_profiler(void) { noop_core_callback(dma_sync_empty_label, 0x11); if (draw_enable_mask & 4) { if (draw_config.tie.enabled != 0) { - if (pal_mode != 0) { + if (pal_mode != FALSE) { register_entity_render_resources(); copy_render_buffer_pair(); } else { diff --git a/src/rendering/effects/draw_lens_flare.c b/src/rendering/effects/draw_lens_flare.c index a54eb9242c..a6f481ce44 100644 --- a/src/rendering/effects/draw_lens_flare.c +++ b/src/rendering/effects/draw_lens_flare.c @@ -18,6 +18,10 @@ void draw_lens_flare(void) __asm__("FUN_001edc50"); void draw_lens_flare(void) { + enum { + LENS_FLARE_STATE_INACTIVE = 0, + LENS_FLARE_STATE_ACTIVE = 1 + }; f32 scr[4]; f32 ctr[4]; f32 screen_center_delta[4]; @@ -36,8 +40,8 @@ void draw_lens_flare(void) { s32 x; s32 y; - if (effect_ribbon.state != 1 || (effect_ribbon.moby->flags & 0x80)) { - effect_ribbon.state = 0; + if (effect_ribbon.state != LENS_FLARE_STATE_ACTIVE || (effect_ribbon.moby->flags & 0x80)) { + effect_ribbon.state = LENS_FLARE_STATE_INACTIVE; return; } if (effect_ribbon.intensity <= 0.0f) { diff --git a/src/rendering/effects/draw_screen_effect.c b/src/rendering/effects/draw_screen_effect.c index 6f9807fe25..54abe40c10 100644 --- a/src/rendering/effects/draw_screen_effect.c +++ b/src/rendering/effects/draw_screen_effect.c @@ -20,6 +20,11 @@ extern void draw_rect_overlay(s32, s32, s32, s32, u64) __asm__("func_ void draw_screen_effect(void) __asm__("FUN_001f4fb8"); void draw_screen_effect(void) { + enum { + BACKGROUND_ALPHA_STATE_SKIP_WRITE = 0, + FIRST_STRIPE_ALPHA_STATE_SKIP_WRITE = 0, + SECOND_STRIPE_ALPHA_STATE_SKIP_WRITE = 0 + }; s32 i; s16 height; u64 mask; @@ -33,7 +38,7 @@ void draw_screen_effect(void) { i = 0; height = fs_aa_buffer.display_height; background_alpha_state = screen_color_effect_now->enable; - if (background_alpha_state != 0) { + if (background_alpha_state != BACKGROUND_ALPHA_STATE_SKIP_WRITE) { vu1_add_g_sregister(0x42, background_alpha_state & 0xFF000000FFULL); } background_color = screen_color_effect_now->color; @@ -45,7 +50,7 @@ void draw_screen_effect(void) { mask = 0xFF000000FFULL; do { first_stripe_alpha_state = screen_color_effect_now->unk18; - if (first_stripe_alpha_state != 0) { + if (first_stripe_alpha_state != FIRST_STRIPE_ALPHA_STATE_SKIP_WRITE) { vu1_add_g_sregister(0x42, first_stripe_alpha_state & mask); } first_stripe_color = screen_color_effect_now->unk14; @@ -60,7 +65,7 @@ void draw_screen_effect(void) { } i = i + screen_color_effect_now->unk10; second_stripe_alpha_state = screen_color_effect_now->unk28; - if (second_stripe_alpha_state != 0) { + if (second_stripe_alpha_state != SECOND_STRIPE_ALPHA_STATE_SKIP_WRITE) { vu1_add_g_sregister(0x42, second_stripe_alpha_state & mask); } second_stripe_color = screen_color_effect_now->unk24; diff --git a/src/rendering/frame/render_level_frame.c b/src/rendering/frame/render_level_frame.c index be852bfbcf..7979041733 100644 --- a/src/rendering/frame/render_level_frame.c +++ b/src/rendering/frame/render_level_frame.c @@ -90,7 +90,8 @@ void render_level_frame(void) { if ((current_level_index != 0) && ((current_level_index != 1) || (level_available[3] != 0))) { render_environment_mapped_object(D_0018CC98[0]); } - if ((memory_card_state.state >= 3) || (memory_card_state.pending_state >= 0)) { + if ((memory_card_state.state >= MEMCARD_REQUEST_FORMAT) || + (memory_card_state.pending_state >= MEMCARD_QUERY_INFO)) { vu1_add_g_sregister(0x47, 0x3004B); quad_extent = 272.0f; texture = get_effect_texture(2); diff --git a/src/rendering/frame/reset_graphics.c b/src/rendering/frame/reset_graphics.c index e3bddbfbcb..8a87ba1ed4 100644 --- a/src/rendering/frame/reset_graphics.c +++ b/src/rendering/frame/reset_graphics.c @@ -19,7 +19,7 @@ extern s32 dmac_vif1_disable() __asm__("func_00233D90"); void reset_graphics(void) __asm__("FUN_001f21c0"); void reset_graphics(void) { - s32 value; + s32 saved_gs_texture_allocation_start; /* The volatile flag store stays out of the call's delay slot, and the do-while keeps the D_0015EE78 load after vu1_init_chain, as retail. */ @@ -33,11 +33,11 @@ void reset_graphics(void) { /* Fakematch: see the note at the top of the function. */ do { vu1_init_chain(); - value = D_0015EE78[0]; + saved_gs_texture_allocation_start = D_0015EE78[0]; } while (0); render_packet_cursor.addr = 0; set_pal_mode(); - D_0015EE78_gp = value; + D_0015EE78_gp = saved_gs_texture_allocation_start; vu1_init_chain(); dmac_vif1_enable(); } diff --git a/src/rendering/lights/update_all_point_lights.c b/src/rendering/lights/update_all_point_lights.c index 2c060f54cc..377f2e4831 100644 --- a/src/rendering/lights/update_all_point_lights.c +++ b/src/rendering/lights/update_all_point_lights.c @@ -27,6 +27,11 @@ extern void refresh_point_light(int) __asm__("FUN_00201f58"); void update_all_point_lights(void) __asm__("FUN_00201a28"); void update_all_point_lights(void) { + enum { + POINT_LIGHT_LINK_INACTIVE = 0, + POINT_LIGHT_LINK_PENDING_CREATION = 1, + POINT_LIGHT_LINK_CREATED = 2 + }; struct DirectionalLight *lights = (struct DirectionalLight *)dir_lights; float lighting_direction_angle; int light_index; @@ -44,12 +49,13 @@ void update_all_point_lights(void) { struct PointLight *light = &point_lights[light_index]; struct PointLightSlot *slot = &((struct PointLightSlot *)point_light_data)[light_index]; - if (slot->link_state != 0 && fast_vec_dist(light->sphere, slot->linked_sphere) > 8.0f) { + if (slot->link_state != POINT_LIGHT_LINK_INACTIVE && + fast_vec_dist(light->sphere, slot->linked_sphere) > 8.0f) { qcopy(slot->linked_sphere, light->sphere); - if (slot->link_state == 1) { + if (slot->link_state == POINT_LIGHT_LINK_PENDING_CREATION) { create_point_light(light_index); - slot->link_state = 2; - } else if (slot->link_state == 2) { + slot->link_state = POINT_LIGHT_LINK_CREATED; + } else if (slot->link_state == POINT_LIGHT_LINK_CREATED) { refresh_point_light(light_index); } } diff --git a/src/rendering/mobys/draw_mobys_setup.c b/src/rendering/mobys/draw_mobys_setup.c index f25980ab31..fcbcfffd6e 100644 --- a/src/rendering/mobys/draw_mobys_setup.c +++ b/src/rendering/mobys/draw_mobys_setup.c @@ -16,10 +16,13 @@ extern void vu1_add_data_ref() __asm__("func_00233830"); void draw_mobys_setup(void) __asm__("FUN_0020d278"); void draw_mobys_setup(void) { + enum { + FONT_STATE_MOBY_DRAW = 6 + }; register s32 current; register s32 callbackArg; vu1_add_data_ref(D_0010FAA0, D_0010FA90[0]); - font_state = 6; + font_state = FONT_STATE_MOBY_DRAW; vu0_load_micro_program(moby_draw_vu0_micro_program); vu1_add_g_sregister(0x47, 0x5360B); current = render_packet_cursor.addr; diff --git a/src/rendering/mobys/render_environment_mapped_object.c b/src/rendering/mobys/render_environment_mapped_object.c index 5c17c1f04d..bc33d40c4e 100644 --- a/src/rendering/mobys/render_environment_mapped_object.c +++ b/src/rendering/mobys/render_environment_mapped_object.c @@ -48,6 +48,10 @@ build_moby_bone_transform(EnvironmentMappedObject *, int, void *) __asm__("func_ void render_environment_mapped_object(EnvironmentMappedObject *object) __asm__("FUN_002327a0"); void render_environment_mapped_object(EnvironmentMappedObject *mesh_object) { + enum { + ENVIRONMENT_MAPPING_UV_REFRESH_PENDING = 1, + ENVIRONMENT_MAPPING_UV_REFRESH_CONSUMED = 2 + }; Vec4 quad_positions[4]; int colors[4]; float texture_coordinates[4][2]; @@ -99,7 +103,8 @@ void render_environment_mapped_object(EnvironmentMappedObject *mesh_object) { if (game_mode == 6 && ship_substate[0] == 4) { mapping_enabled = 0; } - if (mapping_enabled != 0 || environment_mapping_uv_refresh_state == 1) { + if (mapping_enabled != 0 || + environment_mapping_uv_refresh_state == ENVIRONMENT_MAPPING_UV_REFRESH_PENDING) { environment_mapping_was_active_gp = 1; fast_dec_timer(&D_001604AC); transition_fraction = convert_integer_to_float(D_001604AC) / @@ -119,7 +124,8 @@ void render_environment_mapped_object(EnvironmentMappedObject *mesh_object) { fast_vec_normalize(reflection, reflection, 1.0f); reflection[2] += 1.0f; sphere_denominator = square_root(reflection[2] * 2.0f) * 2.0f; - if (environment_mapping_uv_refresh_state == 1 || D_001604AC == 0) { + if (environment_mapping_uv_refresh_state == ENVIRONMENT_MAPPING_UV_REFRESH_PENDING || + D_001604AC == 0) { environment_mapping_vertex_uvs[element_index][0] = reflection[0] / sphere_denominator + 0.5f; environment_mapping_vertex_uvs[element_index][1] = @@ -137,8 +143,8 @@ void render_environment_mapped_object(EnvironmentMappedObject *mesh_object) { transition_fraction; } } - if (environment_mapping_uv_refresh_state == 1) { - environment_mapping_uv_refresh_state = 2; + if (environment_mapping_uv_refresh_state == ENVIRONMENT_MAPPING_UV_REFRESH_PENDING) { + environment_mapping_uv_refresh_state = ENVIRONMENT_MAPPING_UV_REFRESH_CONSUMED; } } else { if (environment_mapping_was_active_gp == 1) { diff --git a/src/rendering/packets/set_up_vis_gif_viewer.c b/src/rendering/packets/set_up_vis_gif_viewer.c index 6f2fb7dcd6..94e07e7172 100644 --- a/src/rendering/packets/set_up_vis_gif_viewer.c +++ b/src/rendering/packets/set_up_vis_gif_viewer.c @@ -16,6 +16,9 @@ void set_up_vis_gif_viewer(u64 *packet_destination, s32 material_control_shift2, s32 mode) { + enum { + FIRST_REGULAR_MATERIAL_INDEX = 0 + }; u64 template_texture_state0; s64 template_draw_control_bits; u64 template_texture_state1; @@ -24,7 +27,7 @@ void set_up_vis_gif_viewer(u64 *packet_destination, template_texture_state0 = resident_material_templates[mode * 3]; template_draw_control_bits = resident_material_templates[mode * 3 + 1]; template_texture_state1 = resident_material_templates[mode * 3 + 2]; - if (mode >= 0) { + if (mode >= FIRST_REGULAR_MATERIAL_INDEX) { packet_destination[0] = (0x20 | (template_draw_control_bits & 0x1C)) | ((u64)prim << 6) | ((u64)(u32)draw_control_high_word << 32); packet_destination += 2; diff --git a/src/rendering/texture/get_frame_texture.c b/src/rendering/texture/get_frame_texture.c index fd94b3018b..bb1defec2b 100644 --- a/src/rendering/texture/get_frame_texture.c +++ b/src/rendering/texture/get_frame_texture.c @@ -36,6 +36,10 @@ extern struct FrameTextureTables hud_state __asm__("D_0019A3E8"); u64 get_frame_texture(s32 frame_id) __asm__("FUN_001ffa10"); u64 get_frame_texture(s32 frame_id) { + enum { + PSMT8 = 0x13, + PSMT8H = 0x1B + }; struct FrameTextureRef *frame; struct FramePalettePage *palette_page; struct FrameImagePage *image_page; @@ -115,9 +119,9 @@ u64 get_frame_texture(s32 frame_id) { if (return_shift < 0) { return_shift = 0; } - return_mode = 0x13; + return_mode = PSMT8; if (image_page->gs_block_offset < (gs_texture_allocation_base >> 8)) { - return_mode = 0x1B; + return_mode = PSMT8H; } return_shift = 1 << return_shift; tex0_word = image_page->gs_block_offset | ((u64)return_shift << 14); diff --git a/src/rendering/view/update_view_context.c b/src/rendering/view/update_view_context.c index bc0ede8dad..cedafbe352 100644 --- a/src/rendering/view/update_view_context.c +++ b/src/rendering/view/update_view_context.c @@ -80,7 +80,7 @@ void update_view_context(void) { depth_scale = -8388080.0f; depth_bias = 8388112.0f; - if (pal_mode != 0) { + if (pal_mode != FALSE) { view_context.fov.f[1] = view_context.fov.f[0] * 0.756f; } else { view_context.fov.f[1] = view_context.fov.f[0] * 0.775f; diff --git a/src/runtime/set_video_timing.c b/src/runtime/set_video_timing.c index e8f209a89e..5023f90398 100644 --- a/src/runtime/set_video_timing.c +++ b/src/runtime/set_video_timing.c @@ -16,7 +16,7 @@ extern f32 frame_time_cube_macro __asm__("D_0015ED74") MACRO_ADDR; void set_video_timing(s32 pal_mode_enabled) { if (pal_mode_enabled == 0) { - pal_mode = 0; + pal_mode = FALSE; frame_scale_macro = 1.0f; frame_scale_sq_macro = 1.0f; frame_scale_inv_macro = 1.0f; @@ -27,7 +27,7 @@ void set_video_timing(s32 pal_mode_enabled) { frame_delta_time = 0.016666668f; return; } - pal_mode = 1; + pal_mode = TRUE; frame_scale_macro = 1.2f; frame_scale_sq_macro = 1.44f; frame_scale_inv_macro = 0.8333333f; diff --git a/src/save/check_memory_card.c b/src/save/check_memory_card.c index 37a0a1432e..ab5004e5d8 100644 --- a/src/save/check_memory_card.c +++ b/src/save/check_memory_card.c @@ -17,6 +17,9 @@ extern u8 memory_card_info_sync_outputs[] __asm__("D_0013D348"); s32 check_memory_card(void) __asm__("FUN_00209168"); s32 check_memory_card(void) { + enum { + MEMCARD_TYPE_SUPPORTED_FOR_STARTUP = 2 + }; s32 card_type; s32 free_blocks; s32 format; @@ -41,7 +44,7 @@ s32 check_memory_card(void) { if (card_state->unkBC == -2) { return 0; } - if (card_type != 2) { + if (card_type != MEMCARD_TYPE_SUPPORTED_FOR_STARTUP) { return 1; } if (format == 0) { diff --git a/src/save/memcard_restore_data.c b/src/save/memcard_restore_data.c index cd3d67f746..a5af8adbb9 100644 --- a/src/save/memcard_restore_data.c +++ b/src/save/memcard_restore_data.c @@ -42,6 +42,9 @@ extern void copy_memory_aligned(void *, void *, s32) __asm__("func_001F9838"); s32 memcard_restore_data(u8 *buf, s32 slot, struct RestoreEntry *tbl) __asm__("FUN_0020af20"); s32 memcard_restore_data(u8 *save_packet, s32 slot, struct RestoreEntry *restore_entries) { + enum { + RESTORE_STATUS_SIZE_MATCH = 1 + }; struct RestoreEntry *matched_entry; s32 errors; s32 total; @@ -75,7 +78,7 @@ s32 memcard_restore_data(u8 *save_packet, s32 slot, struct RestoreEntry *restore s32 entrySize = matched_entry->size; slot_destination = matched_entry->data + slot * entrySize; if (blockSize == entrySize) { - s32 status = 1; + s32 status = RESTORE_STATUS_SIZE_MATCH; copySize = entrySize; matched_entry->status = status; } else if (blockSize < entrySize) { diff --git a/src/save/memcard_save_data.c b/src/save/memcard_save_data.c index 10d2b571db..f01834a0ca 100644 --- a/src/save/memcard_save_data.c +++ b/src/save/memcard_save_data.c @@ -26,6 +26,9 @@ int memcard_save_data(int slot, int flags) __asm__("FUN_0020b178"); extern s32 current_bolt_count_macro __asm__("D_0015ED98") MACRO_ADDR; int memcard_save_data(int slot, int flags) { + enum { + LEVEL_VISIT_UNVISITED = 0 + }; unsigned char saved_visit_state; sceCdReadClock(D_0015EE98); @@ -48,18 +51,18 @@ int memcard_save_data(int slot, int flags) { if (slot == 0) { mode_freeze_flags |= 0x200; } - if (card_state->state >= 3) { + if (card_state->state >= MEMCARD_REQUEST_FORMAT) { goto done; } - if (card_state->pending_state >= 0) { + if (card_state->pending_state >= MEMCARD_QUERY_INFO) { goto done; } card_state->record_index = current_level_index; - saved_visit_state = 0; + saved_visit_state = LEVEL_VISIT_UNVISITED; if (flags >= 0) { current_level_index = flags; saved_visit_state = level_visit_state[flags]; - if (saved_visit_state == 0) { + if (saved_visit_state == LEVEL_VISIT_UNVISITED) { level_visit_state[flags] = 1; } } @@ -84,13 +87,13 @@ int memcard_save_data(int slot, int flags) { level_visit_state[current_level_index] = saved_visit_state; current_level_index = card_state->record_index; } - if (card_state->pending_state < 0) { - card_state->pending_state = 0xF; + if (card_state->pending_state < MEMCARD_QUERY_INFO) { + card_state->pending_state = MEMCARD_BEGIN_UPDATE_SAVE; card_state->pending_card = card_state->active_card; } } done: - return memory_card_state.pending_state == 0xF; + return memory_card_state.pending_state == MEMCARD_BEGIN_UPDATE_SAVE; } extern __typeof__(memcard_save_data) func_0020B178 __attribute__((alias("FUN_0020b178"))); diff --git a/src/save/memcard_update_state.c b/src/save/memcard_update_state.c index f87f452ce3..5820f219a0 100644 --- a/src/save/memcard_update_state.c +++ b/src/save/memcard_update_state.c @@ -58,7 +58,7 @@ void memcard_update_state(void) { MC.cur = 0; } if (sceMcGetInfo(CARD.port, CARD.slot, &CARD.type, &CARD.free, &CARD.format) == 0) { - MC.state = 1; + MC.state = MEMCARD_PROCESS_INFO_RESULT; } break; @@ -69,15 +69,15 @@ void memcard_update_state(void) { CARD.errors = -1; } if (++MC.cur < 1) { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; } else { - MC.state = 2; + MC.state = MEMCARD_DISPATCH_PENDING_OPERATION; } MC.busy = 0; break; case MEMCARD_DISPATCH_PENDING_OPERATION: - if (MC.pending_state >= 0) { + if (MC.pending_state >= MEMCARD_QUERY_INFO) { if (MC.card[0].sync_result == 0) { if (MC.pending_card >= 0) { MC.cur = MC.pending_card; @@ -92,7 +92,7 @@ void memcard_update_state(void) { } else { if (++MC.cur >= 31) { MC.cur = 0; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; } } MC.busy = 0; @@ -101,12 +101,12 @@ void memcard_update_state(void) { case MEMCARD_REQUEST_FORMAT: if (CARD.format == 0) { if (SceMcFormat(CARD.port, CARD.slot) == 0) { - MC.state = 4; + MC.state = MEMCARD_PROCESS_FORMAT_RESULT; } break; } MC.busy = 0; - MC.state = 2; + MC.state = MEMCARD_DISPATCH_PENDING_OPERATION; break; case MEMCARD_PROCESS_FORMAT_RESULT: @@ -114,7 +114,7 @@ void memcard_update_state(void) { MC.err = 1; MC.err_card = MC.cur; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; @@ -122,12 +122,12 @@ void memcard_update_state(void) { case MEMCARD_REQUEST_UNFORMAT: if (CARD.format == 0) { if (SceMcUnformat(CARD.port, CARD.slot) == 0) { - MC.state = 6; + MC.state = MEMCARD_PROCESS_UNFORMAT_RESULT; } break; } MC.busy = 0; - MC.state = 2; + MC.state = MEMCARD_DISPATCH_PENDING_OPERATION; break; case MEMCARD_PROCESS_UNFORMAT_RESULT: @@ -135,7 +135,7 @@ void memcard_update_state(void) { MC.err = 2; MC.err_card = MC.cur; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; @@ -143,7 +143,7 @@ void memcard_update_state(void) { case MEMCARD_REQUEST_CHDIR: if (sceMcChdir(CARD.port, CARD.slot, D_0013D1D0, 0) == 0) { MC.sub = 0; - MC.state = 8; + MC.state = MEMCARD_PROBE_SAVE_HEADER; } break; @@ -166,7 +166,7 @@ void memcard_update_state(void) { MC.err = 4; MC.err_card = MC.cur; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -197,7 +197,7 @@ void memcard_update_state(void) { } else { MC.err = 4; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; } MC.busy = 0; @@ -225,7 +225,7 @@ void memcard_update_state(void) { if (MC.result >= 0) { MC.err = 0x2716; if (sceMcClose(MC.fd) == 0) { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -242,7 +242,7 @@ void memcard_update_state(void) { } else { MC.err = 4; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -250,14 +250,14 @@ void memcard_update_state(void) { case MEMCARD_PROBE_REQUEST_CLOSE: if (sceMcClose(MC.fd) == 0) { MC.busy = 0; - MC.state = 21; + MC.state = MEMCARD_BEGIN_SCAN_SAVE_INFO; } break; } break; case MEMCARD_BEGIN_CREATE_SAVE_DIRECTORY: - MC.state = 10; + MC.state = MEMCARD_CREATE_SAVE_DIRECTORY; MC.sub = 0; CARD.save_index = 0; case MEMCARD_CREATE_SAVE_DIRECTORY: @@ -268,7 +268,7 @@ void memcard_update_state(void) { } else { MC.err = 7; MC.err_card = MC.cur; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; } MC.busy = 0; @@ -291,7 +291,7 @@ void memcard_update_state(void) { } else { MC.err = 0xD; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; @@ -377,7 +377,7 @@ void memcard_update_state(void) { } else { MC.err = 0xA; MC.err_card = MC.cur; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -397,7 +397,7 @@ void memcard_update_state(void) { if (MC.result >= 0) { MC.err = 0xB; if (sceMcClose(MC.fd) == 0) { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -412,7 +412,7 @@ void memcard_update_state(void) { } else { MC.err = 0xD; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; @@ -424,7 +424,7 @@ void memcard_update_state(void) { } else { MC.err = 0xC; MC.err_card = MC.cur; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; } MC.busy = 0; @@ -439,7 +439,7 @@ void memcard_update_state(void) { break; case MEMCARD_CREATE_RESET_CARD_STATUS: MC.card[0].save_index = -1; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.card[0].errors = 0; break; @@ -447,7 +447,7 @@ void memcard_update_state(void) { break; case MEMCARD_BEGIN_DELETE_SAVE_DIRECTORY: - MC.state = 12; + MC.state = MEMCARD_DELETE_SAVE_DIRECTORY; MC.sub = 0; CARD.save_index = -2; case MEMCARD_DELETE_SAVE_DIRECTORY: @@ -478,7 +478,7 @@ void memcard_update_state(void) { } else { MC.err = 0x12; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; } MC.busy = 0; @@ -510,7 +510,7 @@ void memcard_update_state(void) { MC.err = 0x12; } } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; @@ -518,7 +518,7 @@ void memcard_update_state(void) { break; case MEMCARD_BEGIN_SCAN_SAVE_INFO: - MC.state = 22; + MC.state = MEMCARD_ADVANCE_SAVE_INFO_SCAN; CARD.scan_save_index = -1; MC.record_index = 0; break; @@ -527,9 +527,9 @@ void memcard_update_state(void) { CARD.scan_save_index++; if (CARD.scan_save_index < 5) { MC.sub = 0; - MC.state = 23; + MC.state = MEMCARD_READ_SCANNED_SAVE_INFO; } else { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -537,19 +537,19 @@ void memcard_update_state(void) { case MEMCARD_BEGIN_READ_SAVE: if (CARD.save_index < 0) { MC.busy = 0; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.err = 0x13; break; } MC.record_index = 0; MC.sub = 0; - MC.state = 14; + MC.state = MEMCARD_READ_SAVE; case MEMCARD_READ_SAVE: case MEMCARD_READ_SCANNED_SAVE_INFO: switch (MC.sub) { case MEMCARD_READ_SAVE_REQUEST_OPEN: - if (MC.state == 23) { + if (MC.state == MEMCARD_READ_SCANNED_SAVE_INFO) { sprintf(name, D_0013D270, CARD.scan_save_index); } else { sprintf(name, D_0013D270, CARD.save_index); @@ -577,7 +577,7 @@ void memcard_update_state(void) { } else { MC.err = 0x1C; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; } MC.busy = 0; @@ -598,7 +598,7 @@ void memcard_update_state(void) { if (MC.result >= 0) { MC.err = 0x1B; if (sceMcClose(MC.fd) == 0) { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -615,7 +615,7 @@ void memcard_update_state(void) { } else { MC.err = 0x1C; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; @@ -630,7 +630,7 @@ void memcard_update_state(void) { break; case MEMCARD_READ_SAVE_PROCESS_MAIN_DATA_READ_RESULT: if (MC.result == MC.size) { - if (MC.state == 23) { + if (MC.state == MEMCARD_READ_SCANNED_SAVE_INFO) { memcard_restore_info(memcard_game_data_buffer, MC.cur, CARD.scan_save_index); MC.sub = 8; } else { @@ -644,7 +644,7 @@ void memcard_update_state(void) { if (MC.result >= 0) { MC.err = 0x1B; if (sceMcClose(MC.fd) == 0) { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -661,7 +661,7 @@ void memcard_update_state(void) { } else { MC.err = 0x1C; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; @@ -690,7 +690,7 @@ void memcard_update_state(void) { if (MC.result >= 0) { MC.err = 0x1B; if (sceMcClose(MC.fd) == 0) { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -707,17 +707,17 @@ void memcard_update_state(void) { } else { MC.err = 0x1C; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; case MEMCARD_READ_SAVE_REQUEST_CLOSE: if (sceMcClose(MC.fd) == 0) { - if (MC.state == 23) { + if (MC.state == MEMCARD_READ_SCANNED_SAVE_INFO) { MC.busy = 0; - MC.state = 22; + MC.state = MEMCARD_ADVANCE_SAVE_INFO_SCAN; } else { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; } } @@ -728,20 +728,20 @@ void memcard_update_state(void) { case MEMCARD_BEGIN_UPDATE_SAVE: if (CARD.errors != 0) { MC.busy = 0; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.err = 0x2717; break; } if (CARD.save_index < 0) { MC.busy = 0; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.err = 0x1D; break; } MC.sub = 0; - MC.state = 16; + MC.state = MEMCARD_UPDATE_SAVE; case MEMCARD_UPDATE_SAVE: switch (MC.sub) { case MEMCARD_UPDATE_SAVE_REQUEST_OPEN: @@ -769,7 +769,7 @@ void memcard_update_state(void) { } else { MC.err = 0x26; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; } MC.busy = 0; @@ -783,7 +783,7 @@ void memcard_update_state(void) { if (MC.result >= 0) { MC.sub = 4; } else { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -803,7 +803,7 @@ void memcard_update_state(void) { if (MC.result >= 0) { MC.err = 0x25; if (sceMcClose(MC.fd) == 0) { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -820,7 +820,7 @@ void memcard_update_state(void) { } else { MC.err = 0x26; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; @@ -837,7 +837,7 @@ void memcard_update_state(void) { if (MC.result >= 0) { MC.sub = 8; } else { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -857,7 +857,7 @@ void memcard_update_state(void) { if (MC.result >= 0) { MC.err = 0x25; if (sceMcClose(MC.fd) == 0) { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -874,13 +874,13 @@ void memcard_update_state(void) { } else { MC.err = 0x1C; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; case MEMCARD_UPDATE_SAVE_REQUEST_CLOSE: if (sceMcClose(MC.fd) == 0) { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; } break; @@ -914,21 +914,21 @@ void memcard_update_state(void) { case MEMCARD_BEGIN_WRITE_FULL_SAVE: if (CARD.errors != 0) { MC.busy = 0; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.err = 0x2718; break; } if (CARD.save_index < 0) { MC.busy = 0; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.err = 0x27; break; } MC.record_index = 0; MC.sub = 0; - MC.state = 20; + MC.state = MEMCARD_WRITE_FULL_SAVE; case MEMCARD_WRITE_FULL_SAVE: switch (MC.sub) { case MEMCARD_WRITE_FULL_SAVE_REQUEST_OPEN: @@ -951,7 +951,7 @@ void memcard_update_state(void) { } MC.err = 0x2B; MC.err_card = MC.cur; - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; @@ -966,7 +966,7 @@ void memcard_update_state(void) { if (MC.result >= 0) { MC.err = 0xB; if (sceMcClose(MC.fd) == 0) { - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; } @@ -981,7 +981,7 @@ void memcard_update_state(void) { } else { MC.err = 0x2D; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; @@ -990,7 +990,7 @@ void memcard_update_state(void) { MC.err = 0x2C; MC.err_card = MC.cur; } - MC.state = 0; + MC.state = MEMCARD_QUERY_INFO; MC.cur = 0; MC.busy = 0; break; diff --git a/src/sdk/dma/sce_dma_pause.c b/src/sdk/dma/sce_dma_pause.c index 9081690a2c..d9427879f4 100644 --- a/src/sdk/dma/sce_dma_pause.c +++ b/src/sdk/dma/sce_dma_pause.c @@ -20,7 +20,7 @@ s32 sceDmaPause(volatile u32 *chcr) { masked = chan & 0xFFFFFEFF; *chcr = masked; *(volatile u32 *)0x1000F590 = ctrl; - if (state != 0) { + if (state != FALSE) { EnableInterrupts(masked, dstat, ctrl, state); } return chan; diff --git a/src/sdk/graph/sce_gs_set_def_disp_env.c b/src/sdk/graph/sce_gs_set_def_disp_env.c index 30ecabd07b..c67523f1ae 100644 --- a/src/sdk/graph/sce_gs_set_def_disp_env.c +++ b/src/sdk/graph/sce_gs_set_def_disp_env.c @@ -27,6 +27,9 @@ void sceGsSetDefDispEnv(struct sceGsDispEnv *output, s16 horizontal_offset, s16 vertical_offset) { + enum { + GS_FRAME_MODE_FIELD = 0 + }; GsVideoModeState *state; s32 kernel_horizontal, kernel_vertical, kernel_width, kernel_height; s32 mode, scale; @@ -51,7 +54,7 @@ void sceGsSetDefDispEnv(struct sceGsDispEnv *output, output->pmode = 0x66; if (state->nSInterlace != 0) { - if (state->nSFrame_mode == 0) + if (state->nSFrame_mode == GS_FRAME_MODE_FIELD) output->smode2 = 1; else output->smode2 = 3; @@ -72,7 +75,7 @@ void sceGsSetDefDispEnv(struct sceGsDispEnv *output, scaled_horizontal = scaled_horizontal + 0x27c; scaled_horizontal = (scaled_horizontal + horizontal_offset * scale) & 0xfff; value = (u64)(s64)(scale - 1) << 23; - if (state->nSFrame_mode != 0) { + if (state->nSFrame_mode != GS_FRAME_MODE_FIELD) { display_width = (value | display_width) | ((u64)scaled_horizontal | ((u64)(s64)(height * 2 - 1) << 44)); } else { @@ -103,7 +106,7 @@ void sceGsSetDefDispEnv(struct sceGsDispEnv *output, scaled_horizontal = scaled_horizontal + 0x290; scaled_horizontal = (scaled_horizontal + horizontal_offset * scale) & 0xfff; value = (u64)(s64)(scale - 1) << 23; - if (state->nSFrame_mode != 0) { + if (state->nSFrame_mode != GS_FRAME_MODE_FIELD) { display_width = (value | display_width) | ((u64)scaled_horizontal | ((u64)(s64)(height * 2 - 1) << 44)); } else { diff --git a/src/sdk/input/sce_pad2_create_socket.c b/src/sdk/input/sce_pad2_create_socket.c index 842683dcca..d3c0e667b2 100644 --- a/src/sdk/input/sce_pad2_create_socket.c +++ b/src/sdk/input/sce_pad2_create_socket.c @@ -42,6 +42,9 @@ extern void *memset(void *, s32, u32); extern void *memcpy(void *, const void *, u32); s32 scePad2CreateSocket(Pad2SocketParam *param, void *addr) { + enum { + DBC_SOCKET_TYPE_PAD2 = 1 + }; DbcSocketParam dbc; Pad2Side *side; s32 socket; @@ -63,7 +66,7 @@ s32 scePad2CreateSocket(Pad2SocketParam *param, void *addr) { dbc.number = 0; dbc.name[0] = 0; } - dbc.type = 1; + dbc.type = DBC_SOCKET_TYPE_PAD2; dbc.option |= 1; socket = sceDbcCreateSocket(&dbc, addr, (u8 *)addr + 128); if (socket < 0) { diff --git a/src/sdk/input/sce_pad2_init.c b/src/sdk/input/sce_pad2_init.c index a7a54cdac6..cb114d3029 100644 --- a/src/sdk/input/sce_pad2_init.c +++ b/src/sdk/input/sce_pad2_init.c @@ -10,12 +10,15 @@ extern u32 pad2_initialized[] __asm__("D_00132DD0"); extern u8 D_0015B540[]; s32 scePad2Init(void) { + enum { + PAD2_SOCKET_INACTIVE = 0 + }; struct Pad2StateEntry *pad2_socket_record; pad2_initialized[0] = 1; pad2_socket_record = (struct Pad2StateEntry *)D_0015B540; do { - pad2_socket_record->state = 0; + pad2_socket_record->state = PAD2_SOCKET_INACTIVE; pad2_socket_record->request = 0; pad2_socket_record->result = 0; pad2_socket_record = (struct Pad2StateEntry *)((u8 *)pad2_socket_record + 0x330); diff --git a/src/sdk/input/sce_vib_get_profile.c b/src/sdk/input/sce_vib_get_profile.c index 08df65fb1e..38563e51a5 100644 --- a/src/sdk/input/sce_vib_get_profile.c +++ b/src/sdk/input/sce_vib_get_profile.c @@ -16,6 +16,9 @@ typedef union { extern s32 sceDbcReceiveData(s32 port, DbcCommand cmd, void *buf, void *data); s32 sceVibGetProfile(s32 port, u8 *profile) { + enum { + DBC_RECEIVE_ERROR_THRESHOLD = 0 + }; DbcCommand cmd; s32 profile_byte_count; s32 receive_status; @@ -25,7 +28,7 @@ s32 sceVibGetProfile(s32 port, u8 *profile) { cmd.cmd = 3; cmd.ver = 1; receive_status = sceDbcReceiveData(port, cmd, &profile_byte_count, profile); - if (receive_status < 0) { + if (receive_status < DBC_RECEIVE_ERROR_THRESHOLD) { return receive_status; } return profile_byte_count; diff --git a/src/sdk/interrupts/enable_interrupts.c b/src/sdk/interrupts/enable_interrupts.c index 80fc36cab2..cdac4d7bce 100644 --- a/src/sdk/interrupts/enable_interrupts.c +++ b/src/sdk/interrupts/enable_interrupts.c @@ -2,10 +2,13 @@ #include "rnc/sdk/kernel.h" s32 EnableInterrupts(void) { + enum { + INTERRUPT_ENABLE_BIT_CLEAR = 0 + }; u32 status; status = CpuReadStatus(); status &= 0x10000; CpuEnableInt(); - return status != 0; + return status != INTERRUPT_ENABLE_BIT_CLEAR; } diff --git a/src/sdk/ipu/clear_mpeg_reference_buffer.c b/src/sdk/ipu/clear_mpeg_reference_buffer.c index b19a90c3f2..cc8875d6eb 100644 --- a/src/sdk/ipu/clear_mpeg_reference_buffer.c +++ b/src/sdk/ipu/clear_mpeg_reference_buffer.c @@ -5,32 +5,35 @@ int ClearMpegReferenceBuffer(struct sceMpeg *mp) __asm__("ClearMpegReferenceBuff /* Zero status of reference images 0, 4, 8, 1, 5, 9. */ int ClearMpegReferenceBuffer(struct sceMpeg *mp) { + enum { + MPEG_REF_IMAGE_STATUS_CLEARED = 0 + }; struct MpegDecoder *decoder = mp->sys; struct MpegRefImage *reference_image; reference_image = decoder->ref_images[0]; if (reference_image != 0) { - reference_image->status = 0; + reference_image->status = MPEG_REF_IMAGE_STATUS_CLEARED; } reference_image = decoder->ref_images[4]; if (reference_image != 0) { - reference_image->status = 0; + reference_image->status = MPEG_REF_IMAGE_STATUS_CLEARED; } reference_image = decoder->ref_images[8]; if (reference_image != 0) { - reference_image->status = 0; + reference_image->status = MPEG_REF_IMAGE_STATUS_CLEARED; } reference_image = decoder->ref_images[1]; if (reference_image != 0) { - reference_image->status = 0; + reference_image->status = MPEG_REF_IMAGE_STATUS_CLEARED; } reference_image = decoder->ref_images[5]; if (reference_image != 0) { - reference_image->status = 0; + reference_image->status = MPEG_REF_IMAGE_STATUS_CLEARED; } reference_image = decoder->ref_images[9]; if (reference_image != 0) { - reference_image->status = 0; + reference_image->status = MPEG_REF_IMAGE_STATUS_CLEARED; } return 1; } diff --git a/src/sdk/ipu/receive_data_from_ipu.c b/src/sdk/ipu/receive_data_from_ipu.c index 4e0d0077c2..5fdad1155c 100644 --- a/src/sdk/ipu/receive_data_from_ipu.c +++ b/src/sdk/ipu/receive_data_from_ipu.c @@ -10,7 +10,7 @@ void receiveDataFromIPU(s32 destination_address, s32 byte_count) { *(volatile u32 *)0x1000B010 = (destination_address & 0x0FFFFFFF) | 0x80000000; *(volatile u32 *)0x1000B020 = byte_count >> 4; *(volatile u32 *)0x1000B000 = 0x100; - if (saved_interrupt_state != 0) { + if (saved_interrupt_state != FALSE) { EnableInterrupts(0x100); } } diff --git a/src/sdk/kernel/SyncDCache.c b/src/sdk/kernel/SyncDCache.c index ac3028c599..7a9ffad31a 100644 --- a/src/sdk/kernel/SyncDCache.c +++ b/src/sdk/kernel/SyncDCache.c @@ -8,15 +8,18 @@ extern s32 DIntr(); void SyncDCache(s32 range_start_address, s32 range_end_address) __asm__("FUN_00118f88"); void SyncDCache(s32 range_start_address, s32 range_end_address) { + enum { + INTERRUPT_ENABLE_BIT_CLEAR = 0 + }; u32 status; status = CpuReadStatus(); status &= 0x10000; - if (status != 0) { + if (status != INTERRUPT_ENABLE_BIT_CLEAR) { DIntr(); } _sceSDC(range_start_address & 0xFFFFFFC0, range_end_address & 0xFFFFFFC0); - if (status != 0) { + if (status != INTERRUPT_ENABLE_BIT_CLEAR) { EnableInterrupts(); } } diff --git a/src/sdk/kernel/disable_dmac.c b/src/sdk/kernel/disable_dmac.c index e517b4272c..01e0a22b8f 100644 --- a/src/sdk/kernel/disable_dmac.c +++ b/src/sdk/kernel/disable_dmac.c @@ -8,17 +8,20 @@ extern s32 DIntr(); s32 disable_dmac(s32 channel_index) __asm__("FUN_001190f8"); s32 disable_dmac(s32 channel_index) { + enum { + EE_INTERRUPT_ENABLE_CLEAR = 0 + }; u32 status; s32 dmac_disable_result; status = CpuReadStatus(); status &= 0x10000; - if (status != 0) { + if (status != EE_INTERRUPT_ENABLE_CLEAR) { DIntr(); } dmac_disable_result = _DisableDmac(channel_index); CpuSync(); - if (status != 0) { + if (status != EE_INTERRUPT_ENABLE_CLEAR) { EnableInterrupts(); } return dmac_disable_result; diff --git a/src/sdk/kernel/disable_intc.c b/src/sdk/kernel/disable_intc.c index 9daaec49cf..8bc5223ff1 100644 --- a/src/sdk/kernel/disable_intc.c +++ b/src/sdk/kernel/disable_intc.c @@ -8,17 +8,20 @@ extern s32 DIntr(); s32 disable_intc(s32 intc_cause) __asm__("FUN_00119028"); s32 disable_intc(s32 intc_cause) { + enum { + EE_INTERRUPT_ENABLE_CLEAR = 0 + }; u32 status; s32 result; status = CpuReadStatus(); status &= 0x10000; - if (status != 0) { + if (status != EE_INTERRUPT_ENABLE_CLEAR) { DIntr(); } result = _DisableIntc(intc_cause); CpuSync(); - if (status != 0) { + if (status != EE_INTERRUPT_ENABLE_CLEAR) { EnableInterrupts(); } return result; diff --git a/src/sdk/kernel/enable_dmac.c b/src/sdk/kernel/enable_dmac.c index 16e9d29f71..e77405bda9 100644 --- a/src/sdk/kernel/enable_dmac.c +++ b/src/sdk/kernel/enable_dmac.c @@ -8,20 +8,23 @@ extern s32 DIntr(); s32 enable_dmac(s32 channel_index) __asm__("FUN_00119160"); s32 enable_dmac(s32 channel_index) { + enum { + INTERRUPT_ENABLE_BIT_CLEAR = 0 + }; u32 status; - s32 result; + s32 dmac_enable_result; status = CpuReadStatus(); status &= 0x10000; - if (status != 0) { + if (status != INTERRUPT_ENABLE_BIT_CLEAR) { DIntr(); } - result = _EnableDmac(channel_index); + dmac_enable_result = _EnableDmac(channel_index); CpuSync(); - if (status != 0) { + if (status != INTERRUPT_ENABLE_BIT_CLEAR) { EnableInterrupts(); } - return result; + return dmac_enable_result; } /* Recovered original symbol name. */ diff --git a/src/sdk/kernel/enable_intc.c b/src/sdk/kernel/enable_intc.c index c96e8c1d79..ef1e7968ec 100644 --- a/src/sdk/kernel/enable_intc.c +++ b/src/sdk/kernel/enable_intc.c @@ -8,17 +8,20 @@ extern s32 DIntr(); s32 enable_intc(s32 cause_index) __asm__("FUN_00119090"); s32 enable_intc(s32 cause_index) { + enum { + EE_INTERRUPT_ENABLE_BIT_CLEAR = 0 + }; u32 status; s32 intc_enable_result; status = CpuReadStatus(); status &= 0x10000; - if (status != 0) { + if (status != EE_INTERRUPT_ENABLE_BIT_CLEAR) { DIntr(); } intc_enable_result = _EnableIntc(cause_index); CpuSync(); - if (status != 0) { + if (status != EE_INTERRUPT_ENABLE_BIT_CLEAR) { EnableInterrupts(); } return intc_enable_result; diff --git a/src/sdk/libc/mprec/__i2b.c b/src/sdk/libc/mprec/__i2b.c index f52b19cc0e..11bb98a69b 100644 --- a/src/sdk/libc/mprec/__i2b.c +++ b/src/sdk/libc/mprec/__i2b.c @@ -11,8 +11,11 @@ Object *_Balloc(Object *object, int index) __asm__("func_001154D0"); Object *__i2b(Object *unused, Object *object) __asm__("func_00115808"); Object *__i2b(Object *unused, Object *initial_bigint_value) { + enum { + BIGINT_SINGLE_WORD_COUNT = 1 + }; Object *allocated_bigint = _Balloc(unused, 1); allocated_bigint->value = (int)initial_bigint_value; - allocated_bigint->state = 1; + allocated_bigint->state = BIGINT_SINGLE_WORD_COUNT; return allocated_bigint; } diff --git a/src/sdk/libc/stdio/cvt.c b/src/sdk/libc/stdio/cvt.c index 16b46ea3e9..caf67a6a53 100644 --- a/src/sdk/libc/stdio/cvt.c +++ b/src/sdk/libc/stdio/cvt.c @@ -34,7 +34,7 @@ typedef union { #define ALT 0x001 static s8 *cvt(struct _reent *reentrancy_state, - f64 value, + f64 number_to_format, s32 ndigits, s32 flags, s8 *sign, @@ -42,35 +42,39 @@ static s8 *cvt(struct _reent *reentrancy_state, s32 ch, s32 *length) { + enum { + DTOA_MODE_SIGNIFICANT_DIGITS = 2, + DTOA_MODE_FRACTIONAL_DIGITS = 3 + }; s32 mode, dsgn; s8 *digits, *bp, *rve; double_union value_bits; if (ch == 'f') { - mode = 3; + mode = DTOA_MODE_FRACTIONAL_DIGITS; } else { if (ch == 'e' || ch == 'E') { ndigits++; } - mode = 2; + mode = DTOA_MODE_SIGNIFICANT_DIGITS; } - value_bits.d = value; + value_bits.d = number_to_format; if (word0(value_bits) & Sign_bit) { - value = -value; + number_to_format = -number_to_format; *sign = '-'; } else { *sign = '\000'; } - digits = _dtoa_r(reentrancy_state, value, mode, ndigits, decpt, &dsgn, &rve); + digits = _dtoa_r(reentrancy_state, number_to_format, mode, ndigits, decpt, &dsgn, &rve); if ((ch != 'g' && ch != 'G') || (flags & ALT)) { bp = digits + ndigits; if (ch == 'f') { - if (*digits == '0' && value) { + if (*digits == '0' && number_to_format) { *decpt = -ndigits + 1; } bp += *decpt; } - if (value == 0) { + if (number_to_format == 0) { rve = bp; } while (rve < bp) { diff --git a/src/sdk/libc/stdlib/srand.c b/src/sdk/libc/stdlib/srand.c index 3fccc1c69e..8dc692ca37 100644 --- a/src/sdk/libc/stdlib/srand.c +++ b/src/sdk/libc/stdlib/srand.c @@ -4,6 +4,6 @@ void srand(int value) __asm__("func_001160C8"); -void srand(int value) { - _impure_ptr->_rand_next = value; +void srand(int seed) { + _impure_ptr->_rand_next = seed; } diff --git a/src/sdk/mpeg/api/sce_mpeg_demux_pss_ring.c b/src/sdk/mpeg/api/sce_mpeg_demux_pss_ring.c index 6a9a2b53d0..c521456d21 100644 --- a/src/sdk/mpeg/api/sce_mpeg_demux_pss_ring.c +++ b/src/sdk/mpeg/api/sce_mpeg_demux_pss_ring.c @@ -69,6 +69,9 @@ extern void _sysbitInit(SysBit *bs, u8 *start, u8 *bufstart, s32 bufsize); extern u8 *GetSysbitPointer(SysBit *bs, s32 pos); int sceMpegDemuxPssRing(sceMpeg *mp, u8 *start, int size, u8 *bufstart, int bufsize) { + enum { + MPEG_CALLBACK_PES_PACKET = 6 + }; SysBit bs; PssHdr hdr; SysBit *bitstream; @@ -116,7 +119,7 @@ int sceMpegDemuxPssRing(sceMpeg *mp, u8 *start, int size, u8 *bufstart, int bufs for (i = 0; i < sys->n; i++) { if (tbl[i].id == (pss_header->pes.id & tbl[i].mask)) { headerpos = pss_header->pes.header; - cb.type = 6; + cb.type = MPEG_CALLBACK_PES_PACKET; cb.header = GetSysbitPointer(bitstream, headerpos); cb.data = GetSysbitPointer(bitstream, pss_header->pes.data); cb.len = pss_header->pes.datalen; @@ -128,7 +131,7 @@ int sceMpegDemuxPssRing(sceMpeg *mp, u8 *start, int size, u8 *bufstart, int bufs } if (i == sys->n && cbfunc != 0) { headerpos = pss_header->pes.header; - cb.type = 6; + cb.type = MPEG_CALLBACK_PES_PACKET; cb.header = GetSysbitPointer(bitstream, headerpos); cb.data = GetSysbitPointer(bitstream, pss_header->pes.data); cb.len = pss_header->pes.datalen; diff --git a/src/sdk/mpeg/api/sce_mpeg_init.c b/src/sdk/mpeg/api/sce_mpeg_init.c index 14651b78ec..3be684fd01 100644 --- a/src/sdk/mpeg/api/sce_mpeg_init.c +++ b/src/sdk/mpeg/api/sce_mpeg_init.c @@ -11,7 +11,7 @@ void sceMpegInit(void) { *(volatile u32 *)0x1000B000 &= 0xFFFFFEFF; *(volatile u32 *)0x1000B400 &= 0xFFFFFEFF; *(volatile u32 *)0x1000F590 = *(volatile u32 *)0x1000F520 & 0xFFFEFFFF; - if (state != 0) { + if (state != FALSE) { EnableInterrupts(); } *(volatile u32 *)0x1000B020 = 0; diff --git a/src/sdk/mpeg/demux/_getPtsDtsFlags.c b/src/sdk/mpeg/demux/_getPtsDtsFlags.c index 31f7c23cc5..31d7061620 100644 --- a/src/sdk/mpeg/demux/_getPtsDtsFlags.c +++ b/src/sdk/mpeg/demux/_getPtsDtsFlags.c @@ -40,6 +40,10 @@ void GetMpegPictureTimestampsAndFlags(struct MpegTimestampState *state, s64 *decoding_timestamp, s64 *flags) { + enum { + MPEG_PTS_OVERRIDE_INACTIVE = 0, + MPEG_PTS_OVERRIDE_PENDING = 2 + }; s32 previous_timestamp; s32 timestamp_carry; s64 timestamp_step; @@ -71,11 +75,11 @@ void GetMpegPictureTimestampsAndFlags(struct MpegTimestampState *state, } else { *presentation_timestamp = picture->presentation_timestamp; } - if (state->override_state == 2) { + if (state->override_state == MPEG_PTS_OVERRIDE_PENDING) { override_timestamp = state->override_timestamp; if (override_timestamp >= 0) { *presentation_timestamp = override_timestamp; - state->override_state = 0; + state->override_state = MPEG_PTS_OVERRIDE_INACTIVE; state->override_timestamp = -1; } } diff --git a/src/sdk/mpeg/headers/next_header.c b/src/sdk/mpeg/headers/next_header.c index 0c0dfc5c90..93da1c5857 100644 --- a/src/sdk/mpeg/headers/next_header.c +++ b/src/sdk/mpeg/headers/next_header.c @@ -30,6 +30,9 @@ s32 _nextHeader(MpegDec *decoder) { MPEG_SEQUENCE_END_CODE = 0x1B7, MPEG_GROUP_START_CODE = 0x1B8 }; + enum { + MPEG_CALLBACK_TIMESTAMP = 5 + }; MpegCbTimeStamp cb; u32 code; @@ -45,7 +48,7 @@ s32 _nextHeader(MpegDec *decoder) { break; case MPEG_PICTURE_START_CODE: _pictureHeader(decoder); - cb.type = 5; + cb.type = MPEG_CALLBACK_TIMESTAMP; cb.pts = -1; cb.dts = -1; _dispatchMpegCallback(decoder->cbData, &cb); diff --git a/src/sdk/mpeg/headers/setdefaultqm.c b/src/sdk/mpeg/headers/setdefaultqm.c index 4394728de5..942e861fb4 100644 --- a/src/sdk/mpeg/headers/setdefaultqm.c +++ b/src/sdk/mpeg/headers/setdefaultqm.c @@ -8,10 +8,14 @@ extern s32 DIntr(void); void _setDefaultQM(struct MpegDecoder *decoder, s32 command, u32 matrix) { + enum { + MPEG_CALLBACK_BEFORE_DEFAULT_MATRIX_LOAD = 2, + MPEG_CALLBACK_AFTER_DEFAULT_MATRIX_LOAD = 3 + }; s32 interrupts_enabled; struct sceMpegCbData callback; - callback.type = 2; + callback.type = MPEG_CALLBACK_BEFORE_DEFAULT_MATRIX_LOAD; _dispatchMpegCallback(decoder->mpeg, &callback); _waitIpuIdle(decoder); *IPU_CMD = 0; @@ -25,6 +29,6 @@ void _setDefaultQM(struct MpegDecoder *decoder, s32 command, u32 matrix) { } SendIpuCommand(decoder, command); _waitIpuIdle(decoder); - callback.type = 3; + callback.type = MPEG_CALLBACK_AFTER_DEFAULT_MATRIX_LOAD; _dispatchMpegCallback(decoder->mpeg, &callback); } diff --git a/src/sdk/mpeg/macroblock/_decMB0.c b/src/sdk/mpeg/macroblock/_decMB0.c index d65335e343..359283ba9a 100644 --- a/src/sdk/mpeg/macroblock/_decMB0.c +++ b/src/sdk/mpeg/macroblock/_decMB0.c @@ -25,6 +25,12 @@ int _decMB0(struct MpegDecoder *decoder, int *motion_field_select, int differential_motion_vector) { + enum { + DCT_TYPE_FRAME = 0, + MOTION_TYPE_FIELD = 1, + MOTION_TYPE_FRAME = 2, + PICTURE_CODING_TYPE_PREDICTIVE = 2 + }; int *dct_type_output; int *motion_field_select_output; u32 intra_quantiser_command_bits; @@ -42,7 +48,7 @@ int _decMB0(struct MpegDecoder *decoder, int field_in_frame; int dct_type; int motion_flag; - int result; + int decode_success; int coded; *((int *)0x10002010) = ((*((int *)0x10002010)) & 0xF8FFFFFF) | (decoder->picture_coding_type << 0x18); @@ -57,7 +63,7 @@ int _decMB0(struct MpegDecoder *decoder, } if (type_code & 0xC) { if ((decoder->picture_structure == 3) && (decoder->frame_pred_frame_dct != 0)) { - *motion_type = 2; + *motion_type = MOTION_TYPE_FRAME; } else { *motion_type = _nextBit(decoder, 2); } @@ -78,12 +84,12 @@ int _decMB0(struct MpegDecoder *decoder, if (frame_motion == 0) { field_in_frame = structure == 3; } - dct_type = 0; + dct_type = DCT_TYPE_FRAME; if (((decoder->picture_structure == 3) && (decoder->frame_pred_frame_dct == 0)) && (((*mb_type) & 3) != 0)) { dct_type = _nextBit(decoder, 1); } else { - dct_type = 0; + dct_type = DCT_TYPE_FRAME; } *dct_type_output = dct_type; if ((*mb_type) & 0x10) { @@ -114,7 +120,7 @@ int _decMB0(struct MpegDecoder *decoder, decoder->full_pel_forward_vector); } } - result = 0; + decode_success = 0; if (decoder->slice_error == 0) { if ((*mb_type) & 4) { if (decoder->mpeg2 != 0) { @@ -141,7 +147,7 @@ int _decMB0(struct MpegDecoder *decoder, decoder->full_pel_backward_vector); } } - result = 0; + decode_success = 0; if (decoder->slice_error == 0) { type = *mb_type; coded = type & 3; @@ -181,9 +187,9 @@ int _decMB0(struct MpegDecoder *decoder, motion_vector_state->unk8 = 0; } coding_type = decoder->picture_coding_type; - result = 1; - if (coding_type == 2) { - result = 1; + decode_success = 1; + if (coding_type == PICTURE_CODING_TYPE_PREDICTIVE) { + decode_success = 1; if (!((*mb_type) & 9)) { motion_vector_state->unk0 = (motion_vector_state->unk4 = @@ -191,15 +197,15 @@ int _decMB0(struct MpegDecoder *decoder, if (decoder->picture_structure == 3) { *motion_type = coding_type; } else { - *motion_type = 1; + *motion_type = MOTION_TYPE_FIELD; *motion_field_select_output = decoder->picture_structure == 2; } - result = 1; + decode_success = 1; } } - return result; + return decode_success; } - return result; + return decode_success; } - return result; + return decode_success; } diff --git a/src/sdk/mpeg/macroblock/_slice0.c b/src/sdk/mpeg/macroblock/_slice0.c index 6bb002ff6c..c48e5be9fc 100644 --- a/src/sdk/mpeg/macroblock/_slice0.c +++ b/src/sdk/mpeg/macroblock/_slice0.c @@ -9,6 +9,9 @@ extern u8 too_many_macroblocks_error_message[] __asm__("D_00153848"); extern s32 _motionComp0(); s32 _slice0(struct MpegDecoder *mp, s32 nmb) { + enum { + SLICE_SETUP_SUCCESS = 0 + }; s32 blk[16]; s32 mbx; s32 inc; @@ -20,7 +23,7 @@ s32 _slice0(struct MpegDecoder *mp, s32 nmb) { mbx = 0; inc = 0; slice_setup_status = _sliceA0(mp, nmb, &mbx, &inc, blk); - if (slice_setup_status != 0) { + if (slice_setup_status != SLICE_SETUP_SUCCESS) { return slice_setup_status; } mp->slice_error = 0; diff --git a/src/sdk/mpeg/macroblock/skip_mb0.c b/src/sdk/mpeg/macroblock/skip_mb0.c index 7cbfae8315..fb0ba37a7d 100644 --- a/src/sdk/mpeg/macroblock/skip_mb0.c +++ b/src/sdk/mpeg/macroblock/skip_mb0.c @@ -22,6 +22,14 @@ s32 _skipMB0(struct MpegDecoder *decoder, struct MpegMotionRef *motion_reference, s32 *flags) { + enum { + MPEG_PICTURE_CODING_TYPE_I = 1 + }; + enum { + MPEG_MOTION_TYPE_FIELD = 1, + MPEG_PICTURE_CODING_TYPE_P = 2, + MPEG_MOTION_TYPE_FRAME = 2 + }; s32 buf_offset; s32 bottom_field; s32 ok; @@ -30,21 +38,21 @@ s32 _skipMB0(struct MpegDecoder *decoder, buf_offset = decoder->mb_buf_index * 0x140; *(s32 *)((u8 *)(((u8 *)decoder + (buf_offset))) + 0x6CC) = 1; decoder->dc_reset = 1; - if (decoder->picture_coding_type == 2) { + if (decoder->picture_coding_type == MPEG_PICTURE_CODING_TYPE_P) { skip_state->unk14 = 0; skip_state->unk10 = 0; skip_state->unk4 = 0; skip_state->unk0 = 0; } if (decoder->picture_structure == 3) { - *picture_structure_mode = 2; + *picture_structure_mode = MPEG_MOTION_TYPE_FRAME; } else { - *picture_structure_mode = 1; + *picture_structure_mode = MPEG_MOTION_TYPE_FIELD; bottom_field = decoder->picture_structure == 2; motion_reference->unk4 = bottom_field; motion_reference->unk0 = bottom_field; } - if (decoder->picture_coding_type == 1) { + if (decoder->picture_coding_type == MPEG_PICTURE_CODING_TYPE_I) { _Error(decoder, skipped_macroblock_in_i_picture_error_message); ok = 0; } diff --git a/src/sdk/mpeg/picture/_clearEach.c b/src/sdk/mpeg/picture/_clearEach.c index fef2ae1cb5..7bb0b835d8 100644 --- a/src/sdk/mpeg/picture/_clearEach.c +++ b/src/sdk/mpeg/picture/_clearEach.c @@ -19,7 +19,7 @@ void _clearEach(u8 *ctx) { *(volatile u32 *)0x1000D400 = 0; *(volatile u32 *)0x1000F590 = *(volatile u32 *)0x1000F520 & 0xFFFEFFFF; - if (state != 0) + if (state != FALSE) EnableInterrupts(); *(volatile u32 *)0x1000B020 = 0; diff --git a/src/sdk/mpeg/picture/_getpic.c b/src/sdk/mpeg/picture/_getpic.c index 20c30d2129..85c8062a9d 100644 --- a/src/sdk/mpeg/picture/_getpic.c +++ b/src/sdk/mpeg/picture/_getpic.c @@ -15,13 +15,16 @@ s32 _getpic(struct sceMpeg *mpeg) { MPEG_BIDIRECTIONAL_PICTURE = 3, MPEG_DC_INTRA_PICTURE = 4 }; + enum { + MPEG_DECODE_SCAN_NEXT_HEADER = 0 + }; s32 image_addr; s32 status; u32 start_code; struct MpegDecoder *decoder; start_code = 1; - status = 0; + status = MPEG_DECODE_SCAN_NEXT_HEADER; decoder = mpeg->sys; image_addr = decoder->unkD8; decoder->is_end = 0; diff --git a/src/sdk/mpeg/picture/_pictureData0.c b/src/sdk/mpeg/picture/_pictureData0.c index ff7601a18a..5cd7397f5d 100644 --- a/src/sdk/mpeg/picture/_pictureData0.c +++ b/src/sdk/mpeg/picture/_pictureData0.c @@ -17,6 +17,16 @@ typedef struct { extern char skip_to_next_picture_error_message[] __asm__("D_001537E0"); s32 _pictureData0(MpegDec *decoder) { + enum { + DECODE_STATUS_SUCCESS = 0, + DECODE_STATUS_ABORT_PICTURE = 2 + }; + enum { + DECODE_STATUS_SLICE_DECODE_ERROR = 1 + }; + enum { + DECODE_STATUS_SLICE_LOOKAHEAD_STOP = 3 + }; s32 decode_status; s32 mbs; @@ -28,18 +38,20 @@ s32 _pictureData0(MpegDec *decoder) { } do { decode_status = _slice0(decoder, mbs); - } while (decode_status == 1 || decode_status == 3); + } while (decode_status == DECODE_STATUS_SLICE_DECODE_ERROR || + decode_status == DECODE_STATUS_SLICE_LOOKAHEAD_STOP); _waitIpuIdle(decoder); if (_waitBdecOut(decoder) == 0) { - decode_status = 2; + decode_status = DECODE_STATUS_ABORT_PICTURE; } while ((*(volatile u32 *)0x1000D400 >> 8) & 1) { } - if (decode_status == 0) { + if (decode_status == DECODE_STATUS_SUCCESS) { _doMC(decoder, decoder->unk810 == 0); } - if (decode_status == 1 || decode_status == 2) { + if (decode_status == DECODE_STATUS_SLICE_DECODE_ERROR || + decode_status == DECODE_STATUS_ABORT_PICTURE) { _Error(decoder, skip_to_next_picture_error_message); } - return decode_status == 0; + return decode_status == DECODE_STATUS_SUCCESS; } diff --git a/src/sdk/mpeg/picture/decpicture.c b/src/sdk/mpeg/picture/decpicture.c index 884ef0035d..c85c6f264a 100644 --- a/src/sdk/mpeg/picture/decpicture.c +++ b/src/sdk/mpeg/picture/decpicture.c @@ -32,7 +32,7 @@ s32 _decPicture(struct MpegDecoderState *decoder) { s32 decode_succeeded; struct MpegReferenceImage *reference; - if (decoder->picture_coding_type == 3 && decoder->second_field != 0) { + if (decoder->picture_coding_type == FRAME_PICTURE && decoder->second_field != 0) { _Error(decoder, odd_field_picture_count_error_message); decoder->second_field = 0; } diff --git a/src/sdk/mpeg/picture/update_temp_track_data.c b/src/sdk/mpeg/picture/update_temp_track_data.c index 4b17aa7088..e47a325fa1 100644 --- a/src/sdk/mpeg/picture/update_temp_track_data.c +++ b/src/sdk/mpeg/picture/update_temp_track_data.c @@ -2,13 +2,16 @@ #include "rnc/sdk/libmpeg.h" void UpdateTempTrackData(struct MpegDecoder *decoder, s32 delta) { + enum { + MPEG_PICTURE_CODING_TYPE_B = 3 + }; s32 reference; s32 current; s32 step; s32 wrapped; wrapped = 0; step = 0; - if ((decoder->picture_coding_type != 3) && (delta != 0)) { + if ((decoder->picture_coding_type != MPEG_PICTURE_CODING_TYPE_B) && (delta != 0)) { if (delta < 0) { wrapped = decoder->unk854 == 0; } diff --git a/src/sdk/mpeg/ref_images/_getAllRefs.c b/src/sdk/mpeg/ref_images/_getAllRefs.c index 1e4044d5db..9d15affb6d 100644 --- a/src/sdk/mpeg/ref_images/_getAllRefs.c +++ b/src/sdk/mpeg/ref_images/_getAllRefs.c @@ -23,6 +23,13 @@ void _getAllRefs(struct MpegDecoder *decoder, int mvfs[2][2], int *dmvector) { + enum { + MPEG_MOTION_FIELD = 1, + MPEG_PICTURE_CODING_PREDICTIVE = 2, + MPEG_MOTION_FRAME = 2, + MPEG_MOTION_16X8 = 2, + MPEG_MOTION_DUAL_PRIME = 3 + }; int dmv[2][2]; struct MpegRefImage *refs[2][2]; int one = 1; @@ -34,9 +41,9 @@ void _getAllRefs(struct MpegDecoder *decoder, decoder->mb_buf[decoder->mb_buf_index].fetch_count = 0; - if ((mb_type & 8) || decoder->picture_coding_type == 2) { + if ((mb_type & 8) || decoder->picture_coding_type == MPEG_PICTURE_CODING_PREDICTIVE) { if (decoder->picture_structure == 3) { - if (motion_type == 2 || !(mb_type & 8)) { + if (motion_type == MPEG_MOTION_FRAME || !(mb_type & 8)) { _getRef0(decoder, decoder->ref_images[0], 0, @@ -74,7 +81,7 @@ void _getAllRefs(struct MpegDecoder *decoder, pmv[1][0][1] >> 1, same, 0); - } else if (motion_type == 3) { + } else if (motion_type == MPEG_MOTION_DUAL_PRIME) { _dualPrimeVector(decoder, dmv, dmvector, pmv[0][0][0], pmv[0][0][1] >> 1); _getRef0(decoder, decoder->ref_images[0], @@ -139,7 +146,7 @@ void _getAllRefs(struct MpegDecoder *decoder, if (decoder->picture_coding_type == one && decoder->second_field) { same = currentfield != mvfs[0][0]; } - if (motion_type == 1 || !(mb_type & 8)) { + if (motion_type == MPEG_MOTION_FIELD || !(mb_type & 8)) { _getRef0(decoder, refs[same][mvfs[0][0]], 0, @@ -152,7 +159,7 @@ void _getAllRefs(struct MpegDecoder *decoder, pmv[0][0][1], 0, 0); - } else if (motion_type == 2) { + } else if (motion_type == MPEG_MOTION_16X8) { _getRef0(decoder, refs[same][mvfs[0][0]], 0, @@ -179,7 +186,7 @@ void _getAllRefs(struct MpegDecoder *decoder, pmv[1][0][1], 0, 0); - } else if (motion_type == 3) { + } else if (motion_type == MPEG_MOTION_DUAL_PRIME) { same = decoder->second_field ? motion_type - 2 : 0; _dualPrimeVector(decoder, dmv, dmvector, pmv[0][0][0], pmv[0][0][1]); _getRef0(decoder, @@ -216,7 +223,7 @@ void _getAllRefs(struct MpegDecoder *decoder, if (mb_type & 4) { if (decoder->picture_structure == 3) { same = 1; - if (motion_type == 2) { + if (motion_type == MPEG_MOTION_FRAME) { _getRef0(decoder, decoder->ref_images[1], 0, @@ -255,7 +262,7 @@ void _getAllRefs(struct MpegDecoder *decoder, same, avg); } - } else if (motion_type == 1) { + } else if (motion_type == MPEG_MOTION_FIELD) { _getRef0(decoder, mvfs[0][1] ? decoder->ref_images[9] : decoder->ref_images[5], 0, @@ -268,7 +275,7 @@ void _getAllRefs(struct MpegDecoder *decoder, pmv[0][1][1], 0, avg); - } else if (motion_type == 2) { + } else if (motion_type == MPEG_MOTION_16X8) { _getRef0(decoder, mvfs[0][1] ? decoder->ref_images[9] : decoder->ref_images[5], 0, diff --git a/src/sdk/mpeg/ref_images/_updateRefImage.c b/src/sdk/mpeg/ref_images/_updateRefImage.c index 74bbacea5b..679a6546a8 100644 --- a/src/sdk/mpeg/ref_images/_updateRefImage.c +++ b/src/sdk/mpeg/ref_images/_updateRefImage.c @@ -75,6 +75,12 @@ s32 UpdateMpegReferenceImages(struct MpegReferenceState *state, s32 force_reorde MPEG_PICTURE_STRUCTURE_BOTTOM_FIELD = 2, MPEG_PICTURE_STRUCTURE_FRAME = 3 }; + enum { + MPEG_REFERENCE_STATUS_NOT_READY = 0, + MPEG_REFERENCE_STATUS_READY = 1, + MPEG_PICTURE_CODING_TYPE_P = 2, + MPEG_PICTURE_CODING_TYPE_B = 3 + }; struct MpegReferencePicture *selected_picture; s32 references_ready; s32 queue_threshold; @@ -84,7 +90,7 @@ s32 UpdateMpegReferenceImages(struct MpegReferenceState *state, s32 force_reorde selected_picture = NULL; references_ready = 0; queue_threshold = (state->picture_structure == 3) ? 2 : 4; - if (state->coding_type == 3) { + if (state->coding_type == MPEG_PICTURE_CODING_TYPE_B) { state->selected_frame = state->reordered_frame; state->selected_top_field = state->reordered_top_field; state->selected_bottom_field = state->reordered_bottom_field; @@ -133,13 +139,15 @@ s32 UpdateMpegReferenceImages(struct MpegReferenceState *state, s32 force_reorde state->selected_top_field = state->previous_top_field; state->selected_bottom_field = state->previous_bottom_field; if (state->picture_structure == 3) { - if (state->coding_type != 2 || state->current_frame->status == 1) { + if (state->coding_type != MPEG_PICTURE_CODING_TYPE_P || + state->current_frame->status == 1) { references_ready = 1; } } else { predicted_field = (state->picture_structure == 1) ? state->selected_bottom_field : state->selected_top_field; - if (state->coding_type != 2 || (force_reorder != 0 && predicted_field->status == 1) || + if (state->coding_type != MPEG_PICTURE_CODING_TYPE_P || + (force_reorder != 0 && predicted_field->status == MPEG_REFERENCE_STATUS_READY) || (state->current_top_field->status == 1 && state->current_bottom_field->status == 1)) { references_ready = 1; @@ -157,7 +165,7 @@ s32 UpdateMpegReferenceImages(struct MpegReferenceState *state, s32 force_reorde selected_picture = state->selected_bottom_field; break; } - selected_picture->status = 0; + selected_picture->status = MPEG_REFERENCE_STATUS_NOT_READY; selected_picture->presentation_timestamp = state->presentation_timestamp; selected_picture->coding_type = state->coding_type; selected_picture->decoding_timestamp = state->decoding_timestamp; diff --git a/src/sdk/mpeg/ref_images/disprefimagefield.c b/src/sdk/mpeg/ref_images/disprefimagefield.c index 63982dc4b9..3809d893a3 100644 --- a/src/sdk/mpeg/ref_images/disprefimagefield.c +++ b/src/sdk/mpeg/ref_images/disprefimagefield.c @@ -76,6 +76,9 @@ void PrepareMpegPictureFieldTransfers(struct MpegFieldTransferState *state, struct MpegPictureBuffer *first_field_ref_image, struct MpegPictureBuffer *second_field_ref_image) { + enum { + MPEG_PICTURE_STATUS_OUTPUT_READY = 1 + }; s64 first_flags, second_flags; s32 timestamp; s32 second_timestamp; @@ -126,8 +129,9 @@ void PrepareMpegPictureFieldTransfers(struct MpegFieldTransferState *state, state->horizontal_offset1 = secondary->horizontal_offset1; state->vertical_offset0 = primary->vertical_offset0; state->vertical_offset1 = secondary->vertical_offset1; - if (_isOutSizeOK(state, first_field_ref_image) && first_field_ref_image->status == 1 && - second_field_ref_image->status == 1) { + if (_isOutSizeOK(state, first_field_ref_image) && + first_field_ref_image->status == MPEG_PICTURE_STATUS_OUTPUT_READY && + second_field_ref_image->status == MPEG_PICTURE_STATUS_OUTPUT_READY) { first_field_ref_image->macroblock_height *= 2; if (state->decoder_initialized) _csc_storeRefImage(state, first_field_ref_image); diff --git a/src/sdk/mpeg/ref_images/outputframe.c b/src/sdk/mpeg/ref_images/outputframe.c index 76ddce1269..5608a42407 100644 --- a/src/sdk/mpeg/ref_images/outputframe.c +++ b/src/sdk/mpeg/ref_images/outputframe.c @@ -10,20 +10,23 @@ extern s32 _dispRefImageField(struct MpegDecoder *mpeg, s32 arg3); void _outputFrame(struct MpegDecoder *mpeg, s32 frame_counter, s32 output_enabled) { + enum { + MPEG_PICTURE_CODING_TYPE_B = 3 + }; struct MpegRefImage *frame_image; struct MpegRefImage *top_field; struct MpegRefImage *bottom_field; if (output_enabled != 0) { if (mpeg->picture_structure == 3) { - if (mpeg->picture_coding_type == 3) { + if (mpeg->picture_coding_type == MPEG_PICTURE_CODING_TYPE_B) { frame_image = mpeg->ref_images[3]; } else { frame_image = mpeg->ref_images[0]; } _dispRefImage(mpeg, frame_image, frame_counter - 1); } else { - if (mpeg->picture_coding_type == 3) { + if (mpeg->picture_coding_type == MPEG_PICTURE_CODING_TYPE_B) { top_field = mpeg->ref_images[7]; bottom_field = mpeg->ref_images[11]; } else { diff --git a/src/sdk/rpc/rpc/sce_sif_call_rpc.c b/src/sdk/rpc/rpc/sce_sif_call_rpc.c index 1f8dc47165..aa8a80d1dd 100644 --- a/src/sdk/rpc/rpc/sce_sif_call_rpc.c +++ b/src/sdk/rpc/rpc/sce_sif_call_rpc.c @@ -54,6 +54,10 @@ s32 sceSifCallRpc(struct SifRpcClient *client, s32 end_func, s32 end_data) { + enum { + RPC_COMPLETION_DISABLED = 0, + RPC_COMPLETION_ENABLED = 1 + }; s32 semaphore_parameters[6]; struct SifRpcPacket *packet; s32 semaphore_id; @@ -92,9 +96,9 @@ s32 sceSifCallRpc(struct SifRpcClient *client, } if (mode & 1) { if (end_func == 0) { - packet->completion_mode = 0; + packet->completion_mode = RPC_COMPLETION_DISABLED; } else { - packet->completion_mode = 1; + packet->completion_mode = RPC_COMPLETION_ENABLED; } client->semaphore_id = -1; if (sceSifSendCmd(0x8000000A, packet, 0x40, send_buf, client->server_buffer, send_size) != @@ -113,7 +117,7 @@ s32 sceSifCallRpc(struct SifRpcClient *client, free_rpc_packet(packet); return -3; } - packet->completion_mode = 1; + packet->completion_mode = RPC_COMPLETION_ENABLED; if (sceSifSendCmd(0x8000000A, packet, 0x40, send_buf, client->server_buffer, send_size) == 0) { DeleteSema(client->semaphore_id); diff --git a/src/sdk/storage/cdvd/PowerOffCB.c b/src/sdk/storage/cdvd/PowerOffCB.c index 00abc2a214..0b4522a340 100644 --- a/src/sdk/storage/cdvd/PowerOffCB.c +++ b/src/sdk/storage/cdvd/PowerOffCB.c @@ -13,7 +13,7 @@ s32 PowerOffCB(void) { D_001312E4[0] = 1; interrupt_state = DIntr(); sceSifAddCmdHandler(0x80000012, D_00120960, 0); - if (interrupt_state != 0) { + if (interrupt_state != FALSE) { EnableInterrupts(); } D_001312E4[0] = 0; diff --git a/src/sdk/storage/cdvd/sceCdDiskReady.c b/src/sdk/storage/cdvd/sceCdDiskReady.c index 98f9aee75d..01d349f164 100644 --- a/src/sdk/storage/cdvd/sceCdDiskReady.c +++ b/src/sdk/storage/cdvd/sceCdDiskReady.c @@ -21,6 +21,9 @@ extern void sceSifWriteBackDCache(); s32 sceCdDiskReady(s32 mode) __asm__("FUN_00121190"); s32 sceCdDiskReady(s32 mode) { + enum { + CD_DISK_READY_MODE_NEGATIVE_FAILURE_RETURN = 8 + }; s32 response; s32 spin; @@ -33,7 +36,7 @@ s32 sceCdDiskReady(s32 mode) { } if (sceCdSyncS(1) != 0) { SignalSema(cd_scmd_sema); - if (mode == 8) { + if (mode == CD_DISK_READY_MODE_NEGATIVE_FAILURE_RETURN) { return -1; } return 6; @@ -62,7 +65,7 @@ s32 sceCdDiskReady(s32 mode) { if (sceSifCallRpc(&cd_disk_ready_rpc_client, 0, 0, D_001599D0, 4, cd_scmd_result, 4, 0, 0) < 0) { SignalSema(cd_scmd_sema); - if (mode == 8) { + if (mode == CD_DISK_READY_MODE_NEGATIVE_FAILURE_RETURN) { return -1; } return 6; diff --git a/src/sdk/storage/cdvd/sceCdInit.c b/src/sdk/storage/cdvd/sceCdInit.c index 1b33eef810..684c3694d5 100644 --- a/src/sdk/storage/cdvd/sceCdInit.c +++ b/src/sdk/storage/cdvd/sceCdInit.c @@ -37,6 +37,10 @@ int sceCdInit(int init_mode) { enum { CD_INIT_SHUTDOWN = 5 }; + enum { + CD_INIT_REPLY_ENABLE_DEBUG = 0xFE, + CD_INIT_REPLY_BYPASS_VERSION_CHECK = 0xFF + }; int compatibility_result; int bind_result; int delay; @@ -108,8 +112,8 @@ int sceCdInit(int init_mode) { second_version = *(s32 *)((u32)(receive_buffer + 8) | 0x20000000); reply_status = *(s32 *)((u32)(receive_buffer + 0xC) | 0x20000000); compatibility_result = 1; - if (reply_status == 0xFF) { - } else if (reply_status == 0xFE) { + if (reply_status == CD_INIT_REPLY_BYPASS_VERSION_CHECK) { + } else if (reply_status == CD_INIT_REPLY_ENABLE_DEBUG) { cd_debug = compatibility_result; } else { if (first_version / 256 < 2 || second_version / 256 < 2) { diff --git a/src/sdk/storage/cdvd/sceCdSyncS.c b/src/sdk/storage/cdvd/sceCdSyncS.c index b17a75d36d..9b478e9343 100644 --- a/src/sdk/storage/cdvd/sceCdSyncS.c +++ b/src/sdk/storage/cdvd/sceCdSyncS.c @@ -8,7 +8,10 @@ extern u8 cd_s_command_wait_message[] __asm__("D_00152F00"); s32 sceCdSyncS(s32 mode) { - if (mode == 0) { + enum { + CD_SYNC_S_WAIT = 0 + }; + if (mode == CD_SYNC_S_WAIT) { if (cd_debug > 0) { scePrintf(cd_s_command_wait_message); } diff --git a/src/sdk/storage/cdvd/scecdsync.c b/src/sdk/storage/cdvd/scecdsync.c index fb725b1362..fe78be4be0 100644 --- a/src/sdk/storage/cdvd/scecdsync.c +++ b/src/sdk/storage/cdvd/scecdsync.c @@ -7,7 +7,10 @@ extern u8 cd_sync_wait_debug_message[] __asm__("D_00152EF0"); s32 sceCdSync(s32 mode) { - if (mode == 0) { + enum { + CD_SYNC_BLOCKING = 0 + }; + if (mode == CD_SYNC_BLOCKING) { if (cd_debug > 0) { scePrintf(cd_sync_wait_debug_message); } diff --git a/src/sdk/storage/fileio/sceFsInit.c b/src/sdk/storage/fileio/sceFsInit.c index 97ca9f338c..441be8d7f1 100644 --- a/src/sdk/storage/fileio/sceFsInit.c +++ b/src/sdk/storage/fileio/sceFsInit.c @@ -33,6 +33,10 @@ extern s32 SignalSema(); extern s32 WaitSema(); s32 sceFsInit(void) { + enum { + SIF_RPC_BIND_SUCCESS = 0, + SIF_RPC_CALL_SUCCESS = 0 + }; s32 initialization_call_status, delay; struct SifFileSlot *slot; struct UnalignedWord reply_word; @@ -44,12 +48,12 @@ s32 sceFsInit(void) { initialization_call_status = DIntr(); sceSifAddCmdHandler(0x80000011, (u32)_sceFs_Rcv_Intr, (u32)fs_receive_interrupt_handler_data); sceSifAddCmdHandler(0x80000013, (u32)invoke_sif_file_command_callback, (u32)callback_record); - if (initialization_call_status != 0) { + if (initialization_call_status != FALSE) { EnableInterrupts(); } for (;;) { initialization_call_status = sceSifBindRpc(&fio_rpc_client, 0x80000001, 0); - if (initialization_call_status < 0) { + if (initialization_call_status < SIF_RPC_BIND_SUCCESS) { return -1; } if (fio_rpc_client.serve != 0) { @@ -68,7 +72,7 @@ s32 sceFsInit(void) { fs_init_completion_buffer_addresses[1] = D_00157500 + 0x440; initialization_call_status = sceSifCallRpc( &fio_rpc_client, 0xFF, 0, fs_init_completion_buffer_addresses, 8, fio_rpc_result, 8, 0, 0); - if (initialization_call_status < 0) { + if (initialization_call_status < SIF_RPC_CALL_SUCCESS) { return (s32)0xFFFEFFFF; } *(struct UnalignedWord *)FsResetBuffer = diff --git a/src/sdk/storage/memory_card/sce_mc_chdir.c b/src/sdk/storage/memory_card/sce_mc_chdir.c index b8889f53c3..179654adfc 100644 --- a/src/sdk/storage/memory_card/sce_mc_chdir.c +++ b/src/sdk/storage/memory_card/sce_mc_chdir.c @@ -21,13 +21,16 @@ extern s32 sceSifWriteBackDCache(); extern s32 strncpy(s8 *, s8 *, s32); s32 sceMcChdir(s32 port, s32 slot, s8 *path, s32 pwd) { + enum { + RPC_DISPATCH_SUCCESS = 0 + }; s32 rpc_dispatch_status; - s32 ret; + s32 chdir_request_status; if (mc_rpc_client.serve == 0) { return -0x64; } - ret = -0xC8; + chdir_request_status = -0xC8; if (PollSema(mc_sema) >= 0) { if ((path == NULL) || (*path == 0)) { SignalSema(mc_sema); @@ -48,14 +51,14 @@ s32 sceMcChdir(s32 port, s32 slot, s8 *path, s32 pwd) { 4, &mceStorePwd, pwd); - if (rpc_dispatch_status == 0) { + if (rpc_dispatch_status == RPC_DISPATCH_SUCCESS) { mc_current_func = MC_FUNC_CHDIR; } else { SignalSema(mc_sema); } - ret = rpc_dispatch_status; + chdir_request_status = rpc_dispatch_status; /* Duplicate return node #10. Try simplifying control flow for better match */ - return ret; + return chdir_request_status; } - return ret; + return chdir_request_status; } diff --git a/src/sdk/storage/memory_card/sce_mc_get_dir.c b/src/sdk/storage/memory_card/sce_mc_get_dir.c index be8a478c60..57eaf4a164 100644 --- a/src/sdk/storage/memory_card/sce_mc_get_dir.c +++ b/src/sdk/storage/memory_card/sce_mc_get_dir.c @@ -21,14 +21,17 @@ extern s32 sceSifWriteBackDCache(); extern s32 strncpy(s8 *, s8 *, s32); s32 sceMcGetDir(s32 port, s32 slot, s8 *name, s32 mode, s32 maxent, s32 table) { + enum { + RPC_SUBMISSION_SUCCESS = 0 + }; s32 rpc_submission_status; - s32 ret; + s32 request_status; register s32 path_arg = slot; if (mc_rpc_client.serve == 0) { return -0x64; } - ret = -0xC8; + request_status = -0xC8; if (PollSema(mc_sema) >= 0) { if ((name == NULL) || (*name == 0)) { SignalSema(mc_sema); @@ -46,14 +49,14 @@ s32 sceMcGetDir(s32 port, s32 slot, s8 *name, s32 mode, s32 maxent, s32 table) { } rpc_submission_status = sceSifCallRpc( &mc_rpc_client, MC_FUNC_GET_DIR, 1, &D_00159AB0, 0x414, mc_rpc_result, 4, 0, 0); - if (rpc_submission_status == 0) { + if (rpc_submission_status == RPC_SUBMISSION_SUCCESS) { mc_current_func = MC_FUNC_GET_DIR; } else { SignalSema(mc_sema); } - ret = rpc_submission_status; + request_status = rpc_submission_status; /* Duplicate return node #12. Try simplifying control flow for better match */ - return ret; + return request_status; } - return ret; + return request_status; } diff --git a/src/sdk/storage/memory_card/sce_mc_get_info.c b/src/sdk/storage/memory_card/sce_mc_get_info.c index cf283fa8c3..85b4c49422 100644 --- a/src/sdk/storage/memory_card/sce_mc_get_info.c +++ b/src/sdk/storage/memory_card/sce_mc_get_info.c @@ -36,7 +36,7 @@ s32 sceMcGetInfo(s32 port, s32 slot, s32 type, s32 free_blocks, s32 format) { D_00159A80.unk4 = port; D_00159A80.unk8 = slot; D_00159A80.unk1C = D_00159F00; - if (type != 0) { + if (type != NULL) { D_00159A80.unk14 = 1; } else { D_00159A80.unk14 = 0; diff --git a/src/sdk/storage/memory_card/sce_mc_mkdir.c b/src/sdk/storage/memory_card/sce_mc_mkdir.c index 064b218d49..11ad1b2d1d 100644 --- a/src/sdk/storage/memory_card/sce_mc_mkdir.c +++ b/src/sdk/storage/memory_card/sce_mc_mkdir.c @@ -3,9 +3,12 @@ #include "rnc/sdk/storage/memory_card.h" s32 sceMcMkdir(s32 port, s32 slot, const char *name) { + enum { + MC_MKDIR_REQUEST_ACCEPTED = 0 + }; s32 mkdir_request_status = sceMcOpen(port, slot, name, 0x40); - if (mkdir_request_status == 0) { + if (mkdir_request_status == MC_MKDIR_REQUEST_ACCEPTED) { mc_current_func = MC_FUNC_MKDIR; } return mkdir_request_status; diff --git a/src/ui/help/draw_help.c b/src/ui/help/draw_help.c index 2cb8792295..ae0a9a74fa 100644 --- a/src/ui/help/draw_help.c +++ b/src/ui/help/draw_help.c @@ -36,7 +36,10 @@ void draw_help(void) { HELP_TEXT_FADE_OUT = 6, HELP_FRAME_CLOSING = 7 }; - if (help_state.state == 0) { + enum { + HELP_INACTIVE = 0 + }; + if (help_state.state == HELP_INACTIVE) { return; } if (help_state.started == 0) { @@ -66,16 +69,18 @@ void draw_help(void) { break; case HELP_PROMPT_FRAME_TRANSITION: if (D_0015EF1D_b) { - int a = (help_state.half_width - 0x20) * help_state.timer / 8 + 0x20; - int b = (help_state.half_height - 0x20) * help_state.timer / 8 + 0x20; + int transition_half_width = + (help_state.half_width - 0x20) * help_state.timer / 8 + 0x20; + int transition_half_height = + (help_state.half_height - 0x20) * help_state.timer / 8 + 0x20; int alpha; - help_state.frame_half_width = a; - help_state.frame_half_height = b; - draw_ui_frame(help_state.center_y - b, - help_state.center_y + b, - help_state.center_x - a, - help_state.center_x + a, + help_state.frame_half_width = transition_half_width; + help_state.frame_half_height = transition_half_height; + draw_ui_frame(help_state.center_y - transition_half_height, + help_state.center_y + transition_half_height, + help_state.center_x - transition_half_width, + help_state.center_x + transition_half_width, 0x60); alpha = (8 - help_state.timer) * 16; if (alpha < 0) { @@ -108,9 +113,9 @@ void draw_help(void) { help_state.center_x - help_state.half_width, help_state.center_x + help_state.half_width, 0x60); - if (help_state.state == 4) { + if (help_state.state == HELP_TEXT_FADE_IN) { col = 0xFFA888 | (help_state.timer << 29); - } else if (help_state.state == 6) { + } else if (help_state.state == HELP_TEXT_FADE_OUT) { col = ((4 - help_state.timer) << 29) | 0xFFA888; } text = help_msgs[help_state.msg].text; @@ -121,15 +126,15 @@ void draw_help(void) { break; case HELP_FRAME_CLOSING: if (D_0015EF1D_b) { - int b = help_state.frame_half_width - - (help_state.frame_half_width - 8) * help_state.timer / 8; - int a = help_state.frame_half_height - - (help_state.frame_half_height - 8) * help_state.timer / 8; + int closing_half_width = help_state.frame_half_width - + (help_state.frame_half_width - 8) * help_state.timer / 8; + int closing_half_height = help_state.frame_half_height - + (help_state.frame_half_height - 8) * help_state.timer / 8; - draw_ui_frame(help_state.center_y - a, - help_state.center_y + a, - help_state.center_x - b, - help_state.center_x + b, + draw_ui_frame(help_state.center_y - closing_half_height, + help_state.center_y + closing_half_height, + help_state.center_x - closing_half_width, + help_state.center_x + closing_half_width, (8 - help_state.timer) * 12); } break; diff --git a/src/ui/help/force_help_message.c b/src/ui/help/force_help_message.c index cece000399..fa6d354934 100644 --- a/src/ui/help/force_help_message.c +++ b/src/ui/help/force_help_message.c @@ -8,17 +8,21 @@ extern s32 try_set_help_message() __asm__("FUN_00215130"); s32 force_help_message(s32 owner, s32 message_id) __asm__("FUN_002151d8"); s32 force_help_message(s32 help_message_selector, s32 message_id) { + enum { + HELP_MESSAGE_REQUEST_REJECTED = 0, + HELP_MESSAGE_REQUEST_FORCED = 3 + }; s32 help_message_status; help_message_status = try_set_help_message(); - if (help_message_status == 0) { + if (help_message_status == HELP_MESSAGE_REQUEST_REJECTED) { if (message_id != 0) { copy_text_to_shared_buffer(get_help_message_text(message_id)); } D_0015F5D4 = help_message_selector; D_0015F5D0 = 2; D_00161288 = message_id; - help_message_status = 3; + help_message_status = HELP_MESSAGE_REQUEST_FORCED; } return help_message_status; } diff --git a/src/ui/help/help_draw_prompt.c b/src/ui/help/help_draw_prompt.c index 9ea29958c2..7f4a46ece1 100644 --- a/src/ui/help/help_draw_prompt.c +++ b/src/ui/help/help_draw_prompt.c @@ -8,6 +8,10 @@ extern s32 draw_ui_frame() __asm__("func_001F5F18"); void help_draw_prompt(void) __asm__("FUN_001fe898"); void help_draw_prompt(void) { + enum { + HELP_STATE_FRAME_EXPAND = 1, + HELP_STATE_FRAME_COLLAPSE = 7 + }; s32 alpha; help_state.frame_half_width = 0x20; @@ -17,7 +21,8 @@ void help_draw_prompt(void) { help_state.center_x - 0x20, help_state.center_x + 0x20, 0x60); - if (help_state.state == 1 || help_state.state == 7) { + if (help_state.state == HELP_STATE_FRAME_EXPAND || + help_state.state == HELP_STATE_FRAME_COLLAPSE) { alpha = help_state.timer * 21; } else { alpha = 0x7E; diff --git a/src/ui/help/update_help_state.c b/src/ui/help/update_help_state.c index 306395bb7c..efc8e7f2dc 100644 --- a/src/ui/help/update_help_state.c +++ b/src/ui/help/update_help_state.c @@ -65,7 +65,7 @@ void update_help_state(void) { if (game_mode != 0 || help_state.started == 0) { help_state.pending = -1; - help_state.state = 0; + help_state.state = HELP_STATE_IDLE; help_state.timer = 0; return; } @@ -89,7 +89,7 @@ void update_help_state(void) { RECORD_LATEST_TIME(); RECORD_FLAGS(); help_state.msg = -1; - help_state.state = 0; + help_state.state = HELP_STATE_IDLE; help_state.shown = 0; break; @@ -117,10 +117,10 @@ void update_help_state(void) { RECORD_LATEST_TIME(); RECORD_FLAGS(); help_state.timer = 8 - help_state.timer; - help_state.state = 7; + help_state.state = HELP_STATE_DISMISSING; } else if (help_state.timer >= 6) { help_state.timer = 0; - help_state.state = 2; + help_state.state = HELP_STATE_DISMISSAL_WAIT_AUDIO_GATE; } break; } @@ -132,14 +132,14 @@ void update_help_state(void) { if (controller_state.pressed & PAD_TRIANGLE) { RECORD_COUNT(); RECORD_LATEST_TIME(); - help_state.state = 7; + help_state.state = HELP_STATE_DISMISSING; help_state.timer = 0; RECORD_FLAGS(); } else if (help_state.timer >= scale_game_frames(0x18)) { if (music_stream_state.secondary.state == 3 || (id = help_msgs[help_state.msg].audio_track_offset) == -1 || id != music_stream_state.secondary.track - 0x7530) { - help_state.state = 3; + help_state.state = HELP_STATE_DISMISSAL_WAIT_TRANSITION_DELAY; help_state.timer = 0; } } @@ -151,12 +151,12 @@ void update_help_state(void) { if (controller_state.pressed & PAD_TRIANGLE) { RECORD_COUNT(); RECORD_LATEST_TIME(); - help_state.state = 7; + help_state.state = HELP_STATE_DISMISSING; help_state.timer = 0; RECORD_FLAGS(); } else if (help_state.timer >= 8) { help_state.timer = 0; - help_state.state = 4; + help_state.state = HELP_STATE_DISMISSAL_WAIT_START_DELAY; } break; @@ -167,7 +167,7 @@ void update_help_state(void) { if (controller_state.pressed & PAD_TRIANGLE) { RECORD_COUNT(); RECORD_LATEST_TIME(); - help_state.state = 6; + help_state.state = HELP_STATE_DISMISS_DELAY; RECORD_FLAGS(); help_state.timer = 4 - help_state.timer; } else if (help_state.timer >= 4) { @@ -176,7 +176,7 @@ void update_help_state(void) { music_stream_state.secondary.state == 3) { continue_audio_stream_if_ready(); } - help_state.state = 5; + help_state.state = HELP_STATE_WAIT_FOR_DISMISSAL; help_state.timer = 0; } break; @@ -194,7 +194,7 @@ void update_help_state(void) { (controller_state.pressed & PAD_TRIANGLE)) { RECORD_COUNT(); RECORD_LATEST_TIME(); - help_state.state = 6; + help_state.state = HELP_STATE_DISMISS_DELAY; help_state.timer = 0; RECORD_FLAGS(); } @@ -203,7 +203,7 @@ void update_help_state(void) { case HELP_STATE_DISMISS_DELAY: if (D_0015EE1D == 0 || help_state.timer >= 4 || (controller_state.pressed & PAD_TRIANGLE)) { - help_state.state = 7; + help_state.state = HELP_STATE_DISMISSING; help_state.timer = 0; } break; @@ -219,9 +219,9 @@ void update_help_state(void) { } if (help_state.timer >= 8) { if (help_state.queued != 0) { - help_state.state = 8; + help_state.state = HELP_STATE_QUEUED_MESSAGE_WAIT; } else { - help_state.state = 0; + help_state.state = HELP_STATE_IDLE; help_state.msg = -1; } help_state.timer = 0; diff --git a/src/ui/loading/play_level_loading_slides.c b/src/ui/loading/play_level_loading_slides.c index e50d3fbea9..59aeba3e92 100644 --- a/src/ui/loading/play_level_loading_slides.c +++ b/src/ui/loading/play_level_loading_slides.c @@ -64,8 +64,8 @@ void play_level_loading_slides( } sceGsSyncV(0); vu1_init_chain(); - for (frame = 0; frame < duration_ticks && memory_card_state.state < 3 && - memory_card_state.pending_state < 0; + for (frame = 0; frame < duration_ticks && memory_card_state.state < MEMCARD_REQUEST_FORMAT && + memory_card_state.pending_state < MEMCARD_QUERY_INFO; frame++) { alpha = 0x80; reset_gs_registers(); diff --git a/src/ui/map/draw_map_screen.c b/src/ui/map/draw_map_screen.c index 13aa88fa5b..3a9533f552 100644 --- a/src/ui/map/draw_map_screen.c +++ b/src/ui/map/draw_map_screen.c @@ -57,6 +57,9 @@ extern void allocate_voice_for_target_entry() __asm__("func_0022DA68"); s32 draw_map_screen(struct MenuScreen *screen) __asm__("FUN_0021be60"); s32 draw_map_screen(struct MenuScreen *screen) { + enum { + MUSIC_STREAM_READ_IDLE = 0 + }; s32 previous_selected_level_id; s32 selected_level_table_index; s32 next_level_id; @@ -196,7 +199,7 @@ s32 draw_map_screen(struct MenuScreen *screen) { update_map_icons(level_map_selection.level, 0); } - if (music_stream_state.read_state == 0) { + if (music_stream_state.read_state == MUSIC_STREAM_READ_IDLE) { if (level_map_selection.sel != -1) { menu_system.pending_buffer = 0; level_map_selection.slot_id[level_map_selection.sel] ^= 0x1000; @@ -204,7 +207,7 @@ s32 draw_map_screen(struct MenuScreen *screen) { } } pick = -1; - if (music_stream_state.read_state == 0) { + if (music_stream_state.read_state == MUSIC_STREAM_READ_IDLE) { pick = promote_first_available_map_entry(); if (pick != -1) { next = pick_next_map(); @@ -235,7 +238,7 @@ s32 draw_map_screen(struct MenuScreen *screen) { } slot = find_map_entry_slot(id); if (level_map_selection.level != level_map_selection.loaded) { - if (music_stream_state.read_state == 0 && slot == -1 && pick == slot) { + if (music_stream_state.read_state == MUSIC_STREAM_READ_IDLE && slot == -1 && pick == slot) { pick_map_slot_to_evict(level_map_selection.loaded); } } diff --git a/src/ui/map/leave_map_screen.c b/src/ui/map/leave_map_screen.c index 189fc22ec3..0d73e4c949 100644 --- a/src/ui/map/leave_map_screen.c +++ b/src/ui/map/leave_map_screen.c @@ -8,14 +8,17 @@ extern void request_audio_stream_break() __asm__("FUN_002166e8"); s32 leave_map_screen(void) __asm__("FUN_0021bda0"); s32 leave_map_screen(void) { - if (music_stream_state.read_state == 0) { + enum { + MUSIC_STREAM_READ_INACTIVE = 0 + }; + if (music_stream_state.read_state == MUSIC_STREAM_READ_INACTIVE) { if (level_map_selection.sel != -1) { menu_system.pending_buffer = 0; level_map_selection.slot_id[level_map_selection.sel] ^= 0x1000; level_map_selection.sel = -1; } } - if (music_stream_state.read_state != 0) { + if (music_stream_state.read_state != MUSIC_STREAM_READ_INACTIVE) { if (menu_system.pending_buffer != 0) { request_audio_stream_break(); menu_system.pending_buffer = 0; diff --git a/src/ui/map/level_selection/draw_level_selection_map.c b/src/ui/map/level_selection/draw_level_selection_map.c index ce5d93b8ea..6cdd3aadc6 100644 --- a/src/ui/map/level_selection/draw_level_selection_map.c +++ b/src/ui/map/level_selection/draw_level_selection_map.c @@ -78,7 +78,7 @@ void draw_level_selection_map(s32 left, s32 right, s32 top, s32 bottom) { } marker_x = level_map_markers[level_index].x; marker_y = level_map_markers[level_index].y; - if (pal_mode != 0) { + if (pal_mode != FALSE) { marker_y = marker_y * 0x1C0 / 0x1A0; } if (availability == 3 || diff --git a/src/ui/map/map_filters.c b/src/ui/map/map_filters.c index 446a51709b..6b6b3672e1 100644 --- a/src/ui/map/map_filters.c +++ b/src/ui/map/map_filters.c @@ -208,9 +208,9 @@ s32 map_filter_l07_0(s32 projected_x, s32 projected_y, f32 x, f32 y, f32 z) { } return 0; } else { - special_state = 0; + special_state = FALSE; if ((u32)(hero.state.control_mode - 0x11) < 2 || hero.base_condition == 1) { - special_state = 1; + special_state = TRUE; } if (special_state && point_is_clockwise(projected_x, projected_y, 0x12B, 0xB8, 0x13A, 0xF2) && diff --git a/src/ui/menus/initialize_menu_preview_scene.c b/src/ui/menus/initialize_menu_preview_scene.c index d2da0524c1..d5fd7eaeaf 100644 --- a/src/ui/menus/initialize_menu_preview_scene.c +++ b/src/ui/menus/initialize_menu_preview_scene.c @@ -52,10 +52,13 @@ extern s32 set_moby_animation() __asm__("func_00212ED8"); void initialize_menu_preview_scene(void) __asm__("FUN_00218f98"); void initialize_menu_preview_scene(void) { + enum { + MENU_STATE_INITIAL_PAGE_TRANSITION_PENDING = 2 + }; s32 i; s32 preview_workspace_start, graphics_workspace_base, help_text_buffer_start, graphics_buffer_start; - menu_system.state = 2; + menu_system.state = MENU_STATE_INITIAL_PAGE_TRANSITION_PENDING; menu_system.current = &menu_preview_initial_page; menu_system.next = &menu_preview_initial_page; menu_system.close_locked = 0; diff --git a/src/ui/menus/item_preview/queue_preview_animation.c b/src/ui/menus/item_preview/queue_preview_animation.c index bf37be36b5..9eeaf3b83e 100644 --- a/src/ui/menus/item_preview/queue_preview_animation.c +++ b/src/ui/menus/item_preview/queue_preview_animation.c @@ -30,6 +30,9 @@ s32 queue_preview_animation(s32 animation_id, s32 resource_first, s32 resource_count) { + enum { + PREVIEW_REQUEST_INITIAL = 0 + }; PreviewAnimationRequest *request; s32 request_index; @@ -39,7 +42,7 @@ s32 queue_preview_animation(s32 animation_id, } preview_request_count = request_index + 1; request = &preview_animation_requests[request_index]; - request->status = 0; + request->status = PREVIEW_REQUEST_INITIAL; request->animation_id = animation_id; request->trigger_mode = trigger_mode; request->delay_frames = delay_frames; diff --git a/src/ui/menus/item_preview/update_item_preview_binding.c b/src/ui/menus/item_preview/update_item_preview_binding.c index e45470d953..399a86ddbe 100644 --- a/src/ui/menus/item_preview/update_item_preview_binding.c +++ b/src/ui/menus/item_preview/update_item_preview_binding.c @@ -70,6 +70,9 @@ s32 update_item_preview_binding(struct ItemPreviewBinding *preview) { ITEM_PREVIEW_CREATE_MOBYS = 2, ITEM_PREVIEW_MONITOR_CLASS_CHANGE = 3 }; + enum { + ITEM_PREVIEW_TYPE_WITH_SECONDARY_MOBY = 3 + }; struct MenuScreen *grid; struct Moby *moby; struct Moby *secondary_moby; @@ -107,7 +110,7 @@ s32 update_item_preview_binding(struct ItemPreviewBinding *preview) { preview->rotation_angle = fast_add_rotations(preview->rotation_angle, 0.01f); item_type = menu_item_info[item_index].item_type; is_type2 = item_type == 2; - has_secondary_moby = item_type == 3; + has_secondary_moby = item_type == ITEM_PREVIEW_TYPE_WITH_SECONDARY_MOBY; is_type1 = item_type == 1; if (!is_type2 && !has_secondary_moby && !is_type1) { load_class = 1; @@ -118,16 +121,16 @@ s32 update_item_preview_binding(struct ItemPreviewBinding *preview) { use_alternate_x = preview->flags & 1; switch (preview->state) { case ITEM_PREVIEW_INITIALIZE: - preview->state = 1; + preview->state = ITEM_PREVIEW_WAIT_FOR_CLASS; break; case ITEM_PREVIEW_WAIT_FOR_CLASS: if (oclass != -1) { - preview->state = 2; + preview->state = ITEM_PREVIEW_CREATE_MOBYS; } break; case ITEM_PREVIEW_CREATE_MOBYS: if (oclass == -1) { - preview->state = 1; + preview->state = ITEM_PREVIEW_WAIT_FOR_CLASS; break; } if (load_class) { @@ -198,13 +201,13 @@ s32 update_item_preview_binding(struct ItemPreviewBinding *preview) { 0); } } - preview->state = 3; + preview->state = ITEM_PREVIEW_MONITOR_CLASS_CHANGE; break; case ITEM_PREVIEW_MONITOR_CLASS_CHANGE: if (previous_class != oclass) { preview->primary_moby = delete_moby(preview->primary_moby); preview->secondary_moby = delete_moby(preview->secondary_moby); - preview->state = 2; + preview->state = ITEM_PREVIEW_CREATE_MOBYS; } break; } diff --git a/src/ui/menus/item_preview/update_menu_preview_animation_pose.c b/src/ui/menus/item_preview/update_menu_preview_animation_pose.c index aeb29097d8..cebcd6c554 100644 --- a/src/ui/menus/item_preview/update_menu_preview_animation_pose.c +++ b/src/ui/menus/item_preview/update_menu_preview_animation_pose.c @@ -14,6 +14,9 @@ extern void blend_moby_animation(void *, int, int, int) __asm__("func_00212F90") void update_menu_preview_animation_pose(void *preview) __asm__("FUN_00224fc0"); void update_menu_preview_animation_pose(void *preview) { + enum { + MENU_PREVIEW_ANIMATION_COUNTDOWN_EXPIRED = 0 + }; PauseMoby *moby = preview; struct Moby *anim = (struct Moby *)moby; f32 transform[16]; @@ -22,7 +25,7 @@ void update_menu_preview_animation_pose(void *preview) { if (anim->anim_flags & 2) { if (moby->oclass == 0x25F) { if (anim->seq == 6) { - if (--anim->state == 0) { + if (--anim->state == MENU_PREVIEW_ANIMATION_COUNTDOWN_EXPIRED) { if (anim->prev_seq != 1) { blend_moby_animation(moby, 1, 0, 10); } diff --git a/src/ui/menus/item_preview/update_menu_preview_animation_transform.c b/src/ui/menus/item_preview/update_menu_preview_animation_transform.c index ea4304e7ab..7b39f51132 100644 --- a/src/ui/menus/item_preview/update_menu_preview_animation_transform.c +++ b/src/ui/menus/item_preview/update_menu_preview_animation_transform.c @@ -17,6 +17,9 @@ extern void noop_callback_s(void *, void *, int, int, int) __asm__("func_001E948 void update_menu_preview_animation_transform(PauseMoby *moby) __asm__("FUN_00224d28"); void update_menu_preview_animation_transform(PauseMoby *moby) { + enum { + ANIMATION_BINDING_FRAME_AND_CLIP_RESET = 0 + }; f32 transform[16]; s32 source_moby_address = (s32)((struct MenuScreen *)*moby->vars)->data.preview.moby; @@ -40,7 +43,7 @@ void update_menu_preview_animation_transform(PauseMoby *moby) { 0, source_moby_address); } - moby->binding_state = 0; + moby->binding_state = ANIMATION_BINDING_FRAME_AND_CLIP_RESET; moby->primary_binding = (char *)menu_item_info; moby->binding_blend_word = 0; moby->secondary_binding = (char *)menu_item_info; diff --git a/src/ui/menus/item_preview/update_menu_preview_class_pose.c b/src/ui/menus/item_preview/update_menu_preview_class_pose.c index 569d537155..f1edd7f7bd 100644 --- a/src/ui/menus/item_preview/update_menu_preview_class_pose.c +++ b/src/ui/menus/item_preview/update_menu_preview_class_pose.c @@ -33,6 +33,9 @@ extern void attach_manipulator(int, int, void *) __asm__("FUN_0020cb void update_menu_preview_class_pose(void *preview) __asm__("FUN_00224b70"); void update_menu_preview_class_pose(void *preview) { + enum { + PREVIEW_BINDING_STATE_RESET = 0 + }; PauseMoby *moby = preview; struct Moby *anim = preview; f32 transform[16]; @@ -75,7 +78,7 @@ void update_menu_preview_class_pose(void *preview) { moby->binding_blend_word = 0; moby->secondary_binding = (char *)menu_item_info; anim->anim_speed = 0; - moby->binding_state = 0; + moby->binding_state = PREVIEW_BINDING_STATE_RESET; } if (attachment_active) { attach_manipulator(source_moby_address, 0, attachment); diff --git a/src/ui/menus/item_preview/update_menu_preview_pose_and_attachments.c b/src/ui/menus/item_preview/update_menu_preview_pose_and_attachments.c index cc092958b8..2bcf29e316 100644 --- a/src/ui/menus/item_preview/update_menu_preview_pose_and_attachments.c +++ b/src/ui/menus/item_preview/update_menu_preview_pose_and_attachments.c @@ -23,6 +23,9 @@ extern void attach_manipulator(int, int, void *) __asm__("FUN_0020cb10"); void update_menu_preview_pose_and_attachments(void *preview) __asm__("FUN_00224e18"); void update_menu_preview_pose_and_attachments(void *preview) { + enum { + MENU_PREVIEW_BINDING_SELECTION_RESET = 0 + }; PauseMoby *moby = preview; char **preview_vars = moby->vars; f32 transform[16]; @@ -79,7 +82,7 @@ void update_menu_preview_pose_and_attachments(void *preview) { first_attachment_manipulator.rotation_z = 0; } moby->binding_blend_word = 0; - moby->binding_state = 0; + moby->binding_state = MENU_PREVIEW_BINDING_SELECTION_RESET; } extern __typeof__(update_menu_preview_pose_and_attachments) func_00224E18 diff --git a/src/ui/menus/item_preview/update_preview_animation_and_attachments.c b/src/ui/menus/item_preview/update_preview_animation_and_attachments.c index 211bd619be..78738298d5 100644 --- a/src/ui/menus/item_preview/update_preview_animation_and_attachments.c +++ b/src/ui/menus/item_preview/update_preview_animation_and_attachments.c @@ -79,6 +79,9 @@ s32 update_preview_animation_and_attachments(Moby *source_moby, Moby **attachment1, Moby **attachment2) { + enum { + CD_READ_STATE_IDLE = 0 + }; s32 animation_complete; s32 delay_expired; s32 activate_request; @@ -96,7 +99,7 @@ s32 update_preview_animation_and_attachments(Moby *source_moby, delay_expired = 1; } } - if (menu_system.pending_buffer != 0 && music_stream_state.read_state == 0) { + if (menu_system.pending_buffer != 0 && music_stream_state.read_state == CD_READ_STATE_IDLE) { s32 buffer_index = menu_system.pending_buffer - 1; s32 *buffer_slot = &menu_system.stream_buffer[buffer_index]; s32 buffer_address = *buffer_slot; @@ -112,7 +115,7 @@ s32 update_preview_animation_and_attachments(Moby *source_moby, preview_animation_requests[0].animation_id); menu_system.pending_buffer = 0; } - if (menu_system.pending_buffer == 0 && music_stream_state.read_state == 0 && + if (menu_system.pending_buffer == 0 && music_stream_state.read_state == CD_READ_STATE_IDLE && preview_request_count > 0) { if (preview_animation_requests[0].status == 0) { u32 animation_id = preview_animation_requests[0].animation_id; diff --git a/src/ui/menus/pause/set_pause_action_list.c b/src/ui/menus/pause/set_pause_action_list.c index 850efb7722..4289fbd3c9 100644 --- a/src/ui/menus/pause/set_pause_action_list.c +++ b/src/ui/menus/pause/set_pause_action_list.c @@ -7,7 +7,10 @@ int set_pause_action_list(int *p) __asm__("FUN_0021a1b0"); #include "rnc/ui/menus/menu_pages.h" int set_pause_action_list(int *destination) { - if (pause_action_list_mode != 0) { + enum { + PAUSE_ACTION_LIST_MODE_NO_VIDEO = 0 + }; + if (pause_action_list_mode != PAUSE_ACTION_LIST_MODE_NO_VIDEO) { destination[0xD] = (int)title_options_items_with_video; } else { destination[0xD] = (int)title_options_items_no_video; diff --git a/src/ui/menus/save_data/draw_checking_memory_card_data_menu.c b/src/ui/menus/save_data/draw_checking_memory_card_data_menu.c index 287137f743..705eefdb1c 100644 --- a/src/ui/menus/save_data/draw_checking_memory_card_data_menu.c +++ b/src/ui/menus/save_data/draw_checking_memory_card_data_menu.c @@ -44,7 +44,8 @@ s32 draw_checking_memory_card_data_menu(struct MenuScreen *menu) { if (memory_card_state.card[0].type != 2) { goto done; } - if (memory_card_state.state < 3 && memory_card_state.pending_state < 0) { + if (memory_card_state.state < MEMCARD_REQUEST_FORMAT && + memory_card_state.pending_state < MEMCARD_QUERY_INFO) { goto done; } setup_gif_paging(0); diff --git a/src/ui/menus/save_data/draw_save_slot_list.c b/src/ui/menus/save_data/draw_save_slot_list.c index b7edff0c1d..dc3812ff0c 100644 --- a/src/ui/menus/save_data/draw_save_slot_list.c +++ b/src/ui/menus/save_data/draw_save_slot_list.c @@ -54,15 +54,16 @@ s32 draw_save_slot_list(SaveMenu *menu) { inner_right = width - 3; inner_top = y - 1; inner_bottom = y + 0x31; - if (memory_card_state.state < 3 && memory_card_state.pending_state < 0 && - menu->selected_slot == i) { + if (memory_card_state.state < MEMCARD_REQUEST_FORMAT && + memory_card_state.pending_state < MEMCARD_QUERY_INFO && menu->selected_slot == i) { append_screen_rect_packet(0, highlight_top, width, highlight_bottom, 0x8020FFFF, 0); append_screen_rect_packet( 3, inner_top, inner_right, inner_bottom, panel_clear_color, 0); } append_screen_rect_packet(3, inner_top, inner_right, inner_bottom, 0x80303030, 0); slot = &memory_card_state.card[0].entries[i]; - if (memory_card_state.state >= 3 || memory_card_state.pending_state >= 0 || + if (memory_card_state.state >= MEMCARD_REQUEST_FORMAT || + memory_card_state.pending_state >= MEMCARD_QUERY_INFO || memory_card_state.card[0].type != 2) { y += 0x30; } else { diff --git a/src/ui/menus/save_data/loading_data_menu.c b/src/ui/menus/save_data/loading_data_menu.c index 8160bff414..7d012dc169 100644 --- a/src/ui/menus/save_data/loading_data_menu.c +++ b/src/ui/menus/save_data/loading_data_menu.c @@ -44,7 +44,8 @@ s32 loading_data_menu(struct LoadMenuDescriptor *menu) { s32 scaled_volume_70; previous_save_slot = menu->selected_save_slot; if (menu_system.card_op_pending != 0) { - if ((memory_card_state.state < 3) && (memory_card_state.pending_state < 0)) { + if ((memory_card_state.state < MEMCARD_REQUEST_FORMAT) && + (memory_card_state.pending_state < MEMCARD_QUERY_INFO)) { menu_system.card_op_pending = 0; if (memory_card_state.err != 0) { mode_freeze_flags |= 0x100; @@ -84,7 +85,8 @@ s32 loading_data_menu(struct LoadMenuDescriptor *menu) { menu_system.next = menu_system.current->back; return 0; } - if (((memory_card_state.state < 3) && (memory_card_state.pending_state < 0)) && + if (((memory_card_state.state < MEMCARD_REQUEST_FORMAT) && + (memory_card_state.pending_state < MEMCARD_QUERY_INFO)) && (memory_card_state.card[0].type == 2)) { if (menu->flags & 1) { buttons = controller_state.raw_pressed; @@ -106,9 +108,9 @@ s32 loading_data_menu(struct LoadMenuDescriptor *menu) { allocate_voice_for_target_entry(0, 0x11, menu->sound_owner); memory_card_state.active_card = 0; memory_card_state.card[0].save_index = (s32)menu->selected_save_slot; - if (memory_card_state.pending_state < 0) { + if (memory_card_state.pending_state < MEMCARD_QUERY_INFO) { memory_card_state.pending_card = 0; - memory_card_state.pending_state = 0xD; + memory_card_state.pending_state = MEMCARD_BEGIN_READ_SAVE; } menu_system.card_op_pending = 1; menu_system.card_op_text = 0x4FB6; diff --git a/src/ui/menus/save_data/prepare_save_game.c b/src/ui/menus/save_data/prepare_save_game.c index bfd2ab3092..bfd1c6dbce 100644 --- a/src/ui/menus/save_data/prepare_save_game.c +++ b/src/ui/menus/save_data/prepare_save_game.c @@ -29,9 +29,9 @@ void prepare_save_game(int save_data, int slot) { card_state->buf = (void *)save_data; card_state->card[0].save_index = slot; card_state->active_card = 0; - if (card_state->pending_state < 0) { + if (card_state->pending_state < MEMCARD_QUERY_INFO) { card_state->pending_card = 0; - card_state->pending_state = 0x13; + card_state->pending_state = MEMCARD_BEGIN_WRITE_FULL_SAVE; } } diff --git a/src/ui/menus/save_data/save_card_state_check_save.c b/src/ui/menus/save_data/save_card_state_check_save.c index 55e8899224..3e02470322 100644 --- a/src/ui/menus/save_data/save_card_state_check_save.c +++ b/src/ui/menus/save_data/save_card_state_check_save.c @@ -7,8 +7,8 @@ void save_card_state_check_save(void) __asm__("FUN_00208bc0"); void save_card_state_check_save(void) { struct MemoryCardState *card_state = &memory_card_state; - if (card_state->state == 2 && card_state->pending_state < 0) { - card_state->pending_state = 7; + if (card_state->state == MEMCARD_DISPATCH_PENDING_OPERATION && card_state->pending_state < 0) { + card_state->pending_state = MEMCARD_REQUEST_CHDIR; card_state->pending_card = 0; mode_freeze_state = 0xB; } diff --git a/src/ui/menus/save_data/save_card_state_create_save_pending.c b/src/ui/menus/save_data/save_card_state_create_save_pending.c index 5d53c7d912..b9d391cb1b 100644 --- a/src/ui/menus/save_data/save_card_state_create_save_pending.c +++ b/src/ui/menus/save_data/save_card_state_create_save_pending.c @@ -6,8 +6,9 @@ void save_card_state_create_save_pending(void) __asm__("FUN_00208d20"); void save_card_state_create_save_pending(void) { struct MemoryCardState *card_state = &memory_card_state; - if (card_state->state == 2 && card_state->pending_state < 0) { - card_state->pending_state = 9; + if (card_state->state == MEMCARD_DISPATCH_PENDING_OPERATION && + card_state->pending_state < MEMCARD_QUERY_INFO) { + card_state->pending_state = MEMCARD_BEGIN_CREATE_SAVE_DIRECTORY; card_state->pending_card = 0; mode_freeze_state = 0xF; } diff --git a/src/ui/menus/save_data/save_card_state_creating_save.c b/src/ui/menus/save_data/save_card_state_creating_save.c index 23a7b14119..9d7b0b4138 100644 --- a/src/ui/menus/save_data/save_card_state_creating_save.c +++ b/src/ui/menus/save_data/save_card_state_creating_save.c @@ -7,13 +7,13 @@ void save_card_state_creating_save(void) __asm__("FUN_00208d60"); void save_card_state_creating_save(void) { struct MemoryCardState *card_state = &memory_card_state; - if (card_state->state == 2 && card_state->pending_state < 0) { + if (card_state->state == MEMCARD_DISPATCH_PENDING_OPERATION && card_state->pending_state < 0) { if (card_state->err != 0) { mode_freeze_state = 0x12; mode_freeze_flags |= 0x40; return; } - card_state->pending_state = 7; + card_state->pending_state = MEMCARD_REQUEST_CHDIR; card_state->active_card = 0; card_state->card[0].save_index = 0; card_state->pending_card = 0; diff --git a/src/ui/menus/save_data/save_card_state_format_pending.c b/src/ui/menus/save_data/save_card_state_format_pending.c index 6723158f76..b5f41b60b6 100644 --- a/src/ui/menus/save_data/save_card_state_format_pending.c +++ b/src/ui/menus/save_data/save_card_state_format_pending.c @@ -10,7 +10,7 @@ void save_card_state_format_pending(void) { card_state->card[0].sync_result = 0; if (pending < 0) { card_state->pending_card = 0; - card_state->pending_state = 3; + card_state->pending_state = MEMCARD_REQUEST_FORMAT; } mode_freeze_state = 8; } diff --git a/src/ui/menus/save_data/save_card_state_formatting.c b/src/ui/menus/save_data/save_card_state_formatting.c index c0492ac003..2e94b3b4e3 100644 --- a/src/ui/menus/save_data/save_card_state_formatting.c +++ b/src/ui/menus/save_data/save_card_state_formatting.c @@ -7,7 +7,7 @@ void save_card_state_formatting(void) __asm__("FUN_00208b28"); void save_card_state_formatting(void) { struct MemoryCardState *card_state = &memory_card_state; - if (card_state->state == 2 && card_state->pending_state < 0) { + if (card_state->state == MEMCARD_DISPATCH_PENDING_OPERATION && card_state->pending_state < 0) { if (card_state->err != 0) { mode_freeze_state = 0x11; mode_freeze_flags |= 0x40; diff --git a/src/ui/menus/save_data/save_card_state_saving.c b/src/ui/menus/save_data/save_card_state_saving.c index 9136eb5984..cb88570e89 100644 --- a/src/ui/menus/save_data/save_card_state_saving.c +++ b/src/ui/menus/save_data/save_card_state_saving.c @@ -16,7 +16,8 @@ void save_card_state_saving(void) __asm__("FUN_00208f28"); void save_card_state_saving(void) { s32 flags; - if ((memory_card_state.state < 3) && (memory_card_state.pending_state < 0)) { + if ((memory_card_state.state < MEMCARD_REQUEST_FORMAT) && + (memory_card_state.pending_state < MEMCARD_QUERY_INFO)) { if (memory_card_state.err != 0) { mode_freeze_init(3, 0); mode_freeze_state = 0x15; diff --git a/src/ui/menus/save_data/start_memory_card_save.c b/src/ui/menus/save_data/start_memory_card_save.c index 4c8826c287..29d466bb59 100644 --- a/src/ui/menus/save_data/start_memory_card_save.c +++ b/src/ui/menus/save_data/start_memory_card_save.c @@ -20,8 +20,8 @@ void start_memory_card_save(s32 save_data, s32 slot) { *(s32 *)((u8 *)&memory_card_state + slot * 0x1C + 0x20) = 0; memory_card_state.unkF4 = 1; memory_card_state.buf = save_data; - if (memory_card_state.pending_state < 0) { + if (memory_card_state.pending_state < MEMCARD_QUERY_INFO) { memory_card_state.pending_card = 0; - memory_card_state.pending_state = 0x13; + memory_card_state.pending_state = MEMCARD_BEGIN_WRITE_FULL_SAVE; } } diff --git a/src/ui/menus/selection/update_menu_option_list.c b/src/ui/menus/selection/update_menu_option_list.c index 0f035256de..86422f812f 100644 --- a/src/ui/menus/selection/update_menu_option_list.c +++ b/src/ui/menus/selection/update_menu_option_list.c @@ -53,12 +53,12 @@ s32 update_menu_option_list(struct MenuScreen *menu_screen) { if (controller_state.pressed_unmasked & PAD_CROSS) { allocate_voice_for_target_entry(0, 0x11, menu_screen->moby); if (menu_screen->data.options.list[menu_screen->data.options.selection].flags & 1) { - if (requested_video_mode != 0) { + if (requested_video_mode != FALSE) { mode_freeze_init(6, menu_system.current); } else { fade_to_black(4); menu_screen->data.options.fade_timer = scale_game_frames(0x10); - requested_video_mode = requested_video_mode == 0; + requested_video_mode = requested_video_mode == FALSE; } } else if (menu_screen->data.options.list[menu_screen->data.options.selection].flag != 0) { *menu_screen->data.options.list[menu_screen->data.options.selection].flag = diff --git a/src/ui/menus/stream_buffers/initialize_menu_stream_buffers.c b/src/ui/menus/stream_buffers/initialize_menu_stream_buffers.c index 8576cbc331..9c1dd584b8 100644 --- a/src/ui/menus/stream_buffers/initialize_menu_stream_buffers.c +++ b/src/ui/menus/stream_buffers/initialize_menu_stream_buffers.c @@ -10,6 +10,9 @@ void initialize_menu_stream_buffers(s32 mode) __asm__("FUN_00225ac0"); * the first two groups and 0x4F000 for the final group. The flag word * is one only for the final group. */ void initialize_menu_stream_buffers(s32 mode) { + enum { + MENU_STREAM_MODE_SINGLE_PRIMARY_BUFFER = 0 + }; s32 secondary_address; s32 primary_address; s32 primary_count; @@ -22,7 +25,7 @@ void initialize_menu_stream_buffers(s32 mode) { primary_address = menu_system.help_text_buffer; secondary_address = menu_system.unk10C; - if (mode == 0) { + if (mode == MENU_STREAM_MODE_SINGLE_PRIMARY_BUFFER) { primary_count = 1; secondary_count = 0; large_count = 0; diff --git a/src/ui/menus/stream_image/draw_menu_stream_image.c b/src/ui/menus/stream_image/draw_menu_stream_image.c index 83846fd094..4712aa9a5a 100644 --- a/src/ui/menus/stream_image/draw_menu_stream_image.c +++ b/src/ui/menus/stream_image/draw_menu_stream_image.c @@ -14,9 +14,12 @@ extern s64 load_texture_file() __asm__("func_00204CF0"); s32 draw_menu_stream_image(struct MenuStreamImageScreen *screen) __asm__("FUN_00220790"); s32 draw_menu_stream_image(struct MenuStreamImageScreen *screen) { + enum { + MENU_STREAM_IMAGE_MIN_DRAW_STATE = 4 + }; s64 modulate_color; - if (screen->state < 4) { + if (screen->state < MENU_STREAM_IMAGE_MIN_DRAW_STATE) { return 0; } modulate_color = (s64)0x80808080; diff --git a/src/ui/menus/stream_image/update_menu_stream_image.c b/src/ui/menus/stream_image/update_menu_stream_image.c index ead9b73fcf..2cf7c01045 100644 --- a/src/ui/menus/stream_image/update_menu_stream_image.c +++ b/src/ui/menus/stream_image/update_menu_stream_image.c @@ -56,7 +56,8 @@ s32 update_menu_stream_image(struct MenuScreen *stream) { if (selected_entry_index >= 5) { selected_entry_index = 4; } - if (memory_card_state.state < 3 && memory_card_state.pending_state < 0) { + if (memory_card_state.state < MEMCARD_REQUEST_FORMAT && + memory_card_state.pending_state < MEMCARD_QUERY_INFO) { if (stream->data.stream.state == -1) { stream->data.stream.state = 0; } diff --git a/src/ui/menus/streamed_moby/enter_streamed_moby_screen.c b/src/ui/menus/streamed_moby/enter_streamed_moby_screen.c index e679a0d540..879d2c674b 100644 --- a/src/ui/menus/streamed_moby/enter_streamed_moby_screen.c +++ b/src/ui/menus/streamed_moby/enter_streamed_moby_screen.c @@ -11,6 +11,9 @@ extern void helper_moby_update_noop(struct Moby *) __asm__("func_00225AB int enter_streamed_moby_screen(struct MenuStreamedMobyScreen *screen) __asm__("FUN_00225588"); int enter_streamed_moby_screen(struct MenuStreamedMobyScreen *screen) { + enum { + STREAMED_MOBY_SCREEN_STATE_SETUP_FAILED = 3 + }; struct Moby *preview_moby; int stream_buffer_address; preview_moby = create_menu_preview_moby(0x7A5); @@ -30,12 +33,12 @@ int enter_streamed_moby_screen(struct MenuStreamedMobyScreen *screen) { *(int *)(moby_sidecar + 4) = 0; *(int *)(moby_sidecar + 8) = 0; } else { - screen->state = 3; + screen->state = STREAMED_MOBY_SCREEN_STATE_SETUP_FAILED; } stream_buffer_address = acquire_menu_stream_buffer(1); screen->buffer = stream_buffer_address; if (stream_buffer_address == 0) { - screen->state = 3; + screen->state = STREAMED_MOBY_SCREEN_STATE_SETUP_FAILED; } return 0; } diff --git a/src/ui/menus/streamed_moby/update_streamed_moby_animation.c b/src/ui/menus/streamed_moby/update_streamed_moby_animation.c index 57d8191cca..a5aeb6fb72 100644 --- a/src/ui/menus/streamed_moby/update_streamed_moby_animation.c +++ b/src/ui/menus/streamed_moby/update_streamed_moby_animation.c @@ -66,6 +66,9 @@ s32 update_streamed_moby_animation(MobyAnimationStream *stream) { STREAMED_MOBY_WAIT_THIRD_ANIMATION_COMPLETION = 5, STREAMED_MOBY_WAIT_SEQUENCE_RESTART = 6 }; + enum { + ANIMATION_STREAM_READ_FAILED = 3 + }; StreamedAnimationMoby *moby; AnimationTableHeader *header; StreamedClassResource **class_resource; @@ -87,12 +90,12 @@ s32 update_streamed_moby_animation(MobyAnimationStream *stream) { disc_table.animation_table.sector, disc_table.animation_table.size) != 0) { stream->read_offset = table_index; - stream->state = 1; + stream->state = ANIMATION_STREAM_FINISH_READ; animation_asset_read_active[0] = 1; mark_menu_stream_buffer_read_active(stream->buffer); return 0; } - stream->state = 3; + stream->state = ANIMATION_STREAM_READ_FAILED; break; case ANIMATION_STREAM_FINISH_READ: /* Decompress the completed read and relocate three animation tables. */ @@ -111,7 +114,7 @@ s32 update_streamed_moby_animation(MobyAnimationStream *stream) { (*class_resource)->animation_tables[k + 1] = animation_table; relocate_asset_entry_pointers(*class_resource, k + 1); } - stream->state = 2; + stream->state = ANIMATION_STREAM_UPDATE_MOBY; if (alternate_animation_sequence == 0) { stream->moby->moby_state = 0; } else { @@ -157,10 +160,10 @@ s32 update_streamed_moby_animation(MobyAnimationStream *stream) { moby->animation_frame_counter = 1; } if (moby->transition_flags & 2) { - if (moby->moby_state == 1) { + if (moby->moby_state == STREAMED_MOBY_WAIT_FIRST_ANIMATION_COMPLETION) { moby->moby_state = moby->moby_state + 1; } else { - moby->moby_state = 6; + moby->moby_state = STREAMED_MOBY_WAIT_SEQUENCE_RESTART; } moby->animation_frame_counter = 0; blend_moby_animation(moby, 0, 0, scale_game_frames(0x18)); @@ -176,9 +179,9 @@ s32 update_streamed_moby_animation(MobyAnimationStream *stream) { return 0; } if (alternate_animation_sequence == 0) { - moby->moby_state = 0; + moby->moby_state = STREAMED_MOBY_WAIT_DIALOGUE_FOR_FIRST_ANIMATION; } else { - moby->moby_state = 4; + moby->moby_state = STREAMED_MOBY_WAIT_DIALOGUE_FOR_THIRD_ANIMATION; } moby->animation_frame_counter = 0; break; diff --git a/src/ui/menus/system/close_menu_system.c b/src/ui/menus/system/close_menu_system.c index 1a414967e5..9e7e950080 100644 --- a/src/ui/menus/system/close_menu_system.c +++ b/src/ui/menus/system/close_menu_system.c @@ -8,6 +8,9 @@ void close_menu_system(void) __asm__("FUN_002191b8"); void close_menu_system(void) { + enum { + MENU_SYSTEM_STATE_FINALIZE_CLOSE = 20 + }; s32 i; s32 j; struct MenuScreen *screen; @@ -28,7 +31,7 @@ void close_menu_system(void) { for (j = 0; j < 14; j++) { panel_slots[j] = (void *)delete_moby(panel_slots[j]); } - menu_system.state = 20; + menu_system.state = MENU_SYSTEM_STATE_FINALIZE_CLOSE; menu_system.timer = 2; } diff --git a/src/ui/menus/system/enter_main_menu.c b/src/ui/menus/system/enter_main_menu.c index 08dd8e7c3c..246b18c8f7 100644 --- a/src/ui/menus/system/enter_main_menu.c +++ b/src/ui/menus/system/enter_main_menu.c @@ -3,9 +3,12 @@ #include "rnc/globals.h" void enter_main_menu(void) { + enum { + GAME_MODE_MAIN_MENU = 3 + }; menu_system.close_request = 0; menu_system.unk10 = 0; - game_mode = 3; + game_mode = GAME_MODE_MAIN_MENU; menu_system.state = 0x2D; menu_system.update_count = 0; } diff --git a/src/ui/menus/system/process_menu_entry.c b/src/ui/menus/system/process_menu_entry.c index 89fea862f6..3a7006eb18 100644 --- a/src/ui/menus/system/process_menu_entry.c +++ b/src/ui/menus/system/process_menu_entry.c @@ -115,7 +115,7 @@ void process_menu_entry(void *callback_context, Menu *menu, s32 follow_entry_lin } menu_entry_context[5] = current_menu_entry->unk0; kind = current_menu_entry->unk8; - if (kind == 6) { + if (kind == MENU_CONDITION_BOLT_THRESHOLD_AND_COUNT_DIFFERENCE_MET) { sfx = menu_bolt_threshold_thousands_separators; strcpy(SCRATCH, get_help_message_text(current_menu_entry->unk0)); substring_match = FindSubstring(SCRATCH, help_text_integer_placeholder); diff --git a/src/ui/menus/system/setup_menu_display_text.c b/src/ui/menus/system/setup_menu_display_text.c index 424a5e16a5..a05d6ddedc 100644 --- a/src/ui/menus/system/setup_menu_display_text.c +++ b/src/ui/menus/system/setup_menu_display_text.c @@ -11,7 +11,7 @@ extern void setup_gif_paging(int) __asm__("func_001F4280"); extern void do_gif_paging(void) __asm__("func_001F4398"); extern void draw_moby_list(void *, int) __asm__("func_0020D330"); extern void *get_help_message_text(int) __asm__("func_001FDD10"); -extern const float D_001602A4_gp __asm__("D_001602A4") __attribute__((sda)); +extern const float setup_menu_moby_camera_y_offset __asm__("D_001602A4") __attribute__((sda)); extern char setup_menu_text_format[] __asm__("D_001602A8"); extern int menu_display_value_by_level[] __asm__("D_001E0888"); @@ -27,7 +27,7 @@ int setup_menu_display_text(struct MenuScreen *menu) { int count; preview_moby->pos.x = camera->position.f[0] + 8.0f; - preview_moby->pos.y = camera->position.f[1] + D_001602A4_gp; + preview_moby->pos.y = camera->position.f[1] + setup_menu_moby_camera_y_offset; preview_moby->pos.z = camera->position.f[2] - 0.1f; if (menu->data.preview.moby != 0) { draw_moby_list(menu->data.preview.moby, 1); diff --git a/src/ui/menus/system/update_menu_resource_stream.c b/src/ui/menus/system/update_menu_resource_stream.c index 6b9d7f2ce2..bed76f6000 100644 --- a/src/ui/menus/system/update_menu_resource_stream.c +++ b/src/ui/menus/system/update_menu_resource_stream.c @@ -90,8 +90,8 @@ s32 update_menu_resource_stream(struct MenuScreen *stream) { if (resource_index >= 5) { resource_index = 4; } - if (memory_card_state.state < 3) { - if (memory_card_state.pending_state < 0) { + if (memory_card_state.state < MEMCARD_REQUEST_FORMAT) { + if (memory_card_state.pending_state < MEMCARD_QUERY_INFO) { if (stream->data.stream.state == -1) { stream->data.stream.state = 0; } diff --git a/src/ui/menus/system/update_menu_system.c b/src/ui/menus/system/update_menu_system.c index 8e70e922ef..5632457da6 100644 --- a/src/ui/menus/system/update_menu_system.c +++ b/src/ui/menus/system/update_menu_system.c @@ -37,6 +37,13 @@ extern void mode_freeze_init(s32, struct MenuPage *) __asm__("func_001FBAB8"); void update_menu_system(void) __asm__("FUN_002192a8"); void update_menu_system(void) { + enum { + MENU_SYSTEM_STATE_PAGE_TRANSITION_PENDING = 1, + MENU_SYSTEM_STATE_FINALIZE_CLOSE = 0x14 + }; + enum { + MENU_SYSTEM_STATE_INITIALIZE_PREVIEW = 0 + }; s32 i; s32 j; s32 k; @@ -47,7 +54,7 @@ void update_menu_system(void) { menu_system.update_count = menu_system.update_count + 1; reset_active_camera_position_and_basis(); - if (menu_system.state == 0x14) { + if (menu_system.state == MENU_SYSTEM_STATE_FINALIZE_CLOSE) { if (menu_system.timer != 0) { menu_system.timer = menu_system.timer - 1; if (menu_system.timer != 0) { @@ -68,14 +75,14 @@ void update_menu_system(void) { game_mode = 0; return; } - if (menu_system.state == 0 || menu_system.state == 0x2D) { + if (menu_system.state == MENU_SYSTEM_STATE_INITIALIZE_PREVIEW || menu_system.state == 0x2D) { initialize_menu_preview_scene(); } if (mode_freeze_flags & 1) { mode_freeze_init(3, menu_system.current); return; } - if (menu_system.state == 1) { + if (menu_system.state == MENU_SYSTEM_STATE_PAGE_TRANSITION_PENDING) { menu_system.timer = (menu_system.timer < 1) ? 0 : menu_system.timer - 1; if (menu_system.timer == 0) { struct MenuPage *incoming_page = menu_system.next; @@ -122,7 +129,7 @@ void update_menu_system(void) { ((struct Ent *)panel_slots[j])->unk58 = 1.0f; } } - menu_system.state = 1; + menu_system.state = MENU_SYSTEM_STATE_PAGE_TRANSITION_PENDING; menu_system.timer = 12; menu_system.previous = menu_system.current; menu_system.current = 0; diff --git a/src/ui/menus/widgets/draw_menu_flashing_panel.c b/src/ui/menus/widgets/draw_menu_flashing_panel.c index 10af1041eb..ff83c9597b 100644 --- a/src/ui/menus/widgets/draw_menu_flashing_panel.c +++ b/src/ui/menus/widgets/draw_menu_flashing_panel.c @@ -53,7 +53,7 @@ void draw_menu_flashing_panel(struct MenuPanelOwner *panel_moby) { if (x >= 0x200 || x + width < 0) { return; } - if (!(pal_mode != 0 ? y < 0x1C1 : y < 0x1A1) || y + height < 0) { + if (!(pal_mode != FALSE ? y < 0x1C1 : y < 0x1A1) || y + height < 0) { return; } vu1_add_g_sregister(8, 0); diff --git a/src/ui/menus/widgets/draw_menu_item_grid.c b/src/ui/menus/widgets/draw_menu_item_grid.c index 4469d59d75..392e14ba0f 100644 --- a/src/ui/menus/widgets/draw_menu_item_grid.c +++ b/src/ui/menus/widgets/draw_menu_item_grid.c @@ -40,6 +40,9 @@ extern void append_screen_rect_packet(s32, s32, s32, s32, u64, s32) __asm__("fun s32 draw_menu_item_grid(struct MenuScreen *grid) __asm__("FUN_0021d948"); s32 draw_menu_item_grid(struct MenuScreen *grid) { + enum { + MENU_GRID_CELL_EQUIPPABLE_ITEM = 0 + }; Font *font; struct MenuGridCell *cell; s32 focused; @@ -107,9 +110,10 @@ s32 draw_menu_item_grid(struct MenuScreen *grid) { append_screen_rect_packet( left - 0x10, top - 0x10, right + 0x10, bottom + 0x10, panel_clear_color, 1); } - if (cell->kind == 0 ? item_available[cell->id] : alternate_item_available[cell->id]) { + if (cell->kind == MENU_GRID_CELL_EQUIPPABLE_ITEM ? item_available[cell->id] + : alternate_item_available[cell->id]) { frame_offset = 0; - if ((u16)cell->kind == 0) { + if ((u16)cell->kind == MENU_GRID_CELL_EQUIPPABLE_ITEM) { id = cell->id; if (menu_system.equipped[menu_grid_item_slot_records[id].slot] == id && !(grid->data.grid.flags & 0x20)) { diff --git a/src/ui/menus/widgets/draw_menu_selection_text.c b/src/ui/menus/widgets/draw_menu_selection_text.c index 04a95ce947..1c5a160217 100644 --- a/src/ui/menus/widgets/draw_menu_selection_text.c +++ b/src/ui/menus/widgets/draw_menu_selection_text.c @@ -27,7 +27,8 @@ s32 draw_menu_selection_text(struct MenuScreen *menu) { *((s32 *)((((u8 *)card_state) - (-(menu_system.current->focus->data.save.slot * 0x1C))) + 0x20)); setup_gif_paging(0); - if (((card_state->state < 3) && (card_state->pending_state < 0)) && + if (((card_state->state < MEMCARD_REQUEST_FORMAT) && + (card_state->pending_state < MEMCARD_QUERY_INFO)) && (card_state->card[0].type == 2)) { if (entry_index == (-1)) { height = menu->height; diff --git a/src/ui/menus/widgets/draw_menu_text_list.c b/src/ui/menus/widgets/draw_menu_text_list.c index f8a04e518b..8ee62382e3 100644 --- a/src/ui/menus/widgets/draw_menu_text_list.c +++ b/src/ui/menus/widgets/draw_menu_text_list.c @@ -27,6 +27,11 @@ extern void *memset(void *, int, unsigned int); s32 draw_menu_text_list(struct MenuScreen *menu) __asm__("FUN_0021d4a8"); s32 draw_menu_text_list(struct MenuScreen *menu) { + enum { + MENU_LIST_FONT_TEXTURE_NORMAL = 1, + MENU_LIST_FONT_TEXTURE_SMALL = 2, + MENU_LIST_FONT_TEXTURE_LARGE = 3 + }; s32 font_size; s32 font_kind; s32 focused; @@ -44,17 +49,17 @@ s32 draw_menu_text_list(struct MenuScreen *menu) { s32 y; font_size = 12; - font_kind = 1; + font_kind = MENU_LIST_FONT_TEXTURE_NORMAL; font = normal_font_metrics; focused = menu_system.current->focus == menu; if (menu->data.list.flags & 4) { font_size = 14; - font_kind = 3; + font_kind = MENU_LIST_FONT_TEXTURE_LARGE; font = large_font_metrics; } if (menu->data.list.flags & 8) { font_size = 10; - font_kind = 2; + font_kind = MENU_LIST_FONT_TEXTURE_SMALL; font = small_font_metrics; } vu1_add_g_sregister(0x42, 0x44); diff --git a/src/ui/menus/widgets/enter_menu_help_text.c b/src/ui/menus/widgets/enter_menu_help_text.c index cb3acf17c8..93678f6d4b 100644 --- a/src/ui/menus/widgets/enter_menu_help_text.c +++ b/src/ui/menus/widgets/enter_menu_help_text.c @@ -17,6 +17,9 @@ extern s32 start_audio_stream_read(s32, s32, s32) __asm__("FUN_00216788"); s32 enter_menu_help_text(struct MenuScreen *menu) __asm__("FUN_0021d1f8"); s32 enter_menu_help_text(struct MenuScreen *menu) { + enum { + CD_READ_STATE_IDLE = 0 + }; s32 i; struct MenuSystem *menu_system_state; @@ -31,7 +34,7 @@ s32 enter_menu_help_text(struct MenuScreen *menu) { } } menu->data.help.load_state = 0; - if (music_stream_state.read_state == 0) { + if (music_stream_state.read_state == CD_READ_STATE_IDLE) { if (start_audio_stream_read(help_text_read_destination[0], disc_table.help_text.sector, disc_table.help_text.size) != 0) { diff --git a/src/ui/menus/widgets/render_configured_text_label.c b/src/ui/menus/widgets/render_configured_text_label.c index 26898f893e..0cacf6c19b 100644 --- a/src/ui/menus/widgets/render_configured_text_label.c +++ b/src/ui/menus/widgets/render_configured_text_label.c @@ -98,7 +98,7 @@ int render_configured_text_label(struct MenuScreen *label) { struct MenuScreen *page = menu_system.current->focus; value_index = page->data.list.selected; if (selector_flags & 0x8000) { - value_variant = pal_mode != 0; + value_variant = pal_mode != FALSE; } } else if (selector_flags & 0x100) { struct MenuScreen *page = menu_system.current->focus; diff --git a/src/ui/text/font/font_queue_vu_state.c b/src/ui/text/font/font_queue_vu_state.c index c871e27024..b34dc97ec4 100644 --- a/src/ui/text/font/font_queue_vu_state.c +++ b/src/ui/text/font/font_queue_vu_state.c @@ -14,6 +14,9 @@ extern void vu1_gs_regs_font(void) __asm__("func_00233C90"); void font_queue_vu_state(void) __asm__("FUN_001f76a0"); void font_queue_vu_state(void) { + enum { + FONT_STATE_VU_PROGRAM_QUEUED = 7 + }; f32 camera_relative_scale_matrix[4][4]; struct DmaTag *dma_packet_start; u8 *packet_write_ptr; @@ -21,9 +24,9 @@ void font_queue_vu_state(void) { set_scale_matrix(camera_relative_scale_matrix, 1024.0f); fast_vec_scale(camera_relative_scale_matrix[3], camera_position, -1024.0f); camera_relative_scale_matrix[3][3] = 1.0f; - if (font_state != 7) { + if (font_state != FONT_STATE_VU_PROGRAM_QUEUED) { vu1_add_data_ref(font_vu_program, font_vu_program_tag[0]); - font_state = 7; + font_state = FONT_STATE_VU_PROGRAM_QUEUED; } render_packet_cursor.tag->tag = 0x10000000; render_packet_cursor.tag->addr = 0; diff --git a/src/ui/text/link_localized_display_text.c b/src/ui/text/link_localized_display_text.c index 63bbe1c487..58464f492e 100644 --- a/src/ui/text/link_localized_display_text.c +++ b/src/ui/text/link_localized_display_text.c @@ -18,6 +18,9 @@ void link_localized_display_text(void) __asm__("FUN_001fdd58"); void link_localized_display_text(void) { /* win is unsigned (lhu) but w/h are signed: the narrowing gives the sll 16 / sra 17 shift-by-one retail has instead of a plain sra. */ + enum { + HELP_STATE_DISPLAY_START_DELAY = 1 + }; u16 win[16]; HelpState *box; void *text; @@ -26,7 +29,7 @@ void link_localized_display_text(void) { short measured_text_width, rendered_text_height; s32 hHalf5; - help_state.state = 1; + help_state.state = HELP_STATE_DISPLAY_START_DELAY; help_state.timer = 0; if (D_0015EE1D != 0 || D_0015EE1C != 0) { allocate_voice_for_bank_entry(0, 1, 0);