Path: blob/master/SonicMania/Objects/Global/InvincibleStars.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: InvincibleStars Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectInvincibleStars *InvincibleStars;1011void InvincibleStars_Update(void)12{13RSDK_THIS(InvincibleStars);1415EntityPlayer *player = self->player;16if (player) {17self->starFrame[0] = (self->starAngle[0] + 1) % 12;18self->starFrame[1] = (self->starAngle[1] + 1) % 10;1920for (int32 i = 8 - 1; i > 0; --i) {21self->starPos[i].x = self->starPos[i - 1].x;22self->starPos[i].y = self->starPos[i - 1].y;23}24self->starPos[0].x = player->position.x;25self->starPos[0].y = player->position.y;2627Hitbox *playerHitbox = Player_GetHitbox(player);28if (player->direction & FLIP_X)29self->starPos[0].x += (playerHitbox->left << 15) - (playerHitbox->right << 15) - (playerHitbox->left << 16);30else31self->starPos[0].x += ((playerHitbox->right + 2 * playerHitbox->left) << 15) - (playerHitbox->left << 15);3233if ((player->direction & FLIP_Y) && !player->invertGravity)34self->starPos[0].y += (playerHitbox->top << 15) - (playerHitbox->bottom << 15) - (playerHitbox->top << 16);35else36self->starPos[0].y += ((playerHitbox->bottom + 2 * playerHitbox->top) << 15) - (playerHitbox->top << 15);3738if (player->direction) {39self->starAngle[0] -= 144;40self->starAngle[1] -= 16;41}42else {43self->starAngle[0] += 144;44self->starAngle[1] += 16;45}4647self->starAngle[0] &= 0x1FF;48self->starAngle[1] &= 0x1FF;4950if (player->invincibleTimer < 32)51self->alpha = 8 * player->invincibleTimer;5253self->drawGroup = player->drawGroup;54self->visible = player->visible || (player->state == Ice_PlayerState_Frozen);55self->starOffset = 11;56}57else {58destroyEntity(self);59}60}6162void InvincibleStars_LateUpdate(void) {}6364void InvincibleStars_StaticUpdate(void) {}6566void InvincibleStars_Draw(void)67{68RSDK_THIS(InvincibleStars);6970EntityPlayer *player = self->player;71if (player) {72if (player->isChibi) {73self->drawFX |= FX_SCALE;74self->scale.x = 0x100;75self->scale.y = 0x100;76}77else {78if (player->drawFX & FX_SCALE)79self->drawFX |= FX_SCALE;80else81self->drawFX &= ~FX_SCALE;82self->scale.x = player->scale.x;83self->scale.y = player->scale.y;84}85}8687Vector2 drawPos;88drawPos.x = (RSDK.Cos512(self->starAngle[1] + 0x74) << self->starOffset) + self->starPos[7].x;89drawPos.y = (RSDK.Sin512(self->starAngle[1] + 0x74) << self->starOffset) + self->starPos[7].y;90self->starAnimator[3].frameID = self->starFrame[0];91RSDK.DrawSprite(&self->starAnimator[3], &drawPos, false);9293drawPos.x = (RSDK.Cos512(self->starAngle[1] + 0x174) << self->starOffset) + self->starPos[7].x;94drawPos.y = (RSDK.Sin512(self->starAngle[1] + 0x174) << self->starOffset) + self->starPos[7].y;95self->starAnimator[3].frameID += 6;96RSDK.DrawSprite(&self->starAnimator[3], &drawPos, false);9798drawPos.x = (RSDK.Cos512(self->starAngle[1]) << self->starOffset) + self->starPos[5].x;99drawPos.y = (RSDK.Sin512(self->starAngle[1]) << self->starOffset) + self->starPos[5].y;100self->starAnimator[2].frameID = self->starFrame[0];101RSDK.DrawSprite(&self->starAnimator[2], &drawPos, false);102103drawPos.x = (RSDK.Cos512(self->starAngle[1] + 0x100) << self->starOffset) + self->starPos[5].x;104drawPos.y = (RSDK.Sin512(self->starAngle[1] + 0x100) << self->starOffset) + self->starPos[5].y;105self->starAnimator[2].frameID += 6;106RSDK.DrawSprite(&self->starAnimator[2], &drawPos, false);107108drawPos.x = (RSDK.Cos512(self->starAngle[1] + 0xA8) << self->starOffset) + self->starPos[3].x;109drawPos.y = (RSDK.Sin512(self->starAngle[1] + 0xA8) << self->starOffset) + self->starPos[3].y;110self->starAnimator[1].frameID = self->starFrame[1];111RSDK.DrawSprite(&self->starAnimator[1], &drawPos, false);112113drawPos.x = (RSDK.Cos512(self->starAngle[1] + 0x1A8) << self->starOffset) + self->starPos[3].x;114drawPos.y = (RSDK.Sin512(self->starAngle[1] + 0x1A8) << self->starOffset) + self->starPos[3].y;115self->starAnimator[1].frameID += 5;116RSDK.DrawSprite(&self->starAnimator[1], &drawPos, false);117118drawPos.x = (RSDK.Cos512(self->starAngle[0]) << self->starOffset) + self->starPos[0].x;119drawPos.y = (RSDK.Sin512(self->starAngle[0]) << self->starOffset) + self->starPos[0].y;120self->starAnimator[0].frameID = self->starFrame[0];121RSDK.DrawSprite(&self->starAnimator[0], &drawPos, false);122123drawPos.x = (RSDK.Cos512(self->starAngle[0] + 0x100) << self->starOffset) + self->starPos[0].x;124drawPos.y = (RSDK.Sin512(self->starAngle[0] + 0x100) << self->starOffset) + self->starPos[0].y;125RSDK.DrawSprite(&self->starAnimator[0], &drawPos, false);126}127128void InvincibleStars_Create(void *data)129{130RSDK_THIS(InvincibleStars);131132if (!SceneInfo->inEditor) {133self->active = ACTIVE_NORMAL;134self->visible = true;135self->player = (EntityPlayer *)data;136for (int32 i = 0; i < 8; ++i) {137self->starPos[i].x = self->player->position.x;138self->starPos[i].y = self->player->position.y;139}140141self->drawFX = FX_FLIP;142self->inkEffect = INK_ADD;143self->starAngle[0] = 180;144self->starAngle[1] = 0;145self->alpha = 0xFF;146RSDK.SetSpriteAnimation(InvincibleStars->aniFrames, 0, &self->starAnimator[0], true, 0);147RSDK.SetSpriteAnimation(InvincibleStars->aniFrames, 1, &self->starAnimator[1], true, 0);148RSDK.SetSpriteAnimation(InvincibleStars->aniFrames, 2, &self->starAnimator[2], true, 0);149RSDK.SetSpriteAnimation(InvincibleStars->aniFrames, 3, &self->starAnimator[3], true, 0);150}151}152153void InvincibleStars_StageLoad(void) { InvincibleStars->aniFrames = RSDK.LoadSpriteAnimation("Global/Invincible.bin", SCOPE_STAGE); }154155#if GAME_INCLUDE_EDITOR156void InvincibleStars_EditorDraw(void) {}157158void InvincibleStars_EditorLoad(void) {}159#endif160161void InvincibleStars_Serialize(void) {}162163164