You are on page 1of 5

//# address-hook(0x00db3c) end(0x00db42)

function void fn00db3c()


{
{
RenderHUD()
}
}

//# address-hook(0x00db44) end(0x00dbb2)


function void RenderHUD()
{

s16 baseX = global.level_started


if (baseX < 0)
{
baseX += 8
global.level_started = baseX
}
baseX += 0x0f
s16 baseY = 0x08
u16 renderQueue = 0xe000
if (Config_HUD_Opacity == 1)
{
if (control.player1.state & CONTROL_UP)
{
HUD.drawSprite("up1", baseX + 40, 180, renderQueue)
}
else if (control.player1.state & CONTROL_DOWN)
{
HUD.drawSprite("down1", baseX + 40, 180, renderQueue)
}
else if (control.player1.state & CONTROL_LEFT)
{
HUD.drawSprite("left1", baseX + 40, 180, renderQueue)
}
else if (control.player1.state & CONTROL_RIGHT)
{
HUD.drawSprite("right1", baseX + 40, 180, renderQueue)
}
else
{
HUD.drawSprite("none1", baseX + 40, 180, renderQueue)
}
if (control.player1.state & CONTROL_A)
{
HUD.drawSprite("a_pressed1", baseX + 325, 180, renderQueue)
}
else
{
HUD.drawSprite("a_idle1", baseX + 325, 180, renderQueue)
}
if (control.player1.state & CONTROL_B)
{
HUD.drawSprite("b_pressed1", baseX + 325, 180, renderQueue)
}
else
{
HUD.drawSprite("b_idle1", baseX + 325, 180, renderQueue)
}
if (control.player1.state & CONTROL_C)
{
HUD.drawSprite("x_pressed1", baseX + 325, 180, renderQueue)
}
else
{
HUD.drawSprite("x_idle1", baseX + 325, 180, renderQueue)
}
if (control.player1.state & Input.buttonDown(BUTTON_Y))
{
HUD.drawSprite("y_pressed1", baseX + 325, 180, renderQueue)
}
else
{
HUD.drawSprite("y_idle1", baseX + 325, 180, renderQueue)
}
}
if (Config_Show_Pause_Button == 1)
{
HUD.drawSprite("pause", baseX + 300, 16, renderQueue)
}
if (debug_mode.state)
{
HUD.drawSprite("debug", baseX + 183, 16, renderQueue)
}
bool isBonusStage = (global.zone >= 0x13 && global.zone <= 0x15)
#if STANDALONE

if (!isBonusStage)
{
// Score
HUD.drawSprite("hud_text_score", baseX, baseY, renderQueue)
++renderQueue
HUD.drawNumber("hud_digit_%d", player.score * 10, baseX + 0x58,
baseY, renderQueue)
++renderQueue

// Time
{
bool show = (timer.minutes < 9 || isBonusStage ||
(level.framecounter & 0x08) || Game.getSetting(SETTING_INFINITE_TIME))
HUD.drawSprite(show ? "hud_text_time" :
"hud_text_time_red", baseX, baseY + 0x10, renderQueue)
++renderQueue

// Unfortunately, the time progress is done later inside


the frame, so we don't have the right value in "timer.frames" yet
// -> If the conditions for time progress are met, add one
and everything will be alright
u16 minutes = timer.minutes
u16 seconds = timer.seconds
u16 frames = timer.frames
if (hud.dirty.timer && !global.game.paused && timer.alldata
< 0x93b3b) // That is 9:59 and 59 frames
{
++frames
seconds += (frames / 60)
minutes += (seconds / 60)
frames %= 60
seconds %= 60
}
u16 centiseconds = (frames * 99 + 30) / 59

u16 px = (minutes >= 10) ? (baseX + 8) : baseX


if (Game.getSetting(SETTING_EXTENDED_HUD))
{
if (minutes >= 10)
HUD.drawDigit(minutes / 10, px + 0x20, baseY +
0x10, renderQueue)
HUD.drawDigit(minutes % 10, px + 0x28, baseY + 0x10,
renderQueue)
HUD.drawSprite("hud_char_minutes", px + 0x30, baseY +
0x10, renderQueue)
HUD.drawDigit(seconds / 10, px + 0x38, baseY + 0x10,
renderQueue)
HUD.drawDigit(seconds % 10, px + 0x40, baseY + 0x10,
renderQueue)
HUD.drawSprite("hud_char_seconds", px + 0x48, baseY +
0x10, renderQueue)
HUD.drawDigit(centiseconds / 10, px + 0x50, baseY +
0x10, renderQueue)
if (minutes < 10)
HUD.drawDigit(centiseconds % 10, px + 0x58,
baseY + 0x10, renderQueue)
}
else
{
if (minutes >= 10)
HUD.drawDigit(minutes / 10, px + 0x20, baseY +
0x10, renderQueue)
HUD.drawDigit(minutes % 10, px + 0x28, baseY + 0x10,
renderQueue)
HUD.drawSprite("hud_char_colon", px + 0x30, baseY +
0x10, renderQueue)
HUD.drawDigit(seconds / 10, px + 0x38, baseY + 0x10,
renderQueue)
HUD.drawDigit(seconds % 10, px + 0x40, baseY + 0x10,
renderQueue)
}
++renderQueue
}
}

// Rings
{
u16 py = (isBonusStage) ? baseY : baseY + 0x20
bool show = (ring_counter != 0 || (level.framecounter & 0x08))
HUD.drawSprite(show ? "hud_text_rings" : "hud_text_rings_red",
baseX, py, renderQueue)
++renderQueue

u16 px = baseX + (!isBonusStage &&


Game.getSetting(SETTING_EXTENDED_HUD) ? 0x58 : 0x40)
for (u32 value = ring_counter;;)
{
HUD.drawDigit(value % 10, px, py, renderQueue)
px -= 8
value /= 10
if (value == 0)
break
}
++renderQueue
}

// Lives (not visible in Time Attack)


if (!Game.isTimeAttack() && !Game.getSetting(SETTING_INFINITE_LIVES))
{
u64 characterName
if (getMainCharacter() == CHARACTER_SONIC)
characterName = "sonic"
else if (getMainCharacter() == CHARACTER_TAILS)
characterName = (global.region_code & 0x80) ? "tails" :
"miles"
else
characterName = "knuckles"
HUD.drawSprite(stringformat("hud_lives_icon_%s", characterName),
baseX + 312, 8, renderQueue)
++renderQueue

if (lives_counter >= 10)


HUD.drawSmallDigit(u16((lives_counter / 10) % 10), baseX +
344, 16, renderQueue)
HUD.drawSmallDigit(u16(lives_counter % 10), baseX + 352, 16,
renderQueue)
}
}
else
#endif
{
D4 = (isBonusStage) ? 8 : 0

if ((level.framecounter & 0x08) == 0)


{
if (ring_counter == 0)
{
D4 += 2
}
if (timer.minutes == 9 && !isBonusStage)
{
D4 += 4
}
}

// Targets:
// - 0x00dbc2 -> D4.u16 = 0x00
// - 0x00dc00 -> D4.u16 = 0x02
// - 0x00dc32 -> D4.u16 = 0x04
// - 0x00dc96 -> D4.u16 = 0x08
// - 0x00dcb6 -> D4.u16 = 0x0a
A1 = tableLookupAddress(0x00dbb6, D4.u16)

D4.s16 = u16[A1] - 1
D0.s16 = baseX + 0x80
D1.u16 = 0x0108
D5.u16 = 0x86ca
A1 += 2
if (D4.s16 >= 0)
{
writeToSpriteTable(renderQueue)
}
}

You might also like