Path: blob/master/SonicMania/Objects/Global/HUD.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: HUD Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectHUD *HUD;1011void HUD_Update(void)12{13RSDK_THIS(HUD);1415self->enableTimeFlash = false;16self->enableRingFlash = false;1718#if MANIA_USE_PLUS19if (self->replayClapAnimator.animationID == 11)20RSDK.ProcessAnimation(&self->replayClapAnimator);21#endif22}2324void HUD_LateUpdate(void)25{26RSDK_THIS(HUD);2728#if MANIA_USE_PLUS29if (globals->gameMode == MODE_COMPETITION) {30for (self->screenID = 0; self->screenID < RSDK.GetVideoSetting(VIDEOSETTING_SCREENCOUNT); ++self->screenID) {31StateMachine_Run(self->vsStates[self->screenID]);32}33}34else {35StateMachine_Run(self->state);36}37#else38StateMachine_Run(self->state);39#endif4041#if GAME_VERSION != VER_10042if (globals->gameMode < MODE_TIMEATTACK) {43EntityPlayer *player = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);44if (SceneInfo->timeEnabled && player->rings >= 50 && player->superState < SUPERSTATE_SUPER45&& SaveGame_GetSaveRAM()->collectedEmeralds >= 0b01111111) {46if (sku_platform == PLATFORM_PC || sku_platform == PLATFORM_SWITCH || sku_platform == PLATFORM_DEV)47HUD_GetActionButtonFrames();4849if (self->actionPromptPos < TO_FIXED(24))50self->actionPromptPos += TO_FIXED(8);51}52else {53if (self->actionPromptPos > -TO_FIXED(32))54self->actionPromptPos -= TO_FIXED(8);55}56}57#if MANIA_USE_PLUS58else if (globals->gameMode == MODE_TIMEATTACK) {59if (HUD->showTAPrompt) {60if (sku_platform == PLATFORM_PC || sku_platform == PLATFORM_SWITCH || sku_platform == PLATFORM_DEV) {61HUD_GetButtonFrame(&self->superButtonAnimator, KEY_Y);62HUD_GetButtonFrame(&self->saveReplayButtonAnimator, KEY_Y);63HUD_GetButtonFrame(&self->thumbsUpButtonAnimator, KEY_START);64}6566if (self->actionPromptPos < TO_FIXED(24))67self->actionPromptPos += TO_FIXED(8);68}69else {70if (self->actionPromptPos > -TO_FIXED(64))71self->actionPromptPos -= TO_FIXED(8);72}73}74#endif75#endif76}7778void HUD_StaticUpdate(void) {}7980void HUD_Draw(void)81{82RSDK_THIS(HUD);83EntityPlayer *player = RSDK_GET_ENTITY(SceneInfo->currentScreenID, Player);8485Vector2 drawPos;86Vector2 scorePos, timePos, ringPos, lifePos;8788scorePos.x = self->scorePos.x;89scorePos.y = self->scorePos.y;90timePos.x = self->timePos.x;91timePos.y = self->timePos.y;92ringPos.x = self->ringsPos.x;93ringPos.y = self->ringsPos.y;94lifePos.x = self->lifePos.x;95lifePos.y = self->lifePos.y;96if (globals->gameMode == MODE_COMPETITION) {97#if MANIA_USE_PLUS98scorePos.x = self->vsScorePos[SceneInfo->currentScreenID].x;99scorePos.y = self->vsScorePos[SceneInfo->currentScreenID].y;100timePos.x = self->vsTimePos[SceneInfo->currentScreenID].x;101timePos.y = self->vsTimePos[SceneInfo->currentScreenID].y;102ringPos.x = self->vsRingsPos[SceneInfo->currentScreenID].x;103ringPos.y = self->vsRingsPos[SceneInfo->currentScreenID].y;104lifePos.x = self->vsLifePos[SceneInfo->currentScreenID].x;105lifePos.y = self->vsLifePos[SceneInfo->currentScreenID].y;106#endif107108foreach_active(Player, plr)109{110if (plr != player) {111self->playerIDAnimator.frameID = plr->playerID;112RSDK.DrawSprite(&self->playerIDAnimator, &plr->position, false);113}114}115}116#if MANIA_USE_PLUS117else {118if (HUD->swapCooldown > 0) {119RSDK.ProcessAnimation(&self->playerIDAnimator);120RSDK.DrawSprite(&self->playerIDAnimator, &player->position, false);121--HUD->swapCooldown;122}123}124#endif125126self->ringFlashFrame = player->rings ? 0 : ((Zone->persistentTimer >> 3) & 1);127128#if GAME_VERSION != VER_100129#if MANIA_USE_PLUS130self->timeFlashFrame = 0;131if ((SceneInfo->minutes == 9 && isMainGameMode() && !(globals->medalMods & MEDAL_NOTIMEOVER)) || ActClear->disableTimeBonus)132self->timeFlashFrame = (Zone->persistentTimer >> 3) & 1;133#else134if (SceneInfo->minutes == 9 && globals->gameMode < MODE_TIMEATTACK)135self->timeFlashFrame = (Zone->persistentTimer >> 3) & 1;136#endif137#endif138139// Draw "Score"140self->hudElementsAnimator.frameID = 0;141RSDK.DrawSprite(&self->hudElementsAnimator, &scorePos, true);142143// Draw Score144drawPos.x = scorePos.x + TO_FIXED(97);145drawPos.y = scorePos.y + TO_FIXED(14);146HUD_DrawNumbersBase10(&drawPos, player->score, 0);147148// Draw "Time"149#if GAME_VERSION != VER_100150self->hudElementsAnimator.frameID = self->timeFlashFrame + 1;151#else152self->hudElementsAnimator.frameID = 1;153#endif154RSDK.DrawSprite(&self->hudElementsAnimator, &timePos, true);155156if (!self->enableTimeFlash || Zone->persistentTimer & 8) {157// Draw ":"158drawPos.x = timePos.x + TO_FIXED(52);159drawPos.y = timePos.y - TO_FIXED(2);160self->hudElementsAnimator.frameID = 12;161RSDK.DrawSprite(&self->hudElementsAnimator, &drawPos, true);162163// Draw Milliseconds164drawPos.x = timePos.x + TO_FIXED(97);165drawPos.y = timePos.y + TO_FIXED(14);166HUD_DrawNumbersBase10(&drawPos, SceneInfo->milliseconds, 2);167168// Draw Seconds169drawPos.x -= TO_FIXED(9);170HUD_DrawNumbersBase10(&drawPos, SceneInfo->seconds, 2);171172// Draw Minutes173drawPos.x -= TO_FIXED(9);174#if MANIA_USE_PLUS175if (SceneInfo->minutes > 9 && globals->medalMods & MEDAL_NOTIMEOVER)176HUD_DrawNumbersBase10(&drawPos, SceneInfo->minutes, 2);177else178#endif179HUD_DrawNumbersBase10(&drawPos, SceneInfo->minutes, 1);180}181182// Draw "Rings"183self->hudElementsAnimator.frameID = self->ringFlashFrame + 3;184RSDK.DrawSprite(&self->hudElementsAnimator, &ringPos, true);185186if (!self->enableRingFlash || Zone->persistentTimer & 8) {187// Draw Rings188drawPos.x = ringPos.x + TO_FIXED(97);189drawPos.y = ringPos.y + TO_FIXED(14);190if (player->hyperRing)191HUD_DrawNumbersHyperRing(&drawPos, player->rings);192else193HUD_DrawNumbersBase10(&drawPos, player->rings, 0);194}195196if (RSDK_GET_ENTITY(SLOT_PLAYER1, Player)->classID == DebugMode->classID) {197if (player->camera) {198// Draw Camera YPos199drawPos.x = TO_FIXED(ScreenInfo[player->camera->screenID].size.x - 16);200drawPos.y = TO_FIXED(24);201HUD_DrawNumbersBase16(&drawPos, ScreenInfo[player->camera->screenID].position.y);202203// Draw Camera XPos204drawPos.x -= TO_FIXED(9);205HUD_DrawNumbersBase16(&drawPos, ScreenInfo[player->camera->screenID].position.x);206207// Draw Player YPos208drawPos.x = TO_FIXED(ScreenInfo[player->camera->screenID].size.x - 16);209drawPos.y += TO_FIXED(16);210HUD_DrawNumbersBase16(&drawPos, FROM_FIXED(player->position.y));211212// Draw Player XPos213drawPos.x -= TO_FIXED(9);214HUD_DrawNumbersBase16(&drawPos, FROM_FIXED(player->position.x));215}216}217#if MANIA_USE_PLUS218else if (self->actionPromptPos > -TO_FIXED(64) && globals->gameMode == MODE_TIMEATTACK) {219drawPos.x = TO_FIXED(ScreenInfo[SceneInfo->currentScreenID].size.x) - self->actionPromptPos;220drawPos.y = TO_FIXED(20);221222if (API.CheckDLC(DLC_PLUS)) {223// Draw Replay Save Icon224RSDK.DrawSprite(&self->replayClapAnimator, &drawPos, true);225226// Draw Replay Save Button227drawPos.x -= TO_FIXED(28);228if (HUD->replaySaveEnabled) {229RSDK.DrawSprite(&self->saveReplayButtonAnimator, &drawPos, true);230}231else {232self->inkEffect = INK_BLEND;233RSDK.DrawSprite(&self->saveReplayButtonAnimator, &drawPos, true);234235self->inkEffect = INK_NONE;236}237238drawPos.x = TO_FIXED(ScreenInfo[SceneInfo->currentScreenID].size.x) - self->actionPromptPos;239drawPos.y += TO_FIXED(28);240}241// Draw Thumbs Up Icon242RSDK.DrawSprite(&self->thumbsUpIconAnimator, &drawPos, true);243244// Draw Thumbs Up Button245drawPos.x -= TO_FIXED(28);246RSDK.DrawSprite(&self->thumbsUpButtonAnimator, &drawPos, true);247}248#endif249#if GAME_VERSION != VER_100250else if (self->actionPromptPos > -TO_FIXED(32)) {251// Draw Super Icon252drawPos.x = TO_FIXED(ScreenInfo[SceneInfo->currentScreenID].size.x) - self->actionPromptPos;253drawPos.y = TO_FIXED(20);254RSDK.DrawSprite(&self->superIconAnimator, &drawPos, true);255256drawPos.x -= TO_FIXED(20);257bool32 canSuper = true;258#if MANIA_USE_PLUS259if (Player->canSuperCB)260canSuper = Player->canSuperCB(true);261#endif262// Draw Super Button263if (player->state == Player_State_Air && player->jumpAbilityState == 1 && canSuper) {264RSDK.DrawSprite(&self->superButtonAnimator, &drawPos, true);265}266else {267self->inkEffect = INK_BLEND;268RSDK.DrawSprite(&self->superButtonAnimator, &drawPos, true);269270self->inkEffect = INK_NONE;271}272}273#endif274275// Draw Life Icon (aka the Leader Icon if in encore mode)276drawPos.x = lifePos.x;277drawPos.y = lifePos.y;278#if MANIA_USE_PLUS279int32 lives = self->lives[player->playerID];280self->lifeIconAnimator.frameID = HUD_CharacterIndexFromID(player->characterID);281282if (self->lifeIconAnimator.frameID < 0) {283self->lifeIconAnimator.frameID = self->lifeFrameIDs[player->playerID];284lives--;285}286else {287self->lifeFrameIDs[player->playerID] = self->lifeIconAnimator.frameID;288self->lives[player->playerID] = player->lives;289}290#else291switch (player->characterID) {292default:293case ID_SONIC: self->lifeIconAnimator.frameID = 0; break;294case ID_TAILS: self->lifeIconAnimator.frameID = 1; break;295case ID_KNUCKLES: self->lifeIconAnimator.frameID = 2; break;296}297#endif298RSDK.DrawSprite(&self->lifeIconAnimator, &drawPos, true);299300#if MANIA_USE_PLUS301if (globals->gameMode == MODE_ENCORE) {302for (int32 p = 0; p < PLAYER_COUNT; ++p) {303if (HUD->stockFlashTimers[p] > 0)304HUD->stockFlashTimers[p]--;305}306307drawPos.x += TO_FIXED(20);308EntityPlayer *sidekick = RSDK_GET_ENTITY(SLOT_PLAYER2, Player);309if (sidekick->classID) {310// Draw Buddy Icon311self->lifeIconAnimator.frameID = HUD_CharacterIndexFromID(sidekick->characterID);312if (self->lifeIconAnimator.frameID >= 0 && !(HUD->stockFlashTimers[0] & 4)) {313if ((sidekick->state != Player_State_Death && sidekick->state != Player_State_Drown && sidekick->state != Player_State_EncoreRespawn)314|| !sidekick->abilityValues[0]) {315RSDK.DrawSprite(&self->lifeIconAnimator, &drawPos, true);316}317}318319// Draw Stock Icons320drawPos.x += TO_FIXED(20);321RSDK.SetSpriteAnimation(HUD->aniFrames, 12, &self->lifeIconAnimator, true, 0);322for (int32 i = 1; i < 4; ++i) {323self->lifeIconAnimator.frameID = HUD_CharacterIndexFromID(GET_STOCK_ID(i));324if (self->lifeIconAnimator.frameID >= 0 && !(HUD->stockFlashTimers[i] & 4))325RSDK.DrawSprite(&self->lifeIconAnimator, &drawPos, true);326327drawPos.x += TO_FIXED(16);328}329330RSDK.SetSpriteAnimation(HUD->aniFrames, 2, &self->lifeIconAnimator, true, 0);331}332}333else {334// Draw Life Icon "X"335self->hudElementsAnimator.frameID = 14;336RSDK.DrawSprite(&self->hudElementsAnimator, &drawPos, true);337338// Draw Lives339drawPos.x += TO_FIXED(48);340if (player->lives < 10)341drawPos.x -= TO_FIXED(8);342HUD_DrawNumbersBase10(&drawPos, lives, 0);343}344#else345// Draw Life Icon "X"346self->hudElementsAnimator.frameID = 14;347RSDK.DrawSprite(&self->hudElementsAnimator, &drawPos, true);348349// Draw Lives350drawPos.x += TO_FIXED(48);351if (player->lives < 10)352drawPos.x -= TO_FIXED(8);353HUD_DrawNumbersBase10(&drawPos, player->lives, 0);354#endif355356if (globals->gameMode == MODE_COMPETITION) {357// Draw Competition Borders358#if MANIA_USE_PLUS359switch (HUD->screenBorderType[SceneInfo->currentScreenID]) {360default:361case VS_BORDER_NONE: break;362363case VS_BORDER_BOTTOMRIGHT:364// Along right edge365RSDK.DrawRect(ScreenInfo->size.x - 1, 0, 1, ScreenInfo->size.y, 0x000000, 0xFF, INK_NONE, true);366// Along bottom edge367RSDK.DrawRect(0, ScreenInfo->size.y - 1, ScreenInfo->size.x, 1, 0x000000, 0xFF, INK_NONE, true);368break;369370case VS_BORDER_BOTTOM:371// Along bottom edge372RSDK.DrawRect(0, ScreenInfo->size.y - 1, ScreenInfo->size.x, 1, 0x000000, 0xFF, INK_NONE, true);373break;374375case VS_BORDER_BOTTOMLEFT:376// Along left edge (on screen 2)377RSDK.DrawRect(0, 0, 1, ScreenInfo[1].size.y, 0x000000, 0xFF, INK_NONE, true);378// Along bottom edge379RSDK.DrawRect(0, ScreenInfo->size.y - 1, ScreenInfo->size.x, 1, 0x000000, 0xFF, INK_NONE, true);380break;381382case VS_BORDER_TOPRIGHT:383// Along right edge384RSDK.DrawRect(ScreenInfo->size.x - 1, 0, 1, ScreenInfo->size.y, 0x000000, 0xFF, INK_NONE, true);385// Along top edge (on screen 2 or 3)386RSDK.DrawRect(0, 0, ScreenInfo[1].size.x, 1, 0x000000, 0xFF, INK_NONE, true);387break;388389case VS_BORDER_TOP:390// Along top edge (on screen 2)391RSDK.DrawRect(0, 0, ScreenInfo[1].size.x, 1, 0x000000, 0xFF, INK_NONE, true);392break;393394case VS_BORDER_TOPLEFT:395// Along left edge (on screen 3 or 4)396RSDK.DrawRect(0, 0, 1, ScreenInfo[1].size.y, 0x000000, 0xFF, INK_NONE, true);397// Along top edge (on screen 3 or 4)398RSDK.DrawRect(0, 0, ScreenInfo[1].size.x, 1, 0x000000, 0xFF, INK_NONE, true);399break;400}401#else402switch (SceneInfo->currentScreenID) {403case 0:404// Along right edge (on screen 1)405RSDK.DrawRect(0, ScreenInfo->size.y - 1, ScreenInfo->size.x, 1, 0x000000, 0xFF, INK_NONE, true);406break;407408case 1:409// Along left edge (on screen 2)410RSDK.DrawRect(0, 0, ScreenInfo[1].size.x, 1, 0x000000, 0xFF, INK_NONE, true);411break;412413default: break;414}415#endif416}417}418419void HUD_Create(void *data)420{421RSDK_THIS(HUD);422423if (!SceneInfo->inEditor) {424#if MANIA_USE_PLUS425ActClear->disableTimeBonus = false;426#endif427428self->active = ACTIVE_NORMAL;429self->visible = true;430self->drawGroup = Zone->hudDrawGroup;431432self->scorePos.x = TO_FIXED(16);433self->scorePos.y = TO_FIXED(12);434self->timePos.x = TO_FIXED(16);435self->timePos.y = TO_FIXED(28);436self->ringsPos.x = TO_FIXED(16);437self->ringsPos.y = TO_FIXED(44);438self->lifePos.x = TO_FIXED(16);439self->lifePos.y = TO_FIXED(ScreenInfo->size.y - 12);440#if GAME_VERSION != VER_100441self->actionPromptPos = -TO_FIXED(32);442#endif443444#if MANIA_USE_PLUS445for (int32 i = 0; i < SCREEN_COUNT; ++i) {446self->vsScorePos[i].x = self->scorePos.x;447self->vsScorePos[i].y = self->scorePos.y;448self->vsTimePos[i].x = self->timePos.x;449self->vsTimePos[i].y = self->timePos.y;450self->vsRingsPos[i].x = self->ringsPos.x;451self->vsRingsPos[i].y = self->ringsPos.y;452self->vsLifePos[i].x = self->lifePos.x;453self->vsLifePos[i].y = self->lifePos.y;454}455#endif456457RSDK.SetSpriteAnimation(HUD->aniFrames, 0, &self->hudElementsAnimator, true, 0);458RSDK.SetSpriteAnimation(HUD->aniFrames, 1, &self->numbersAnimator, true, 0);459RSDK.SetSpriteAnimation(HUD->aniFrames, 9, &self->hyperNumbersAnimator, true, 0);460RSDK.SetSpriteAnimation(HUD->aniFrames, 2, &self->lifeIconAnimator, true, 0);461#if MANIA_USE_PLUS462RSDK.SetSpriteAnimation(HUD->aniFrames, globals->gameMode == MODE_ENCORE ? 13 : 8, &self->playerIDAnimator, true, 0);463RSDK.SetSpriteAnimation(HUD->aniFrames, 10, &self->thumbsUpIconAnimator, true, 2);464RSDK.SetSpriteAnimation(HUD->aniFrames, 10, &self->replayClapAnimator, true, 1);465#else466RSDK.SetSpriteAnimation(HUD->aniFrames, 8, &self->playerIDAnimator, true, 0);467#endif468469#if GAME_VERSION != VER_100470RSDK.SetSpriteAnimation(HUD->superButtonFrames, 0, &self->superIconAnimator, true, 0);471HUD_GetActionButtonFrames();472#endif473474#if MANIA_USE_PLUS475RSDK.AddViewableVariable("Show HUD", &self->visible, VIEWVAR_UINT8, false, true);476#endif477}478}479480void HUD_StageLoad(void)481{482HUD->aniFrames = RSDK.LoadSpriteAnimation("Global/HUD.bin", SCOPE_STAGE);483#if GAME_VERSION != VER_100484HUD->superButtonFrames = RSDK.LoadSpriteAnimation("Global/SuperButtons.bin", SCOPE_STAGE);485#endif486487#if MANIA_USE_PLUS488HUD->sfxClick = RSDK.GetSfx("Stage/Click.wav");489HUD->sfxStarpost = RSDK.GetSfx("Global/StarPost.wav");490491HUD->showTAPrompt = false;492493EntityCompetitionSession *session = CompetitionSession_GetSession();494if (globals->gameMode == MODE_COMPETITION) {495HUD->screenBorderType[0] = session->screenBorderType[0];496HUD->screenBorderType[1] = session->screenBorderType[1];497HUD->screenBorderType[2] = session->screenBorderType[2];498HUD->screenBorderType[3] = session->screenBorderType[3];499}500#endif501}502503void HUD_DrawNumbersBase10(Vector2 *drawPos, int32 value, int32 digitCount)504{505RSDK_THIS(HUD);506507if (!digitCount && value > 0) {508int32 v = value;509while (v > 0) {510++digitCount;511v /= 10;512}513}514else {515if (!digitCount && value <= 0)516digitCount = 1;517}518519int32 digit = 1;520while (digitCount--) {521self->numbersAnimator.frameID = value / digit % 10;522RSDK.DrawSprite(&self->numbersAnimator, drawPos, true);523digit *= 10;524drawPos->x -= TO_FIXED(8);525}526}527528void HUD_DrawNumbersBase16(Vector2 *drawPos, int32 value)529{530RSDK_THIS(HUD);531532int32 mult = 1;533for (int32 i = 4; i; --i) {534self->numbersAnimator.frameID = value / mult & 0xF;535RSDK.DrawSprite(&self->numbersAnimator, drawPos, true);536drawPos->x -= TO_FIXED(8);537mult *= 16;538}539}540541void HUD_DrawNumbersHyperRing(Vector2 *drawPos, int32 value)542{543RSDK_THIS(HUD);544545int32 cnt = 0;546int32 mult = 1;547int32 mult2 = 1;548if (value <= 0) {549cnt = 1;550}551else {552int32 v = value;553while (v) {554++cnt;555v /= 10;556}557}558559if (cnt > 0) {560while (cnt--) {561self->hyperNumbersAnimator.frameID = value / mult % 10;562RSDK.DrawSprite(&self->hyperNumbersAnimator, drawPos, true);563drawPos->x -= TO_FIXED(8);564mult = 10 * mult2;565mult2 *= 10;566}567}568569self->hyperNumbersAnimator.frameID = 10;570drawPos->x -= TO_FIXED(4);571RSDK.DrawSprite(&self->hyperNumbersAnimator, drawPos, true);572}573574#if GAME_VERSION != VER_100575void HUD_GetButtonFrame(Animator *animator, int32 buttonID)576{577int32 gamepadType = UIButtonPrompt_GetGamepadType();578if (API_GetConfirmButtonFlip() && buttonID <= 1)579buttonID ^= 1;580581// Gamepad582if (gamepadType != UIBUTTONPROMPT_KEYBOARD && (gamepadType < UIBUTTONPROMPT_KEYBOARD_FR || gamepadType > UIBUTTONPROMPT_KEYBOARD_SP)) {583RSDK.SetSpriteAnimation(HUD->superButtonFrames, gamepadType, animator, true, buttonID);584}585else {586// Keyboard587EntityPlayer *player = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);588#if MANIA_USE_PLUS589int32 id = API_GetInputDeviceID(player->controllerID);590#else591int32 id = INPUT_NONE;592#endif593int32 contID = id == INPUT_UNASSIGNED ? CONT_P1 : player->controllerID;594595int32 map = 0;596switch (buttonID) {597default: break;598case 0: map = ControllerInfo[contID].keyA.keyMap; break;599case 1: map = ControllerInfo[contID].keyB.keyMap; break;600case 2: map = ControllerInfo[contID].keyX.keyMap; break;601case 3: map = ControllerInfo[contID].keyY.keyMap; break;602case 4: map = ControllerInfo[contID].keyStart.keyMap; break;603}604605int32 frame = UIButtonPrompt_MappingsToFrame(map);606RSDK.SetSpriteAnimation(HUD->superButtonFrames, 1, animator, true, frame);607}608}609void HUD_GetActionButtonFrames(void)610{611RSDK_THIS(HUD);612613HUD_GetButtonFrame(&self->superButtonAnimator, KEY_Y);614#if MANIA_USE_PLUS615HUD_GetButtonFrame(&self->saveReplayButtonAnimator, KEY_Y);616HUD_GetButtonFrame(&self->thumbsUpButtonAnimator, KEY_START);617#endif618}619#endif620621void HUD_State_MoveIn(void)622{623RSDK_THIS(HUD);624625#if MANIA_USE_PLUS626StateMachine(*state) = NULL;627Vector2 *scorePos = NULL, *timePos = NULL, *ringsPos = NULL, *lifePos = NULL;628int32 *targetPos = NULL;629630if (globals->gameMode == MODE_COMPETITION) {631state = &self->vsStates[SceneInfo->currentScreenID];632scorePos = &self->vsScorePos[SceneInfo->currentScreenID];633timePos = &self->vsTimePos[SceneInfo->currentScreenID];634ringsPos = &self->vsRingsPos[SceneInfo->currentScreenID];635lifePos = &self->vsLifePos[SceneInfo->currentScreenID];636targetPos = &self->vsTargetPos[SceneInfo->currentScreenID];637}638else {639state = &self->state;640scorePos = &self->scorePos;641timePos = &self->timePos;642ringsPos = &self->ringsPos;643lifePos = &self->lifePos;644targetPos = &self->targetPos;645}646647if (scorePos->x < *targetPos)648scorePos->x += TO_FIXED(8);649650if (timePos->x < *targetPos)651timePos->x += TO_FIXED(8);652653if (ringsPos->x < *targetPos)654ringsPos->x += TO_FIXED(8);655656if (lifePos->x < *targetPos)657lifePos->x += TO_FIXED(8);658else659*state = StateMachine_None;660#else661if (self->scorePos.x < self->targetPos)662self->scorePos.x += TO_FIXED(8);663664if (self->timePos.x < self->targetPos)665self->timePos.x += TO_FIXED(8);666667if (self->ringsPos.x < self->targetPos)668self->ringsPos.x += TO_FIXED(8);669670if (self->lifePos.x < self->targetPos)671self->lifePos.x += TO_FIXED(8);672else673self->state = StateMachine_None;674#endif675}676677void HUD_State_MoveOut(void)678{679RSDK_THIS(HUD);680681#if MANIA_USE_PLUS682Vector2 *scorePos = NULL, *timePos = NULL, *ringsPos = NULL, *lifePos = NULL;683StateMachine(*state) = NULL;684685if (globals->gameMode == MODE_COMPETITION) {686state = &self->vsStates[self->screenID];687scorePos = &self->vsScorePos[self->screenID];688timePos = &self->vsTimePos[self->screenID];689ringsPos = &self->vsRingsPos[self->screenID];690lifePos = &self->vsLifePos[self->screenID];691}692else {693state = &self->state;694scorePos = &self->scorePos;695timePos = &self->timePos;696ringsPos = &self->ringsPos;697lifePos = &self->lifePos;698}699700scorePos->x -= TO_FIXED(8);701702if (timePos->x - scorePos->x > TO_FIXED(16))703timePos->x -= TO_FIXED(8);704705if (ringsPos->x - timePos->x > TO_FIXED(16))706ringsPos->x -= TO_FIXED(8);707708if (lifePos->x - ringsPos->x > TO_FIXED(16))709lifePos->x -= TO_FIXED(8);710711if (lifePos->x < -TO_FIXED(80)) {712if (globals->gameMode == MODE_COMPETITION) {713*state = StateMachine_None;714CompSession_DeriveWinner(self->screenID, FINISHTYPE_GAMEOVER);715EntityGameOver *gameOver = RSDK_GET_ENTITY(self->screenID + Player->playerCount, GameOver);716EntityCompetition *manager = Competition->sessionManager;717718if (!manager || manager->timer) {719RSDK.ResetEntity(gameOver, GameOver->classID, INT_TO_VOID(false));720gameOver->playerID = self->screenID;721}722else {723RSDK.ResetEntity(gameOver, GameOver->classID, INT_TO_VOID(true));724RSDK.SetEngineState(ENGINESTATE_FROZEN);725SceneInfo->timeEnabled = false;726gameOver->playerID = self->screenID;727}728}729else {730destroyEntity(self);731}732}733#else734self->scorePos.x -= TO_FIXED(8);735736if (self->timePos.x - self->scorePos.x > TO_FIXED(16))737self->timePos.x -= TO_FIXED(8);738739if (self->ringsPos.x - self->timePos.x > TO_FIXED(16))740self->ringsPos.x -= TO_FIXED(8);741742if (self->lifePos.x - self->ringsPos.x > TO_FIXED(16))743self->lifePos.x -= TO_FIXED(8);744745if (self->lifePos.x < -TO_FIXED(64))746destroyEntity(self);747#endif748}749750void HUD_MoveIn(EntityHUD *hud)751{752hud->targetPos = hud->scorePos.x;753hud->scorePos.x -= TO_FIXED(0x100);754hud->timePos.x -= TO_FIXED(0x110);755hud->ringsPos.x -= TO_FIXED(0x120);756hud->lifePos.x -= TO_FIXED(0x130);757hud->state = HUD_State_MoveIn;758}759760void HUD_MoveOut(void)761{762foreach_active(HUD, hud) { hud->state = HUD_State_MoveOut; }763}764765void HUD_EnableRingFlash(void)766{767foreach_all(HUD, hud)768{769if (hud)770hud->enableRingFlash = true;771foreach_break;772}773}774775int32 HUD_CharacterIndexFromID(int32 characterID)776{777int32 id = -1;778for (int32 i = characterID; i > 0; ++id, i >>= 1)779;780return id;781}782783#if GAME_INCLUDE_EDITOR784void HUD_EditorDraw(void)785{786RSDK_THIS(HUD);787RSDK.SetSpriteAnimation(HUD->aniFrames, 0, &self->hudElementsAnimator, true, 0);788RSDK.DrawSprite(&self->hudElementsAnimator, NULL, false);789}790791void HUD_EditorLoad(void) { HUD->aniFrames = RSDK.LoadSpriteAnimation("Editor/EditorIcons.bin", SCOPE_STAGE); }792#endif793794void HUD_Serialize(void) {}795796797