PlayerIsWithinHitbox deduplication for no0, st0, nz0 (#1755)
Some checks are pending
Format code / format (push) Waiting to run
Build C code / extract-assets (push) Waiting to run
Build C code / build-linux (push) Blocked by required conditions
Build C code / build-macos (push) Blocked by required conditions
Build C code / build-windows (push) Blocked by required conditions
Build C code / build-linux-lle (push) Blocked by required conditions
Build Saturn version / build-and-test-saturn (push) Waiting to run
Build Saturn version / function-finder-saturn (push) Waiting to run
Build Debug Module tool / build (push) Waiting to run
Build PSX and PSP version / build-and-test (pspeu, hd) (push) Waiting to run
Build PSX and PSP version / build-and-test (pspeu, pspeu) (push) Waiting to run
Build PSX and PSP version / build-and-test (us, us) (push) Waiting to run
Build PSX and PSP version / generate-progress-report (pspeu, hd) (push) Blocked by required conditions
Build PSX and PSP version / generate-progress-report (pspeu, pspeu) (push) Blocked by required conditions
Build PSX and PSP version / generate-progress-report (us, us) (push) Blocked by required conditions
Build PSX and PSP version / generate-duplicates-report (us, us) (push) Blocked by required conditions
Build PSX and PSP version / generate-duplicates-report-psp (pspeu, pspeu) (push) Blocked by required conditions

1. func_801B0AA4 decompilation
2. PlayerIsWithinHitbox deduplication for no0, st0, nz0
This commit is contained in:
Aleksandr Shabelnikov 2024-10-06 19:56:04 +02:00 committed by GitHub
parent fffde1f095
commit 5fab2ecb0e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 159 additions and 37 deletions

View File

@ -43,6 +43,7 @@ unk14_startFrame = 0x80181BF0;
unk14_lifetime = 0x80181BF4;
g_olroxDroolCollOffsets = 0x80181BFC;
g_UnkEntityAnimData = 0x80181C04;
g_StoneDoorTiles = 0x80181C90;
anim_bone_rot = 0x801821DC;
steps = 0x801825AC;
init_velocity_x = 0x801825B4;
@ -52,7 +53,7 @@ sensors_special = 0x8018275C;
sensors_move = 0x80182764;
sprites_nz0_3 = 0x801BEBB0;
g_UnkPrimHelperRot = 0x801C184C;
func_801A7E2C = 0x801C1968;
PlayerIsWithinHitbox = 0x801C1968;
func_801B0AA4 = 0x801C19EC;
MakeExplosions = 0x801C3334;
EntityWargExplosionPuffOpaque = 0x801C33F4;

View File

@ -7,6 +7,7 @@ g_HeartDropArray = 0x801813B0;
actor_names = 0x8018146C;
g_eBlueDoorUV = 0x801826B8;
g_eBlueDoorTiles = 0x801826D0;
PlayerIsWithinHitbox = 0x801B0A20;
EntityWargExplosionPuffOpaque = 0x801B3C38;
EntityBossFightManager = 0x801B3FCC;
EntityBossRoomBlock = 0x801B4518;

View File

@ -18,6 +18,7 @@ D_80183D1C = 0x80183D1C;
D_80197F80 = 0x80197F80;
D_8019A40C = 0x8019A40C;
c_HeartPrizes = 0x801A7C84;
PlayerIsWithinHitbox = 0x801A7E2C;
EntityLockCamera = 0x801A7EB0;
ST0_EntityCutscene = 0x801A9210;
EntityCutscene = 0x801AA290;

View File

@ -3,21 +3,148 @@
INCLUDE_ASM("st/no0/nonmatchings/first_c_file", func_us_801C1854);
bool func_801A7E2C(Entity* self) {
s16 diffX = PLAYER.posX.i.hi - self->posX.i.hi;
#include "../player_is_within_hitbox.h"
diffX = abs(diffX);
if (self->hitboxWidth >= diffX) {
diffX = PLAYER.posY.i.hi - self->posY.i.hi;
diffX = abs(diffX);
return self->hitboxHeight >= diffX;
extern u16 D_us_80180ADC[];
extern u8 D_us_80180E94[];
extern u8 D_us_80180E9C[];
extern u16 D_us_80180EA4[];
void func_801B0AA4(Entity* self) {
Tilemap* tilemap = &g_Tilemap;
u16* dataPtr;
// These vars are all reused for things; hard to make good names :(
u16 var_s2;
u16 var_s3;
s16 var_s4;
var_s3 = self->params;
if (!self->step) {
InitializeEntity(D_us_80180ADC);
self->hitboxState = 1;
var_s2 = self->ext.et_801B0AA4.unk7C = D_us_80180E9C[var_s3];
if (var_s2) {
self->hitboxWidth = D_us_80180E94[var_s3];
self->hitboxHeight = 0x14;
} else {
self->hitboxWidth = 0x14;
self->hitboxHeight = D_us_80180E94[var_s3];
}
self->ext.et_801B0AA4.unk88 = 2;
}
if (PlayerIsWithinHitbox(self)) {
var_s2 = GetSideToPlayer();
if (self->ext.et_801B0AA4.unk7C) {
var_s2 &= 2;
var_s2 *= 2;
} else {
var_s2 &= 1;
var_s2 *= 4;
}
if (var_s2 != self->ext.et_801B0AA4.unk88) {
self->ext.et_801B0AA4.unk88 = var_s2;
var_s3 = (var_s3 << 3) + var_s2;
dataPtr = &D_us_80180EA4[var_s3];
self->ext.et_801B0AA4.unk7E = 0;
self->ext.et_801B0AA4.unk8A = 0x10;
var_s3 = tilemap->scrollX.i.hi;
if (var_s3 != *dataPtr && self->ext.et_801B0AA4.unk7C) {
self->ext.et_801B0AA4.unk7E = 1;
tilemap->x = var_s3;
} else {
tilemap->x = *dataPtr;
}
self->ext.et_801B0AA4.unk80 = *dataPtr++;
var_s2 = tilemap->scrollY.i.hi - 4;
if (var_s2 != *dataPtr && !self->ext.et_801B0AA4.unk7C) {
self->ext.et_801B0AA4.unk7E |= 2;
tilemap->y = var_s2;
} else {
tilemap->y = *dataPtr;
}
self->ext.et_801B0AA4.unk82 = *dataPtr++;
var_s3 += 0x100;
if (var_s3 != *dataPtr && self->ext.et_801B0AA4.unk7C) {
self->ext.et_801B0AA4.unk7E |= 4;
tilemap->width = var_s3;
} else {
tilemap->width = *dataPtr;
}
self->ext.et_801B0AA4.unk84 = *dataPtr++;
var_s2 += 0x100;
if (var_s2 != *dataPtr && !self->ext.et_801B0AA4.unk7C) {
self->ext.et_801B0AA4.unk7E |= 8;
tilemap->height = var_s2;
} else {
tilemap->height = *dataPtr;
}
self->ext.et_801B0AA4.unk86 = *dataPtr;
}
} else {
return false;
self->ext.et_801B0AA4.unk88 = 2;
}
// Unique for NO0
if (self->params == 4) {
self->ext.et_801B0AA4.unk8A = 1U;
}
if (self->ext.et_801B0AA4.unk7E) {
if (!(--self->ext.et_801B0AA4.unk8A)) {
tilemap->x = self->ext.et_801B0AA4.unk80;
tilemap->y = self->ext.et_801B0AA4.unk82;
tilemap->width = self->ext.et_801B0AA4.unk84;
tilemap->height = self->ext.et_801B0AA4.unk86;
self->ext.et_801B0AA4.unk7E = 0;
return;
}
var_s4 = (self->ext.et_801B0AA4.unk80 - tilemap->x) / 2;
if (var_s4) {
if (var_s4 > 0) {
tilemap->x += 2;
} else {
tilemap->x -= 2;
}
} else {
tilemap->x = self->ext.et_801B0AA4.unk80;
self->ext.et_801B0AA4.unk7E &= ~1;
}
var_s4 = (self->ext.et_801B0AA4.unk82 - tilemap->y) / 2;
if (var_s4) {
if (var_s4 > 0) {
tilemap->y += 2;
} else {
tilemap->y -= 2;
}
} else {
tilemap->y = self->ext.et_801B0AA4.unk82;
self->ext.et_801B0AA4.unk7E &= ~2;
}
var_s4 = (self->ext.et_801B0AA4.unk84 - tilemap->width) / 2;
if (var_s4) {
if (var_s4 > 0) {
tilemap->width += 2;
} else {
tilemap->width -= 2;
}
} else {
tilemap->width = self->ext.et_801B0AA4.unk84;
self->ext.et_801B0AA4.unk7E &= ~4;
}
var_s4 = (self->ext.et_801B0AA4.unk86 - tilemap->height) / 2;
if (var_s4) {
if (var_s4 > 0) {
tilemap->height += 2;
} else {
tilemap->height -= 2;
}
} else {
tilemap->height = self->ext.et_801B0AA4.unk86;
self->ext.et_801B0AA4.unk7E &= ~8;
}
}
}
INCLUDE_ASM("st/no0/nonmatchings/first_c_file", func_801B0AA4);
INCLUDE_ASM("st/no0/nonmatchings/first_c_file", func_us_801C1E48);
s16 func_us_801C1F98(Primitive* prim, s16 arg1) {

View File

@ -30,6 +30,7 @@ typedef enum EntityIDs {
/* 0x15 */ E_GREY_PUFF = 0x15,
/* 0x17 */ E_BG_LIGHTNING = 0x17,
/* 0x1E */ E_CAVERN_DOOR_LEVER_UNK0 = 0x1E,
/* 0x20 */ E_DUMMY_20 = 0x20,
/* 0x27 */ E_FALLING_ROCK_2 = 0x27,
/* 0x2E */ E_ID_2E = 0x2E,
/* 0x30 */ E_ID_30 = 0x30,

View File

@ -26,18 +26,7 @@ void func_801B0958(Entity* self) {
AnimateEntity(objInit->animFrames, self);
}
bool func_801B0A20(Entity* self) {
s16 diffX = PLAYER.posX.i.hi - self->posX.i.hi;
diffX = abs(diffX);
if (self->hitboxWidth >= diffX) {
diffX = PLAYER.posY.i.hi - self->posY.i.hi;
diffX = abs(diffX);
return self->hitboxHeight >= diffX;
} else {
return false;
}
}
#include "../player_is_within_hitbox.h"
void func_801B0AA4(Entity* self) {
Tilemap* tilemap = &g_Tilemap;
@ -62,7 +51,7 @@ void func_801B0AA4(Entity* self) {
self->ext.et_801B0AA4.unk88 = 2;
}
if (func_801B0A20(self)) {
if (PlayerIsWithinHitbox(self)) {
var_s2 = GetSideToPlayer();
if (self->ext.et_801B0AA4.unk7C) {
var_s2 &= 2;

View File

@ -0,0 +1,13 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
bool PlayerIsWithinHitbox(Entity* self) {
s16 diffX = PLAYER.posX.i.hi - self->posX.i.hi;
diffX = abs(diffX);
if (self->hitboxWidth >= diffX) {
diffX = PLAYER.posY.i.hi - self->posY.i.hi;
diffX = abs(diffX);
return self->hitboxHeight >= diffX;
} else {
return false;
}
}

View File

@ -21,18 +21,7 @@ void func_801A7D64(Entity* self) {
AnimateEntity(obj->animFrames, self);
}
bool func_801A7E2C(Entity* self) {
s16 diffX = PLAYER.posX.i.hi - self->posX.i.hi;
diffX = abs(diffX);
if (self->hitboxWidth >= diffX) {
diffX = PLAYER.posY.i.hi - self->posY.i.hi;
diffX = abs(diffX);
return self->hitboxHeight >= diffX;
} else {
return false;
}
}
#include "../player_is_within_hitbox.h"
extern u16 D_801805B0[];
extern u8 D_8018065C[];
@ -75,7 +64,7 @@ void EntityLockCamera(Entity* self) {
return;
}
if (func_801A7E2C(self) != 0) {
if (PlayerIsWithinHitbox(self) != 0) {
facingLeft = GetSideToPlayer();
if (self->ext.lockCamera.unk7C) {
facingLeft &= 2;