diff --git a/src/SB/Game/zNPCTypeBossPlankton.cpp b/src/SB/Game/zNPCTypeBossPlankton.cpp index f06fbbf43..e9099f1ad 100644 --- a/src/SB/Game/zNPCTypeBossPlankton.cpp +++ b/src/SB/Game/zNPCTypeBossPlankton.cpp @@ -1,4 +1,5 @@ #include "zNPCTypeBossPlankton.h" +#include "xDebug.h" #include @@ -23,8 +24,77 @@ #define ANIM_attack_missle 76 //0x4c #define ANIM_attack_bomb 77 //0x4d +#define SOUND_HOVER 0 +#define SOUND_HIT 1 +#define SOUND_BOLT_FIRE 2 +#define SOUND_BOLT_FLY 3 +#define SOUND_BOLT_HIT 4 +#define SOUND_CHARGE 5 + namespace { + struct sound_data_type + { + U32 id; + U32 handle; + xVec3* loc; + F32 volume; + }; + + struct sound_property + { + U32 asset; + F32 volume; + F32 range_inner; + F32 range_outer; + F32 delay; + F32 fade_time; + }; + + struct sound_asset + { + S32 group; + char* name; + U32 priority; + U32 flags; + }; + + static U32 sound_asset_ids[6][10]; + static sound_data_type sound_data[6]; + static const sound_asset sound_assets[29] = + { + {0, "RSB_foot_loop", 0, 3}, + {0, "fan_loop", 0, 3}, + {0, "Rocket_burn_loop", 0, 3}, + {0, "RP_whirr_loop", 0, 3}, + {0, "RP_whirr2_loop", 0, 3}, + {0, "Glove_hover", 0, 3}, + {0, "Glove_pursuit", 0, 3}, + {1, "Prawn_FF_hit", 0, 0}, + {1, "Prawn_hit", 0, 0}, + {1, "Door_metal_shut", 0, 0}, + {1, "Ghostplat_fall", 0, 0}, + {1, "ST-death", 0, 0}, + {1, "RP_Bwrrzt", 0, 0}, + {1, "RP_chunk", 0, 0}, + {1, "b201_rp_exhale", 0, 0}, + {2, "RP_laser_alt", 0, 0}, + {3, "RP_laser_loop", 0, 1}, + {3, "ElecArc_alt_b", 0, 1}, + {3, "Laser_lrg_fire_loop", 0, 1}, + {3, "Laser_sm_fire_loop", 0, 1}, + {4, "RB_stalact_brk", 0, 0}, + {4, "Volcano_blast", 0, 0}, + {4, "RP_laser_thunk", 0, 0}, + {4, "RP_pfft", 0, 0}, + {4, "RP_thwash", 0, 0}, + {5, "RP_charge_whirr", 0, 0}, + {5, "B101_SC_jump", 0, 0}, + {5, "KJ_Charge", 0, 0}, + {5, "Laser_med_pwrup1", 0, 0} + }; + + S32 init_sound() { return 0; @@ -39,6 +109,745 @@ namespace { } + struct config + { + F32 radius; + F32 length; + F32 vel; + F32 fade_dist; + F32 kill_dist; + F32 safe_dist; + F32 hit_radius; + F32 rand_ang; + F32 scar_life; + xVec2 bolt_uv[2]; + S32 hit_interval; + F32 damage; + }; + + struct tweak_group + { + xVec3 accel; + xVec3 max_vel; + F32 turn_accel; + F32 turn_max_vel; + F32 ground_y; + F32 ground_radius; + F32 hit_vel; + F32 hit_max_dist; + F32 idle_time; + F32 min_arena_dist; + struct + { + F32 min_ang; + F32 max_ang; + F32 min_delay; + F32 max_delay; + } follow; + struct + { + F32 fuse_dist; + F32 fuse_delay; + } help; + struct + { + xVec3 accel; + xVec3 max_vel; + F32 stun_duration; + F32 obstruct_angle; + } mode_buddy; + struct + { + xVec3 accel; + xVec3 max_vel; + F32 stun_duration; + } mode_harass; + struct + { + F32 height; + F32 radius; + F32 beam_interval; + F32 beam_duration; + F32 beam_dist; + } hunt; + struct + { + F32 rate; + F32 time_warm_up; + F32 time_fire; + F32 gun_tilt_min; + F32 gun_tilt_max; + F32 max_dist; + F32 emit_dist; + config fx; + } beam; + struct + { + F32 safety_dist; + F32 safety_height; + F32 attack_dist; + F32 attack_height; + F32 stun_time; + } harass; + struct + { + F32 duration; + F32 accel; + F32 max_vel; + } flank; + struct + { + F32 accel; + F32 max_vel; + F32 dist; + } fall; + struct + { + F32 duration; + F32 move_delay_min; + F32 move_delay_max; + F32 accel; + F32 max_vel; + } evade; + struct + { + xVec3 center; + struct + { + F32 radius; + F32 height; + } attack; + struct + { + F32 radius; + F32 height; + } safety; + } arena; + sound_property sound[6]; + void* context; + tweak_callback cb_move; + tweak_callback cb_arena; + tweak_callback cb_ground; + tweak_callback cb_beam; + tweak_callback cb_help; + tweak_callback cb_sound; + tweak_callback cb_sound_asset; + + void register_tweaks(bool init, xModelAssetParam* ap, U32 apsize, const char*); + }; + + void tweak_group::register_tweaks(bool init, xModelAssetParam* ap, U32 apsize, const char*) + { + xVec3 V0; + V0.x = 0.0f; + V0.y = 0.0f; + V0.z = 0.0f; + + if (init) + { + turn_accel = 540.0f; + auto_tweak::load_param(turn_accel, DEG2RAD(10), 0.01f, 1000000000.0f, ap, + apsize, "turn_accel"); + } + if (init) + { + turn_max_vel = 180.0f; + auto_tweak::load_param(turn_max_vel, DEG2RAD(10), 0.01f, 1000000000.0f, ap, + apsize, "turn_max_vel"); + } + if (init) + { + ground_y = -1.38f; + auto_tweak::load_param(ground_y, 1.0f, -1000000000.0f, 1000000000.0f, ap, + apsize, "ground_y"); + } + if (init) + { + ground_radius = 12.0f; + auto_tweak::load_param(ground_radius, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "ground_radius"); + } + if (init) + { + hit_vel = 5.0f; + auto_tweak::load_param(hit_vel, 1.0f, 0.0f, 100000.0f, ap, apsize, "hit_vel"); + } + if (init) + { + hit_max_dist = 5.0f; + auto_tweak::load_param(hit_max_dist, 1.0f, 0.0f, 100000.0f, ap, apsize, + "hit_max_dist"); + } + if (init) + { + idle_time = 3.0f; + auto_tweak::load_param(idle_time, 1.0f, 0.0f, 10.0f, ap, apsize, "idle_time"); + } + if (init) + { + min_arena_dist = 3.0f; + auto_tweak::load_param(min_arena_dist, 1.0f, 0.0f, 100.0f, ap, apsize, + "min_arena_dist"); + } + if (init) + { + help.fuse_dist = 8.0f; + auto_tweak::load_param(help.fuse_dist, 1.0f, 0.0f, 100.0f, ap, apsize, + "help.fuse_dist"); + } + if (init) + { + help.fuse_delay = 3.0f; + auto_tweak::load_param(help.fuse_delay, 1.0f, 0.0f, 100.0f, ap, apsize, + "help.fuse_delay"); + } + if (init) + { + follow.min_ang = 15.0f; + auto_tweak::load_param(follow.min_ang, DEG2RAD(10), 0.0f, 180.0f, ap, apsize, + "follow.min_ang"); + } + if (init) + { + follow.max_ang = 30.0f; + auto_tweak::load_param(follow.max_ang, DEG2RAD(10), 0.0f, 180.0f, ap, apsize, + "follow.max_ang"); + } + if (init) + { + follow.min_delay = 0.0f; + auto_tweak::load_param(follow.min_delay, 1.0f, 0.0f, 10.0f, ap, apsize, + "follow.min_delay"); + } + if (init) + { + follow.max_delay = 2.0f; + auto_tweak::load_param(follow.max_delay, 1.0f, 0.0f, 10.0f, ap, apsize, + "follow.max_delay"); + } + if (init) + { + mode_buddy.accel = xVec3::create(10.0f, 20.0f, 20.0f); + auto_tweak::load_param(mode_buddy.accel, 0, 0, 0, ap, apsize, + "mode_buddy.accel"); + } + if (init) + { + mode_buddy.max_vel = xVec3::create(20.0f, 10.0f, 20.0f); + auto_tweak::load_param(mode_buddy.max_vel, 0, 0, 0, ap, apsize, + "mode_buddy.max_vel"); + } + if (init) + { + mode_buddy.stun_duration = 1.0f; + auto_tweak::load_param(mode_buddy.stun_duration, 1.0f, 0.0f, 100.0f, ap, + apsize, "mode_buddy.stun_duration"); + } + if (init) + { + mode_buddy.obstruct_angle = 45.0f; + auto_tweak::load_param(mode_buddy.obstruct_angle, DEG2RAD(10), 0.0f, 90.0f, + ap, apsize, "mode_buddy.obstruct_angle"); + } + if (init) + { + mode_harass.accel = xVec3::create(10.0f, 5.0f, 10.0f); + auto_tweak::load_param(mode_harass.accel, 0, 0, 0, ap, apsize, + "mode_harass.accel"); + } + if (init) + { + mode_harass.max_vel = xVec3::create(20.0f, 10.0f, 10.0f); + auto_tweak::load_param(mode_harass.max_vel, 0, 0, 0, ap, apsize, + "mode_harass.max_vel"); + } + if (init) + { + mode_harass.stun_duration = 2.0f; + auto_tweak::load_param(mode_harass.stun_duration, 1.0f, 0.0f, 10.0f, ap, + apsize, "mode_harass.stun_duration"); + } + if (init) + { + hunt.height = 3.0f; + auto_tweak::load_param(hunt.height, 1.0f, -10.0f, 10.0f, ap, apsize, + "hunt.height"); + } + if (init) + { + hunt.radius = 5.0f; + auto_tweak::load_param(hunt.radius, 1.0f, 1.0f, 100.0f, ap, apsize, + "hunt.radius"); + } + if (init) + { + hunt.beam_interval = 3.0f; + auto_tweak::load_param(hunt.beam_interval, 1.0f, 0.0f, 100.0f, ap, apsize, + "hunt.beam_interval"); + } + if (init) + { + hunt.beam_duration = 3.0f; + auto_tweak::load_param(hunt.beam_duration, 1.0f, 0.0f, 100.0f, ap, apsize, + "hunt.beam_duration"); + } + if (init) + { + hunt.beam_dist = 7.5f; + auto_tweak::load_param(hunt.beam_dist, 1.0f, 1.0f, 100.0f, ap, apsize, + "hunt.beam_dist"); + } + if (init) + { + beam.rate = 6.0f; + auto_tweak::load_param(beam.rate, 1.0f, 0.01f, 100000.0f, ap, apsize, + "beam.rate"); + } + if (init) + { + beam.time_warm_up = 0.5f; + auto_tweak::load_param(beam.time_warm_up, 1.0f, 0.01f, 100.0f, ap, apsize, + "beam.time_warm_up"); + } + if (init) + { + beam.time_fire = 5.0f; + auto_tweak::load_param(beam.time_fire, 1.0f, 0.01f, 100.0f, ap, apsize, + "beam.time_fire"); + } + if (init) + { + beam.gun_tilt_min = -80.0f; + auto_tweak::load_param(beam.gun_tilt_min, DEG2RAD(10), -180.0f, 180.0f, ap, + apsize, "beam.gun_tilt_min"); + } + if (init) + { + beam.gun_tilt_max = 20.0f; + auto_tweak::load_param(beam.gun_tilt_max, DEG2RAD(10), -180.0f, 180.0f, ap, + apsize, "beam.gun_tilt_max"); + } + if (init) + { + beam.max_dist = 25.0f; + auto_tweak::load_param(beam.max_dist, 1.0f, 1.0f, 100.0f, ap, apsize, + "beam.max_dist"); + } + if (init) + { + beam.emit_dist = 0.5f; + auto_tweak::load_param(beam.emit_dist, 1.0f, 0.0f, 10.0f, ap, apsize, + "beam.emit_dist"); + } + if (init) + { + beam.fx.radius = 0.7f; + auto_tweak::load_param(beam.fx.radius, 1.0f, 0.01f, 100.0f, ap, apsize, + "beam.fx.radius"); + } + if (init) + { + beam.fx.length = 2.0f; + auto_tweak::load_param(beam.fx.length, 1.0f, 0.01f, 100.0f, ap, apsize, + "beam.fx.length"); + } + if (init) + { + beam.fx.vel = 20.0f; + auto_tweak::load_param(beam.fx.vel, 1.0f, 0.0f, 100000.0f, ap, apsize, + "beam.fx.vel"); + } + if (init) + { + beam.fx.fade_dist = 15.0f; + auto_tweak::load_param(beam.fx.fade_dist, 1.0f, 0.0f, 100000.0f, ap, apsize, + "beam.fx.fade_dist"); + } + if (init) + { + beam.fx.kill_dist = 20.0f; + auto_tweak::load_param(beam.fx.kill_dist, 1.0f, 0.0f, 100000.0f, ap, apsize, + "beam.fx.kill_dist"); + } + if (init) + { + beam.fx.safe_dist = 2.0f; + auto_tweak::load_param(beam.fx.safe_dist, 1.0f, 0.0f, 100000.0f, ap, apsize, + "beam.fx.safe_dist"); + } + if (init) + { + beam.fx.hit_radius = 0.2f; + auto_tweak::load_param(beam.fx.hit_radius, 1.0f, 0.0f, 100.0f, ap, apsize, + "beam.fx.hit_radius"); + } + if (init) + { + beam.fx.rand_ang = 6.0f; + auto_tweak::load_param(beam.fx.rand_ang, DEG2RAD(10), 0.0f, 360.0f, ap, + apsize, "beam.fx.rand_ang"); + } + if (init) + { + beam.fx.scar_life = 3.0f; + auto_tweak::load_param(beam.fx.scar_life, 1.0f, 0.0f, 100.0f, ap, apsize, + "beam.fx.scar_life"); + } + if (init) + { + beam.fx.bolt_uv[0].x = 0.0f; + auto_tweak::load_param(beam.fx.bolt_uv[0].x, 1.0f, 0.0f, 1.0f, ap, apsize, + "beam.fx.bolt_uv[0].x"); + } + if (init) + { + beam.fx.bolt_uv[0].y = 0.0f; + auto_tweak::load_param(beam.fx.bolt_uv[0].y, 1.0f, 0.0f, 1.0f, ap, apsize, + "beam.fx.bolt_uv[0].y"); + } + if (init) + { + beam.fx.bolt_uv[1].x = 1.0f; + auto_tweak::load_param(beam.fx.bolt_uv[1].x, 1.0f, 0.0f, 1.0f, ap, apsize, + "beam.fx.bolt_uv[1].x"); + } + if (init) + { + beam.fx.bolt_uv[1].y = 1.0f; + auto_tweak::load_param(beam.fx.bolt_uv[1].y, 1.0f, 0.0f, 1.0f, ap, apsize, + "beam.fx.bolt_uv[1].y"); + } + if (init) + { + beam.fx.hit_interval = 2; + auto_tweak::load_param(beam.fx.hit_interval, 1, 0, 100, ap, apsize, + "beam.fx.hit_interval"); + } + if (init) + { + beam.fx.damage = 1.0f; + auto_tweak::load_param(beam.fx.damage, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "beam.fx.damage"); + } + if (init) + { + harass.safety_dist = 2.0f; + auto_tweak::load_param(harass.safety_dist, 1.0f, 0.0f, 100.0f, ap, apsize, + "harass.safety_dist"); + } + if (init) + { + harass.safety_height = -4.0f; + auto_tweak::load_param(harass.safety_height, 1.0f, -100.0f, 100.0f, ap, + apsize, "harass.safety_height"); + } + if (init) + { + harass.attack_dist = 5.0f; + auto_tweak::load_param(harass.attack_dist, 1.0f, 0.0f, 100.0f, ap, apsize, + "harass.attack_dist"); + } + if (init) + { + harass.attack_height = 2.0f; + auto_tweak::load_param(harass.attack_height, 1.0f, -100.0f, 100.0f, ap, + apsize, "harass.attack_height"); + } + if (init) + { + harass.stun_time = 6.0f; + auto_tweak::load_param(harass.stun_time, 1.0f, 0.0f, 100.0f, ap, apsize, + "harass.stun_time"); + } + if (init) + { + flank.duration = 2.0f; + auto_tweak::load_param(flank.duration, 1.0f, 0.0f, 100.0f, ap, apsize, + "flank.duration"); + } + if (init) + { + flank.accel = 5.0f; + auto_tweak::load_param(flank.accel, 1.0f, 0.0f, 100.0f, ap, apsize, + "flank.accel"); + } + if (init) + { + flank.max_vel = 20.0f; + auto_tweak::load_param(flank.max_vel, 1.0f, 0.0f, 100.0f, ap, apsize, + "flank.max_vel"); + } + if (init) + { + fall.accel = 4.0f; + auto_tweak::load_param(fall.accel, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "fall.accel"); + } + if (init) + { + fall.max_vel = 50.0f; + auto_tweak::load_param(fall.max_vel, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "fall.max_vel"); + } + if (init) + { + fall.dist = 30.0f; + auto_tweak::load_param(fall.dist, 1.0f, 0.0f, 100000.0f, ap, apsize, + "fall.dist"); + } + if (init) + { + evade.duration = 6.0f; + auto_tweak::load_param(evade.duration, 1.0f, 0.0f, 10.0f, ap, apsize, + "evade.duration"); + } + if (init) + { + evade.move_delay_min = 1.0f; + auto_tweak::load_param(evade.move_delay_min, 1.0f, 0.0f, 10.0f, ap, apsize, + "evade.move_delay_min"); + } + if (init) + { + evade.move_delay_max = 1.5f; + auto_tweak::load_param(evade.move_delay_max, 1.0f, 0.0f, 10.0f, ap, apsize, + "evade.move_delay_max"); + } + if (init) + { + evade.accel = 5.0f; + auto_tweak::load_param(evade.accel, 1.0f, 0.0f, 100000.0f, ap, apsize, + "evade.accel"); + } + if (init) + { + evade.max_vel = 10.0f; + auto_tweak::load_param(evade.max_vel, 1.0f, 0.0f, 100000.0f, ap, apsize, + "evade.max_vel"); + } + if (init) + { + arena.center = V0; + auto_tweak::load_param(arena.center, 0, 0, 0, ap, apsize, "arena.center"); + } + if (init) + { + arena.attack.radius = 14.0f; + auto_tweak::load_param(arena.attack.radius, 1.0f, 0.01f, 100.0f, ap, apsize, + "arena.attack.radius"); + } + if (init) + { + arena.attack.height = 11.0f; + auto_tweak::load_param(arena.attack.height, 1.0f, 0.01f, 100.0f, ap, apsize, + "arena.attack.height"); + } + if (init) + { + arena.safety.radius = 12.0f; + auto_tweak::load_param(arena.safety.radius, 1.0f, 0.01, 100.0f, ap, apsize, + "arena.safety.radius"); + } + if (init) + { + arena.safety.height = 14.0f; + auto_tweak::load_param(arena.safety.height, 1.0f, 0.01f, 100.0f, ap, apsize, + "arena.safety.height"); + } + if (init) + { + sound[SOUND_HOVER].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_HOVER].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_HOVER].volume"); + } + if (init) + { + sound[SOUND_HOVER].range_inner = 0.0f; + auto_tweak::load_param(sound[SOUND_HOVER].range_inner, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_HOVER].range_inner"); + } + if (init) + { + sound[SOUND_HOVER].range_outer = 10.0f; + auto_tweak::load_param(sound[SOUND_HOVER].range_outer, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_HOVER].range_outer"); + } + if (init) + { + sound[SOUND_HOVER].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_HOVER].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_HOVER].delay"); + } + if (init) + { + sound[SOUND_HOVER].fade_time = 0.0f; + auto_tweak::load_param(sound[SOUND_HOVER].fade_time, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_HOVER].fade_time"); + } + if (init) + { + sound[SOUND_HIT].volume = 0.5f; + auto_tweak::load_param(sound[SOUND_HIT].volume, 1.0f, 0.0f, 1.0f, ap, apsize, + "sound[SOUND_HIT].volume"); + } + if (init) + { + sound[SOUND_HIT].range_inner = 10.0f; + auto_tweak::load_param(sound[SOUND_HIT].range_inner, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_HIT].range_inner"); + } + if (init) + { + sound[SOUND_HIT].range_outer = 30.0f; + auto_tweak::load_param(sound[SOUND_HIT].range_outer, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_HIT].range_outer"); + } + if (init) + { + sound[SOUND_HIT].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_HIT].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_HIT].delay"); + } + if (init) + { + sound[SOUND_BOLT_FIRE].volume = 0.5f; + auto_tweak::load_param(sound[SOUND_BOLT_FIRE].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_BOLT_FIRE].volume"); + } + if (init) + { + sound[SOUND_BOLT_FIRE].range_inner = 0.0f; + auto_tweak::load_param(sound[SOUND_BOLT_FIRE].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_BOLT_FIRE].range_inner"); + } + if (init) + { + sound[SOUND_BOLT_FIRE].range_outer = 20.0f; + auto_tweak::load_param(sound[SOUND_BOLT_FIRE].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_BOLT_FIRE].range_outer"); + } + if (init) + { + sound[SOUND_BOLT_FIRE].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_BOLT_FIRE].delay, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_BOLT_FIRE].delay"); + } + if (init) + { + sound[SOUND_BOLT_FLY].volume = 0.2f; + auto_tweak::load_param(sound[SOUND_BOLT_FLY].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_BOLT_FLY].volume"); + } + if (init) + { + sound[SOUND_BOLT_FLY].range_inner = 0.0f; + auto_tweak::load_param(sound[SOUND_BOLT_FLY].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_BOLT_FLY].range_inner"); + } + if (init) + { + sound[SOUND_BOLT_FLY].range_outer = 10.0f; + auto_tweak::load_param(sound[SOUND_BOLT_FLY].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_BOLT_FLY].range_outer"); + } + if (init) + { + sound[SOUND_BOLT_FLY].delay = 0.1f; + auto_tweak::load_param(sound[SOUND_BOLT_FLY].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_BOLT_FLY].delay"); + } + if (init) + { + sound[SOUND_BOLT_FLY].fade_time = 0.1f; + auto_tweak::load_param(sound[SOUND_BOLT_FLY].fade_time, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_BOLT_FLY].fade_time"); + } + if (init) + { + sound[SOUND_BOLT_HIT].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_BOLT_HIT].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_BOLT_HIT].volume"); + } + if (init) + { + sound[SOUND_BOLT_HIT].range_inner = 0.0f; + auto_tweak::load_param(sound[SOUND_BOLT_HIT].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_BOLT_HIT].range_inner"); + } + if (init) + { + sound[SOUND_BOLT_HIT].range_outer = 20.0f; + auto_tweak::load_param(sound[SOUND_BOLT_HIT].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_BOLT_HIT].range_outer"); + } + if (init) + { + sound[SOUND_BOLT_HIT].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_BOLT_HIT].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_BOLT_HIT].delay"); + } + if (init) + { + sound[SOUND_CHARGE].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_CHARGE].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_CHARGE].volume"); + } + if (init) + { + sound[SOUND_CHARGE].range_inner = 0.0f; + auto_tweak::load_param(sound[SOUND_CHARGE].range_inner, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_CHARGE].range_inner"); + } + if (init) + { + sound[SOUND_CHARGE].range_outer = 20.0f; + auto_tweak::load_param(sound[SOUND_CHARGE].range_outer, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_CHARGE].range_outer"); + } + if (init) + { + sound[SOUND_CHARGE].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_CHARGE].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_CHARGE].delay"); + } + if (init) + { + sound[SOUND_HOVER].asset = sound_asset_ids[0][4]; + sound_data[SOUND_HOVER].id = xStrHash(sound_assets[sound[SOUND_HOVER].asset].name); + } + if (init) + { + sound[SOUND_HIT].asset = sound_asset_ids[1][3]; + sound_data[SOUND_HIT].id = xStrHash(sound_assets[sound[SOUND_HIT].asset].name); + } + if (init) + { + sound[SOUND_BOLT_FIRE].asset = sound_asset_ids[2][0]; + sound_data[SOUND_BOLT_FIRE].id = xStrHash(sound_assets[sound[SOUND_BOLT_FIRE].asset].name); + } + if (init) + { + sound[SOUND_BOLT_FLY].asset = sound_asset_ids[3][3]; + sound_data[SOUND_BOLT_FLY].id = xStrHash(sound_assets[sound[SOUND_BOLT_FLY].asset].name); + } + if (init) + { + sound[SOUND_BOLT_HIT].asset = sound_asset_ids[4][3]; + sound_data[SOUND_BOLT_HIT].id = xStrHash(sound_assets[sound[SOUND_BOLT_HIT].asset].name); + } + if (init) + { + sound[SOUND_CHARGE].asset = sound_asset_ids[5][3]; + sound_data[SOUND_CHARGE].id = xStrHash(sound_assets[sound[SOUND_CHARGE].asset].name); + } + } + } // namespace xAnimTable* ZNPC_AnimTable_BossPlankton() diff --git a/src/SB/Game/zNPCTypeBossPlankton.h b/src/SB/Game/zNPCTypeBossPlankton.h index 61d4aa9d5..075125dad 100644 --- a/src/SB/Game/zNPCTypeBossPlankton.h +++ b/src/SB/Game/zNPCTypeBossPlankton.h @@ -13,6 +13,12 @@ struct zNPCNewsFish; +namespace auto_tweak +{ + template + void load_param(T1&, T2, T2, T2, xModelAssetParam*, U32, const char*); +}; + struct zNPCBPlankton : zNPCBoss { enum move_enum diff --git a/src/SB/Game/zNPCTypeBossSB2.cpp b/src/SB/Game/zNPCTypeBossSB2.cpp index 7448a4529..c8f61e473 100644 --- a/src/SB/Game/zNPCTypeBossSB2.cpp +++ b/src/SB/Game/zNPCTypeBossSB2.cpp @@ -11,6 +11,7 @@ #include "xstransvc.h" #include "xSnd.h" #include "xVec3.h" +#include "xDebug.h" #include "zCamera.h" #include "zEntSimpleObj.h" @@ -51,8 +52,53 @@ #define ANIM_KarateLoop 64 #define ANIM_KarateEnd 65 +#define SOUND_TAUNT 0 +#define SOUND_KARATE 1 +#define SOUND_CHOP_WINDUP 2 +#define SOUND_CHOP_SWING 3 +#define SOUND_SWIPE 4 +#define SOUND_KARATE_SLUG 5 +#define SOUND_CHOP_HIT 6 +#define SOUND_KARATE_HIT 7 +#define SOUND_HIT_SLAP 8 +#define SOUND_HIT_FLAIL 9 + namespace { + struct sound_data_type + { + U32 id; + U32 handle; + xVec3* loc; + F32 volume; + }; + + struct sound_asset + { + S32 group; + char* name; + U32 priority; + U32 flags; + }; + + static U32 sound_asset_ids[10][4]; + static sound_data_type sound_data[10]; + static const sound_asset sound_assets[12] = + { + {0, "RSB_laugh", 0, 0}, + {1, "RSB_kah", 0, 0}, + {2, "RSB_chop_windup", 0, 0}, + {3, "RSB_chop_swing", 0, 0}, + {4, "RSB_swipe", 0, 0}, + {5, "RSB_foot_loop", 0, 1}, + {6, "RSB_armhit1", 0, 0}, + {6, "RSB_armhit2", 0, 0}, + {7, "RSB_armhit1", 0, 0}, + {7, "RSB_armhit2", 0, 0}, + {8, "RSB_armsmash", 0, 0}, + {9, "RSB_foor_impact", 0, 0}, + }; + S32 set_alpha_blend(xModelInstance*) { return 0; // to-do @@ -77,6 +123,858 @@ namespace return 0; // to-do } + struct sound_property + { + U32 asset; + F32 volume; + F32 range_inner; + F32 range_outer; + F32 delay; + F32 fade_time; + }; + + struct tweak_group + { + F32 accel; + F32 max_vel; + F32 turn_accel; + F32 turn_max_vel; + F32 arena_radius; + F32 ground_y; + F32 ground_radius; + F32 ground_zone_height; + F32 move_radius; + F32 damage_speed; + F32 player_damage_time; + F32 intro_time; + struct + { + F32 pulse_rate; + F32 pulse_min; + F32 pulse_max; + } nodes; + struct + { + F32 min_dist; + F32 vel; + F32 accel; + F32 decel; + F32 collide_vel; + } spin; + struct + { + F32 delay_vuln; + } help; + struct + { + F32 delay; + } chop; + struct + { + F32 hold_time; + } swipe; + struct + { + xVec3 emit_offset; + F32 emit_arc; + F32 aim_dist; + F32 aim_time; + F32 aim_accel_time; + F32 fire_vel; + F32 fire_accel; + F32 drop_vel; + F32 drop_accel; + F32 target_yoffset; + F32 fade_dist; + F32 kill_dist; + F32 delay_emit[3]; + F32 delay_fire[3]; + } karate; + struct + { + F32 warm_up; + F32 cool_down; + F32 height; + F32 move_time; + } hunt; + struct + { + bool is_sphere; + bool damage_player; + S32 bone; + xVec3 offset; + F32 radius; + xVec3 extent; + F32 yaw; + F32 pitch; + F32 roll; + } bounds[3]; + sound_property sound[10]; + void* context; + tweak_callback cb_arena; + tweak_callback cb_ground; + tweak_callback cb_move_radius; + tweak_callback cb_bounds; + tweak_callback cb_hunt_move; + tweak_callback cb_sound; + tweak_callback cb_sound_asset; + + void load(xModelAssetParam* ap, U32 apsize); + void register_tweaks(bool init, xModelAssetParam* ap, U32 apsize, const char*); + }; + + void tweak_group::register_tweaks(bool init, xModelAssetParam* ap, U32 apsize, const char*) + { + if (init) + { + accel = 2.0f; + auto_tweak::load_param(accel, 1.0f, 0.0f, 1000000000.0f, ap, apsize, "accel"); + } + if (init) + { + max_vel = 5.0f; + auto_tweak::load_param(max_vel, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "max_vel"); + } + if (init) + { + turn_accel = 540.0f; + auto_tweak::load_param(turn_accel, DEG2RAD(10), 0.01f, 1000000000.0f, ap, + apsize, "turn_accel"); + } + if (init) + { + turn_max_vel = 180.0f; + auto_tweak::load_param(turn_max_vel, DEG2RAD(10), 0.01f, 1000000000.0f, ap, + apsize, "turn_max_vel"); + } + if (init) + { + arena_radius = 12.0f; + auto_tweak::load_param(arena_radius, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "arena_radius"); + } + if (init) + { + ground_y = 0.0f; + auto_tweak::load_param(ground_y, 1.0f, -1000000000.0f, 1000000000.0f, ap, + apsize, "ground_y"); + } + if (init) + { + ground_radius = 31.0f; + auto_tweak::load_param(ground_radius, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "ground_radius"); + } + if (init) + { + ground_zone_height = 6.0f; + auto_tweak::load_param(ground_zone_height, 1.0f, 0.0f, 1000000000.0f, ap, + apsize, "ground_zone_height"); + } + if (init) + { + move_radius = 27.0f; + auto_tweak::load_param(move_radius, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "move_radius"); + } + if (init) + { + damage_speed = 50.0f; + auto_tweak::load_param(damage_speed, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "damage_speed"); + } + if (init) + { + player_damage_time = 1.0f; + auto_tweak::load_param(player_damage_time, 1.0f, 0.0f, 100.0f, ap, apsize, + "player_damage_time"); + } + if (init) + { + intro_time = 0.0f; + auto_tweak::load_param(intro_time, 1.0f, 0.0f, 100.0f, ap, apsize, + "intro_time"); + } + if (init) + { + nodes.pulse_rate = 15.0f; + auto_tweak::load_param(nodes.pulse_rate, 1.0f, 0.0f, 100000.0f, ap, apsize, + "nodes.pulse_rate"); + } + if (init) + { + nodes.pulse_min = 0.0f; + auto_tweak::load_param(nodes.pulse_min, 1.0f, 0.0f, 10.0f, ap, apsize, + "nodes.pulse_min"); + } + if (init) + { + nodes.pulse_max = 0.5f; + auto_tweak::load_param(nodes.pulse_max, 1.0f, 0.0f, 10.0f, ap, apsize, + "nodes.pulse_max"); + } + if (init) + { + spin.min_dist = 0.5f; + auto_tweak::load_param(spin.min_dist, 1.0f, 0.0f, 10.0f, ap, apsize, + "spin.min_dist"); + } + if (init) + { + spin.vel = 5.0f; + auto_tweak::load_param(spin.vel, 1.0f, 0.0f, 10.0f, ap, apsize, "spin.vel"); + } + if (init) + { + spin.accel = 20.0f; + auto_tweak::load_param(spin.accel, 1.0f, 0.0f, 100000.0f, ap, apsize, + "spin.accel"); + } + if (init) + { + spin.decel = 5.0f; + auto_tweak::load_param(spin.decel, 1.0f, 0.0f, 100000.0f, ap, apsize, + "spin.decel"); + } + if (init) + { + spin.collide_vel = 3.0f; + auto_tweak::load_param(spin.collide_vel, 1.0f, 0.0f, 100000.0f, ap, apsize, + "spin.collide_vel"); + } + if (init) + { + help.delay_vuln = 1.0f; + auto_tweak::load_param(help.delay_vuln, 1.0f, 0.0f, 10.0f, ap, apsize, + "help.delay_vuln"); + } + if (init) + { + chop.delay = 0.3f; + auto_tweak::load_param(chop.delay, 1.0f, 0.0f, 100000.0f, ap, apsize, + "chop.delay"); + } + if (init) + { + swipe.hold_time = 3.5f; + auto_tweak::load_param(swipe.hold_time, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "swipe.hold_time"); + } + if (init) + { + karate.emit_offset = xVec3::create(0.0f, -1.0f, 3.0f); + auto_tweak::load_param(karate.emit_offset, 0, 0, 0, ap, apsize, + "karate.emit_offset"); + } + if (init) + { + karate.emit_arc = 55.0f; + auto_tweak::load_param(karate.emit_arc, DEG2RAD(10), 0.01f, 1000000000.0f, ap, + apsize, "karate.emit_arc"); + } + if (init) + { + karate.aim_dist = 7.0f; + auto_tweak::load_param(karate.aim_dist, 1.0f, 0.01f, 100.0f, ap, apsize, + "karate.aim_dist"); + } + if (init) + { + karate.aim_time = 1.0f; + auto_tweak::load_param(karate.aim_time, 1.0f, 0.001f, 100.0f, ap, apsize, + "karate.aim_time"); + } + if (init) + { + karate.aim_accel_time = 0.2f; + auto_tweak::load_param(karate.aim_accel_time, 1.0f, 0.001f, 100.0f, ap, + apsize, "karate.aim_accel_time"); + } + if (init) + { + karate.fire_vel = 5.0f; + auto_tweak::load_param(karate.fire_vel, 1.0f, 0.01f, 100000000.0f, ap, apsize, + "karate.fire_vel"); + } + if (init) + { + karate.fire_accel = 10.0f; + auto_tweak::load_param(karate.fire_accel, 1.0f, 0.01f, 1000000000.0f, ap, + apsize, "karate.fire_accel"); + } + if (init) + { + karate.drop_vel = 5.0f; + auto_tweak::load_param(karate.drop_vel, 1.0f, 0.1f, 100.0f, ap, apsize, + "karate.drop_vel"); + } + if (init) + { + karate.drop_accel = 10.0f; + auto_tweak::load_param(karate.drop_accel, 1.0f, 0.1f, 100.0f, ap, apsize, + "karate.drop_accel"); + } + if (init) + { + karate.target_yoffset = 1.0f; + auto_tweak::load_param(karate.target_yoffset, 1.0f, 0.1f, 100.0f, ap, apsize, + "karate.target_yoffset"); + } + if (init) + { + karate.fade_dist = 10.0f; + auto_tweak::load_param(karate.fade_dist, 1.0f, 0.1f, 100.0f, ap, apsize, + "karate.fade_dist"); + } + if (init) + { + karate.kill_dist = 15.0f; + auto_tweak::load_param(karate.kill_dist, 1.0f, 0.1f, 100.f, ap, apsize, + "karate.kill_dist"); + } + if (init) + { + karate.delay_emit[0] = 0.3f; + auto_tweak::load_param(karate.delay_emit[0], 1.0f, 0.001f, 100.0f, ap, apsize, + "karate.delay_emit[0]"); + } + if (init) + { + karate.delay_emit[1] = 0.6f; + auto_tweak::load_param(karate.delay_emit[1], 1.0f, 0.001f, 100.0f, ap, apsize, + "karate.delay_emit[1]"); + } + if (init) + { + karate.delay_emit[2] = 0.9f; + auto_tweak::load_param(karate.delay_emit[2], 1.0f, 0.001f, 100.0f, ap, apsize, + "karate.delay_emit[2]"); + } + if (init) + { + karate.delay_fire[0] = 2.75; + auto_tweak::load_param(karate.delay_fire[0], 1.0f, 0.001f, 100.0f, ap, apsize, + "karate.delay_fire[0]"); + } + if (init) + { + karate.delay_fire[1] = 0.0f; + auto_tweak::load_param(karate.delay_fire[1], 1.0f, 0.001f, 100.0f, ap, apsize, + "karate.delay_fire[1]"); + } + if (init) + { + karate.delay_fire[2] = 2.75; + auto_tweak::load_param(karate.delay_fire[2], 1.0f, 0.001f, 100.0f, ap, apsize, + "karate.delay_fire[2]"); + } + if (init) + { + hunt.warm_up = 0.5f; + auto_tweak::load_param(hunt.warm_up, 1.0f, 0.0f, 10.0f, ap, apsize, + "hunt.warm_up"); + } + if (init) + { + hunt.cool_down = 0.5f; + auto_tweak::load_param(hunt.cool_down, 1.0f, 0.0f, 10.0f, ap, apsize, + "hunt.cool_down"); + } + if (init) + { + hunt.height = 3.0f; + auto_tweak::load_param(hunt.height, 1.0f, -10.0f, 10.0f, ap, apsize, + "hunt.height"); + } + if (init) + { + hunt.move_time = 1.0f; + auto_tweak::load_param(hunt.move_time, 1.0f, 0.01, 10.0f, ap, apsize, + "hunt.move_time"); + } + if (init) + { + bounds[0].is_sphere = FALSE; + auto_tweak::load_param(bounds[0].is_sphere, 0, 0, 0, ap, apsize, + "bounds[0].is_sphere"); + } + if (init) + { + bounds[0].damage_player = FALSE; + auto_tweak::load_param(bounds[0].damage_player, 0, 0, 0, ap, apsize, + "bounds[0].damage_player"); + } + if (init) + { + bounds[0].bone = 2; + auto_tweak::load_param(bounds[0].bone, 1, 0, 63, ap, apsize, + "bounds[0].bone"); + } + if (init) + { + bounds[0].offset = xVec3::create(0.0f, 4.0f, 0.0f); + auto_tweak::load_param(bounds[0].offset, 0, 0, 0, ap, apsize, + "bounds[0].offset"); + } + if (init) + { + bounds[0].radius = 1.0f; + auto_tweak::load_param(bounds[0].radius, 1.0f, 0.0f, 1000000000.0f, ap, + apsize, "bounds[0].radius"); + } + if (init) + { + bounds[0].extent = xVec3::create(4.0f, 5.5f, 2.0f); + auto_tweak::load_param(bounds[0].extent, 0, 0, 0, ap, apsize, + "bounds[0].extent"); + } + if (init) + { + bounds[0].yaw = 0.0f; + auto_tweak::load_param(bounds[0].yaw, DEG2RAD(10), -1000000000.0f, + 1000000000.0f, ap, apsize, "bounds[0].yaw"); + } + if (init) + { + bounds[0].pitch = 0.0f; + auto_tweak::load_param(bounds[0].pitch, DEG2RAD(10), -1000000000.0f, + 1000000000.0f, ap, apsize, "bounds[0].pitch"); + } + if (init) + { + bounds[0].roll = 0.0f; + auto_tweak::load_param(bounds[0].roll, DEG2RAD(10), -1000000000.0f, + 1000000000.0f, ap, apsize, "bounds[0].roll"); + } + if (init) + { + bounds[1].is_sphere = FALSE; + auto_tweak::load_param(bounds[1].is_sphere, 0, 0, 0, ap, apsize, + "bounds[1].is_sphere"); + } + if (init) + { + bounds[1].damage_player = FALSE; + auto_tweak::load_param(bounds[1].damage_player, 0, 0, 0, ap, apsize, + "bounds[1].damage_player"); + } + if (init) + { + bounds[1].bone = 6; + auto_tweak::load_param(bounds[1].bone, 1, 0, 63, ap, apsize, + "bounds[1].bone"); + } + if (init) + { + bounds[1].offset = xVec3::create(0.0f, -1.5f, 0.1f); + auto_tweak::load_param(bounds[1].offset, 0, 0, 0, ap, apsize, + "bounds[1].offset"); + } + if (init) + { + bounds[1].radius = 1.0f; + auto_tweak::load_param(bounds[1].radius, 1.0f, 0.0f, 1000000000.0f, ap, + apsize, "bounds[1].radius"); + } + if (init) + { + bounds[1].extent = xVec3::create(6.5f, 2.8f, 2.5f); + auto_tweak::load_param(bounds[1].extent, 0, 0, 0, ap, apsize, + "bounds[1].extent"); + } + if (init) + { + bounds[1].yaw = 0.0f; + auto_tweak::load_param(bounds[1].yaw, DEG2RAD(10), -1000000000.0f, + 1000000000.0f, ap, apsize, "bounds[1].yaw"); + } + if (init) + { + bounds[1].pitch = 0.0f; + auto_tweak::load_param(bounds[1].pitch, DEG2RAD(10), -1000000000.0f, + 1000000000.0f, ap, apsize, "bounds[1].pitch"); + } + if (init) + { + bounds[1].roll = 0.0f; + auto_tweak::load_param(bounds[1].roll, DEG2RAD(10), -1000000000.0f, + 1000000000.0f, ap, apsize, "bounds[1].roll"); + } + if (init) + { + bounds[2].is_sphere = FALSE; + auto_tweak::load_param(bounds[2].is_sphere, 0, 0, 0, ap, apsize, + "bounds[2].is_sphere"); + } + if (init) + { + bounds[2].damage_player = TRUE; + auto_tweak::load_param(bounds[2].damage_player, 0, 0, 0, ap, apsize, + "bounds[2].damage_player"); + } + if (init) + { + bounds[2].bone = 2; + auto_tweak::load_param(bounds[2].bone, 1, 0, 63, ap, apsize, + "bounds[2].bone"); + } + if (init) + { + bounds[2].offset = xVec3::create(0.0f, -7.0f, 0.2f); + auto_tweak::load_param(bounds[2].offset, 0, 0, 0, ap, apsize, + "bounds[2].offset"); + } + if (init) + { + bounds[2].radius = 1.0f; + auto_tweak::load_param(bounds[2].radius, 1.0f, 0.0f, 1000000000.0f, ap, + apsize, "bounds[2].radius"); + } + if (init) + { + bounds[2].extent = xVec3::create(3.0f, 6.0f, 1.0f); + auto_tweak::load_param(bounds[2].extent, 0, 0, 0, ap, apsize, + "bounds[2].extent"); + } + if (init) + { + bounds[2].yaw = 0.0f; + auto_tweak::load_param(bounds[2].yaw, DEG2RAD(10), -1000000000.0f, + 1000000000.0f, ap, apsize, "bounds[2].yaw"); + } + if (init) + { + bounds[2].pitch = 0.0f; + auto_tweak::load_param(bounds[2].pitch, DEG2RAD(10), -1000000000.0f, + 1000000000.0f, ap, apsize, "bounds[2].pitch"); + } + if (init) + { + bounds[2].roll = 0.0f; + auto_tweak::load_param(bounds[2].roll, DEG2RAD(10), -1000000000.0f, + 1000000000.0f, ap, apsize, "bounds[2].roll"); + } + if (init) + { + sound[SOUND_TAUNT].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_TAUNT].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_TAUNT].volume"); + } + if (init) + { + sound[SOUND_TAUNT].range_inner = 30.0f; + auto_tweak::load_param(sound[SOUND_TAUNT].range_inner, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_TAUNT].range_inner"); + } + if (init) + { + sound[SOUND_TAUNT].range_outer = 50.0f; + auto_tweak::load_param(sound[SOUND_TAUNT].range_outer, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_TAUNT].range_outer"); + } + if (init) + { + sound[SOUND_TAUNT].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_TAUNT].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_TAUNT].delay"); + } + if (init) + { + sound[SOUND_KARATE].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_KARATE].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_KARATE].volume"); + } + if (init) + { + sound[SOUND_KARATE].range_inner = 30.0f; + auto_tweak::load_param(sound[SOUND_KARATE].range_inner, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_KARATE].range_inner"); + } + if (init) + { + sound[SOUND_KARATE].range_outer = 50.0f; + auto_tweak::load_param(sound[SOUND_KARATE].range_outer, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_KARATE].range_outer"); + } + if (init) + { + sound[SOUND_KARATE].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_KARATE].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_KARATE].delay"); + } + if (init) + { + sound[SOUND_CHOP_WINDUP].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_CHOP_WINDUP].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_CHOP_WINDUP].volume"); + } + if (init) + { + sound[SOUND_CHOP_WINDUP].range_inner = 10.0f; + auto_tweak::load_param(sound[SOUND_CHOP_WINDUP].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_CHOP_WINDUP].range_inner"); + } + if (init) + { + sound[SOUND_CHOP_WINDUP].range_outer = 30.0f; + auto_tweak::load_param(sound[SOUND_CHOP_WINDUP].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_CHOP_WINDUP].range_outer"); + } + if (init) + { + sound[SOUND_CHOP_WINDUP].delay = 0.2f; + auto_tweak::load_param(sound[SOUND_CHOP_WINDUP].delay, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_CHOP_WINDUP].delay"); + } + if (init) + { + sound[SOUND_CHOP_SWING].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_CHOP_SWING].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_CHOP_SWING].volume"); + } + if (init) + { + sound[SOUND_CHOP_SWING].range_inner = 10.0f; + auto_tweak::load_param(sound[SOUND_CHOP_SWING].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_CHOP_SWING].range_inner"); + } + if (init) + { + sound[SOUND_CHOP_SWING].range_outer = 30.0f; + auto_tweak::load_param(sound[SOUND_CHOP_SWING].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_CHOP_SWING].range_outer"); + } + if (init) + { + sound[SOUND_CHOP_SWING].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_CHOP_SWING].delay, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_CHOP_SWING].delay"); + } + if (init) + { + sound[SOUND_SWIPE].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_SWIPE].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_SWIPE].volume"); + } + if (init) + { + sound[SOUND_SWIPE].range_inner = 10.0f; + auto_tweak::load_param(sound[SOUND_SWIPE].range_inner, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_SWIPE].range_inner"); + } + if (init) + { + sound[SOUND_SWIPE].range_outer = 30.0f; + auto_tweak::load_param(sound[SOUND_SWIPE].range_outer, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_SWIPE].range_outer"); + } + if (init) + { + sound[SOUND_SWIPE].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_SWIPE].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_SWIPE].delay"); + } + if (init) + { + sound[SOUND_KARATE_SLUG].volume = 0.25f; + auto_tweak::load_param(sound[SOUND_KARATE_SLUG].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_KARATE_SLUG].volume"); + } + if (init) + { + sound[SOUND_KARATE_SLUG].range_inner = 0.0f; + auto_tweak::load_param(sound[SOUND_KARATE_SLUG].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_KARATE_SLUG].range_inner"); + } + if (init) + { + sound[SOUND_KARATE_SLUG].range_outer = 15.0f; + auto_tweak::load_param(sound[SOUND_KARATE_SLUG].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_KARATE_SLUG].range_outer"); + } + if (init) + { + sound[SOUND_KARATE_SLUG].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_KARATE_SLUG].delay, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_KARATE_SLUG].delay"); + } + if (init) + { + sound[SOUND_KARATE_SLUG].fade_time = 0.0f; + auto_tweak::load_param(sound[SOUND_KARATE_SLUG].fade_time, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_KARATE_SLUG].fade_time"); + } + if (init) + { + sound[SOUND_CHOP_HIT].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_CHOP_HIT].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_CHOP_HIT].volume"); + } + if (init) + { + sound[SOUND_CHOP_HIT].range_inner = 10.0f; + auto_tweak::load_param(sound[SOUND_CHOP_HIT].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_CHOP_HIT].range_inner"); + } + if (init) + { + sound[SOUND_CHOP_HIT].range_outer = 30.0f; + auto_tweak::load_param(sound[SOUND_CHOP_HIT].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_CHOP_HIT].range_outer"); + } + if (init) + { + sound[SOUND_CHOP_HIT].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_CHOP_HIT].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_CHOP_HIT].delay"); + } + if (init) + { + sound[SOUND_KARATE_HIT].volume = 0.5f; + auto_tweak::load_param(sound[SOUND_KARATE_HIT].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_KARATE_HIT].volume"); + } + if (init) + { + sound[SOUND_KARATE_HIT].range_inner = 10.0f; + auto_tweak::load_param(sound[SOUND_KARATE_HIT].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_KARATE_HIT].range_inner"); + } + if (init) + { + sound[SOUND_KARATE_HIT].range_outer = 30.0f; + auto_tweak::load_param(sound[SOUND_KARATE_HIT].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_KARATE_HIT].range_outer"); + } + if (init) + { + sound[SOUND_KARATE_HIT].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_KARATE_HIT].delay, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_KARATE_HIT].delay"); + } + if (init) + { + sound[SOUND_HIT_SLAP].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_HIT_SLAP].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_HIT_SLAP].volume"); + } + if (init) + { + sound[SOUND_HIT_SLAP].range_inner = 30.0f; + auto_tweak::load_param(sound[SOUND_HIT_SLAP].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_HIT_SLAP].range_inner"); + } + if (init) + { + sound[SOUND_HIT_SLAP].range_outer = 50.0f; + auto_tweak::load_param(sound[SOUND_HIT_SLAP].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_HIT_SLAP].range_outer"); + } + if (init) + { + sound[SOUND_HIT_SLAP].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_HIT_SLAP].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_HIT_SLAP].delay"); + } + if (init) + { + sound[SOUND_HIT_FLAIL].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_HIT_FLAIL].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_HIT_FLAIL].volume"); + } + if (init) + { + sound[SOUND_HIT_FLAIL].range_inner = 30.0f; + auto_tweak::load_param(sound[SOUND_HIT_FLAIL].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_HIT_FLAIL].range_inner"); + } + if (init) + { + sound[SOUND_HIT_FLAIL].range_outer = 50.0f; + auto_tweak::load_param(sound[SOUND_HIT_FLAIL].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_HIT_FLAIL].range_outer"); + } + if (init) + { + sound[SOUND_HIT_FLAIL].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_HIT_FLAIL].delay, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_HIT_FLAIL].delay"); + } + if (init) + { + sound[SOUND_TAUNT].asset = sound_asset_ids[0][0]; + sound_data[SOUND_TAUNT].id = xStrHash(sound_assets[sound[SOUND_TAUNT].asset].name); + } + if (init) + { + sound[SOUND_KARATE].asset = sound_asset_ids[1][0]; + sound_data[SOUND_KARATE].id = xStrHash(sound_assets[sound[SOUND_KARATE].asset].name); + } + if (init) + { + sound[SOUND_CHOP_WINDUP].asset = sound_asset_ids[2][0]; + sound_data[SOUND_CHOP_WINDUP].id = + xStrHash(sound_assets[sound[SOUND_CHOP_WINDUP].asset].name); + } + if (init) + { + sound[SOUND_CHOP_SWING].asset = sound_asset_ids[3][0]; + sound_data[SOUND_CHOP_SWING].id = + xStrHash(sound_assets[sound[SOUND_CHOP_SWING].asset].name); + } + if (init) + { + sound[SOUND_SWIPE].asset = sound_asset_ids[4][0]; + sound_data[SOUND_SWIPE].id = xStrHash(sound_assets[sound[SOUND_SWIPE].asset].name); + } + if (init) + { + sound[SOUND_KARATE_SLUG].asset = sound_asset_ids[5][0]; + sound_data[SOUND_KARATE_SLUG].id = + xStrHash(sound_assets[sound[SOUND_KARATE_SLUG].asset].name); + } + if (init) + { + sound[SOUND_CHOP_HIT].asset = sound_asset_ids[6][0]; + sound_data[SOUND_CHOP_HIT].id = + xStrHash(sound_assets[sound[SOUND_CHOP_HIT].asset].name); + } + if (init) + { + sound[SOUND_KARATE_HIT].asset = sound_asset_ids[7][1]; + sound_data[SOUND_KARATE_HIT].id = + xStrHash(sound_assets[sound[SOUND_KARATE_HIT].asset].name); + } + if (init) + { + sound[SOUND_HIT_SLAP].asset = sound_asset_ids[8][0]; + sound_data[SOUND_HIT_SLAP].id = + xStrHash(sound_assets[sound[SOUND_CHOP_HIT].asset].name); + } + if (init) + { + sound[SOUND_HIT_FLAIL].asset = sound_asset_ids[9][0]; + sound_data[SOUND_HIT_FLAIL].id = + xStrHash(sound_assets[sound[SOUND_HIT_FLAIL].asset].name); + } + } + } // namespace xAnimTable* ZNPC_AnimTable_BossSB2() diff --git a/src/SB/Game/zNPCTypeBossSB2.h b/src/SB/Game/zNPCTypeBossSB2.h index 698547e3a..c0b80c4e4 100644 --- a/src/SB/Game/zNPCTypeBossSB2.h +++ b/src/SB/Game/zNPCTypeBossSB2.h @@ -8,6 +8,12 @@ struct zNPCNewsFish; +namespace auto_tweak +{ + template + void load_param(T1&, T2, T2, T2, xModelAssetParam*, U32, const char*); +}; + struct zNPCB_SB2 : zNPCBoss { enum move_enum diff --git a/src/SB/Game/zNPCTypeDutchman.cpp b/src/SB/Game/zNPCTypeDutchman.cpp index 2ad1285e7..34b003386 100644 --- a/src/SB/Game/zNPCTypeDutchman.cpp +++ b/src/SB/Game/zNPCTypeDutchman.cpp @@ -1,15 +1,10 @@ #include "xVec3.h" #include "xMath3.h" +#include "xDebug.h" #include "zNPCTypeDutchman.h" #include -namespace -{ - void kill_sound(S32 a, U32 b) - { - } -} // namespace #define f1605 0.0f #define f1606 1.0f @@ -30,8 +25,877 @@ namespace #define ANIM_Attack02End01 18 //0x48 #define ANIM_LassoGrab01 19 //0x4c +#define SOUND_BEAM 0 +#define SOUND_FLAME 1 +#define SOUND_VAPOR 2 +#define SOUND_HIGH_HUMM 3 +#define SOUND_BIZARRE 4 +#define SOUND_MORE_BIZARRE 5 + static U32 dutchman_count; +namespace +{ + void kill_sound(S32 a, U32 b) + { + } + + struct sound_property + { + F32 volume; + F32 range_inner; + F32 range_outer; + F32 delay; + F32 fade_time; + }; + + struct tweak_group + { + F32 orbit_radius; + xVec3 accel; + xVec3 max_vel; + F32 turn_accel; + F32 turn_max_vel; + F32 ground_y; + F32 ground_radius; + F32 alpha; + F32 speed_mult[3]; + F32 reticle_y; + F32 reticle_radius; + struct + { + F32 alpha; + F32 scale; + F32 yoffset; + F32 vel_u; + F32 vel_v; + } halo; + struct + { + F32 turn_vel; + F32 turn_accel; + F32 up_vel; + } initiate; + beam_type beam; + struct + { + xVec3 accel; + xVec3 max_vel; + F32 turn_accel; + F32 turn_max_vel; + F32 fade_time; + F32 trail_width; + } teleport; + struct + { + F32 accel; + F32 max_vel; + F32 start_delay; + F32 wave_rate; + F32 unit_dist; + F32 start_dist; + F32 lead_dist; + F32 emit_rate[3]; + F32 emit_width[3]; + F32 snot_dist; + F32 snot_vel; + F32 snot_height; + F32 splash_width; + F32 decay; + F32 blob_pitch; + F32 spray_width; + F32 warm_up_time; + F32 sneeze_mult; + } flame; + struct + { + signed int dummy; + } fly; + struct + { + F32 min_dist_enable; + F32 min_dist_disable; + F32 max_angle_enable; + F32 max_angle_disable; + F32 safety_dist; + F32 decel; + F32 escape_delay; + } lasso; + struct + { + F32 beam_radius; + F32 beam_blast_radius; + xVec3 flame_size; + xVec3 snot_size; + F32 hand_radius; + F32 slime_width; + F32 slime_time; + } damage; + struct + { + F32 delay; + F32 duration; + F32 rate_mult; + F32 yoffset; + } wipe; + struct + { + F32 wind_duration; + F32 wink_duration; + F32 start_y; + F32 end_y; + F32 wind_min; + F32 wind_kill_dist; + F32 wind_mag_up; + F32 wind_mag_right; + } death; + sound_property sound[6]; + void* context; + tweak_callback cb_orbit_radius; + tweak_callback cb_ground; + tweak_callback cb_damage; + tweak_callback cb_flame_rate; + tweak_callback cb_alpha; + tweak_callback cb_reticle; + tweak_callback cb_halo_uv; + tweak_callback cb_blob_pitch; + tweak_callback cb_sound; + + + void register_tweaks(bool init, xModelAssetParam* ap, U32 apsize, const char*); + }; + + void tweak_group::register_tweaks(bool init, xModelAssetParam* ap, U32 apsize, const char*) + { + if (init) + { + orbit_radius = 13.0f; + auto_tweak::load_param(orbit_radius, 1.0f, 0.01f, 50.0f, ap, apsize, + "orbit_radius"); + } + if (init) + { + accel = xVec3::create(1.0f, 3.0f, 2.5f); + auto_tweak::load_param(accel, 0, 0, 0, ap, apsize, "accel"); + } + if (init) + { + max_vel = xVec3::create(1.0f, 3.0f, 2.5f); + auto_tweak::load_param(max_vel, 0, 0, 0, ap, apsize, "max_vel"); + } + if (init) + { + turn_accel = 540.0f; + auto_tweak::load_param(turn_accel, DEG2RAD(10), 0.01f, 1000000000.0f, ap, + apsize, "turn_accel"); + } + if (init) + { + turn_max_vel = 180.0f; + auto_tweak::load_param(turn_max_vel, DEG2RAD(10), 0.01f, 1000000000.0f, ap, + apsize, "turn_max_vel"); + } + if (init) + { + ground_y = -1.4f; + auto_tweak::load_param(ground_y, 1.0f, -1000000000.0f, 1000000000.0f, ap, + apsize, "ground_y"); + } + if (init) + { + ground_radius = 12.0f; + auto_tweak::load_param(ground_radius, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "ground_radius"); + } + if (init) + { + alpha = 1.0f; + auto_tweak::load_param(alpha, 1.0f, 0.0f, 1.0f, ap, apsize, "alpha"); + } + if (init) + { + speed_mult[0] = 1.0f; + auto_tweak::load_param(speed_mult[0], 1.0f, 0.01f, 10.0f, ap, apsize, + "speed_mult[0]"); + } + if (init) + { + speed_mult[1] = 1.5f; + auto_tweak::load_param(speed_mult[1], 1.0f, 0.01f, 10.0f, ap, apsize, + "speed_mult[1]"); + } + if (init) + { + speed_mult[2] = 2.0f; + auto_tweak::load_param(speed_mult[2], 1.0f, 0.01f, 10.0f, ap, apsize, + "speed_mult[2]"); + } + if (init) + { + reticle_y = 0.0f; + auto_tweak::load_param(reticle_y, 1.0f, -100.0f, 100.0f, ap, apsize, + "reticle_y"); + } + if (init) + { + reticle_radius = 1.0f; + auto_tweak::load_param(reticle_radius, 1.0f, -100.0f, 100.0f, ap, apsize, + "reticle_radius"); + } + if (init) + { + halo.alpha = 0.0f; + auto_tweak::load_param(halo.alpha, 1.0f, 0.0f, 1.0f, ap, apsize, + "halo.alpha"); + } + if (init) + { + halo.scale = 1.0f; + auto_tweak::load_param(halo.scale, 1.0f, 0.0f, 100.0f, ap, apsize, + "halo.scale"); + } + if (init) + { + halo.yoffset = 1.0f; + auto_tweak::load_param(halo.yoffset, 1.0f, -10.0f, 10.0f, ap, apsize, + "halo.yoffset"); + } + if (init) + { + halo.vel_u = 0.0f; + auto_tweak::load_param(halo.vel_u, 1.0f, -1000000000.0, 1000000000.0f, ap, + apsize, "halo.vel_u"); + } + if (init) + { + halo.vel_v = 0.0f; + auto_tweak::load_param(halo.vel_v, 1.0f, -1000000000.0, 1000000000.0f, ap, + apsize, "halo.vel_v"); + } + if (init) + { + initiate.turn_vel = 900.0f; + auto_tweak::load_param(initiate.turn_vel, DEG2RAD(10), -1000000000.0f, + 1000000000.0f, ap, apsize, "initiate.turn_vel"); + } + if (init) + { + initiate.turn_accel = 180.0f; + auto_tweak::load_param(initiate.turn_accel, DEG2RAD(10), 0.01f, 1000000000.0f, + ap, apsize, "initiate.turn_accel"); + } + if (init) + { + initiate.up_vel = 10.0f; + auto_tweak::load_param(initiate.up_vel, DEG2RAD(10), 0.01f, 1000000000.0f, ap, + apsize, "initiate.up_vel"); + } + if (init) + { + beam.knock_back = 1.0f; + auto_tweak::load_param(beam.knock_back, 1.0f, 0.0f, 100000.0f, ap, apsize, + "beam.knock_back"); + } + if (init) + { + beam.thickness = 0.4f; + auto_tweak::load_param(beam.thickness, 1.0f, 0.001f, 10.0f, ap, apsize, + "beam.thickness"); + } + if (init) + { + beam.focus_time = 0.2f; + auto_tweak::load_param(beam.focus_time, 1.0f, 0.01f, 10.0f, ap, apsize, + "beam.focus_time"); + } + if (init) + { + beam.segment_width = 0.2f; + auto_tweak::load_param(beam.segment_width, 1.0f, 0.001f, 10.0f, ap, apsize, + "beam.segment_width"); + } + if (init) + { + beam.accel = 80.0f; + auto_tweak::load_param(beam.accel, 1.0f, 0.01f, 1000000000.0f, ap, apsize, + "beam.accel"); + } + if (init) + { + beam.max_vel = 40.0f; + auto_tweak::load_param(beam.max_vel, 1.0f, 0.01f, 1000000000.0f, ap, apsize, + "beam.max_vel"); + } + if (init) + { + beam.start_dist = 1.0f; + auto_tweak::load_param(beam.start_dist, 1.0f, 0.0f, 100.0f, ap, apsize, + "beam.start_dist"); + } + if (init) + { + beam.end_dist = 25.0f; + auto_tweak::load_param(beam.end_dist, 1.0f, 0.0f, 100.0f, ap, apsize, + "beam.end_dist"); + } + if (init) + { + beam.wave_freq = 5.0f; + auto_tweak::load_param(beam.wave_freq, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "beam.wave_freq"); + } + if (init) + { + beam.wave_min = 0.5f; + auto_tweak::load_param(beam.wave_min, 1.0f, 0.0f, 100.0f, ap, apsize, + "beam.wave_min"); + } + if (init) + { + beam.wave_max = 2.0f; + auto_tweak::load_param(beam.wave_max, 1.0f, 0.0f, 100.0f, ap, apsize, + "beam.wave_max"); + } + if (init) + { + beam.light_rate = 0.1f; + auto_tweak::load_param(beam.light_rate, 1.0f, 0.0f, 1.0f, ap, apsize, + "beam.light_rate"); + } + if (init) + { + beam.glow_dist = 0.25f; + auto_tweak::load_param(beam.glow_dist, 1.0f, 0.0f, 10.0f, ap, apsize, + "beam.glow_dist"); + } + if (init) + { + beam.shots[0] = 2; + auto_tweak::load_param(beam.shots[0], 1, 1, 1000, ap, apsize, + "beam.shots[0]"); + } + if (init) + { + beam.shots[1] = 3; + auto_tweak::load_param(beam.shots[1], 1, 1, 1000, ap, apsize, + "beam.shots[1]"); + } + if (init) + { + beam.shots[2] = 4; + auto_tweak::load_param(beam.shots[2], 1, 1, 1000, ap, apsize, + "beam.shots[2]"); + } + if (init) + { + beam.fade_dist = 20.0f; + auto_tweak::load_param(beam.fade_dist, 1.0f, 0.0f, 100000.0f, ap, apsize, + "beam.fade_dist"); + } + if (init) + { + teleport.accel = xVec3::create(20.0f, 20.0f, 20.0f); + auto_tweak::load_param(teleport.accel, 0, 0, 0, ap, apsize, + "teleport.accel"); + } + if (init) + { + teleport.max_vel = xVec3::create(20.0f, 20.0f, 20.0f); + auto_tweak::load_param(teleport.max_vel, 0, 0, 0, ap, apsize, + "teleport.max_vel"); + } + if (init) + { + teleport.turn_accel = 2160.0f; + auto_tweak::load_param(teleport.turn_accel, DEG2RAD(10), 0.01f, 1000000000.0f, + ap, apsize, "teleport.turn_accel"); + } + if (init) + { + teleport.turn_max_vel = 720.0f; + auto_tweak::load_param(teleport.turn_max_vel, DEG2RAD(10), 0.01, + 1000000000.0f, ap, apsize, "teleport.turn_max_vel"); + } + if (init) + { + teleport.fade_time = 0.5f; + auto_tweak::load_param(teleport.fade_time, 1.0f, 0.01f, 10.0f, ap, apsize, + "teleport.fade_time"); + } + if (init) + { + teleport.trail_width = 0.0f; + auto_tweak::load_param(teleport.trail_width, 1.0f, 0.0f, 10.0f, ap, apsize, + "teleport.trail_width"); + } + if (init) + { + flame.accel = 80.0f; + auto_tweak::load_param(flame.accel, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "flame.accel"); + } + if (init) + { + flame.max_vel = 10.0f; + auto_tweak::load_param(flame.max_vel, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "flame.max_vel"); + } + if (init) + { + flame.start_delay = 0.5f; + auto_tweak::load_param(flame.start_delay, 1.0f, 0.01f, 10.0f, ap, apsize, + "flame.start_delay"); + } + if (init) + { + flame.wave_rate = 2.0f; + auto_tweak::load_param(flame.wave_rate, 1.0f, 0.01f, 100.0f, ap, apsize, + "flame.wave_rate"); + } + if (init) + { + flame.unit_dist = 0.8f; + auto_tweak::load_param(flame.unit_dist, 1.0f, 0.01f, 100.0f, ap, apsize, + "flame.unit_dist"); + } + if (init) + { + flame.start_dist = 0.0f; + auto_tweak::load_param(flame.start_dist, 1.0f, 0.0f, 10.0f, ap, apsize, + "flame.start_dist"); + } + if (init) + { + flame.lead_dist = 2.0f; + auto_tweak::load_param(flame.lead_dist, 1.0f, -10.0f, 10.0f, ap, apsize, + "flame.lead_dist"); + } + if (init) + { + flame.emit_rate[0] = 2.0f; + auto_tweak::load_param(flame.emit_rate[0], 1.0f, 0.0f, 1000000.0f, ap, apsize, + "flame.emit_rate[0]"); + } + if (init) + { + flame.emit_rate[1] = 4.0f; + auto_tweak::load_param(flame.emit_rate[1], 1.0f, 0.0f, 1000000.0f, ap, apsize, + "flame.emit_rate[1]"); + } + if (init) + { + flame.emit_rate[2] = 10.0f; + auto_tweak::load_param(flame.emit_rate[2], 1.0f, 0.0f, 1000000.0f, ap, apsize, + "flame.emit_rate[2]"); + } + if (init) + { + flame.emit_width[0] = 0.1f; + auto_tweak::load_param(flame.emit_width[0], 1.0f, 0.0f, 10.0f, ap, apsize, + "flame.emit_width[0]"); + } + if (init) + { + flame.emit_width[1] = 0.3f; + auto_tweak::load_param(flame.emit_width[1], 1.0f, 0.0f, 10.0f, ap, apsize, + "flame.emit_width[1]"); + } + if (init) + { + flame.emit_width[2] = 1.0f; + auto_tweak::load_param(flame.emit_width[2], 1.0f, 0.0f, 10.0f, ap, apsize, + "flame.emit_width[2]"); + } + if (init) + { + flame.snot_dist = 0.2f; + auto_tweak::load_param(flame.snot_dist, 1.0f, -10.0f, 10.0f, ap, apsize, + "flame.snot_dist"); + } + if (init) + { + flame.snot_vel = 2.0f; + auto_tweak::load_param(flame.snot_vel, 1.0f, -100.0f, 100.0f, ap, apsize, + "flame.snot_vel"); + } + if (init) + { + flame.snot_height = -0.2f; + auto_tweak::load_param(flame.snot_height, 1.0f, -10.0f, 10.0f, ap, apsize, + "flame.snot_height"); + } + if (init) + { + flame.splash_width = 0.1f; + auto_tweak::load_param(flame.splash_width, 1.0f, 0.0f, 10.0f, ap, apsize, + "flame.splash_width"); + } + if (init) + { + flame.decay = 0.75f; + auto_tweak::load_param(flame.decay, 1.0f, 0.0f, 1.0f, ap, apsize, + "flame.decay"); + } + if (init) + { + flame.blob_pitch = 60.0f; + auto_tweak::load_param(flame.blob_pitch, DEG2RAD(10), -90.0f, 90.0f, ap, + apsize, "flame.blob_pitch"); + } + if (init) + { + flame.spray_width = 0.1f; + auto_tweak::load_param(flame.splash_width, 1.0f, 0.0f, 10.0f, ap, apsize, + "flame.spray_width"); + } + if (init) + { + flame.warm_up_time = 0.4f; + auto_tweak::load_param(flame.warm_up_time, 1.0f, 0.01f, 10.0f, ap, apsize, + "flame.warm_up_time"); + } + if (init) + { + flame.sneeze_mult = 10.0f; + auto_tweak::load_param(flame.sneeze_mult, 1.0f, 1.0f, 100.0f, ap, apsize, + "flame.sneete_mult"); + } + if (init) + { + lasso.min_dist_enable = 2.0f; + auto_tweak::load_param(lasso.min_dist_enable, 1.0f, 0.0f, 100.0f, ap, apsize, + "lasso.min_dist_enable"); + } + if (init) + { + lasso.min_dist_disable = 0.5f; + auto_tweak::load_param(lasso.min_dist_disable, 1.0f, 0.0f, 100.0f, ap, apsize, + "lasso.min_dist_disable"); + } + if (init) + { + lasso.max_angle_enable = 60.0f; + auto_tweak::load_param(lasso.max_angle_enable, DEG2RAD(10), 0.01f, + 1000000000.0f, ap, apsize, "lasso.max_angle_enable"); + } + if (init) + { + lasso.max_angle_disable = 90.0f; + auto_tweak::load_param(lasso.max_angle_disable, DEG2RAD(10), 0.01f, + 1000000000.0f, ap, apsize, "lasso.max_angle_disable"); + } + if (init) + { + lasso.safety_dist = 2.0f; + auto_tweak::load_param(lasso.safety_dist, 1.0f, 0.0f, 100.0f, ap, apsize, + "lasso.safety_dist"); + } + if (init) + { + lasso.decel = 20.0f; + auto_tweak::load_param(lasso.decel, 1.0f, 0.0f, 1000.0f, ap, apsize, + "lasso.decel"); + } + if (init) + { + lasso.escape_delay = 1.0f; + auto_tweak::load_param(lasso.escape_delay, 1.0f, 0.0f, 100.0f, ap, apsize, + "lasso.escape_delay"); + } + if (init) + { + damage.beam_radius = 0.1f; + auto_tweak::load_param(damage.beam_radius, 1.0f, 0.0f, 10.0f, ap, apsize, + "damage.beam_radius"); + } + if (init) + { + damage.beam_blast_radius = 0.4f; + auto_tweak::load_param(damage.beam_blast_radius, 1.0f, 0.0f, 10.0f, ap, + apsize, "damage.beam_blast_radius"); + } + if (init) + { + damage.flame_size = xVec3::create(0.4f, 1.5f, 3.0f); + auto_tweak::load_param(damage.flame_size, 0, 0, 0, ap, apsize, + "damage.flame_size"); + } + if (init) + { + damage.snot_size = xVec3::create(2.0f, 2.0f, 2.5f); + auto_tweak::load_param(damage.snot_size, 0, 0, 0, ap, apsize, + "damage.snot_size"); + } + if (init) + { + damage.hand_radius = 0.5f; + auto_tweak::load_param(damage.hand_radius, 1.0f, 0.0f, 10.0f, ap, apsize, + "damage.hand_radius"); + } + if (init) + { + damage.slime_width = 1.0f; + auto_tweak::load_param(damage.slime_width, 1.0f, 0.0f, 10.0f, ap, apsize, + "damage.slime_width"); + } + if (init) + { + damage.slime_time = 6.0f; + auto_tweak::load_param(damage.slime_time, 1.0f, 0.0f, 20.0f, ap, apsize, + "damage.slime_time"); + } + if (init) + { + wipe.delay = 1.2f; + auto_tweak::load_param(wipe.delay, 1.0f, 0.0f, 10.0f, ap, apsize, + "wipe.delay"); + } + if (init) + { + wipe.duration = 0.3f; + auto_tweak::load_param(wipe.duration, 1.0f, 0.0f, 10.0f, ap, apsize, + "wipe.duration"); + } + if (init) + { + wipe.rate_mult = 2.0f; + auto_tweak::load_param(wipe.rate_mult, 1.0f, 0.0f, 100.0f, ap, apsize, + "wipe.rate_mult"); + } + if (init) + { + wipe.yoffset = 0.0f; + auto_tweak::load_param(wipe.yoffset, 1.0f, -10.0f, 10.0f, ap, apsize, + "wipe.yoffset"); + } + if (init) + { + death.wind_duration = 5.0f; + auto_tweak::load_param(death.wind_duration, 1.0f, 0.01f, 100.0f, ap, apsize, + "death.wind_duration"); + } + if (init) + { + death.wink_duration = 1.0f; + auto_tweak::load_param(death.wink_duration, 1.0f, 0.01f, 100.0f, ap, apsize, + "death.wink_duration"); + } + if (init) + { + death.start_y = -2.0f; + auto_tweak::load_param(death.start_y, 1.0f, -100.0f, 100.0f, ap, apsize, + "death.start_y"); + } + if (init) + { + death.end_y = 7.0f; + auto_tweak::load_param(death.end_y, 1.0f, -100.0f, 100.0f, ap, apsize, + "death.end_y"); + } + if (init) + { + death.wind_min = 2.0f; + auto_tweak::load_param(death.wind_min, 1.0f, 0.0f, 1000000000.0f, ap, apsize, + "death.wind_min"); + } + if (init) + { + death.wind_kill_dist = 2.0f; + auto_tweak::load_param(death.wind_kill_dist, 1.0f, 0.01f, 1000000000.0f, ap, + apsize, "death.wind_kill_dist"); + } + if (init) + { + death.wind_mag_up = 0.0f; + auto_tweak::load_param(death.wind_mag_up, 1.0f, -1000000000.0f, 1000000000.0f, + ap, apsize, "death.wind_mag_up"); + } + if (init) + { + death.wind_mag_right = 10.0f; + auto_tweak::load_param(death.wind_mag_right, 1.0f, -1000000000.0f, + 1000000000.0f, ap, apsize, "death.wind_mag_right"); + } + if (init) + { + sound[SOUND_BEAM].volume = 0.5f; + auto_tweak::load_param(sound[SOUND_BEAM].volume, 1.0f, 0.0f, 1.0f, ap, apsize, + "sound[SOUND_BEAM].volume"); + } + if (init) + { + sound[SOUND_BEAM].range_inner = 0.0f; + auto_tweak::load_param(sound[SOUND_BEAM].range_inner, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_BEAM].range_inner"); + } + if (init) + { + sound[SOUND_BEAM].range_outer = 20.0f; + auto_tweak::load_param(sound[SOUND_BEAM].range_outer, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_BEAM].range_outer"); + } + if (init) + { + sound[SOUND_BEAM].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_BEAM].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_BEAM].delay"); + } + if (init) + { + sound[SOUND_BEAM].fade_time = 0.0f; + auto_tweak::load_param(sound[SOUND_BEAM].fade_time, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_BEAM].fade_time"); + } + if (init) + { + sound[SOUND_FLAME].volume = 0.5f; + auto_tweak::load_param(sound[SOUND_FLAME].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_FLAME].volume"); + } + if (init) + { + sound[SOUND_FLAME].range_inner = 0.0f; + auto_tweak::load_param(sound[SOUND_FLAME].range_inner, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_FLAME].range_inner"); + } + if (init) + { + sound[SOUND_FLAME].range_outer = 20.0f; + auto_tweak::load_param(sound[SOUND_FLAME].range_outer, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_FLAME].range_outer"); + } + if (init) + { + sound[SOUND_FLAME].delay = 0.2f; + auto_tweak::load_param(sound[SOUND_FLAME].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_FLAME].delay"); + } + if (init) + { + sound[SOUND_FLAME].fade_time = 1.0f; + auto_tweak::load_param(sound[SOUND_FLAME].fade_time, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_FLAME].fade_time"); + } + if (init) + { + sound[SOUND_VAPOR].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_VAPOR].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_VAPOR].volume"); + } + if (init) + { + sound[SOUND_VAPOR].range_inner = 10.0f; + auto_tweak::load_param(sound[SOUND_VAPOR].range_inner, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_VAPOR].range_inner"); + } + if (init) + { + sound[SOUND_VAPOR].range_outer = 30.0f; + auto_tweak::load_param(sound[SOUND_VAPOR].range_outer, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_VAPOR].range_outer"); + } + if (init) + { + sound[SOUND_VAPOR].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_VAPOR].delay, 1.0f, 0.0f, 100000.0f, ap, + apsize, "sound[SOUND_VAPOR].delay"); + } + if (init) + { + sound[SOUND_VAPOR].fade_time = 0.0f; + auto_tweak::load_param(sound[SOUND_VAPOR].fade_time, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_VAPOR].fade_time"); + } + if (init) + { + sound[SOUND_HIGH_HUMM].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_HIGH_HUMM].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_HIGH_HUMM].volume"); + } + if (init) + { + sound[SOUND_HIGH_HUMM].range_inner = 0.0f; + auto_tweak::load_param(sound[SOUND_HIGH_HUMM].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_HIGH_HUMM].range_inner"); + } + if (init) + { + sound[SOUND_HIGH_HUMM].range_outer = 10.0f; + auto_tweak::load_param(sound[SOUND_HIGH_HUMM].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_HIGH_HUMM].range_outer"); + } + if (init) + { + sound[SOUND_HIGH_HUMM].delay = 0.1f; + auto_tweak::load_param(sound[SOUND_HIGH_HUMM].delay, 1.0f, 0.0f, 100000.0f, + ap, apsize, "sound[SOUND_HIGH_HUMM].delay"); + } + if (init) + { + sound[SOUND_HIGH_HUMM].fade_time = 0.5f; + auto_tweak::load_param(sound[SOUND_HIGH_HUMM].fade_time, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_HIGH_HUMM].fade_time"); + } + if (init) + { + sound[SOUND_BIZARRE].volume = 0.5f; + auto_tweak::load_param(sound[SOUND_BIZARRE].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_BIZARRE].volume"); + } + if (init) + { + sound[SOUND_BIZARRE].range_inner = 1.0f; + auto_tweak::load_param(sound[SOUND_BIZARRE].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_BIZARRE].range_inner"); + } + if (init) + { + sound[SOUND_BIZARRE].range_outer = 10.0f; + auto_tweak::load_param(sound[SOUND_BIZARRE].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_BIZARRE].range_outer"); + } + if (init) + { + sound[SOUND_BIZARRE].delay = 40.0f; + auto_tweak::load_param(sound[SOUND_BIZARRE].delay, 1.0f, 0.0f, 10.0f, ap, + apsize, "sound[SOUND_BIZARRE].delay"); + } + + if (init) + { + sound[SOUND_MORE_BIZARRE].volume = 1.0f; + auto_tweak::load_param(sound[SOUND_MORE_BIZARRE].volume, 1.0f, 0.0f, 1.0f, ap, + apsize, "sound[SOUND_MORE_BIZARRE].volume"); + } + if (init) + { + sound[SOUND_MORE_BIZARRE].range_inner = 10.0f; + auto_tweak::load_param(sound[SOUND_MORE_BIZARRE].range_inner, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_MORE_BIZARRE].range_inner"); + } + if (init) + { + sound[SOUND_MORE_BIZARRE].range_outer = 40.0f; + auto_tweak::load_param(sound[SOUND_MORE_BIZARRE].range_outer, 1.0f, 0.0f, + 100000.0f, ap, apsize, + "sound[SOUND_MORE_BIZARRE].range_outer"); + } + if (init) + { + sound[SOUND_MORE_BIZARRE].delay = 0.0f; + auto_tweak::load_param(sound[SOUND_MORE_BIZARRE].delay, 1.0f, 0.0f, 10.0f, ap, + apsize, "sound[SOUND_MORE_BIZARRE].delay"); + } + } + +} // namespace + //13 new states //8 new transitions xAnimTable* ZNPC_AnimTable_Dutchman() diff --git a/src/SB/Game/zNPCTypeDutchman.h b/src/SB/Game/zNPCTypeDutchman.h index aaab93642..c96a1a964 100644 --- a/src/SB/Game/zNPCTypeDutchman.h +++ b/src/SB/Game/zNPCTypeDutchman.h @@ -8,6 +8,35 @@ #include "zNPCTypeCommon.h" #include "zNPCGoals.h" +namespace auto_tweak +{ + template + void load_param(T1&, T2, T2, T2, xModelAssetParam*, U32, const char*); +}; + +struct beam_config +{ + F32 accel; + F32 max_vel; + F32 start_dist; + F32 end_dist; + F32 wave_freq; + F32 wave_min; + F32 wave_max; +}; + +struct beam_type : beam_config +{ + F32 knock_back; + F32 thickness; + F32 focus_time; + F32 segment_width; + F32 light_rate; + F32 glow_dist; + S32 shots[3]; + F32 fade_dist; +}; + struct zNPCDutchman : zNPCSubBoss { enum move_enum