Path: blob/master/src/game/behaviors/bowling_ball.inc.c
7861 views
// bowling_ball.c.inc12static struct ObjectHitbox sBowlingBallHitbox = {3/* interactType: */ INTERACT_DAMAGE,4/* downOffset: */ 0,5/* damageOrCoinValue: */ 2,6/* health: */ 0,7/* numLootCoins: */ 0,8/* radius: */ 100,9/* height: */ 150,10/* hurtboxRadius: */ 0,11/* hurtboxHeight: */ 0,12};1314static Trajectory sThiHugeMetalBallTraj[] = {15TRAJECTORY_POS(0, /*pos*/ -4786, 101, -2166),16TRAJECTORY_POS(1, /*pos*/ -5000, 81, -2753),17TRAJECTORY_POS(2, /*pos*/ -5040, 33, -3846),18TRAJECTORY_POS(3, /*pos*/ -4966, 38, -4966),19TRAJECTORY_POS(4, /*pos*/ -4013, -259, -4893),20TRAJECTORY_POS(5, /*pos*/ -2573, -1019, -4780),21TRAJECTORY_POS(6, /*pos*/ -1053, -1399, -4806),22TRAJECTORY_POS(7, /*pos*/ 760, -1637, -4833),23TRAJECTORY_POS(8, /*pos*/ 2866, -2047, -4886),24TRAJECTORY_POS(9, /*pos*/ 3386, -6546, -4833),25TRAJECTORY_END(),26};2728static Trajectory sThiTinyMetalBallTraj[] = {29TRAJECTORY_POS(0, /*pos*/ -1476, 29, -680),30TRAJECTORY_POS(1, /*pos*/ -1492, 14, -1072),31TRAJECTORY_POS(2, /*pos*/ -1500, 3, -1331),32TRAJECTORY_POS(3, /*pos*/ -1374, -17, -1527),33TRAJECTORY_POS(4, /*pos*/ -1178, -83, -1496),34TRAJECTORY_POS(5, /*pos*/ -292, -424, -1425),35TRAJECTORY_POS(6, /*pos*/ 250, -491, -1433),36TRAJECTORY_POS(7, /*pos*/ 862, -613, -1449),37TRAJECTORY_POS(8, /*pos*/ 1058, -1960, -1449),38TRAJECTORY_END(),39};4041void bhv_bowling_ball_init(void) {42o->oGravity = 5.5f;43o->oFriction = 1.0f;44o->oBuoyancy = 2.0f;45}4647void bowling_ball_set_hitbox(void) {48obj_set_hitbox(o, &sBowlingBallHitbox);4950if (o->oInteractStatus & INT_STATUS_INTERACTED)51o->oInteractStatus = 0;52}5354void bowling_ball_set_waypoints(void) {55switch (o->oBehParams2ndByte) {56case BBALL_BP_STYPE_BOB_UPPER:57o->oPathedStartWaypoint = segmented_to_virtual(bob_seg7_metal_ball_path0);58break;5960case BBALL_BP_STYPE_TTM:61o->oPathedStartWaypoint = segmented_to_virtual(ttm_seg7_trajectory_070170A0);62break;6364case BBALL_BP_STYPE_BOB_LOWER:65o->oPathedStartWaypoint = segmented_to_virtual(bob_seg7_metal_ball_path1);66break;6768case BBALL_BP_STYPE_THI_LARGE:69o->oPathedStartWaypoint = (struct Waypoint *) sThiHugeMetalBallTraj;70break;7172case BBALL_BP_STYPE_THI_SMALL:73o->oPathedStartWaypoint = (struct Waypoint *) sThiTinyMetalBallTraj;74break;75}76}7778void bhv_bowling_ball_roll_loop(void) {79s16 collisionFlags;80s32 sp18;81#ifdef AVOID_UB82sp18 = 0;83#endif8485bowling_ball_set_waypoints();86collisionFlags = object_step();8788//! Uninitialzed parameter, but the parameter is unused in the called function89sp18 = cur_obj_follow_path(sp18);9091o->oBowlingBallTargetYaw = o->oPathedTargetYaw;92o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, o->oBowlingBallTargetYaw, 0x400);93if (o->oForwardVel > 70.0) {94o->oForwardVel = 70.0;95}9697bowling_ball_set_hitbox();9899if (sp18 == -1) {100if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 7000)) {101spawn_mist_particles();102spawn_mist_particles_variable(0, 0, 92.0f);103}104105o->activeFlags = ACTIVE_FLAG_DEACTIVATED;106}107108if ((collisionFlags & OBJ_COL_FLAG_GROUNDED) && (o->oVelY > 5.0f))109cur_obj_play_sound_2(SOUND_GENERAL_QUIET_POUND1_LOWPRIO);110}111112void bhv_bowling_ball_initializeLoop(void) {113s32 sp1c;114#ifdef AVOID_UB115sp1c = 0;116#endif117118bowling_ball_set_waypoints();119120//! Uninitialzed parameter, but the parameter is unused in the called function121sp1c = cur_obj_follow_path(sp1c);122123o->oMoveAngleYaw = o->oPathedTargetYaw;124125switch (o->oBehParams2ndByte) {126case BBALL_BP_STYPE_BOB_UPPER:127o->oForwardVel = 20.0f;128break;129130case BBALL_BP_STYPE_TTM:131o->oForwardVel = 10.0f;132break;133134case BBALL_BP_STYPE_BOB_LOWER:135o->oForwardVel = 20.0f;136break;137138case BBALL_BP_STYPE_THI_LARGE:139o->oForwardVel = 25.0f;140break;141142case BBALL_BP_STYPE_THI_SMALL:143o->oForwardVel = 10.0f;144cur_obj_scale(0.3f);145o->oGraphYOffset = 39.0f;146break;147}148}149150void bhv_bowling_ball_loop(void) {151switch (o->oAction) {152case BBALL_ACT_INITIALIZE:153o->oAction = BBALL_ACT_ROLL;154bhv_bowling_ball_initializeLoop();155break;156157case BBALL_ACT_ROLL:158bhv_bowling_ball_roll_loop();159break;160}161162if (o->oBehParams2ndByte != 4)163set_camera_shake_from_point(SHAKE_POS_BOWLING_BALL, o->oPosX, o->oPosY, o->oPosZ);164165set_object_visibility(o, 4000);166}167168void bhv_generic_bowling_ball_spawner_init(void) {169switch (o->oBehParams2ndByte) {170case BBALL_BP_STYPE_BOB_UPPER:171o->oBBallSpawnerMaxSpawnDist = 7000.0f;172o->oBBallSpawnerSpawnOdds = 2.0f;173break;174175case BBALL_BP_STYPE_TTM:176o->oBBallSpawnerMaxSpawnDist = 8000.0f;177o->oBBallSpawnerSpawnOdds = 1.0f;178break;179180case BBALL_BP_STYPE_BOB_LOWER:181o->oBBallSpawnerMaxSpawnDist = 6000.0f;182o->oBBallSpawnerSpawnOdds = 2.0f;183break;184}185}186187void bhv_generic_bowling_ball_spawner_loop(void) {188struct Object *bowlingBall;189190if (o->oTimer == 256)191o->oTimer = 0;192193if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 1000)194|| (o->oPosY < gMarioObject->header.gfx.pos[1]))195return;196197if ((o->oTimer & o->oBBallSpawnerPeriodMinus1) == 0) /* Modulus */198{199if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, o->oBBallSpawnerMaxSpawnDist)) {200if ((s32)(random_float() * o->oBBallSpawnerSpawnOdds) == 0) {201bowlingBall = spawn_object(o, MODEL_BOWLING_BALL, bhvBowlingBall);202bowlingBall->oBehParams2ndByte = o->oBehParams2ndByte;203}204}205}206}207208void bhv_thi_bowling_ball_spawner_loop(void) {209struct Object *bowlingBall;210211if (o->oTimer == 256)212o->oTimer = 0;213214if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 800)215|| (o->oPosY < gMarioObject->header.gfx.pos[1]))216return;217218if ((o->oTimer % 64) == 0) {219if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 12000)) {220if ((s32)(random_float() * 1.5) == 0) {221bowlingBall = spawn_object(o, MODEL_BOWLING_BALL, bhvBowlingBall);222bowlingBall->oBehParams2ndByte = o->oBehParams2ndByte;223}224}225}226}227228void bhv_bob_pit_bowling_ball_init(void) {229o->oGravity = 12.0f;230o->oFriction = 1.0f;231o->oBuoyancy = 2.0f;232}233234void bhv_bob_pit_bowling_ball_loop(void) {235struct FloorGeometry *sp1c;236UNUSED s16 collisionFlags = object_step();237238find_floor_height_and_data(o->oPosX, o->oPosY, o->oPosZ, &sp1c);239if ((sp1c->normalX == 0) && (sp1c->normalZ == 0))240o->oForwardVel = 28.0f;241242bowling_ball_set_hitbox();243set_camera_shake_from_point(SHAKE_POS_BOWLING_BALL, o->oPosX, o->oPosY, o->oPosZ);244cur_obj_play_sound_1(SOUND_ENV_UNKNOWN2);245set_object_visibility(o, 3000);246}247248void bhv_free_bowling_ball_init(void) {249o->oGravity = 5.5f;250o->oFriction = 1.0f;251o->oBuoyancy = 2.0f;252o->oHomeX = o->oPosX;253o->oHomeY = o->oPosY;254o->oHomeZ = o->oPosZ;255o->oForwardVel = 0;256o->oMoveAngleYaw = 0;257}258259void bhv_free_bowling_ball_roll_loop(void) {260s16 collisionFlags = object_step();261bowling_ball_set_hitbox();262263if (o->oForwardVel > 10.0f) {264set_camera_shake_from_point(SHAKE_POS_BOWLING_BALL, o->oPosX, o->oPosY, o->oPosZ);265cur_obj_play_sound_1(SOUND_ENV_UNKNOWN2);266}267268if ((collisionFlags & OBJ_COL_FLAG_GROUNDED) && !(collisionFlags & OBJ_COL_FLAGS_LANDED))269cur_obj_play_sound_2(SOUND_GENERAL_QUIET_POUND1_LOWPRIO);270271if (!is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 6000)) {272o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;273cur_obj_become_intangible();274275o->oPosX = o->oHomeX;276o->oPosY = o->oHomeY;277o->oPosZ = o->oHomeZ;278bhv_free_bowling_ball_init();279o->oAction = FREE_BBALL_ACT_RESET;280}281}282283void bhv_free_bowling_ball_loop(void) {284o->oGravity = 5.5f;285286switch (o->oAction) {287case FREE_BBALL_ACT_IDLE:288if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 3000)) {289o->oAction = FREE_BBALL_ACT_ROLL;290o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;291cur_obj_become_tangible();292}293break;294295case FREE_BBALL_ACT_ROLL:296bhv_free_bowling_ball_roll_loop();297break;298299case FREE_BBALL_ACT_RESET:300if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 5000))301o->oAction = FREE_BBALL_ACT_IDLE;302break;303}304}305306307