mirror of
https://github.com/HarbourMasters/SpaghettiKart
synced 2026-07-08 22:45:12 -04:00
178 lines
6.2 KiB
C++
178 lines
6.2 KiB
C++
#include "HotAirBalloon.h"
|
|
#include "World.h"
|
|
#include "port/Game.h"
|
|
|
|
extern "C" {
|
|
#include "render_objects.h"
|
|
#include "update_objects.h"
|
|
#include "assets/luigi_raceway_data.h"
|
|
#include "assets/common_data.h"
|
|
#include "math_util.h"
|
|
#include "math_util_2.h"
|
|
#include "code_80086E70.h"
|
|
#include "code_80057C60.h"
|
|
#include "actors.h"
|
|
}
|
|
|
|
OHotAirBalloon::OHotAirBalloon(const FVector& pos) {
|
|
Name = "Hot Air Balloon";
|
|
_pos = pos;
|
|
|
|
D_80165898 = 0;
|
|
|
|
// Spawn balloon on second lap.
|
|
if (GetCourse() == GetLuigiRaceway()) {
|
|
_visible = (bool*)&D_80165898;
|
|
} else { // Spawn balloon on race start
|
|
bool mod = true;
|
|
_visible = &mod;
|
|
}
|
|
|
|
find_unused_obj_index(&_objectIndex);
|
|
|
|
init_object(_objectIndex, 0);
|
|
}
|
|
|
|
void OHotAirBalloon::Tick() {
|
|
s32 objectIndex = _objectIndex;
|
|
|
|
if (*_visible) {
|
|
if (gObjectList[objectIndex].state != 0) {
|
|
OHotAirBalloon::func_80085768(objectIndex);
|
|
OHotAirBalloon::func_80085534(objectIndex);
|
|
object_calculate_new_pos_offset(objectIndex);
|
|
if (gObjectList[objectIndex].state >= 2) {
|
|
gActorHotAirBalloonItemBox->pos[0] = gObjectList[objectIndex].pos[0];
|
|
gActorHotAirBalloonItemBox->pos[1] = gObjectList[objectIndex].pos[1] - 10.0;
|
|
gActorHotAirBalloonItemBox->pos[2] = gObjectList[objectIndex].pos[2];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void OHotAirBalloon::Draw(s32 cameraId) {
|
|
s32 objectIndex;
|
|
objectIndex = _objectIndex;
|
|
if (*_visible) {
|
|
if (gGamestate != CREDITS_SEQUENCE) {
|
|
func_8008A1D0(objectIndex, cameraId, 0x000005DC, 0x00000BB8);
|
|
if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) {
|
|
OHotAirBalloon::func_80055CCC(objectIndex, cameraId);
|
|
}
|
|
} else {
|
|
clear_object_flag(objectIndex, 0x00100000);
|
|
OHotAirBalloon::func_80055CCC(objectIndex, cameraId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void OHotAirBalloon::func_80055CCC(s32 objectIndex, s32 cameraId) {
|
|
UNUSED s32 pad;
|
|
f32 test;
|
|
Camera* camera;
|
|
|
|
camera = &camera1[cameraId];
|
|
if (gObjectList[objectIndex].state >= 2) {
|
|
func_8008A454(objectIndex, cameraId, 0x0000012C);
|
|
test = gObjectList[objectIndex].pos[1] - gObjectList[objectIndex].surfaceHeight;
|
|
func_8004A6EC(objectIndex, (20.0 / test) + 0.5);
|
|
if (is_obj_index_flag_status_inactive(objectIndex, 0x00100000) != 0) {
|
|
func_80043328(gObjectList[objectIndex].pos, (u16*) gObjectList[objectIndex].direction_angle,
|
|
gObjectList[objectIndex].sizeScaling, (Gfx*)d_course_luigi_raceway_dl_F960);
|
|
gSPDisplayList(gDisplayListHead++, (Gfx*)d_course_luigi_raceway_dl_F650);
|
|
} else {
|
|
D_80183E80[0] = (s16) gObjectList[objectIndex].direction_angle[0];
|
|
D_80183E80[1] =
|
|
(s16) (func_800418AC(gObjectList[objectIndex].pos[0], gObjectList[objectIndex].pos[2], camera->pos) +
|
|
0x8000);
|
|
D_80183E80[2] = (u16) gObjectList[objectIndex].direction_angle[2];
|
|
func_80043328(gObjectList[objectIndex].pos, D_80183E80, gObjectList[objectIndex].sizeScaling,
|
|
(Gfx*)d_course_luigi_raceway_dl_FBE0);
|
|
gSPDisplayList(gDisplayListHead++, (Gfx*)d_course_luigi_raceway_dl_FA20);
|
|
if (gPlayerCountSelection1 == 1) {
|
|
gObjectList[objectIndex].direction_angle[1] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void OHotAirBalloon::init_hot_air_balloon(s32 objectIndex) {
|
|
gObjectList[objectIndex].sizeScaling = 1.0f;
|
|
gObjectList[objectIndex].model = (Gfx*)d_course_luigi_raceway_dl_F960;
|
|
if (gGamestate != CREDITS_SEQUENCE) {
|
|
set_obj_origin_pos(objectIndex, xOrientation * _pos.x, _pos.y, _pos.z);
|
|
set_obj_origin_offset(objectIndex, 0.0f, 300.0f, 0.0f);
|
|
} else {
|
|
set_obj_origin_pos(objectIndex, xOrientation * _pos.x, _pos.y, _pos.z);
|
|
set_obj_origin_offset(objectIndex, 0.0f, 300.0f, 0.0f);
|
|
}
|
|
func_8008B844(objectIndex);
|
|
func_800886F4(objectIndex);
|
|
func_80086EF0(objectIndex);
|
|
gObjectList[objectIndex].velocity[1] = -2.0f;
|
|
init_actor_hot_air_balloon_item_box(0.0f, 0.0f, 0.0f);
|
|
object_next_state(objectIndex);
|
|
}
|
|
|
|
void OHotAirBalloon::func_80085534(s32 objectIndex) {
|
|
switch (gObjectList[objectIndex].unk_0AE) {
|
|
case 1:
|
|
if (gObjectList[objectIndex].offset[1] <= 18.0) {
|
|
func_80086FD4(objectIndex);
|
|
}
|
|
break;
|
|
case 2:
|
|
f32_step_towards(&gObjectList[objectIndex].velocity[1], 0.0f, 0.05f);
|
|
if (gObjectList[objectIndex].velocity[1] == 0.0) {
|
|
func_80086FD4(objectIndex);
|
|
}
|
|
break;
|
|
case 3:
|
|
func_800871AC(objectIndex, 1);
|
|
break;
|
|
case 4:
|
|
f32_step_towards(&gObjectList[objectIndex].velocity[1], 1.0f, 0.05f);
|
|
if (gObjectList[objectIndex].velocity[1] == 1.0) {
|
|
func_80086FD4(objectIndex);
|
|
}
|
|
break;
|
|
case 5:
|
|
func_800871AC(objectIndex, 90);
|
|
break;
|
|
case 6:
|
|
f32_step_towards(&gObjectList[objectIndex].velocity[1], 0.0f, 0.05f);
|
|
if (gObjectList[objectIndex].velocity[1] == 0.0) {
|
|
func_80086FD4(objectIndex);
|
|
}
|
|
break;
|
|
case 7:
|
|
f32_step_towards(&gObjectList[objectIndex].velocity[1], -1.0f, 0.05f);
|
|
if (gObjectList[objectIndex].velocity[1] == -1.0) {
|
|
func_80086FD4(objectIndex);
|
|
}
|
|
break;
|
|
case 8:
|
|
func_800871AC(objectIndex, 90);
|
|
break;
|
|
case 9:
|
|
f32_step_towards(&gObjectList[objectIndex].velocity[1], 0.0f, 0.05f);
|
|
if (func_80087060(objectIndex, 90) != 0) {
|
|
func_8008701C(objectIndex, 3);
|
|
}
|
|
break;
|
|
}
|
|
object_add_velocity_offset_y(objectIndex);
|
|
gObjectList[objectIndex].direction_angle[1] += 0x100;
|
|
}
|
|
|
|
void OHotAirBalloon::func_80085768(s32 objectIndex) {
|
|
switch (gObjectList[objectIndex].state) { /* irregular */
|
|
case 1:
|
|
OHotAirBalloon::init_hot_air_balloon(objectIndex);
|
|
break;
|
|
case 0:
|
|
case 2:
|
|
break;
|
|
}
|
|
}
|