mirror of
https://github.com/zeldaret/st
synced 2026-08-07 10:15:54 -04:00
5e934a8c9b
* 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
490 lines
11 KiB
C++
490 lines
11 KiB
C++
#include "MainGame/AdventureMode.hpp"
|
|
#include "Unknown/Common.hpp"
|
|
#include "Unknown/UnkStruct_027e09a4.hpp"
|
|
#include "Unknown/UnkStruct_027e0ce0.hpp"
|
|
|
|
extern "C" unk32 func_02032784(unk32 param1);
|
|
extern "C" u8 func_020157f0(unk32 param1, unk32 param2);
|
|
extern "C" u8 func_020157c0(unk32 param1, unk32 param2);
|
|
|
|
static const u8 data_ov024_020d7550[] = {0x01, 0x04, 0x10, 0x40, 0x00};
|
|
static const u8 data_ov024_020d7555[] = {0x20, 0x10, 0x08, 0x40, 0x00, 0x04, 0x80, 0x01, 0x02, 0x00, 0x00};
|
|
static const unk32 data_ov024_020d7560[] = {0x01, 0x00, 0x02};
|
|
|
|
const u8 UnkDataStruct4_14::func_ov024_020d1a18(unk32 param1) {
|
|
return data_ov024_020d7550[param1];
|
|
}
|
|
|
|
unk32 UnkDataStruct4_14::func_ov024_020d1a28(u8 param1) {
|
|
switch (param1) {
|
|
case 0x10:
|
|
return 2;
|
|
case 0x01:
|
|
return 0;
|
|
case 0x40:
|
|
return 3;
|
|
case 0x04:
|
|
return 1;
|
|
case 0x00:
|
|
return 4;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return 4;
|
|
}
|
|
|
|
u8 UnkDataStruct4_14::func_ov024_020d1a98(unk32 param1, unk32 param2) {
|
|
return data_ov024_020d7555[param1 + 1 + ((param2 + 1) * 3)];
|
|
}
|
|
|
|
void UnkDataStruct4_14::func_ov024_020d1ab8(unk32 param1, unk32 *param2, unk32 *param3) {
|
|
switch (param1) {
|
|
case 0x10:
|
|
*param2 = 0;
|
|
*param3 = -1;
|
|
break;
|
|
case 0x40:
|
|
*param2 = -1;
|
|
*param3 = 0;
|
|
break;
|
|
case 0x80:
|
|
*param2 = -1;
|
|
*param3 = 1;
|
|
break;
|
|
case 0x00:
|
|
*param2 = 0;
|
|
*param3 = 0;
|
|
break;
|
|
case 0x01:
|
|
*param2 = 0;
|
|
*param3 = 1;
|
|
break;
|
|
case 0x04:
|
|
*param2 = 1;
|
|
*param3 = 0;
|
|
break;
|
|
case 0x08:
|
|
*param2 = 1;
|
|
*param3 = -1;
|
|
break;
|
|
case 0x20:
|
|
*param2 = -1;
|
|
*param3 = -1;
|
|
break;
|
|
case 0x02:
|
|
*param2 = 1;
|
|
*param3 = 1;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
s32 UnkDataStruct4_14::func_ov024_020d1b98(unk32 *param1, unk32 param2) {
|
|
s32 var_r3 = 0;
|
|
|
|
if (param2 & 0x01) {
|
|
param1[var_r3++] = 0x00;
|
|
}
|
|
|
|
if (param2 & 0x04) {
|
|
param1[var_r3++] = 0x01;
|
|
}
|
|
|
|
if (param2 & 0x10) {
|
|
param1[var_r3++] = 0x02;
|
|
}
|
|
|
|
if (param2 & 0x40) {
|
|
param1[var_r3++] = 0x03;
|
|
}
|
|
|
|
return var_r3;
|
|
}
|
|
|
|
s32 UnkDataStruct4_14::func_ov024_020d1be0(s32 param1) {
|
|
switch (param1) {
|
|
case 0x54:
|
|
return 0x01;
|
|
case 0x51:
|
|
return 0x04;
|
|
case 0x45:
|
|
return 0x10;
|
|
case 0x15:
|
|
return 0x40;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return 0x00;
|
|
}
|
|
|
|
s32 UnkDataStruct4_14::func_ov024_020d1c3c(unk32 *param1, unk32 param2) const {
|
|
s32 j = 0;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (this->func_ov024_020d1cc8(i, param2)) {
|
|
param1[j] = i;
|
|
j++;
|
|
}
|
|
}
|
|
|
|
return j;
|
|
}
|
|
|
|
void UnkDataStruct4_14::func_ov024_020d1c84() {
|
|
for (int i = 0; i < ARRAY_LEN(this->mUnk_0F); i++) {
|
|
if (func_02032784(this->mUnk_0F[i]) == 1 && func_02032784(this->mUnk_0C[i]) == 2) {
|
|
this->mUnk_0F[i] = this->mUnk_0C[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d1cc8(unk32 param1, unk32 param2) const {
|
|
const u8 value = func_ov024_020d1a18(param1);
|
|
return this->mUnk_0F[param2] & value;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d1cf4(unk32 param1) const {
|
|
const u8 value = func_ov024_020d1a18(param1);
|
|
|
|
for (int i = 0; i < ARRAY_LEN(this->mUnk_0F); i++) {
|
|
if (this->mUnk_0F[i] & value) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d1d30(unk32 param1, u16 param2) const {
|
|
for (int i = 0; i < ARRAY_LEN(this->mUnk_0C); i++) {
|
|
if (this->mUnk_0C[i] != 0) {
|
|
if (param1 == this->mUnk_02[i] && param2 == this->mUnk_06[i]) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
u8 UnkDataStruct4_14::func_ov024_020d1d78() const {
|
|
u8 value = 0;
|
|
|
|
for (int i = 0; i < ARRAY_LEN(this->mUnk_0F); i++) {
|
|
value |= this->mUnk_0F[i];
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
u8 UnkDataStruct4_14::func_ov024_020d1da0() const {
|
|
u8 value = 0;
|
|
|
|
for (int i = 0; i < ARRAY_LEN(this->mUnk_0C); i++) {
|
|
value |= this->mUnk_0C[i];
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d1dc8(unk32 param1, unk32 param2) const {
|
|
const u8 value = func_ov024_020d1a18(param1);
|
|
return this->mUnk_0C[param2] & value;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d1df4(unk32 param1) const {
|
|
return func_ov024_020d1a18(param1) & this->func_ov024_020d1da0();
|
|
}
|
|
|
|
void UnkDataStruct4_14::func_ov024_020d1e20(unk16 *param1, unk32 param2) {
|
|
switch (param2) {
|
|
case 0x10:
|
|
param1[0] = 0;
|
|
param1[1] = -1;
|
|
break;
|
|
case 0x01:
|
|
param1[0] = 0;
|
|
param1[1] = 1;
|
|
break;
|
|
case 0x40:
|
|
param1[0] = -1;
|
|
param1[1] = 0;
|
|
break;
|
|
case 0x04:
|
|
param1[0] = 1;
|
|
param1[1] = 0;
|
|
break;
|
|
default:
|
|
param1[0] = 0;
|
|
param1[1] = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
u8 UnkDataStruct4_14::func_ov024_020d1eac(const unk32 param1) {
|
|
switch (param1) {
|
|
case 0x10:
|
|
return 0x01;
|
|
case 0x01:
|
|
return 0x10;
|
|
case 0x04:
|
|
return 0x40;
|
|
case 0x40:
|
|
return 0x04;
|
|
case 0x08:
|
|
return 0x80;
|
|
case 0x20:
|
|
return 0x02;
|
|
case 0x02:
|
|
return 0x20;
|
|
case 0x80:
|
|
return 0x08;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return 0x00;
|
|
}
|
|
|
|
void UnkDataStruct4_14::func_ov024_020d1f60(u32 param1) {
|
|
if (param1 >= 0x78) {
|
|
param1 = 0;
|
|
}
|
|
|
|
this->mUnk_12 = param1;
|
|
}
|
|
|
|
unk32 UnkDataStruct4_14::func_ov024_020d1f70() const {
|
|
u8 val = this->mUnk_12;
|
|
|
|
if (this->mUnk_12 == 0) {
|
|
return 0x6000;
|
|
}
|
|
|
|
return (this->mUnk_12 * 0xC000) / 120;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d1fa4(unk32 param1) const {
|
|
if (this->mUnk_0C[param1] != 0) {
|
|
if (this->mUnk_06[param1] != 0 && !this->func_ov024_020d2320(param1)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void UnkDataStruct4_14::func_ov024_020d1fe8() {
|
|
this->mUnk_00 = 0;
|
|
this->mStationSceneIndex = SceneIndex_Max;
|
|
|
|
for (int i = 0; i < ARRAY_LEN(this->mUnk_0C); i++) {
|
|
this->mUnk_0C[i] = 0;
|
|
this->mUnk_0F[i] = 0;
|
|
this->mUnk_02[i] = -1;
|
|
this->mUnk_06[i] = 0;
|
|
}
|
|
|
|
this->mUnk_12 = 0;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d2030(unk32 param1, unk32 param2) {
|
|
if (this->func_ov024_020d1dc8(param1, param2) && !this->func_ov024_020d1cc8(param1, param2)) {
|
|
this->mUnk_0F[param2] |= func_ov024_020d1a18(param1);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
u8 UnkDataStruct4_14::func_ov024_020d208c(unk32 param1) const {
|
|
return this->mUnk_0F[param1];
|
|
}
|
|
|
|
void UnkDataStruct4_14::func_ov024_020d2098(unk32 param1, unk32 param2) {
|
|
this->mUnk_0C[param2] |= func_ov024_020d1a18(param1);
|
|
}
|
|
|
|
unk32 UnkDataStruct4_14::func_ov024_020d20c0(unk32 param1, unk32 param2) const {
|
|
u8 var_r6;
|
|
s32 var_r7;
|
|
s32 temp_r8;
|
|
|
|
var_r6 = func_ov024_020d1a18(param1);
|
|
temp_r8 = this->func_ov024_020d1d78();
|
|
|
|
switch (func_02032784(temp_r8)) {
|
|
case 0:
|
|
return 4;
|
|
case 1:
|
|
return 4;
|
|
case 2:
|
|
return func_ov024_020d1a28(temp_r8 & ~var_r6);
|
|
case 3:
|
|
if ((param2 == 1) || (param2 == 3)) {
|
|
for (var_r7 = 1; var_r7 < 4; var_r7++) {
|
|
if (param2 == 1) {
|
|
var_r6 = func_020157f0(var_r6, 2);
|
|
} else {
|
|
var_r6 = func_020157c0(var_r6, 2);
|
|
}
|
|
|
|
if (temp_r8 & var_r6) {
|
|
return func_ov024_020d1a28(var_r6);
|
|
}
|
|
}
|
|
|
|
return 4;
|
|
}
|
|
|
|
return 4;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return 4;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::IsStationDungeon() const {
|
|
switch (this->mStationSceneIndex) {
|
|
case SceneIndex_d_forest:
|
|
case SceneIndex_d_snow26:
|
|
case SceneIndex_d_water27:
|
|
case SceneIndex_d_flame:
|
|
case SceneIndex_d_sand:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d21d8() const {
|
|
switch (this->func_ov024_020d1da0()) {
|
|
case 0x01:
|
|
case 0x04:
|
|
case 0x44:
|
|
case 0x40:
|
|
case 0x11:
|
|
case 0x10:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d223c() const {
|
|
if (!this->func_ov024_020d21d8() && func_02032784(this->func_ov024_020d1da0()) == 2) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d2270(unk32 param1, unk32 param2) const {
|
|
u8 value = func_ov024_020d1a18(param1);
|
|
|
|
if (this->mUnk_0C[param2] & value && !(this->mUnk_0F[param2] & value)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
unk32 UnkDataStruct4_14::func_ov024_020d22ac(unk32 param1) const {
|
|
u8 temp_r7 = func_ov024_020d1a18(param1);
|
|
bool var_r5 = false;
|
|
|
|
for (int i = 0; i < ARRAY_LEN(data_ov024_020d7560); i++) {
|
|
unk32 temp_r2 = data_ov024_020d7560[i];
|
|
|
|
if (this->mUnk_0F[temp_r2] & temp_r7) {
|
|
return temp_r2;
|
|
}
|
|
|
|
if (this->func_ov024_020d2270(param1, temp_r2)) {
|
|
var_r5 = true;
|
|
}
|
|
}
|
|
|
|
return var_r5 ? -1 : -2;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d2320(unk32 param1) const {
|
|
UnkStruct_027e0ce0::func_ov000_0205c904()->func_ov024_020d3f4c(this->mUnk_02[param1], this->mUnk_06[param1]);
|
|
}
|
|
|
|
unk32 UnkDataStruct4_14::func_ov024_020d2348(unk32 param1) const {
|
|
unk32 var_r6 = 0;
|
|
|
|
for (int i = 0; i < ARRAY_LEN(data_ov024_020d7684) - 1; i++) {
|
|
//! TODO: fake match, how is this accessed??
|
|
if (GET_FLAG2(data_ov024_020d7684[this->func_ov024_020d22ac(i)][12], param1)) {
|
|
var_r6++;
|
|
}
|
|
}
|
|
|
|
return var_r6;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d239c() const {
|
|
u8 temp_r0 = func_ov024_020d1da0();
|
|
|
|
if (temp_r0 == 4 || temp_r0 == 0x40 || temp_r0 == 0x44) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d23bc() const {
|
|
u8 temp_r0 = func_ov024_020d1da0() + 0xFF;
|
|
bool var_r0 = false;
|
|
|
|
if (temp_r0 > 0x10) {
|
|
return false;
|
|
}
|
|
|
|
if (GET_FLAG2(0x18001, temp_r0)) {
|
|
var_r0 = true;
|
|
}
|
|
|
|
return var_r0;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d23ec() const {
|
|
bool var_r4 = false;
|
|
u8 value = this->func_ov024_020d1d78();
|
|
|
|
if (func_02032784(value) == 3 && (this->func_ov024_020d2464(1) || this->func_ov024_020d2464(0))) {
|
|
var_r4 = true;
|
|
}
|
|
|
|
return var_r4;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d243c() const {
|
|
return this->func_ov024_020d23ec();
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d2448() const {
|
|
u8 value = this->func_ov024_020d1da0();
|
|
return value == 0x11 || value == 0x44 ? true : false;
|
|
}
|
|
|
|
bool UnkDataStruct4_14::func_ov024_020d2464(bool param1) const {
|
|
if (param1) {
|
|
return this->mUnk_13 == 0x01;
|
|
}
|
|
|
|
return this->mUnk_13 == 0x02;
|
|
}
|