checkerboard_platform.inc.c (3042B)
1 // checkerboard_platform.inc.c 2 3 struct Struct8032F754 { 4 s32 unk0; 5 Vec3f unk1; 6 f32 unk2; 7 }; 8 9 struct Struct8032F754 D_8032F754[] = { 10 { 145, { 0.7f, 1.5f, 0.7f }, 7.0f }, 11 { 235, { 1.2f, 2.0f, 1.2f }, 11.6f }, 12 }; 13 14 void bhv_checkerboard_elevator_group_init(void) { 15 s32 sp3C; 16 s32 sp38; 17 s32 sp34; 18 s32 i; 19 struct Object *sp2C; 20 21 if (o->oBhvParams2ndByte == 0) { 22 o->oBhvParams2ndByte = 65; 23 } 24 25 sp3C = o->oBhvParams2ndByte * 10; 26 sp34 = (o->oBhvParams >> 24) & 0xFF; 27 28 for (i = 0; i <= 1; i++) { 29 if (i == 0) { 30 sp38 = -D_8032F754[sp34].unk0; 31 } else { 32 sp38 = D_8032F754[sp34].unk0; 33 } 34 35 sp2C = spawn_object_relative(i, 0, i * sp3C, sp38, o, MODEL_CHECKERBOARD_PLATFORM, 36 bhvCheckerboardPlatformSub); 37 sp2C->oCheckerBoardPlatformUnk1AC = D_8032F754[sp34].unk2; 38 vec3f_copy_2(sp2C->header.gfx.scale, D_8032F754[sp34].unk1); 39 } 40 } 41 42 void checkerboard_plat_act_move_y(UNUSED s32 unused, f32 vel, s32 a2) { 43 o->oMoveAnglePitch = 0; 44 o->oAngleVelPitch = 0; 45 o->oForwardVel = 0.0f; 46 o->oVelY = vel; 47 if (o->oTimer > a2) { 48 o->oAction++; 49 } 50 } 51 52 void checkerboard_plat_act_rotate(s32 a0, s16 a1) { 53 o->oVelY = 0.0f; 54 o->oAngleVelPitch = a1; 55 if (o->oTimer + 1 == 0x8000 / absi(a1)) { 56 o->oAction = a0; 57 } 58 o->oCheckerBoardPlatformUnkF8 = a0; 59 } 60 61 void bhv_checkerboard_platform_init(void) { 62 o->oCheckerBoardPlatformUnkFC = o->parentObj->oBhvParams2ndByte; 63 } 64 65 void bhv_checkerboard_platform_loop(void) { 66 f32 sp24 = o->oCheckerBoardPlatformUnk1AC; 67 68 o->oCheckerBoardPlatformUnkF8 = 0; 69 70 if (o->oDistanceToMario < 1000.0f) { 71 cur_obj_play_sound_1(SOUND_ENV_ELEVATOR4); 72 } 73 74 switch (o->oAction) { 75 case 0: 76 if (o->oBhvParams2ndByte == 0) { 77 o->oAction = 1; 78 } else { 79 o->oAction = 3; 80 } 81 break; 82 case 1: 83 checkerboard_plat_act_move_y(2, 10.0f, o->oCheckerBoardPlatformUnkFC); 84 break; 85 case 2: 86 checkerboard_plat_act_rotate(3, 512); 87 break; 88 case 3: 89 checkerboard_plat_act_move_y(4, -10.0f, o->oCheckerBoardPlatformUnkFC); 90 break; 91 case 4: 92 checkerboard_plat_act_rotate(1, -512); 93 break; 94 } 95 96 o->oMoveAnglePitch += absi(o->oAngleVelPitch); 97 o->oFaceAnglePitch += absi(o->oAngleVelPitch); 98 o->oFaceAngleYaw = o->oMoveAngleYaw; 99 100 if (o->oMoveAnglePitch != 0) { 101 o->oForwardVel = signum_positive(o->oAngleVelPitch) * sins(o->oMoveAnglePitch) * sp24; 102 o->oVelY = signum_positive(o->oAngleVelPitch) * coss(o->oMoveAnglePitch) * sp24; 103 } 104 105 if (o->oCheckerBoardPlatformUnkF8 == 1) { 106 o->oAngleVelPitch = 0; 107 o->oFaceAnglePitch &= ~0x7FFF; 108 cur_obj_move_using_fvel_and_gravity(); 109 } else { 110 cur_obj_move_using_fvel_and_gravity(); 111 } 112 113 load_object_collision_model(); 114 }