Path: blob/master/SonicMania/Objects/SSZ/MSHologram.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: MSHologram Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectMSHologram *MSHologram;1011void MSHologram_Update(void)12{13RSDK_THIS(MSHologram);1415self->angle = (self->angle + 4) & 0xFF;1617RSDK.ProcessAnimation(&self->lightsAnimator);18RSDK.ProcessAnimation(&self->metalSonicAnimator);19RSDK.ProcessAnimation(&self->rabbitAnimator);20RSDK.ProcessAnimation(&self->canaryAnimator);2122StateMachine_Run(self->state);23}2425void MSHologram_LateUpdate(void) {}2627void MSHologram_StaticUpdate(void) {}2829void MSHologram_Draw(void)30{31RSDK_THIS(MSHologram);32Vector2 drawPos;3334drawPos.x = self->position.x;35drawPos.y = self->position.y;36RSDK.DrawSprite(&self->projectorAnimator, NULL, false);3738if (!(Zone->timer & 2)) {39RSDK.DrawSprite(&self->lightsAnimator, NULL, false);4041self->direction = FLIP_X;42RSDK.DrawSprite(&self->rabbitAnimator, NULL, false);4344self->direction = FLIP_NONE;45RSDK.DrawSprite(&self->metalSonicAnimator, NULL, false);4647if (self->angle < 0x80)48self->direction = FLIP_X;4950drawPos.x += (RSDK.Cos256(self->angle) - 0x140) << 13;51drawPos.y += (RSDK.Sin256(self->angle) - 0x1C0) << 12;52RSDK.DrawSprite(&self->canaryAnimator, &drawPos, false);5354self->direction = FLIP_NONE;55}56}5758void MSHologram_Create(void *data)59{60RSDK_THIS(MSHologram);6162if (!SceneInfo->inEditor) {63if (globals->gameMode == MODE_TIMEATTACK) {64destroyEntity(self);65}66else {67self->active = ACTIVE_BOUNDS;68self->visible = true;69self->drawFX = FX_FLIP;70self->drawGroup = Zone->objectDrawGroup[0];71self->updateRange.x = 0x800000;72self->updateRange.y = 0x800000;7374RSDK.SetSpriteAnimation(MSHologram->aniFrames, 0, &self->projectorAnimator, true, 0);75RSDK.SetSpriteAnimation(MSHologram->aniFrames, 1, &self->lightsAnimator, true, 0);76RSDK.SetSpriteAnimation(MSHologram->aniFrames, 2, &self->metalSonicAnimator, true, 0);77RSDK.SetSpriteAnimation(MSHologram->aniFrames, 3, &self->rabbitAnimator, true, 0);78RSDK.SetSpriteAnimation(MSHologram->aniFrames, 4, &self->canaryAnimator, true, 0);7980self->state = MSHologram_State_CheckPlayerCollisions;81}82}83}8485void MSHologram_StageLoad(void)86{87if (RSDK.CheckSceneFolder("SSZ1"))88MSHologram->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/MSHologram.bin", SCOPE_STAGE);89else if (RSDK.CheckSceneFolder("SSZ2"))90MSHologram->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/MSHologram.bin", SCOPE_STAGE);9192MSHologram->hitbox.left = -12;93MSHologram->hitbox.top = -10;94MSHologram->hitbox.right = 12;95MSHologram->hitbox.bottom = 10;9697MSHologram->sfxExplosion = RSDK.GetSfx("Stage/Explosion2.wav");98}99100void MSHologram_State_CheckPlayerCollisions(void)101{102RSDK_THIS(MSHologram);103104foreach_active(Player, player)105{106if (player->animator.animationID == ANI_JUMP || player->animator.animationID == ANI_DROPDASH) {107if (Player_CheckBadnikTouch(player, self, &MSHologram->hitbox))108self->state = MSHologram_State_Explode;109}110else {111Player_CheckCollisionBox(player, self, &MSHologram->hitbox);112}113}114}115116void MSHologram_State_Explode(void)117{118RSDK_THIS(MSHologram);119120if (!(Zone->timer % 3)) {121RSDK.PlaySfx(MSHologram->sfxExplosion, false, 255);122123if (Zone->timer & 4) {124int32 x = RSDK.Rand(-8, 8) << 16;125int32 y = RSDK.Rand(-8, 8) << 16;126EntityExplosion *explosion = CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_ENEMY), x + self->position.x, y + self->position.y);127explosion->drawGroup = Zone->objectDrawGroup[1];128}129}130131if (++self->timer == 80) {132self->timer = 0;133self->destroyed = true;134self->visible = false;135self->state = MSHologram_State_Destroyed;136137for (int32 i = 0; i < 16; ++i) {138int32 x = self->position.x + RSDK.Rand(0x800000, 0xE00000);139int32 y = self->position.y - RSDK.Rand(0x200000, 0x800000);140EntityAnimals *animal = CREATE_ENTITY(Animals, INT_TO_VOID(RSDK.Rand(1, 12)), x, y);141animal->updateRange.x = 0x1000000;142animal->updateRange.y = 0x1000000;143animal->behaviour = ANIMAL_BEHAVE_FOLLOW;144}145}146}147148void MSHologram_State_Destroyed(void)149{150RSDK_THIS(MSHologram);151152if (++self->timer == 384) {153foreach_active(Animals, animal)154{155if (animal->behaviour == ANIMAL_BEHAVE_FOLLOW)156animal->behaviour = ANIMAL_BEHAVE_FREE;157}158159destroyEntity(self);160}161}162163#if GAME_INCLUDE_EDITOR164void MSHologram_EditorDraw(void)165{166RSDK_THIS(MSHologram);167168RSDK.SetSpriteAnimation(MSHologram->aniFrames, 0, &self->projectorAnimator, false, 0);169RSDK.SetSpriteAnimation(MSHologram->aniFrames, 1, &self->lightsAnimator, false, 0);170RSDK.SetSpriteAnimation(MSHologram->aniFrames, 2, &self->metalSonicAnimator, false, 0);171RSDK.SetSpriteAnimation(MSHologram->aniFrames, 3, &self->rabbitAnimator, false, 0);172RSDK.SetSpriteAnimation(MSHologram->aniFrames, 4, &self->canaryAnimator, false, 0);173174Vector2 drawPos;175drawPos.x = self->position.x;176drawPos.y = self->position.y;177RSDK.DrawSprite(&self->projectorAnimator, NULL, false);178179RSDK.DrawSprite(&self->lightsAnimator, NULL, false);180181self->direction = FLIP_X;182RSDK.DrawSprite(&self->rabbitAnimator, NULL, false);183184self->direction = FLIP_NONE;185RSDK.DrawSprite(&self->metalSonicAnimator, NULL, false);186187if (self->angle < 128)188self->direction = FLIP_X;189drawPos.x += (RSDK.Cos256(self->angle) - 0x140) << 13;190drawPos.y += (RSDK.Sin256(self->angle) - 0x1C0) << 12;191RSDK.DrawSprite(&self->canaryAnimator, &drawPos, false);192193self->direction = FLIP_NONE;194}195196void MSHologram_EditorLoad(void)197{198if (RSDK.CheckSceneFolder("SSZ1"))199MSHologram->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/MSHologram.bin", SCOPE_STAGE);200else if (RSDK.CheckSceneFolder("SSZ2"))201MSHologram->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/MSHologram.bin", SCOPE_STAGE);202}203#endif204205void MSHologram_Serialize(void) {}206207208