Files
st/src/024_MainGame/Train/UnkStruct_027e0d00.cpp
T
Yanis 5e934a8c9b Decompile overlay 24 (Part 3) (#68)
* name func_01ffd3d8 and func_01ffd400

* name func_01ffd3b0

* match func_ov024_020cf9d4 + improve the Random struct

* UnkStruct_027e0cf8_00_0C_024 45%

* match PassengerManager::GetRandomIndex

* UnkStruct_027e0cf8_00_0C_024 OK

* UnkStruct_027e0cf8_00_0C_024: do other sections

* UnkStruct_027e0cf8_08_024 55%

* cleanup: remplace delete into null by the delete macro

* UnkStruct_027e0cf8_08_024 OK

* fix build issues

* UnkStruct_ov024_020d86a0_024 OK

* PlayerActor_A0_38_024 .text OK, CreditsEndingType OK

* tools: create courselist.py to convert .CLB data to yaml

* UnkDataStruct4_14 OK

* UnkDataStruct4 17%

* UnkDataStruct4 OK

* MiscAdvManager OK

* PassengerManager OK

* fix build issues

* ZeldaTrainBinary OK

* mark PassengerManager as complete and adjust delinks

* UnkStruct_027e0cf8_08_00_024 OK

* document more of UnkStruct_027e0ce0

* savefile hotfixes

* UnkStruct_027e0ce0_34_024 OK

* code_020d46b4_024 OK

* UnkStruct_027e0d00 & UnkStruct_027e0d00_20 OK

* code_020d51dc_024 OK

* fix weird formatting

* UnkTrainSystem1 OK

* fix jp broken match

* UnkTrainSystem2 OK

* UnkStruct_027e0d08_024 31%

* fix build issues

* UnkStruct_027e0d08 OK!!!

* remove useless parenthesis

* ActorUnk_ov000_020a8bb0_EC OK

* move ActorUnk_ov000_020a8bb0_EC to MainGame/Actor/

* ActorUnkOBPC OK

* add sjiswrap support

* solve remaining gaps and fix build issues

* reorganise files + counter docs

* tools: remove format command execution from defaults
2026-06-09 23:01:32 +02:00

209 lines
6.3 KiB
C++

#include "Unknown/UnkStruct_027e0d00.hpp"
#include "MainGame/CargoManager.hpp"
#include "System/SysNew.hpp"
#include "Unknown/UnkStruct_027e09a4.hpp"
#include "Unknown/UnkStruct_027e0ce0.hpp"
#include "versions.h"
extern "C" bool func_ov026_020f4be0(int, int);
extern "C" unk32 func_02012fc4(unk32);
const UnkStruct_ov024_020d7624 data_ov024_020d7624 = {0x13, {0}};
static const unk32 data_ov024_020d764c[] = {0x0320, 0x0300, 0x0500, 0x0200};
static const unk32 data_ov024_020d763c[] = {0x0270, 0x0140, 0x0240, 0x0100};
static const unk32 data_ov024_020d762c[] = {0x444C, 0x2178, 0x203C, 0x15B8};
static const unk32 data_ov024_020d765c[] = {0x0080, 0x0000, 0x0000, 0x0000};
const unk32 data_ov024_020d766c[] = {0x0004, 0x0610, 0x03F0, 0x0450};
void UnkStruct_027e0d00::func_ov024_020d47c4(unk32 *param1, unk32 *param2, unk32 param3) {
UnkStruct_027e0ce0_34 *ptr = UnkStruct_027e0ce0::func_ov000_0205c904();
if (param3 < ptr->mUnk_2C) {
*param1 = ptr->func_ov024_020d3dec(param3);
*param2 = ptr->func_ov024_020d3e0c(param3);
} else if (param3 == 2) {
*param1 = 1;
*param2 = 0;
} else if (param3 == 3) {
*param1 = 3;
*param2 = 0;
}
}
UnkStruct_027e0d00 *UnkStruct_027e0d00::Create() {
return new(HeapIndex_1) UnkStruct_027e0d00();
}
unk32 UnkStruct_027e0d00::func_ov024_020d485c(unk32 param1, unk32 param2) {
switch (param2) {
case 0:
return data_ov024_020d765c[param1];
case 1:
return data_ov024_020d764c[param1];
case 2:
return data_ov024_020d763c[param1];
case 3:
return func_02012fc4(data_ov024_020d762c[param1]);
default:
break;
}
return 0;
}
u8 UnkStruct_027e0d00::func_ov024_020d48c8(unk32 param1) {
return data_ov024_020d7624.unk_01[param1];
}
void UnkStruct_027e0d00::func_ov024_020d48d8(unk32 param1, unk32 param2) {
for (int i = 0; i < MAX_TRAIN_SETS; i++) {
this->DestroyUnk020(param1, i);
}
this->mUnk_020[param1][param2] = new(this->mUnk_0E4[param1]) UnkStruct_027e0d00_20(param1, param2);
this->mUnk_020[param1][param2]->func_ov000_020588f0(this->mUnk_010[param1], this->func_ov024_020d485c(param1, 0x03), 0x01,
this->mUnk_000[param1]);
this->mUnk_020[param1][param2]->func_ov024_020d4fa0(this->mUnk_0A0[param1], data_ov024_020d766c[param1]);
}
void UnkStruct_027e0d00::func_ov024_020d49ec(unk32 param1, unk32 param2) {
this->DestroyUnk020(param1, param2);
}
void UnkStruct_027e0d00::func_ov024_020d4a50() {
UnkStruct_027e0ce0_34 *ptr = UnkStruct_027e0ce0::func_ov000_0205c904();
for (int i = 0; i < MAX_TRAIN_PARTS; i++) {
unk32 local_1c = -1;
unk32 local_20 = -1;
UnkStruct_027e0d00::func_ov024_020d47c4(&local_1c, &local_20, i);
this->func_ov024_020d48d8(local_1c, local_20);
}
this->func_ov024_020d4bf8();
}
void UnkStruct_027e0d00::func_ov024_020d4ab4() {
int j;
int i;
for (i = 0; i < MAX_TRAIN_PARTS; i++) {
for (j = 0; j < MAX_TRAIN_SETS; j++) {
this->func_ov024_020d49ec(i, j);
}
}
}
#if IS_JP
extern "C" void func_ov000_0205a1f4(void *, int, int, int, int);
#endif
void UnkStruct_027e0d00::func_ov024_020d4af4() {
if (!this->mUnk_104) {
return;
}
if (data_027e09a4->IsTrain()) {
return;
}
for (int i = 0; i < MAX_TRAIN_PARTS; i++) {
unk32 local_1c = -1;
unk32 local_20 = -1;
UnkStruct_027e0d00::func_ov024_020d47c4(&local_1c, &local_20, i);
UnkStruct_027e0d00_20 *pUnk20 = this->mUnk_020[local_1c][local_20];
if (pUnk20 != NULL && pUnk20->mUnk_20.mUnk_04 != NULL) {
#if IS_JP
UnkStruct_027e0d00_00 *ptr = this->mUnk_000[local_1c];
func_ov000_0205a1f4(ptr, ptr->mUnk_1C, ptr->mUnk_20, ptr->mUnk_24, ptr->mUnk_1B);
#endif
pUnk20->func_ov000_02058914(this->mUnk_000[local_1c]);
}
}
this->func_ov024_020d4bf8();
}
unk32 UnkStruct_027e0d00::func_ov024_020d4b9c(unk32 param1) {
switch (param1) {
case 0x00:
return 0x18; // meant to be 0x17?
case 0x01:
return 0x18;
case 0x02:
return 0x19;
case 0x03:
return 0x1A;
case 0x04:
return 0x1B;
case 0x05:
return 0x1C;
default:
break;
}
#if IS_JP
return 0x40;
#else
return 0x3F;
#endif
}
void UnkStruct_027e0d00::func_ov024_020d4bf8() {
UnkStruct_StackTitleScreen auStack_20("Npc/Tex.bin", 1);
auStack_20.func_ov000_02059270(0x17, "feel_e", 0x2D200000);
auStack_20.func_ov000_02059270(0x18, "feel0", 0x2D200000);
auStack_20.func_ov000_02059270(0x19, "feel1", 0x2D200000);
auStack_20.func_ov000_02059270(0x1A, "feel2", 0x2D200000);
auStack_20.func_ov000_02059270(0x1B, "feel3", 0x2D200000);
auStack_20.func_ov000_02059270(0x1C, "feel4", 0x2D200000);
}
void UnkStruct_027e0d00::func_ov024_020d4cc0(u32 cargoType) {
if (cargoType != CargoType_None && this->mUnk_100 != NULL) {
this->mUnk_0F4 = new(this->mUnk_100) MapObjectProfile_Derived5(cargoType);
this->mUnk_0F4->func_ov000_020588f0(this->mUnk_0FC, 0xD30, 0x01, this->mUnk_0F8);
}
}
void UnkStruct_027e0d00::func_ov024_020d4d10() {
this->DestroyUnk0F4();
}
void UnkStruct_027e0d00::func_ov024_020d4d44() {
if (this->mUnk_0F4 != NULL && this->mUnk_0F4->mUnk_20.mUnk_04 != NULL) {
#if IS_JP
UnkStruct_027e0d00_00 *ptr = this->mUnk_0F8;
func_ov000_0205a1f4(ptr, ptr->mUnk_1C, ptr->mUnk_20, ptr->mUnk_24, ptr->mUnk_1B);
#endif
this->mUnk_0F4->func_ov000_02058914(this->mUnk_0F8);
}
}
void UnkStruct_027e0d00::func_ov024_020d4d6c(unk32 param1) {
for (int i = 0; i < ARRAY_LEN(this->mUnk_0B0); i++) {
if (func_ov026_020f4be0(param1, i)) {
this->mUnk_0B0[i] = new(HeapIndex_1) MapObjectProfile_Derived5(i);
this->mUnk_0B0[i]->func_ov000_020586b4(0, 0, 0, 0);
}
}
}
void UnkStruct_027e0d00::func_ov024_020d4df8() {
for (int i = 0; i < ARRAY_LEN(this->mUnk_0B0); i++) {
DELETE(this->mUnk_0B0[i]);
}
}
G3d_Model *UnkStruct_027e0d00::func_ov024_020d4e3c(unk32 param1) {
if (this->mUnk_0B0[param1] != NULL) {
return G3d_GetModelPtr(this->mUnk_0B0[param1]->mUnk_50);
}
return NULL;
}