summaryrefslogtreecommitdiff
path: root/src/engine/objects/Flagpole.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/objects/Flagpole.cpp')
-rw-r--r--src/engine/objects/Flagpole.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/engine/objects/Flagpole.cpp b/src/engine/objects/Flagpole.cpp
new file mode 100644
index 000000000..682f74915
--- /dev/null
+++ b/src/engine/objects/Flagpole.cpp
@@ -0,0 +1,85 @@
+#include "Flagpole.h"
+#include "World.h"
+
+extern "C" {
+#include "code_800029B0.h"
+#include "render_objects.h"
+#include "update_objects.h"
+#include "assets/yoshi_valley_data.h"
+#include "assets/common_data.h"
+#include "math_util.h"
+#include "math_util_2.h"
+#include "code_80086E70.h"
+#include "code_80057C60.h"
+}
+
+size_t OFlagpole::_count = 0;
+
+OFlagpole::OFlagpole(const FVector& pos, s16 direction) {
+ _idx = _count;
+ _pos = pos;
+ _direction = direction;
+
+ init_object(indexObjectList1[_idx], 0);
+
+ _count++;
+}
+
+void OFlagpole::Tick() { // func_80083080
+ s32 objectIndex = indexObjectList1[_idx];
+
+ if (gObjectList[objectIndex].state != 0) {
+ OFlagpole::func_80083018(objectIndex);
+ OFlagpole::func_80083060(objectIndex);
+ }
+}
+
+void OFlagpole::Draw(s32 cameraId) { // func_80055228
+ s32 objectIndex = indexObjectList1[_idx];
+
+ func_8008A364(objectIndex, cameraId, 0x4000U, 0x000005DC);
+ if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) {
+ OFlagpole::func_80055164(objectIndex);
+ }
+}
+
+void OFlagpole::func_80055164(s32 objectIndex) { // func_80055164
+ if (gObjectList[objectIndex].state >= 2) {
+ gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D0077A0);
+ rsp_set_matrix_transformation(gObjectList[objectIndex].pos, gObjectList[objectIndex].direction_angle,
+ gObjectList[objectIndex].sizeScaling);
+ if (gIsGamePaused == 0) {
+ gObjectList[objectIndex].unk_0A2 = render_animated_model((Armature*) gObjectList[objectIndex].model,
+ (Animation**) gObjectList[objectIndex].vertex, 0,
+ gObjectList[objectIndex].unk_0A2);
+ } else {
+ render_animated_model((Armature*) gObjectList[objectIndex].model,
+ (Animation**) gObjectList[objectIndex].vertex, 0, gObjectList[objectIndex].unk_0A2);
+ }
+ }
+}
+
+void OFlagpole::func_80082F1C(s32 objectIndex) {
+ gObjectList[objectIndex].model = (Gfx*) d_course_yoshi_valley_unk5;
+ gObjectList[objectIndex].vertex = (Vtx*) d_course_yoshi_valley_unk4;
+ gObjectList[objectIndex].sizeScaling = 0.027f;
+ object_next_state(objectIndex);
+ set_obj_origin_pos(objectIndex, _pos.x * xOrientation, _pos.y, _pos.z);
+ set_obj_origin_offset(objectIndex, 0.0f, 0.0f, 0.0f);
+ set_obj_direction_angle(objectIndex, 0U, _direction, 0U);
+}
+
+void OFlagpole::func_80083018(s32 objectIndex) {
+ switch (gObjectList[objectIndex].state) {
+ case 1:
+ OFlagpole::func_80082F1C(objectIndex);
+ break;
+ case 0:
+ default:
+ break;
+ }
+}
+
+void OFlagpole::func_80083060(s32 objectIndex) {
+ object_calculate_new_pos_offset(objectIndex);
+}