Path: blob/master/SonicMania/Objects/SSZ/MSPanel.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: MSPanel Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectMSPanel *MSPanel;1011void MSPanel_Update(void)12{13RSDK_THIS(MSPanel);1415StateMachine_Run(self->state);16}1718void MSPanel_LateUpdate(void) {}1920void MSPanel_StaticUpdate(void) {}2122void MSPanel_Draw(void)23{24RSDK_THIS(MSPanel);2526if (MetalSonic->invincibilityTimerPanel & 1) {27RSDK.CopyPalette(2, 32, 0, 32, 16);28RSDK.CopyPalette(2, 160, 0, 160, 16);2930RSDK.DrawSprite(&self->cablesAnimator, NULL, false);31RSDK.DrawSprite(&self->panelAnimator, NULL, false);3233RSDK.CopyPalette(1, 32, 0, 32, 16);34RSDK.CopyPalette(1, 160, 0, 160, 16);35}36else {37RSDK.DrawSprite(&self->cablesAnimator, NULL, false);38RSDK.DrawSprite(&self->panelAnimator, NULL, false);39}40}4142void MSPanel_Create(void *data)43{44RSDK_THIS(MSPanel);4546if (!SceneInfo->inEditor) {47self->active = ACTIVE_BOUNDS;48self->visible = true;49self->updateRange.x = 0x800000;50self->updateRange.y = 0x800000;5152RSDK.SetSpriteAnimation(MSPanel->aniFrames, 1, &self->panelAnimator, true, 0);53RSDK.SetSpriteAnimation(MSPanel->aniFrames, 0, &self->cablesAnimator, true, 0);5455self->state = MSPanel_State_SetupPanel;56self->drawGroup = Zone->objectDrawGroup[0];57}58}5960void MSPanel_StageLoad(void) { MSPanel->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/MSPanel.bin", SCOPE_STAGE); }6162void MSPanel_State_SetupPanel(void)63{64RSDK_THIS(MSPanel);6566EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);6768if (player1->position.x > self->position.x && player1->position.y < self->position.y + 0xE80000) {6970foreach_active(MetalSonic, metal)71{72if (abs(self->position.x - metal->position.x) < 0x400000 && metal->position.y - self->position.y < 0x1000000) {73metal->panel = self;74metal->state = MetalSonic_State_EnterPanel;75metal->angle = 0;76metal->targetPos = self->position;77metal->targetPos.y += 0x240000;78metal->timer = 0;7980RSDK.SetSpriteAnimation(MetalSonic->aniFrames, 3, &metal->metalSonicAnimator, false, 0);81RSDK.SetSpriteAnimation(MetalSonic->aniFrames, 11, &metal->boosterAnimator, false, 0);82self->state = StateMachine_None;83}84}85}86}8788void MSPanel_State_Active(void)89{90RSDK_THIS(MSPanel);9192RSDK.ProcessAnimation(&self->panelAnimator);93}9495void MSPanel_State_Explode(void)96{97RSDK_THIS(MSPanel);9899if (!(Zone->timer % 3)) {100RSDK.PlaySfx(MetalSonic->sfxExplosion2, false, 255);101102if (!(Zone->timer & 4)) {103int32 x = self->position.x + RSDK.Rand(-0x300000, 0x300000);104int32 y = self->position.y + RSDK.Rand(-0x100000, 0x400000);105106EntityExplosion *explosion = CREATE_ENTITY(Explosion, INT_TO_VOID((RSDK.Rand(0, 256) > 192) + EXPLOSION_BOSS), x, y);107explosion->drawGroup = Zone->objectDrawGroup[1];108}109}110}111112void MSPanel_State_Rumbling(void)113{114RSDK_THIS(MSPanel);115116if (!(Zone->timer % 3)) {117RSDK.PlaySfx(MetalSonic->sfxExplosion2, false, 255);118119if (!(Zone->timer & 4)) {120int32 x = self->position.x + RSDK.Rand(-0x600000, 0x600000);121int32 y = self->position.y + RSDK.Rand(-0x200000, 0x600000);122EntityExplosion *explosion = CREATE_ENTITY(Explosion, INT_TO_VOID((RSDK.Rand(0, 256) > 192) + EXPLOSION_BOSS), x, y);123explosion->drawGroup = Zone->objectDrawGroup[1];124}125}126127if (!(Zone->timer & 0xF)) {128Camera_ShakeScreen(0, 0, 4);129RSDK.PlaySfx(MetalSonic->sfxRumble, false, 255);130}131}132133#if GAME_INCLUDE_EDITOR134void MSPanel_EditorDraw(void)135{136RSDK_THIS(MSPanel);137138RSDK.SetSpriteAnimation(MSPanel->aniFrames, 1, &self->panelAnimator, false, 0);139RSDK.SetSpriteAnimation(MSPanel->aniFrames, 0, &self->cablesAnimator, false, 0);140141RSDK.DrawSprite(&self->cablesAnimator, NULL, false);142RSDK.DrawSprite(&self->panelAnimator, NULL, false);143}144145void MSPanel_EditorLoad(void) { MSPanel->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/MSPanel.bin", SCOPE_STAGE); }146#endif147148void MSPanel_Serialize(void) {}149150151