Make Object_3C a LevelObjectEntry.

This commit is contained in:
Antonio Castelli
2022-11-06 20:19:11 -08:00
parent 10537750e1
commit 689ba90944
7 changed files with 167 additions and 107 deletions
+119
View File
@@ -140,6 +140,12 @@ typedef struct LevelObjectEntry_Door {
typedef struct LevelObjectEntry_FogChanger {
/* 0x00 */ LevelObjectEntryCommon common;
/* 0x08 */ u8 unk8;
/* 0x09 */ u8 unk9;
/* 0x0A */ u8 unkA;
/* 0x0B */ u8 unkB;
/* 0x0C */ s16 unkC;
/* 0x0E */ s16 unkE;
/* 0x10 */ s16 unk10;
} LevelObjectEntry_FogChanger;
typedef struct LevelObjectEntry_AiNode {
@@ -230,6 +236,12 @@ typedef struct LevelObjectEntry_Buoy_PirateShip {
typedef struct LevelObjectEntry_Weather {
/* 0x00 */ LevelObjectEntryCommon common;
/* 0x08 */ s16 unk8;
/* 0x0A */ s16 unkA;
/* 0x0C */ s16 unkC;
/* 0x0E */ s16 unkE;
/* 0x10 */ u8 unk10;
/* 0x11 */ u8 unk11;
/* 0x12 */ s16 unk12;
} LevelObjectEntry_Weather;
typedef struct LevelObjectEntry_Bridge_WhaleRamp {
@@ -413,6 +425,12 @@ typedef struct LevelObjectEntry_DynamicLightingObject {
typedef struct LevelObjectEntry_EffectBox {
/* 0x00 */ LevelObjectEntryCommon common;
/* 0x08 */ u8 unk8;
/* 0x09 */ u8 unk9;
/* 0x0A */ u8 unkA;
/* 0x0B */ u8 unkB;
/* 0x0C */ u8 unkC;
/* 0x0D */ u8 unkD;
} LevelObjectEntry_EffectBox;
typedef struct LevelObjectEntry_TrophyCab {
@@ -494,6 +512,7 @@ typedef struct LevelObjectEntry_Snowball {
typedef struct LevelObjectEntry_Teleport {
/* 0x00 */ LevelObjectEntryCommon common;
/* 0x08 */ s8 unk8;
} LevelObjectEntry_Teleport;
typedef struct LevelObjectEntry_Lighthouse_RocketSignpost {
@@ -509,6 +528,8 @@ typedef struct LevelObjectEntry_Windsail {
typedef struct LevelObjectEntry_RangeTrigger {
/* 0x00 */ LevelObjectEntryCommon common;
/* 0x08 */ u16 unk8;
/* 0x0A */ u16 unkA;
} LevelObjectEntry_RangeTrigger;
typedef struct LevelObjectEntry_Fireball_Octoweapon {
@@ -569,4 +590,102 @@ typedef struct LevelObjectEntry8000E2B4 {
s16 unkE;
} LevelObjectEntry8000E2B4;
typedef struct LevelObjectEntry80011AD0 {
LevelObjectEntryCommon common;
u8 pad8[0x6];
u8 unkD;
} LevelObjectEntry80011AD0;
typedef struct LevelObjectEntry {
union {
LevelObjectEntry_Racer racer;
LevelObjectEntry_Scenery scenery;
LevelObjectEntry_Fish fish;
LevelObjectEntry_Animator animator;
LevelObjectEntry_Weapon weapon;
LevelObjectEntry_Smoke smoke;
LevelObjectEntry_Exit exit;
LevelObjectEntry_Audio audio;
LevelObjectEntry_AudioLine audioLine;
LevelObjectEntry_CameraControl cameraControl;
LevelObjectEntry_SetupPoint setupPoint;
LevelObjectEntry_Dino_Whale dino_whale;
LevelObjectEntry_Checkpoint checkpoint;
LevelObjectEntry_Door door;
LevelObjectEntry_FogChanger fogChanger;
LevelObjectEntry_AiNode aiNode;
LevelObjectEntry_WeaponBalloon weaponBalloon;
LevelObjectEntry_AudioSeqLine audioSeqLine;
LevelObjectEntry_BombExplosion bombExplosion;
LevelObjectEntry_WBalloonPop balloonPop;
LevelObjectEntry_Unknown25 unk25;
LevelObjectEntry_SkyControl skyControl;
LevelObjectEntry_AudioReverb audioReverb;
LevelObjectEntry_Torch_Mist torch_mist;
LevelObjectEntry_TexScroll texScroll;
LevelObjectEntry_ModeChange modeChange;
LevelObjectEntry_StopWatchMan tt;
LevelObjectEntry_Banana banana;
LevelObjectEntry_RgbaLight rgbaLighting;
LevelObjectEntry_Buoy_PirateShip buoy_pirateShip;
LevelObjectEntry_Weather weather;
LevelObjectEntry_Bridge_WhaleRamp bridge_whaleRamp;
LevelObjectEntry_RampSwitch rampSwitch;
LevelObjectEntry_SeaMonster seaMonster;
LevelObjectEntry_Bonus bonus;
LevelObjectEntry_LensFlare lensFlare;
LevelObjectEntry_LensFlareSwitch lensFlareSwitch;
LevelObjectEntry_CollectEgg collectEgg;
LevelObjectEntry_EggCreator eggCreator;
LevelObjectEntry_CharacterFlag characterFlag;
LevelObjectEntry_Animation animation;
LevelObjectEntry_InfoPoint infoPoint;
LevelObjectEntry_Trigger trigger;
LevelObjectEntry_AirZippers_WaterZippers airzipper_waterzipper;
LevelObjectEntry_Unknown58 unk58;
LevelObjectEntry_WaveGenerator waverGenerator;
LevelObjectEntry_Butterfly butterfly;
LevelObjectEntry_Parkwarden taj;
LevelObjectEntry_WorldKey worldKey;
LevelObjectEntry_BananaCreator bananaCreator;
LevelObjectEntry_TreasureSucker treasureSucker;
LevelObjectEntry_Log log;
LevelObjectEntry_LavaSpurt lavaSpurt;
LevelObjectEntry_PosArrow posArrow;
LevelObjectEntry_HitTester hitTester;
LevelObjectEntry_MidiFade midiFade;
LevelObjectEntry_DynamicLightingObject dynamicLighting;
LevelObjectEntry_EffectBox effectBox;
LevelObjectEntry_TrophyCab trophyCabinet;
LevelObjectEntry_Bubbler bubbler;
LevelObjectEntry_FlyCoin flyCoin;
LevelObjectEntry_GoldenBalloon goldenBalloon;
LevelObjectEntry_Laserbolt laserbolt;
LevelObjectEntry_Lasergun lasergun;
LevelObjectEntry_GroundZipper groundZipper;
LevelObjectEntry_OverridePos overridePos;
LevelObjectEntry_WizpigShip wizpigShip;
LevelObjectEntry_SilverCoin silverCoin;
LevelObjectEntry_Boost boost;
LevelObjectEntry_WardenSmoke tajSmoke;
LevelObjectEntry_Unknown94 unk94;
LevelObjectEntry_Unknown96 unk96;
LevelObjectEntry_Snowball snowball;
LevelObjectEntry_Teleport teleport;
LevelObjectEntry_Lighthouse_RocketSignpost lighthouse_signpost;
LevelObjectEntry_Windsail windsail;
LevelObjectEntry_RangeTrigger rangeTrigger;
LevelObjectEntry_Fireball_Octoweapon fireball_octoweapon;
LevelObjectEntry_Frog frog;
LevelObjectEntry_SilverCoinAdv2 silverCoinAdv2;
LevelObjectEntry_TTDoor ttDoor;
LevelObjectEntry_MidiFadePoint midiFadePoint;
LevelObjectEntry_OctoBubble octoBubble;
LevelObjectEntry_LevelName levelName;
LevelObjectEntry_Midichset midichset;
LevelObjectEntry8000E2B4 unk8000E2B4;
LevelObjectEntry80011AD0 unk80011AD0;
};
} LevelObjectEntry;
#endif
+2 -11
View File
@@ -5,6 +5,7 @@
#include "types.h"
#include "enums.h"
#include "level_object_entries.h"
// Stolen from PD
// This hacky structure allows coords to be accessed using
@@ -554,16 +555,6 @@ typedef struct LevelModel {
/* 0x48 */ s32 modelSize;
} LevelModel;
typedef struct Object_3C {
u8 pad0[0x2];
s16 unk2;
s16 unk4;
s16 unk6;
s8 unk8;
u8 pad9[0x4];
u8 unkD;
} Object_3C;
typedef enum {
OBJECT_MODEL_TYPE_3D_MODEL,
OBJECT_MODEL_TYPE_SPRITE_BILLBOARD,
@@ -1387,7 +1378,7 @@ typedef struct ObjectSegment {
/* 0x003B */ s8 unk3B;
union {
/* 0x003C */ Object_3C* unk3C;
/* 0x003C */ LevelObjectEntry* level_entry;
/* 0x003C */ f32 unk3C_f;
} unk3C_a;
+29 -44
View File
@@ -446,7 +446,7 @@ void obj_loop_effectbox(Object *obj, s32 speed) {
Object **objList;
Object_EffectBox *curObj64;
s32 numberOfObjects;
Object_3C_80034B74 *obj3C;
LevelObjectEntry_EffectBox *level_entry;
s32 i;
f32 xDiff;
f32 yDiff;
@@ -458,13 +458,13 @@ void obj_loop_effectbox(Object *obj, s32 speed) {
f32 temp4;
f32 temp5;
obj3C = obj->segment.unk3C_a.unk3C;
level_entry = &obj->segment.unk3C_a.level_entry->effectBox;
objList = get_racer_objects(&numberOfObjects);
temp0 = sine_s((obj3C->unkB << 8) * -1);
temp1 = cosine_s((obj3C->unkB << 8) * -1);
temp2 = obj3C->unk8 * 3;
temp3 = obj3C->unk9 * 3;
temp4 = obj3C->unkA * 3;
temp0 = sine_s((level_entry->unkB << 8) * -1);
temp1 = cosine_s((level_entry->unkB << 8) * -1);
temp2 = level_entry->unk8 * 3;
temp3 = level_entry->unk9 * 3;
temp4 = level_entry->unkA * 3;
for (i = 0; i < numberOfObjects; i++)
{
xDiff = objList[i]->segment.trans.x_position - obj->segment.trans.x_position;
@@ -476,8 +476,8 @@ void obj_loop_effectbox(Object *obj, s32 speed) {
temp5 = (-xDiff * temp1) + (zDiff * temp0);
if ((-temp4 < temp5) && (temp5 < temp4)) {
curObj64 = &objList[i]->unk64->effect_box;
curObj64->unk1FE = obj3C->unkC;
curObj64->unk1FF = obj3C->unkD;
curObj64->unk1FE = level_entry->unkC;
curObj64->unk1FF = level_entry->unkD;
temp5 = temp3 / 2;
if ((temp5 < yDiff) && (curObj64->unk1FE == 1)) {
temp5 = (1.0 - ((yDiff - temp5) / temp5));
@@ -552,13 +552,13 @@ void obj_loop_trophycab(Object *obj, s32 speed) {
obj->unk7C.word = 1;
if ((settings->trophies >> (((settings->worldId - 1) ^ 0) * 2)) & 3) {
sp44.objectID = 128;
sp44.x = obj->segment.unk3C_a.unk3C->unk2;
sp44.y = obj->segment.unk3C_a.unk3C->unk4;
sp44.z = obj->segment.unk3C_a.unk3C->unk6;
sp44.x = obj->segment.unk3C_a.level_entry->trophyCabinet.common.x;
sp44.y = obj->segment.unk3C_a.level_entry->trophyCabinet.common.y;
sp44.z = obj->segment.unk3C_a.level_entry->trophyCabinet.common.z;
sp44.size = 8;
trophyObj = spawn_object(&sp44, 1);
if (trophyObj) {
trophyObj->segment.unk3C_a.unk3C = (void *) 0;
trophyObj->segment.unk3C_a.level_entry = NULL;
trophyObj->segment.trans.y_rotation = obj->segment.trans.y_rotation;
}
}
@@ -684,7 +684,7 @@ void obj_loop_eggcreator(Object *obj, UNUSED s32 speed) {
Object_EggCreator *someObj64 = &someObj->unk64->egg_creator;
someObj64->unk4 = obj;
obj->unk78 = someObj;
someObj->segment.unk3C_a.unk3C = 0;
someObj->segment.unk3C_a.level_entry = NULL;
}
}
}
@@ -1441,9 +1441,9 @@ void obj_init_teleport(Object *obj, UNUSED LevelObjectEntry_Teleport *entry) {
void obj_loop_teleport(Object *obj, UNUSED s32 speed) {
if (obj->unk78 != 0) {
Object_3C_80038DC4 *temp = obj->segment.unk3C_a.unk3C;
LevelObjectEntry_Teleport *level_entry = &obj->segment.unk3C_a.level_entry->teleport;
if (obj->unk4C->unk13 < 0x78) {
func_8006F338(temp->unk8);
func_8006F338(level_entry->unk8);
obj->unk78 = 0;
play_sound_global(SOUND_WHOOSH2, NULL);
func_80000FDC(SOUND_VOICE_TT_FUTURE_FUN_LAND, 0, 1.0f);
@@ -1749,7 +1749,7 @@ void obj_init_goldenballoon(Object *obj, LevelObjectEntry_GoldenBalloon *entry)
}
void obj_loop_goldenballoon(Object *obj, s32 speed) {
Object_3C *obj3C;
LevelObjectEntry *levelEntry;
Object_4C *obj4C;
Object_Racer *racer;
Object_GoldenBalloon *obj64;
@@ -1772,8 +1772,8 @@ void obj_loop_goldenballoon(Object *obj, s32 speed) {
}
speedf = sp2C;
settings = get_settings();
obj3C = obj->segment.unk3C_a.unk3C;
flag = 0x10000 << obj3C->unk8;
levelEntry = obj->segment.unk3C_a.level_entry;
flag = 0x10000 << levelEntry->goldenBalloon.unk8;
if (settings->courseFlagsPtr[settings->courseId] & flag) {
if (obj->unk7C.word > 0) {
obj->unk74 = 2;
@@ -2046,7 +2046,7 @@ void obj_loop_bananacreator(Object *obj, s32 speed) {
newBananaObj = spawn_object(&newEntry, 1);
obj->unk7C.word = 1;
if (newBananaObj) {
newBananaObj->segment.unk3C_a.unk3C = 0;
newBananaObj->segment.unk3C_a.level_entry = NULL;
newBananaObj64 = &newBananaObj->unk64->banana;
newBananaObj64->spawner = obj;
func_8003FC44(obj->segment.trans.x_position, obj->segment.trans.y_position - 14.0f, obj->segment.trans.z_position, 44, 34, 0.25f, 0);
@@ -2272,7 +2272,7 @@ void func_8003FC44(f32 arg0, f32 arg1, f32 arg2, s32 arg3, s32 arg4, f32 arg5, s
someObj = spawn_object(&sp24, 1);
if (someObj != NULL) {
someObj->segment.trans.scale *= 3.5 * arg5;
someObj->segment.unk3C_a.unk3C = NULL;
someObj->segment.unk3C_a.level_entry = NULL;
someObj->segment.x_velocity = 0.0f;
someObj->segment.y_velocity = 0.0f;
someObj->segment.z_velocity = 0.0f;
@@ -2413,21 +2413,6 @@ void obj_init_weather(Object *obj, LevelObjectEntry_Weather *entry) {
#ifdef NON_EQUIVALENT
void func_800ABC5C(s32, s32, s32, s32, s32, s32); /* extern */
typedef struct Object_3C_Weather {
u8 pad0[0x2];
s16 unk2;
s16 unk4;
s16 unk6;
s8 unk8;
u8 unk9;
s16 unkA;
s16 unkC;
s16 unkE;
u8 unk10;
u8 unk11;
s16 unk12;
} Object_3C_Weather;
// Has stack & regalloc issues.
void obj_loop_weather(Object *obj, s32 speed) {
s32 sp54;
@@ -2436,7 +2421,7 @@ void obj_loop_weather(Object *obj, s32 speed) {
Object **objects;
Object **lastObj;
Object *curObj;
Object_3C_Weather *obj3c;
LevelObjectEntry_Weather *level_entry;
f32 temp_f0;
f32 new_var;
f32 temp_f2;
@@ -2454,9 +2439,9 @@ void obj_loop_weather(Object *obj, s32 speed) {
temp_f0 = obj->segment.trans.x_position - curObj->segment.trans.x_position;
temp_f2 = obj->segment.trans.z_position - curObj->segment.trans.z_position;
new_var = obj->unk78f;
obj3c = obj->segment.unk3C_a.unk3C;
level_entry = &obj->segment.unk3C_a.level_entry->weather;
if (((temp_f0 * temp_f0) + (temp_f2 * temp_f2)) <= (new_var * 1.0f)){
func_800ABC5C(obj3c->unkA * 256, obj3c->unkC * 256, obj3c->unkE * 256, obj3c->unk10 * 257, obj3c->unk11 * 257, (s32) obj3c->unk12);
func_800ABC5C(level_entry->unkA * 256, level_entry->unkC * 256, level_entry->unkE * 256, level_entry->unk10 * 257, level_entry->unk11 * 257, (s32) level_entry->unk12);
}
}
}
@@ -2618,7 +2603,7 @@ void obj_loop_bubbler(Object *obj, s32 speed) {
void obj_init_boost(Object *obj, LevelObjectEntry_Boost *entry) {
obj->unk64 = (s32)get_misc_asset(MISC_ASSET_UNK14) + (entry->unk8[0] << 7);
obj->segment.unk3C_a.unk3C = NULL;
obj->segment.unk3C_a.level_entry = NULL;
}
void obj_init_unknown94(UNUSED Object *obj, UNUSED LevelObjectEntry_Unknown94 *entry, UNUSED s32 arg2) {
@@ -2632,12 +2617,12 @@ void obj_init_rangetrigger(UNUSED Object *obj, UNUSED LevelObjectEntry_RangeTrig
void obj_loop_rangetrigger(Object *obj, s32 speed) {
UNUSED s32 temp;
Object_3C_80042178 *obj3C;
LevelObjectEntry_RangeTrigger *level_entry;
unk80042178 sp20;
obj3C = obj->segment.unk3C_a.unk3C;
if (func_80016DE8(obj->segment.trans.x_position, 0, obj->segment.trans.z_position, (f32)obj3C->unk8, 1, &sp20) > 0) {
obj->unk74 = obj3C->unkA;
level_entry = &obj->segment.unk3C_a.level_entry->rangeTrigger;
if (func_80016DE8(obj->segment.trans.x_position, 0, obj->segment.trans.z_position, (f32)level_entry->unk8, 1, &sp20) > 0) {
obj->unk74 = level_entry->unkA;
} else {
obj->unk74 = 0;
}
-21
View File
@@ -24,16 +24,6 @@ typedef struct unk80034B4C {
s32 unk78;
} unk80034B4C;
typedef struct Object_3C_80034B74 {
u8 pad0[0x8];
u8 unk8;
u8 unk9;
u8 unkA;
u8 unkB;
u8 unkC;
u8 unkD;
} Object_3C_80034B74;
typedef struct unk8003564C {
s8 unk0;
s8 unk1;
@@ -92,11 +82,6 @@ typedef struct unk80038B74 {
s8 unk8;
} unk80038B74;
typedef struct Object_3C_80038DC4 {
u8 pad0[8];
s8 unk8;
} Object_3C_80038DC4;
typedef struct unk80039160 {
u8 pad0[0x78];
s32 unk78;
@@ -186,12 +171,6 @@ typedef struct unk8004210C {
s32 unk64;
} unk8004210C;
typedef struct Object_3C_80042178 {
u8 pad0[8];
u16 unk8;
u16 unkA;
} Object_3C_80042178;
typedef struct unk80042A1C {
u8 pad0[0x78];
f32 unk78;
+4 -4
View File
@@ -674,7 +674,7 @@ void func_8000E2B4(void) {
if (get_filtered_cheats() & CHEAT_SMALL_CHARACTERS) {
player->segment.trans.scale *= 0.714f;
}
player->segment.unk3C_a.unk3C = 0;
player->segment.unk3C_a.level_entry = NULL;
player->segment.trans.y_rotation = D_8011AD4C;
player->segment.trans.y_position = D_8011AD48;
}
@@ -702,10 +702,10 @@ GLOBAL_ASM("asm/non_matchings/objects/func_8000E4E8.s")
s32 func_8000E558(Object *arg0){
s32 temp_v0;
s32 new_var, new_var2;
if (arg0->segment.unk3C_a.unk3C == 0) {
if (arg0->segment.unk3C_a.level_entry == NULL) {
return TRUE;
}
temp_v0 = arg0->segment.unk3C_a.unk3C;
temp_v0 = arg0->segment.unk3C_a.level_entry;
new_var2 = D_8011AE98[0];
if ((temp_v0 >= new_var2) && (((D_8011AEA0 * 8) + new_var2) >= temp_v0)) {
return FALSE;
@@ -1037,7 +1037,7 @@ void func_80011AD0(Object *this) {
break;
case 3: //L80011BB4
tmp_f0 = this->segment.unk3C_a.unk3C->unkD;
tmp_f0 = this->segment.unk3C_a.level_entry->unk80011AD0.unkD;
offset = (this->unk64->obj80011AD0.unkFC * 6);
offset *= 5;
offset *= 2;
+2 -2
View File
@@ -1496,7 +1496,7 @@ void update_player_racer(Object* obj, s32 updateRate) {
newObject.size = 8;
tempRacer->unk15C = spawn_object(&newObject, 1);
if (tempRacer->unk15C) {
tempRacer->unk15C->segment.unk3C_a.unk3C = 0;
tempRacer->unk15C->segment.unk3C_a.level_entry = NULL;
tempRacer->unk15C->segment.unk38.half.lower = 128;
}
}
@@ -3623,7 +3623,7 @@ void racer_enter_door(Object_Racer* racer, s32 updateRate) {
if (racer->transitionTimer > 0) {
racer->transitionTimer -= updateRate;
if (racer->transitionTimer <= 0) {
func_8006D968((s8* ) racer->unk108->segment.unk3C_a.unk3C);
func_8006D968((s8* ) racer->unk108->segment.unk3C_a.level_entry);
racer->transitionTimer = 0;
}
}
+11 -25
View File
@@ -484,7 +484,7 @@ void func_80027FC4(s32 arg0) {
sp20.objectID = arg0;
D_8011B0B8 = spawn_object(&sp20, 2);
if (D_8011B0B8 != 0) {
D_8011B0B8->segment.unk3C_a.unk3C = 0;
D_8011B0B8->segment.unk3C_a.level_entry = NULL;
D_8011B0B8->unk4A = -1;
}
}
@@ -1348,20 +1348,6 @@ void func_8003093C(s32 arg0) {
#ifdef NON_EQUIVALENT
//unk8011D388 D_8011D388[4];
typedef struct Object_3C_FogChanger {
u8 pad0[0x2];
s16 unk2;
s16 unk4;
s16 unk6;
s8 unk8;
u8 unk9;
u8 unkA;
u8 unkB;
s16 unkC;
s16 unkE;
s16 unk10;
} Object_3C_FogChanger;
void obj_loop_fogchanger(Object* obj) {
s32 temp_v0;
s32 index;
@@ -1372,13 +1358,13 @@ void obj_loop_fogchanger(Object* obj) {
s32 temp_a3, temp_t0, temp_t1, temp_a1;
s32 temp;
Object **sp40;
Object_3C_FogChanger *sp44;
LevelObjectEntry_FogChanger *level_entry;
Object *tempObj;
unk8011D388 *temp_v0_3;
ObjectSegment *phi_s3;
sp40 = NULL;
sp44 = obj->segment.unk3C_a.unk3C;
level_entry = &obj->segment.unk3C_a.level_entry->fogChanger;
phi_s3 = NULL;
// check_if_showing_cutscene_camera() returns the bool gCutsceneCameraActive. 1 if camera is controlled by cutscene, 0 if controlled by racer.
@@ -1408,15 +1394,15 @@ void obj_loop_fogchanger(Object* obj) {
x -= obj->segment.trans.x_position;
z -= obj->segment.trans.z_position;
if (((x * x) + (z * z)) < obj->unk78f) {
phi_a0 = sp44->unkC;
phi_v1 = sp44->unkE;
temp_a3 = sp44->unk9;
temp_t0 = sp44->unkA;
temp_t1 = sp44->unkB;
temp_a1 = sp44->unk10;
phi_a0 = level_entry->unkC;
phi_v1 = level_entry->unkE;
temp_a3 = level_entry->unk9;
temp_t0 = level_entry->unkA;
temp_t1 = level_entry->unkB;
temp_a1 = level_entry->unk10;
if (phi_v1 < phi_a0) {
phi_v1 = sp44->unkC;
phi_a0 = sp44->unkE;
phi_v1 = level_entry->unkC;
phi_a0 = level_entry->unkE;
}
if (phi_v1 >= 0x400) {
phi_v1 = 0x3FF;