Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Patch 1 #692

Merged
merged 10 commits into from
Jan 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 36 additions & 25 deletions src/menu/pauseMenu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1232,33 +1232,41 @@ bool32 sub_080A5F24(void) {
return result;
}

void sub_080A5F48(Item item, u32 param_2) {
extern u32 gSprite_082E68F4[];
u32 ammoCount;
u32 tensDigit;
u8* puVar2;
u32 temp1;
typedef union {
struct {
s32 v1;
s32 v2;
} values;
u64 raw;
} DoubleReturnValue;

void sub_080A5F48(Item item, u32 offset) {
// this funcitons signature allows the div function to return a u64 (2x 32 bit registers)
// with the result in one register and the remainder in the other
typedef u64 DivRem(u32, u32);

s32 ammoCount;
s32 onesDigit;
s32 tensDigit;
void* dest;
u16* temp2;
u32 temp3;
register u32 rem asm("r1");
u32 index;
DoubleReturnValue ret;

switch (item) {
case ITEM_BOTTLE1:
case ITEM_BOTTLE2:
case ITEM_BOTTLE3:
case ITEM_BOTTLE4:
item = gSave.stats.bottles[item - ITEM_BOTTLE1];
break;
default:
break;
}

temp1 = param_2 * 0x20 + 0x6010000;
temp3 = gSpriteAnimations_322[item]->index;
temp2 = &gMoreSpritePtrs[1][temp3 * 2];
DmaCopy32(3, &gMoreSpritePtrs[2][temp2[1] * 0x10], temp1, 0x40 * 4);
ammoCount = -1;
dest = OBJ_VRAM0 + (offset * 0x20);
index = gSpriteAnimations_322[item]->index;
temp2 = &gMoreSpritePtrs[1][index * 2];
DmaCopy32(3, &gMoreSpritePtrs[2][temp2[1] * 0x10], dest, 0x40 * 4);

ammoCount = -1;
switch (item) {
case 7:
case 8:
Expand All @@ -1270,15 +1278,18 @@ void sub_080A5F48(Item item, u32 param_2) {
break;
}

if (-1 < (int)ammoCount) {
tensDigit = Div(ammoCount, 10);
item = rem;
if ((int)tensDigit >= 10) {
tensDigit = 9;
}
DmaCopy32(3, gUnk_085C4620 + tensDigit * 0x8, temp1, 0x8 * 4);
DmaCopy32(3, gUnk_085C4620 + (item + 10) * 0x8, temp1 + 0x20, 0x8 * 4);
}
if (ammoCount < 0)
return;

ret.raw = ((DivRem*)Div)(ammoCount, 10); // by casting to DivRem, we can recover the remainder from the Div call
onesDigit = ret.values.v2;
tensDigit = ret.values.v1;

if (tensDigit >= 10)
tensDigit = 9;

DmaCopy32(3, gUnk_085C4620 + tensDigit * 0x8, dest, 0x8 * 4);
DmaCopy32(3, gUnk_085C4620 + (onesDigit + 10) * 0x8, dest + 0x20, 0x8 * 4);
}

void PauseMenu_Screen_7(void) {
Expand Down
81 changes: 46 additions & 35 deletions src/ui.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,62 +440,73 @@ void EraseChargeBar(void) {
}
}

typedef union {
u32 values[2];
u64 raw;
} returnValues;

typedef u64 DivRem(u32, u32);

void DrawChargeBar(void) {
bool32 tmp1;
u16* ptr1;
u32 tmp2;
u32 tmp3;
register u32 rem asm("r1");
u32 tmp5;
u16* BufferPos;
returnValues ret;
// these names are almost certainly inaccurate
u32 chargeTime;
u32 chargeState;
u32 chargeFrame;

tmp1 = FALSE;
if ((gHUD.hideFlags & HUD_HIDE_CHARGE_BAR) == 0) {
if (!(gHUD.hideFlags & HUD_HIDE_CHARGE_BAR))
tmp1 = gPlayerState.chargeState.action != 0;
if (!tmp1) {
EraseChargeBar();
return;
}
if (gHUD.maxHealth > 10 * 4)
BufferPos = &gBG0Buffer[0x60];
else
BufferPos = &gBG0Buffer[0x40];

if (!tmp1)
return EraseChargeBar();

if (gHUD.maxHealth > 10 * 4) {
ptr1 = &gBG0Buffer[0x60];
} else {
ptr1 = &gBG0Buffer[0x40];
}
chargeTime = Div(gPlayerState.chargeState.chargeTimer + 19, 20);
if (chargeTime > 40)
chargeTime = 40;

tmp2 = Div(gPlayerState.chargeState.chargeTimer + 19, 20);
if (tmp2 > 40) {
tmp2 = 40;
}
if (gHUD.unk_6 == 0 || gHUD.unk_7 != tmp2) {
if (gHUD.unk_6 == 0 || gHUD.unk_7 != chargeTime) {
gHUD.unk_6 = 1;
gHUD.unk_7 = tmp2;
tmp3 = Div(tmp2, 4);
tmp5 = rem;
ptr1[0] = 0xf016;
ptr1[11] = 0xf416;
DmaSet(3, gUnk_080C8F54 + (10 - tmp3), ptr1 + 1, 0x8000000a);
if (tmp5 != 0) {
ptr1[tmp3 + 1] = ((tmp5 + 0x17U) & 0x3ff) | 0xf000;
}
gHUD.unk_7 = chargeTime;

// this calls Div and returns the result in ret.values[0] and the remainder in ret.values[1]
ret.raw = ((DivRem*)&Div)(chargeTime, 4);
chargeState = ret.values[0];
chargeFrame = ret.values[1];

BufferPos[0] = 0xf016;
BufferPos[11] = 0xf416;
DmaSet(3, &gUnk_080C8F54[10 - chargeState], BufferPos + 1, 0x8000000a);
if (chargeFrame != 0)
BufferPos[chargeState + 1] = ((chargeFrame + 0x17U) & 0x3ff) | 0xf000;
gScreen.bg0.updated = 1;
}

switch (gPlayerState.chargeState.action) {
case 4:
case 5:
gHUD.unk_9 += (gPlayerState.chargeState.action == 4) ? 2 : 1;
tmp3 = gHUD.unk_9 >> 4 & 3;
chargeState = gHUD.unk_9 >> 4 & 3;
break;
default:
tmp3 = 0;
chargeState = 0;
break;
}

if (tmp3 != gHUD.unk_8) {
gHUD.unk_8 = tmp3;
ptr1 = (u16*)0x600c2c0;
DmaSet(3, gUnk_080C8F7C[tmp3], ptr1, 0x84000030);
}
if (chargeState == gHUD.unk_8)
return;

gHUD.unk_8 = chargeState;

BufferPos = (u16*)(VRAM + 0xc2c0);
DmaSet(3, gUnk_080C8F7C[chargeState], BufferPos, 0x84000030);
}

void DrawKeys(void) {
Expand Down
Loading