mirror of
https://github.com/HarbourMasters/SpaghettiKart
synced 2026-06-19 07:57:00 -04:00
Impl new intro (#193)
* Update menus
* Update CMakeLists.txt
* Add Ship
* Impl hm ship actors
* Update HM course
* Impl new intro
* Finish intro scene
* Rename
* Start Editor Work
* raycast works
* Fix ScreenRayTrace in widescreen
* Basic Actor Picking
* wip
* Editor use vtx collision
* gizmo work
* otr works for object picking
* Impl objects for editor
* actor init
* Update
* Add all axis move (freemove)
* Docking Windows works here
* Setup imgui layout for editor
* Editor Snap to Ground works
* Basic Scene Explorer Works
* Editor get actor names
* Impl editor object names
* impl Editor Play and Pause buttons
* Editor translate works while paused
* Fix freecam lighting
* Added adjustable track properties to editor
* Editor matrix, icons, rotation, impl light
* Setup Track Properties 1
* Editor tooling wip
* Load modded o2rs
* Don't enable hud if editor is enabled
* Updates
* SceneManager nearly working
* Fix mario kart 64 intro logo sizing
* Fix Rotator
* Finish new matrix translation code
* Cleanup headers
* Cleanup
* Cleanup 2
* Cleanup 3
* Prevent divize by zero crash
* Add visible circle for translate in all axis
* Editor scaling/rot works properly now
* Scale All_Axis evenly
* Fixes to includes to work on Linux.
* Removed overfilled arguments in gfx_create_framebuffer()
* Added missing function definitions to Game.h
* Editor sun face the camera
* Add rotation model to gizmo
* Add new handles
* Failed attempt at transforming collision
* Impl water volume
* Import fast64 paths
* water surface
* Scene Setup 1
* Custom Track O2R almost working needs testing
* Custom Track Load path O2r
* Render custom track. Wip collision
* Add missing function
* Debug Spawning Custom O2R Track
* Import courses working now
* Fix memory leak
* Remove New Track Button
* Engine.cpp more consistent with sf64
* Fix Editor Enable Button
* Editor Accurate mouse click drag objects
* Editor selects closest object and cleanup
* Gizmo rot and scale collision working
* Remove constexpr from IRotator
* Impl properties for location/rot/scale
* Better Properties display, swap rot handles
* Fix content browser dock and editor now disabled by default
* Remove GameInfoWindow, Multiplayer Button, and FPS Slider
* Disable Editor when its disabled
* Add new logo to hm intro
* Fix pause menu item box cursor
* Remove minimap from Course::from_json and to_json
* Impl Import Minimap
* Fix custom minimap rendering
* minimap uses extension .png
* Refactor minimap
* Freecam only for player 1
* GrandPrix Balloons work in custom track
* Track Id is now std::string and outside of Props
* Moved editor assets to be included in ship.o2r
* Fixed GenerateO2R to package the correct folder and save to the correct filename
* Linux specific changes.
* Added "#include <stdio.h>" that required them
* Changed how the "ship.o2r" file is loaded to allow it to load the file from within appimages.
* Changed the Linuxdeploy version to avoid errors later when the Github Actions creates appimages(same fix applied to other ports.)
* Revert "Moved editor assets to be included in ship.o2r"
This reverts commit 05704c01f7.
* Added back files(this time without LUS changes)
* Changed workflow file to use correct filename for assets file.
* Missed a few spots in the workflow file.
* Added .desktop file and made corrections to the main workflow.
* Added the rest of upstream CMakeLists.txt
* disabled USE_NETWORKING
* New InverseMatrix
* Renamed both .o2r files to be more accurate to its contents.
* Reverted CmakeList.txt
---------
Co-authored-by: MegaMech <7255464+MegaMech@users.noreply.github.com>
Co-authored-by: sitton76 <58642183+sitton76@users.noreply.github.com>
This commit is contained in:
@@ -18,8 +18,8 @@ const char* sBoardwalkTexList[] = { gTextureBat1, gTextureBat2, gTextureBat3, gT
|
||||
|
||||
size_t OBat::_count = 0;
|
||||
|
||||
OBat::OBat(const FVector& pos, const FRotation& rot) {
|
||||
|
||||
OBat::OBat(const FVector& pos, const IRotator& rot) {
|
||||
Name = "Bat";
|
||||
find_unused_obj_index(&_objectIndex);
|
||||
|
||||
init_texture_object(_objectIndex, (uint8_t*)d_course_banshee_boardwalk_bat_tlut, sBoardwalkTexList, 0x20U,
|
||||
|
||||
@@ -21,14 +21,14 @@ extern "C" {
|
||||
/**
|
||||
* OBat
|
||||
*
|
||||
* FRotation does not appear to do anything.
|
||||
* IRotator does not appear to do anything.
|
||||
* Could not find where origin_pos was at.
|
||||
* So pos does not work either
|
||||
*
|
||||
*/
|
||||
class OBat : public OObject {
|
||||
public:
|
||||
explicit OBat(const FVector& pos, const FRotation& rot);
|
||||
explicit OBat(const FVector& pos, const IRotator& rot);
|
||||
|
||||
~OBat() {
|
||||
_count--;
|
||||
@@ -51,10 +51,8 @@ public:
|
||||
void func_8007D794(s32 objectIndex);
|
||||
void func_8007DA4C(s32 objectIndex);
|
||||
|
||||
|
||||
private:
|
||||
FVector _pos;
|
||||
static size_t _count;
|
||||
size_t _idx;
|
||||
s32 _objectIndex;
|
||||
};
|
||||
|
||||
@@ -29,7 +29,8 @@ extern s8 gPlayerCount;
|
||||
|
||||
size_t OBombKart::_count = 0;
|
||||
|
||||
OBombKart::OBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex, uint16_t state, f32 unk_3C) {
|
||||
OBombKart::OBombKart(FVector pos, TrackWaypoint* waypoint, uint16_t waypointIndex, uint16_t state, f32 unk_3C) {
|
||||
Name = "Bomb Kart";
|
||||
_idx = _count;
|
||||
Vec3f _pos = {0, 0, 0};
|
||||
|
||||
@@ -41,10 +42,10 @@ OBombKart::OBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex,
|
||||
|
||||
// Set height to the default value of 2000.0f unless Pos[1] is higher.
|
||||
// This allows placing these on very high surfaces.
|
||||
f32 height = (pos[1] > 2000.0f) ? pos[1] : 2000.0f;
|
||||
_pos[0] = pos[0];
|
||||
_pos[1] = spawn_actor_on_surface(pos[0], height, pos[2]);
|
||||
_pos[2] = pos[2];
|
||||
f32 height = (pos.y > 2000.0f) ? pos.y : 2000.0f;
|
||||
_pos[0] = pos.x;
|
||||
_pos[1] = spawn_actor_on_surface(pos.x, height, pos.z);
|
||||
_pos[2] = pos.z;
|
||||
}
|
||||
|
||||
WaypointIndex = waypointIndex;
|
||||
@@ -72,7 +73,7 @@ OBombKart::OBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex,
|
||||
WheelPos[3][2] = _pos[2];
|
||||
check_bounding_collision(&_Collision, 2.0f, _pos[0], _pos[1], _pos[2]);
|
||||
|
||||
find_unused_obj_index(&ObjectIndex);
|
||||
find_unused_obj_index(&_objectIndex);
|
||||
|
||||
_count++;
|
||||
}
|
||||
@@ -329,7 +330,7 @@ void OBombKart::Tick() {
|
||||
void OBombKart::Draw(s32 cameraId) {
|
||||
if (gModeSelection == BATTLE) {
|
||||
for (size_t playerId = 0; playerId < NUM_BOMB_KARTS_BATTLE; playerId++) {
|
||||
Object* object = &gObjectList[ObjectIndex];
|
||||
Object* object = &gObjectList[_objectIndex];
|
||||
if (object->state != 0) {
|
||||
s32 primAlpha = object->primAlpha;
|
||||
Player* player = &gPlayerOne[playerId];
|
||||
@@ -337,9 +338,9 @@ void OBombKart::Draw(s32 cameraId) {
|
||||
object->pos[1] = player->pos[1] - 2.0;
|
||||
object->pos[2] = player->pos[2];
|
||||
object->surfaceHeight = player->unk_074;
|
||||
func_800563DC(ObjectIndex, cameraId, primAlpha);
|
||||
func_8005669C(ObjectIndex, cameraId, primAlpha);
|
||||
func_800568A0(ObjectIndex, cameraId);
|
||||
func_800563DC(_objectIndex, cameraId, primAlpha);
|
||||
func_8005669C(_objectIndex, cameraId, primAlpha);
|
||||
func_800568A0(_objectIndex, cameraId);
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -358,27 +359,27 @@ void OBombKart::Draw(s32 cameraId) {
|
||||
}
|
||||
Camera* camera = &camera1[cameraId];
|
||||
if (cameraId == PLAYER_ONE) {
|
||||
if (is_obj_flag_status_active(ObjectIndex, 0x00200000) != 0) {
|
||||
if (is_obj_flag_status_active(_objectIndex, 0x00200000) != 0) {
|
||||
Unk_4A = 0;
|
||||
} else if (gGamestate != ENDING) {
|
||||
Unk_4A = 1;
|
||||
}
|
||||
clear_object_flag(ObjectIndex, 0x00200000);
|
||||
clear_object_flag(_objectIndex, 0x00200000);
|
||||
}
|
||||
|
||||
// huh???
|
||||
s32 state = State;
|
||||
if (State != States::DISABLED) {
|
||||
gObjectList[ObjectIndex].pos[0] = Pos[0];
|
||||
gObjectList[ObjectIndex].pos[1] = Pos[1];
|
||||
gObjectList[ObjectIndex].pos[2] = Pos[2];
|
||||
s32 temp_s4 = func_8008A364(ObjectIndex, cameraId, 0x31C4U, 0x000001F4);
|
||||
if (is_obj_flag_status_active(ObjectIndex, VISIBLE) != 0) {
|
||||
set_object_flag(ObjectIndex, 0x00200000);
|
||||
gObjectList[_objectIndex].pos[0] = Pos[0];
|
||||
gObjectList[_objectIndex].pos[1] = Pos[1];
|
||||
gObjectList[_objectIndex].pos[2] = Pos[2];
|
||||
s32 temp_s4 = func_8008A364(_objectIndex, cameraId, 0x31C4U, 0x000001F4);
|
||||
if (is_obj_flag_status_active(_objectIndex, VISIBLE) != 0) {
|
||||
set_object_flag(_objectIndex, 0x00200000);
|
||||
D_80183E80[0] = 0;
|
||||
D_80183E80[1] = func_800418AC(Pos[0], Pos[2], camera->pos);
|
||||
D_80183E80[2] = 0x8000;
|
||||
func_800563DC(ObjectIndex, cameraId, 0x000000FF);
|
||||
func_800563DC(_objectIndex, cameraId, 0x000000FF);
|
||||
OBombKart::SomeRender(camera->pos);
|
||||
if (((u32) temp_s4 < 0x4E21U) && (state != BOMB_STATE_EXPLODED)) {
|
||||
OBombKart::LoadMtx();
|
||||
|
||||
@@ -47,11 +47,10 @@ public:
|
||||
u16 Unk_4A = 0;
|
||||
s16 Unk_4C = 1;
|
||||
f32 CenterY; // Center of the circle
|
||||
s32 ObjectIndex = 0; // Index into gObjectList
|
||||
Collision _Collision;
|
||||
|
||||
// Set waypoint to NULL if using a spawn position and not a waypoint.
|
||||
explicit OBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex, uint16_t state, f32 unk_3C);
|
||||
explicit OBombKart(FVector pos, TrackWaypoint* waypoint, uint16_t waypointIndex, uint16_t state, f32 unk_3C);
|
||||
|
||||
~OBombKart() {
|
||||
_count--;
|
||||
|
||||
@@ -23,6 +23,7 @@ extern "C" {
|
||||
size_t OBoos::_count = 0;
|
||||
|
||||
OBoos::OBoos(size_t numBoos, const IPathSpan& leftBoundary, const IPathSpan& active, const IPathSpan& rightBoundary) {
|
||||
Name = "Boos";
|
||||
// Max five boos allowed due to limited splines
|
||||
// D_800E5D9C
|
||||
if (numBoos > 10) {
|
||||
|
||||
@@ -17,9 +17,10 @@ extern "C" {
|
||||
size_t OChainChomp::_count = 0;
|
||||
|
||||
OChainChomp::OChainChomp() {
|
||||
Name = "Chain Chomp";
|
||||
_idx = _count;
|
||||
init_object(indexObjectList2[_count], 0);
|
||||
|
||||
_objectIndex = indexObjectList2[_count];
|
||||
|
||||
_count++;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ extern Lights1 D_800E45C0[];
|
||||
}
|
||||
|
||||
OCheepCheep::OCheepCheep(const FVector& pos, CheepType type, IPathSpan span) {
|
||||
Name = "Cheep Cheep";
|
||||
_type = type;
|
||||
_spawnPos = pos;
|
||||
_span = span;
|
||||
|
||||
@@ -28,6 +28,7 @@ extern "C" {
|
||||
size_t OCrab::_count = 0;
|
||||
|
||||
OCrab::OCrab(const FVector2D& start, const FVector2D& end) {
|
||||
Name = "Crab";
|
||||
_idx = _count;
|
||||
_start = start;
|
||||
_end = end;
|
||||
|
||||
@@ -46,5 +46,4 @@ private:
|
||||
FVector2D _end;
|
||||
static size_t _count;
|
||||
s32 _idx;
|
||||
s32 _objectIndex;
|
||||
};
|
||||
|
||||
@@ -16,6 +16,7 @@ extern "C" {
|
||||
size_t OFlagpole::_count = 0;
|
||||
|
||||
OFlagpole::OFlagpole(const FVector& pos, s16 direction) {
|
||||
Name = "Flagpole";
|
||||
_idx = _count;
|
||||
_pos = pos;
|
||||
_direction = direction;
|
||||
|
||||
@@ -42,5 +42,4 @@ private:
|
||||
s16 _direction;
|
||||
static size_t _count;
|
||||
size_t _idx;
|
||||
s32 _objectIndex;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,231 @@
|
||||
#include "GrandPrixBalloons.h"
|
||||
|
||||
#include "port/Game.h"
|
||||
#include "assets/other_textures.h"
|
||||
#include "assets/common_data.h"
|
||||
|
||||
extern "C" {
|
||||
#include "update_objects.h"
|
||||
#include "render_objects.h"
|
||||
#include "code_80057C60.h"
|
||||
#include "code_80086E70.h"
|
||||
#include "math_util.h"
|
||||
#include "math_util_2.h"
|
||||
#include "menus.h"
|
||||
}
|
||||
|
||||
size_t OGrandPrixBalloons::_count = 0;
|
||||
|
||||
OGrandPrixBalloons::OGrandPrixBalloons(const FVector& pos) {
|
||||
Pos = pos;
|
||||
|
||||
_active = 1;
|
||||
if (gPlayerCount == 1) {
|
||||
_numBalloons = 0x64;
|
||||
_numBalloons2 = 0x3C;
|
||||
_numBalloons3 = 0x1E;
|
||||
} else {
|
||||
_numBalloons = 0x32;
|
||||
_numBalloons2 = 0x1E;
|
||||
_numBalloons3 = 0xA;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < _numBalloons; i++) {
|
||||
find_unused_obj_index(&gObjectParticle3[i]);
|
||||
init_object(gObjectParticle3[i], 0);
|
||||
}
|
||||
}
|
||||
|
||||
void OGrandPrixBalloons::Tick() {
|
||||
s32 someIndex;
|
||||
s32 objectIndex;
|
||||
s32 someCount;
|
||||
Object* object;
|
||||
|
||||
if (!_active) {
|
||||
return;
|
||||
}
|
||||
someCount = 0;
|
||||
for (someIndex = 0; someIndex < _numBalloons; someIndex++) {
|
||||
objectIndex = gObjectParticle3[someIndex];
|
||||
if (objectIndex != DELETED_OBJECT_ID) {
|
||||
object = &gObjectList[objectIndex];
|
||||
if (object->state != 0) {
|
||||
OGrandPrixBalloons::func_80074E28(objectIndex);
|
||||
OGrandPrixBalloons::func_80074D94(objectIndex);
|
||||
if (object->state == 0) {
|
||||
delete_object_wrapper(&gObjectParticle3[someIndex]);
|
||||
this->Destroy();
|
||||
}
|
||||
someCount += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (someCount == 0) {
|
||||
_active = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void OGrandPrixBalloons::Draw(s32 cameraId) {
|
||||
s32 var_s1;
|
||||
s32 objectIndex;
|
||||
if (!_active) {
|
||||
return;
|
||||
}
|
||||
|
||||
gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007E98);
|
||||
gDPLoadTLUT_pal256(gDisplayListHead++, gTLUTOnomatopoeia);
|
||||
func_8004B614(0, 0, 0, 0, 0, 0, 0);
|
||||
gDPSetAlphaCompare(gDisplayListHead++, G_AC_THRESHOLD);
|
||||
gDPSetRenderMode(gDisplayListHead++,
|
||||
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL |
|
||||
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA),
|
||||
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL |
|
||||
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA));
|
||||
D_80183E80[0] = 0;
|
||||
D_80183E80[1] = 0x8000;
|
||||
rsp_load_texture((uint8_t*)gTextureBalloon1, 64, 32);
|
||||
for (var_s1 = 0; var_s1 < _numBalloons; var_s1++) {
|
||||
objectIndex = gObjectParticle3[var_s1];
|
||||
if ((objectIndex != NULL_OBJECT_ID) && (gObjectList[objectIndex].state >= 2)) {
|
||||
OGrandPrixBalloons::func_80053D74(objectIndex, cameraId, 0);
|
||||
}
|
||||
}
|
||||
rsp_load_texture((uint8_t*)gTextureBalloon2, 64, 32);
|
||||
for (var_s1 = 0; var_s1 < _numBalloons; var_s1++) {
|
||||
objectIndex = gObjectParticle3[var_s1];
|
||||
if ((objectIndex != NULL_OBJECT_ID) && (gObjectList[objectIndex].state >= 2)) {
|
||||
OGrandPrixBalloons::func_80053D74(objectIndex, cameraId, 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OGrandPrixBalloons::func_80053D74(s32 objectIndex, UNUSED s32 arg1, s32 vertexIndex) {
|
||||
Object* object;
|
||||
|
||||
Vtx* vtx = (Vtx*) LOAD_ASSET_RAW(common_vtx_hedgehog);
|
||||
|
||||
if (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX) {
|
||||
object = &gObjectList[objectIndex];
|
||||
D_80183E80[2] = (s16) (object->unk_084[6] + 0x8000);
|
||||
rsp_set_matrix_transformation(object->pos, (u16*) D_80183E80, object->sizeScaling);
|
||||
set_color_render((s32) object->unk_084[0], (s32) object->unk_084[1], (s32) object->unk_084[2],
|
||||
(s32) object->unk_084[3], (s32) object->unk_084[4], (s32) object->unk_084[5],
|
||||
(s32) object->primAlpha);
|
||||
gSPVertex(gDisplayListHead++, (uintptr_t)&vtx[vertexIndex], 4, 0);
|
||||
gSPDisplayList(gDisplayListHead++, (Gfx*)common_rectangle_display);
|
||||
}
|
||||
}
|
||||
|
||||
void OGrandPrixBalloons::func_80074924(s32 objectIndex) {
|
||||
s32 sp2C = 0;
|
||||
s32 sp28;
|
||||
s32 sp24;
|
||||
s32 sp20 = 0;
|
||||
s32 temp_a0;
|
||||
Object* object;
|
||||
|
||||
object = &gObjectList[objectIndex];
|
||||
object->sizeScaling = 0.15f;
|
||||
|
||||
if (GetCourse() == GetMarioRaceway()) {
|
||||
sp2C = random_int(0x00C8U);
|
||||
sp28 = random_int(_numBalloons3);
|
||||
sp24 = random_int(0x0096U);
|
||||
sp20 = random_int(0x2000U);
|
||||
object->origin_pos[0] = (f32) ((((f64) Pos.x + 100.0) - (f64) sp2C) * (f64) xOrientation);
|
||||
object->origin_pos[1] = (f32) (Pos.y + sp28);
|
||||
object->origin_pos[2] = (f32) (((f64) Pos.z + 200.0) - (f64) sp24);
|
||||
} else if (GetCourse() == GetRoyalRaceway()) {
|
||||
sp2C = random_int(0x0168U);
|
||||
sp28 = random_int(_numBalloons3);
|
||||
sp24 = random_int(0x00B4U);
|
||||
sp20 = random_int(0x2000U);
|
||||
object->origin_pos[0] = (f32) ((((f64) Pos.x + 180.0) - (f64) sp2C) * (f64) xOrientation);
|
||||
object->origin_pos[1] = (f32) (Pos.y + sp28);
|
||||
object->origin_pos[2] = (f32) (((f64) Pos.z + 200.0) - (f64) sp24);
|
||||
} else if (GetCourse() == GetLuigiRaceway()) {
|
||||
sp2C = random_int(0x012CU);
|
||||
sp28 = random_int(_numBalloons3);
|
||||
sp24 = random_int(0x0096U);
|
||||
sp20 = random_int(0x2000U);
|
||||
object->origin_pos[0] = (f32) ((((f64) Pos.x + 150.0) - (f64) sp2C) * (f64) xOrientation);
|
||||
object->origin_pos[1] = (f32) (Pos.y + sp28);
|
||||
object->origin_pos[2] = (f32) (((f64) Pos.z + 200.0) - (f64) sp24);
|
||||
} else { // any track
|
||||
sp2C = random_int(0x00C8U);
|
||||
sp28 = random_int(_numBalloons3);
|
||||
sp24 = random_int(0x0096U);
|
||||
sp20 = random_int(0x2000U);
|
||||
object->origin_pos[0] = (f32) ((((f64) Pos.x + 100.0) - (f64) sp2C) * (f64) xOrientation);
|
||||
object->origin_pos[1] = (f32) (Pos.y + sp28);
|
||||
object->origin_pos[2] = (f32) (((f64) Pos.z + 200.0) - (f64) sp24);
|
||||
}
|
||||
|
||||
set_obj_origin_offset(objectIndex, 0, 0, 0);
|
||||
if (gPlayerCount == 1) {
|
||||
object->velocity[1] = (f32) (((f64) (f32) (sp2C % 4) * 0.25) + 0.8);
|
||||
} else {
|
||||
object->velocity[1] = (f32) (((f64) (f32) (sp2C % 3) * 0.2) + 0.4);
|
||||
}
|
||||
temp_a0 = sp2C % 8;
|
||||
object->unk_084[0] = D_800E6F30[temp_a0][0];
|
||||
object->unk_084[1] = D_800E6F30[temp_a0][1];
|
||||
object->unk_084[2] = D_800E6F30[temp_a0][2];
|
||||
object->unk_084[3] = D_800E6F48[temp_a0][0];
|
||||
object->unk_084[4] = D_800E6F48[temp_a0][1];
|
||||
object->unk_084[5] = D_800E6F48[temp_a0][2];
|
||||
object->unk_084[6] = sp20 - 0x1000;
|
||||
if (sp2C & 1) {
|
||||
object->unk_084[7] = (sp20 / 32) + 0x100;
|
||||
} else {
|
||||
object->unk_084[7] = -0x100 - (sp20 / 32);
|
||||
}
|
||||
object->primAlpha = 0x00E6;
|
||||
object_next_state(objectIndex);
|
||||
}
|
||||
|
||||
void OGrandPrixBalloons::func_80074D94(s32 objectIndex) {
|
||||
if (gObjectList[objectIndex].unk_0AE == 1) {
|
||||
if ((_numBalloons2 <= gObjectList[objectIndex].offset[1]) &&
|
||||
(s16_step_down_towards(&gObjectList[objectIndex].primAlpha, 0, 8) != 0)) {
|
||||
func_80086F60(objectIndex);
|
||||
}
|
||||
object_add_velocity_offset_y(objectIndex);
|
||||
}
|
||||
object_calculate_new_pos_offset(objectIndex);
|
||||
}
|
||||
|
||||
void OGrandPrixBalloons::func_80074E28(s32 objectIndex) {
|
||||
switch (gObjectList[objectIndex].state) {
|
||||
case 1:
|
||||
OGrandPrixBalloons::func_80074924(objectIndex);
|
||||
break;
|
||||
case 2:
|
||||
if (set_and_run_timer_object(objectIndex, 1) != false) {
|
||||
func_80086E70(objectIndex);
|
||||
break;
|
||||
}
|
||||
case 0:
|
||||
break;
|
||||
case 3:
|
||||
OGrandPrixBalloons::func_80041480(&gObjectList[objectIndex].unk_084[6], -0x1000, 0x1000, &gObjectList[objectIndex].unk_084[7]);
|
||||
if (gObjectList[objectIndex].unk_0AE == 0) {
|
||||
func_80072428(objectIndex);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OGrandPrixBalloons::func_80041480(s16* arg0, s16 arg1, s16 arg2, s16* arg3) {
|
||||
*arg0 += *arg3;
|
||||
if (*arg3 >= 0) {
|
||||
if (*arg0 >= arg2) {
|
||||
*arg0 = arg2;
|
||||
*arg3 = -*arg3;
|
||||
}
|
||||
} else if (arg1 >= *arg0) {
|
||||
*arg0 = arg1;
|
||||
*arg3 = -*arg3;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
#pragma once
|
||||
|
||||
#include <libultraship.h>
|
||||
#include <vector>
|
||||
|
||||
#include "engine/World.h"
|
||||
#include "engine/objects/Object.h"
|
||||
|
||||
extern "C" {
|
||||
#include "macros.h"
|
||||
#include "main.h"
|
||||
#include "vehicles.h"
|
||||
#include "waypoints.h"
|
||||
#include "common_structs.h"
|
||||
#include "objects.h"
|
||||
#include "camera.h"
|
||||
#include "some_data.h"
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Grand Prix Balloons OObject
|
||||
*/
|
||||
class OGrandPrixBalloons : public OObject {
|
||||
public:
|
||||
|
||||
explicit OGrandPrixBalloons(const FVector& pos);
|
||||
|
||||
~OGrandPrixBalloons() {
|
||||
_count--;
|
||||
}
|
||||
|
||||
static size_t GetCount() {
|
||||
return _count;
|
||||
}
|
||||
|
||||
virtual void Tick() override;
|
||||
virtual void Draw(s32 cameraId) override;
|
||||
void func_80053D74(s32 objectIndex, UNUSED s32 arg1, s32 vertexIndex);
|
||||
|
||||
void func_80074924(s32 objectIndex);
|
||||
void func_80074D94(s32 objectIndex);
|
||||
void func_80074E28(s32 objectIndex);
|
||||
void func_80041480(s16* arg0, s16 arg1, s16 arg2, s16* arg3); // Some weird math function
|
||||
|
||||
private:
|
||||
static size_t _count;
|
||||
s32 _idx;
|
||||
FVector Pos;
|
||||
bool _active;
|
||||
size_t _numBalloons;
|
||||
size_t _numBalloons2;
|
||||
size_t _numBalloons3;
|
||||
};
|
||||
@@ -15,10 +15,12 @@ extern "C" {
|
||||
size_t OHedgehog::_count = 0;
|
||||
|
||||
OHedgehog::OHedgehog(const FVector& pos, const FVector2D& patrolPoint, s16 unk) {
|
||||
Name = "Hedgehog";
|
||||
_idx = _count;
|
||||
_pos = pos;
|
||||
|
||||
s32 objectId = indexObjectList2[_idx];
|
||||
_objectIndex = objectId;
|
||||
init_object(objectId, 0);
|
||||
gObjectList[objectId].pos[0] = gObjectList[objectId].origin_pos[0] = pos.x * xOrientation;
|
||||
gObjectList[objectId].pos[1] = gObjectList[objectId].surfaceHeight = pos.y + 6.0;
|
||||
|
||||
@@ -15,6 +15,7 @@ extern "C" {
|
||||
}
|
||||
|
||||
OHotAirBalloon::OHotAirBalloon(const FVector& pos) {
|
||||
Name = "Hot Air Balloon";
|
||||
_pos = pos;
|
||||
|
||||
D_80165898 = 0;
|
||||
|
||||
@@ -31,5 +31,4 @@ public:
|
||||
private:
|
||||
FVector _pos;
|
||||
bool *_visible;
|
||||
s32 _objectIndex;
|
||||
};
|
||||
|
||||
@@ -37,6 +37,7 @@ extern s8 gPlayerCount;
|
||||
}
|
||||
|
||||
OLakitu::OLakitu(s32 playerId, LakituType type) {
|
||||
Name = "Lakitu";
|
||||
_playerId = playerId;
|
||||
|
||||
init_object(gIndexLakituList[playerId], (s32)type);
|
||||
|
||||
@@ -25,6 +25,7 @@ extern "C" {
|
||||
size_t OMole::_count = 0;
|
||||
|
||||
OMole::OMole(FVector pos, OMoleGroup* group) {
|
||||
Name = "Mole";
|
||||
_idx = _count;
|
||||
_group = group;
|
||||
|
||||
|
||||
@@ -40,7 +40,6 @@ public:
|
||||
void func_80081790(s32 objectIndex);
|
||||
void func_8008153C(s32 objectIndex);
|
||||
|
||||
s32 _objectIndex;
|
||||
s32 _moleIndex;
|
||||
private:
|
||||
static size_t _count;
|
||||
|
||||
@@ -18,6 +18,6 @@ void OObject::Tick60fps() {}
|
||||
void OObject::Draw(s32 cameraId) { }
|
||||
void OObject::Expire() { }
|
||||
void OObject::Destroy() {
|
||||
PendingDestroy = true;
|
||||
bPendingDestroy = true;
|
||||
}
|
||||
void OObject::Reset() { }
|
||||
|
||||
@@ -11,7 +11,9 @@ class OObject {
|
||||
public:
|
||||
uint8_t uuid[16];
|
||||
Object o;
|
||||
bool PendingDestroy = false;
|
||||
const char* Name = "";
|
||||
bool bPendingDestroy = false;
|
||||
s32 _objectIndex = -1;
|
||||
|
||||
virtual ~OObject() = default;
|
||||
|
||||
|
||||
@@ -34,7 +34,8 @@ extern s8 gPlayerCount;
|
||||
}
|
||||
|
||||
|
||||
OPenguin::OPenguin(Vec3f pos, u16 direction, PenguinType type, Behaviour behaviour) {
|
||||
OPenguin::OPenguin(FVector pos, u16 direction, PenguinType type, Behaviour behaviour) {
|
||||
Name = "Penguin";
|
||||
_type = type;
|
||||
_bhv = behaviour;
|
||||
|
||||
@@ -43,9 +44,9 @@ OPenguin::OPenguin(Vec3f pos, u16 direction, PenguinType type, Behaviour behavio
|
||||
init_object(_objectIndex, 0);
|
||||
|
||||
Object *object = &gObjectList[_objectIndex];
|
||||
object->origin_pos[0] = pos[0] * xOrientation;
|
||||
object->origin_pos[1] = pos[1];
|
||||
object->origin_pos[2] = pos[2];
|
||||
object->origin_pos[0] = pos.x * xOrientation;
|
||||
object->origin_pos[1] = pos.y;
|
||||
object->origin_pos[2] = pos.z;
|
||||
object->unk_0C6 = direction;
|
||||
|
||||
switch(type) {
|
||||
|
||||
@@ -38,7 +38,7 @@ public:
|
||||
f32 Diameter = 0.0f; // Waddle in a circle around the spawn point at this diameter.
|
||||
uint16_t MirrorModeAngleOffset;
|
||||
|
||||
explicit OPenguin(Vec3f pos, u16 direction, PenguinType type, Behaviour behaviour);
|
||||
explicit OPenguin(FVector pos, u16 direction, PenguinType type, Behaviour behaviour);
|
||||
|
||||
virtual void Tick() override;
|
||||
virtual void Draw(s32 cameraId) override;
|
||||
@@ -55,7 +55,6 @@ private:
|
||||
void InitOtherPenguin(s32 objectIndex);
|
||||
|
||||
static bool _toggle;
|
||||
s32 _objectIndex;
|
||||
PenguinType _type;
|
||||
Behaviour _bhv;
|
||||
};
|
||||
|
||||
@@ -26,7 +26,7 @@ extern Vec3s D_800E634C[];
|
||||
// };
|
||||
|
||||
OPodium::OPodium(const FVector& pos) {
|
||||
|
||||
Name = "Podium";
|
||||
_pos = pos;
|
||||
|
||||
find_unused_obj_index(&_podium1Index);
|
||||
|
||||
@@ -32,6 +32,7 @@ SplineData* D_800E633C[] = { &D_800E6034, &D_800E60F0, &D_800E61B4, &D_800E6280
|
||||
size_t OSeagull::_count = 0;
|
||||
|
||||
OSeagull::OSeagull(FVector pos) {
|
||||
Name = "Seagull";
|
||||
_idx = _count;
|
||||
_pos.x = pos.x;
|
||||
_pos.y = pos.y;
|
||||
|
||||
@@ -38,7 +38,6 @@ public:
|
||||
void func_8008241C(s32 objectIndex, s32 arg1);
|
||||
void func_80082714(s32 objectIndex, s32 arg1);
|
||||
private:
|
||||
s32 _objectIndex;
|
||||
FVector _pos;
|
||||
static size_t _count;
|
||||
s32 _idx;
|
||||
|
||||
@@ -17,11 +17,13 @@ static const char* sSnowmanHeadList[] = { d_course_frappe_snowland_snowman_head
|
||||
size_t OSnowman::_count = 0;
|
||||
|
||||
OSnowman::OSnowman(const FVector& pos) {
|
||||
Name = "Snowman";
|
||||
_idx = _count;
|
||||
_pos = pos;
|
||||
|
||||
find_unused_obj_index(&_headIndex);
|
||||
init_object(_headIndex, 0);
|
||||
_objectIndex = _headIndex;
|
||||
gObjectList[_headIndex].origin_pos[0] = pos.x * xOrientation;
|
||||
gObjectList[_headIndex].origin_pos[1] = pos.y + 5.0 + 3.0;
|
||||
gObjectList[_headIndex].origin_pos[2] = pos.z;
|
||||
|
||||
@@ -50,7 +50,6 @@ private:
|
||||
FVector _pos;
|
||||
static size_t _count;
|
||||
size_t _idx;
|
||||
s32 _objectIndex;
|
||||
s32 _headIndex;
|
||||
s32 _bodyIndex;
|
||||
};
|
||||
|
||||
@@ -47,6 +47,7 @@ s16 D_800E597C[] = { 0x0000, 0x0000, 0x4000, 0x8000, 0x8000, 0xc000 };
|
||||
size_t OThwomp::_count = 0;
|
||||
|
||||
OThwomp::OThwomp(s16 x, s16 z, s16 direction, f32 scale, s16 behaviour, s16 primAlpha, u16 boundingBoxSize) {
|
||||
Name = "Thwomp";
|
||||
_idx = _count;
|
||||
_faceDirection = direction;
|
||||
_boundingBoxSize = boundingBoxSize;
|
||||
|
||||
@@ -113,7 +113,6 @@ public:
|
||||
private:
|
||||
static size_t _count;
|
||||
s32 _idx;
|
||||
s32 _objectIndex;
|
||||
s16 _faceDirection;
|
||||
//! @todo Write this better. This effects the squish size and the bounding box size.
|
||||
// We should probably return to the programmer the pointer to the actor so they can do thwomp->squishSize = value.
|
||||
|
||||
@@ -20,7 +20,8 @@ extern "C" {
|
||||
|
||||
#define DEGREES_FLOAT_TO_SHORT(Degrees) ((s16)((Degrees) * (0x8000 / 180.0f)))
|
||||
|
||||
OTrashBin::OTrashBin(const FVector& pos, const FRotation& rotation, f32 scale, OTrashBin::Behaviour bhv) {
|
||||
OTrashBin::OTrashBin(const FVector& pos, const IRotator& rotation, f32 scale, OTrashBin::Behaviour bhv) {
|
||||
Name = "Trashbin";
|
||||
_pos = pos;
|
||||
_rot = rotation;
|
||||
_scale = scale;
|
||||
|
||||
@@ -24,7 +24,7 @@ public:
|
||||
STATIC, // The lid stays shut
|
||||
MUNCHING // The lid opens/closes in a scary munching manner
|
||||
};
|
||||
explicit OTrashBin(const FVector& pos, const FRotation& rotation, f32 scale, OTrashBin::Behaviour bhv);
|
||||
explicit OTrashBin(const FVector& pos, const IRotator& rotation, f32 scale, OTrashBin::Behaviour bhv);
|
||||
|
||||
virtual void Tick() override;
|
||||
virtual void Draw(s32 cameraId) override;
|
||||
@@ -38,9 +38,8 @@ private:
|
||||
|
||||
Behaviour _bhv;
|
||||
FVector _pos;
|
||||
FRotation _rot;
|
||||
IRotator _rot;
|
||||
float _scale;
|
||||
size_t _idx;
|
||||
s32 _objectIndex;
|
||||
bool _drawBin = false;
|
||||
};
|
||||
|
||||
@@ -21,6 +21,7 @@ extern "C" {
|
||||
}
|
||||
|
||||
OTrophy::OTrophy(const FVector& pos, TrophyType trophy, Behaviour bhv) {
|
||||
Name = "Trophy";
|
||||
_trophy = trophy;
|
||||
_spawnPos = pos;
|
||||
_spawnPos.y += 16.0f; // Adjust the height so the trophy sits on the surface when positioned to 0,0,0
|
||||
|
||||
@@ -48,7 +48,6 @@ public:
|
||||
private:
|
||||
StarEmitter* _emitter;
|
||||
|
||||
s32 _objectIndex;
|
||||
TrophyType _trophy;
|
||||
FVector _spawnPos;
|
||||
Behaviour _bhv;
|
||||
|
||||
Reference in New Issue
Block a user