Path: blob/master/SonicMania/Objects/UFO/UFO_HUD.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: UFO_HUD Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectUFO_HUD *UFO_HUD;1011void UFO_HUD_Update(void)12{13RSDK_THIS(UFO_HUD);1415#if MANIA_USE_PLUS && GAME_VERSION != VER_10716if (ControllerInfo->keyY.press) {17// Not original code, should help fix some crashes/glitches that occur due to how this works through18Entity *selfStore = SceneInfo->entity;19SceneInfo->entity = RSDK_GET_ENTITY_GEN(SLOT_PLAYER1);2021// Cool Debug thingy they left in22UFO_HUD_LevelUpMach();2324// Not original code, should help fix some crashes/glitches that occur due to how this works through25SceneInfo->entity = selfStore;26}27#endif2829if (self->scale.x > 0x200) {30self->scale.x -= 0x10;31self->scale.y -= 0x10;3233if (self->scale.x <= 0x200) {34int32 cnt = 32 * UFO_Setup->machPoints / UFO_Setup->machQuotas[UFO_Setup->machLevel];35RSDK.CopyPalette(self->machPaletteBank, 96, 0, 96, cnt);36RSDK.CopyPalette(1, cnt + 96, 0, cnt + 96, (uint8)(32 - cnt));37}38else {39RSDK.SetLimitedFade(0, 1, 4, self->scale.x - 0x200, 96, 127);40}41}4243if (self->timer > 0)44self->timer--;4546if (UFO_Setup->rings <= 0 || UFO_Setup->rings >= 10)47self->showRingCount = true;48else49self->showRingCount = (UFO_Setup->timer >> 3) & 1;50}5152void UFO_HUD_LateUpdate(void) {}5354void UFO_HUD_StaticUpdate(void) {}5556void UFO_HUD_Draw(void)57{58RSDK_THIS(UFO_HUD);5960Vector2 drawPos;61drawPos.y = 0x240000;62drawPos.x = ScreenInfo->center.x << 16;63if (self->scale.x > 0x200)64self->drawFX = FX_SCALE;6566RSDK.DrawSprite(&self->hudAnimator, &drawPos, true);6768for (int32 i = 0; i <= UFO_Setup->machLevel; ++i) {69RSDK.DrawSprite(&self->stripeAnimator, &drawPos, true);70drawPos.x += 0xA0000;71}7273drawPos.x = ScreenInfo->center.x << 16;74if (!(self->timer & 4) && self->timer) {75self->machAnimator.frameID = 3;76RSDK.DrawSprite(&self->machAnimator, &drawPos, true);77}78else if (!self->timer) {79self->machAnimator.frameID = UFO_Setup->machLevel;80RSDK.DrawSprite(&self->machAnimator, &drawPos, true);81}8283self->drawFX = FX_NONE;84if (self->showRingCount) {85drawPos.x += 0x200000;86drawPos.y = 0x250000;87UFO_HUD_DrawNumbers(&drawPos, UFO_Setup->rings);88}89}9091void UFO_HUD_Create(void *data)92{93RSDK_THIS(UFO_HUD);9495if (!SceneInfo->inEditor) {96self->active = ACTIVE_NORMAL;97self->visible = true;98self->drawGroup = 12;99self->updateRange.x = 0x800000;100self->updateRange.y = 0x800000;101self->scale.x = 0x200;102self->scale.y = 0x200;103self->machPaletteBank = 2;104105RSDK.SetSpriteAnimation(UFO_HUD->aniFrames, 0, &self->hudAnimator, true, 0);106RSDK.SetSpriteAnimation(UFO_HUD->aniFrames, 1, &self->numbersAnimator, true, 0);107RSDK.SetSpriteAnimation(UFO_HUD->aniFrames, 2, &self->machAnimator, true, 0);108RSDK.SetSpriteAnimation(UFO_HUD->aniFrames, 3, &self->stripeAnimator, true, 0);109}110}111112void UFO_HUD_StageLoad(void)113{114UFO_HUD->aniFrames = RSDK.LoadSpriteAnimation("SpecialUFO/HUD.bin", SCOPE_STAGE);115116RSDK.ResetEntitySlot(SLOT_UFO_HUD, UFO_HUD->classID, NULL);117}118119void UFO_HUD_CheckLevelUp(void)120{121EntityUFO_HUD *hud = RSDK_GET_ENTITY(SLOT_UFO_HUD, UFO_HUD);122123if (UFO_Setup->machPoints >= UFO_Setup->machQuotas[UFO_Setup->machLevel]) {124UFO_Setup->machPoints -= UFO_Setup->machQuotas[UFO_Setup->machLevel];125126if (UFO_Setup->machLevel >= 2) {127++UFO_Setup->scoreBonus;128hud->timer = 60;129}130else {131if (++UFO_Setup->machLevel == 2)132hud->machPaletteBank = 3;133}134135UFO_Player_ChangeMachState();136137hud->scale.x = 0x300;138hud->scale.y = 0x300;139RSDK.PlaySfx(UFO_Sphere->sfxMachSpeed, false, 0xFF);140}141142if (hud->scale.x == 0x200) {143int32 cnt = 32 * UFO_Setup->machPoints / UFO_Setup->machQuotas[UFO_Setup->machLevel];144RSDK.CopyPalette(hud->machPaletteBank, 96, 0, 96, cnt);145RSDK.CopyPalette(1, cnt + 96, 0, cnt + 96, (uint8)(32 - cnt));146}147}148149void UFO_HUD_LevelUpMach(void)150{151EntityUFO_HUD *hud = RSDK_GET_ENTITY(SLOT_UFO_HUD, UFO_HUD);152UFO_Setup->machPoints = 0;153154if (UFO_Setup->machLevel >= 2) {155++UFO_Setup->scoreBonus;156hud->timer = 60;157}158else {159if (++UFO_Setup->machLevel == 2)160hud->machPaletteBank = 3;161}162163UFO_Player_ChangeMachState();164165hud->scale.x = 0x300;166hud->scale.y = 0x300;167RSDK.PlaySfx(UFO_Sphere->sfxMachSpeed, false, 255);168}169170void UFO_HUD_DrawNumbers(Vector2 *drawPos, int32 value)171{172RSDK_THIS(UFO_HUD);173174int32 mult = 1;175for (int32 i = 0; i < 3; ++i) {176self->numbersAnimator.frameID = value / mult % 10;177RSDK.DrawSprite(&self->numbersAnimator, drawPos, true);178drawPos->x -= 0x100000;179mult *= 10;180}181}182183#if GAME_INCLUDE_EDITOR184void UFO_HUD_EditorDraw(void) {}185186void UFO_HUD_EditorLoad(void) {}187#endif188189void UFO_HUD_Serialize(void) {}190191192