Path: blob/master/SonicMania/Objects/MSZ/RotatingSpikes.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: RotatingSpikes Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectRotatingSpikes *RotatingSpikes;1011void RotatingSpikes_Update(void)12{13RSDK_THIS(RotatingSpikes);1415RSDK.ProcessAnimation(&self->pivotAnimator);16RSDK.ProcessAnimation(&self->spikeBallAnimator);1718self->angle = (self->angle + self->rotSpeed) & 0x3FF;1920Hitbox *hitbox = RSDK.GetHitbox(&self->spikeBallAnimator, 0);21int32 storeX = self->position.x;22int32 storeY = self->position.y;2324foreach_active(Player, player)25{26int32 radius = self->spikeRadius + self->pivotRadius;27for (int32 i = 0; i < self->spikeCount; ++i) {28self->position.x = storeX + ((radius * RSDK.Cos1024(self->angle + self->angleOffset)) << 6);29self->position.y = storeY + ((radius * RSDK.Sin1024(self->angle + self->angleOffset)) << 6);30if (Player_CheckCollisionTouch(player, self, hitbox)) {31#if MANIA_USE_PLUS32if (!Player_CheckMightyUnspin(player, 0x400, 2, &player->uncurlTimer))33#endif34Player_Hurt(player, self);35}36radius += 2 * self->spikeRadius;37}38}3940self->position.x = storeX;41self->position.y = storeY;42}4344void RotatingSpikes_LateUpdate(void) {}4546void RotatingSpikes_StaticUpdate(void) {}4748void RotatingSpikes_Draw(void)49{50RSDK_THIS(RotatingSpikes);5152int32 radius = self->spikeRadius + self->pivotRadius;53RSDK.DrawSprite(&self->pivotAnimator, NULL, false);5455for (int32 i = 0; i < self->spikeCount; ++i) {56Vector2 drawPos;57drawPos.x = ((radius * RSDK.Cos1024(self->angleOffset + self->angle)) << 6) + self->position.x;58drawPos.y = ((radius * RSDK.Sin1024(self->angleOffset + self->angle)) << 6) + self->position.y;59RSDK.DrawSprite(&self->spikeBallAnimator, &drawPos, false);6061radius += self->spikeRadius << 1;62}63}6465void RotatingSpikes_Create(void *data)66{67RSDK_THIS(RotatingSpikes);6869if (!SceneInfo->inEditor) {70self->active = ACTIVE_BOUNDS;71self->visible = true;72self->updateRange.x = 0x800000;73self->updateRange.y = 0x800000;74self->angleOffset &= 0x3FF;75self->drawGroup = self->priority == ROTSPIKES_PRIO_LOW ? Zone->objectDrawGroup[0] : Zone->objectDrawGroup[1];7677RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 0, &self->pivotAnimator, true, 0);78RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 1, &self->spikeBallAnimator, true, 0);79}80}8182void RotatingSpikes_StageLoad(void)83{84if (RSDK.CheckSceneFolder("MSZ"))85RotatingSpikes->aniFrames = RSDK.LoadSpriteAnimation("MSZ/RotatingSpikes.bin", SCOPE_STAGE);86else if (RSDK.CheckSceneFolder("SSZ1"))87RotatingSpikes->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/RotatingSpikes.bin", SCOPE_STAGE);88}8990#if GAME_INCLUDE_EDITOR91void RotatingSpikes_EditorDraw(void)92{93RSDK_THIS(RotatingSpikes);9495RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 0, &self->pivotAnimator, true, 0);96RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 1, &self->spikeBallAnimator, true, 0);9798self->drawGroup = self->priority == ROTSPIKES_PRIO_LOW ? Zone->objectDrawGroup[0] : Zone->objectDrawGroup[1];99100RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 0, &self->pivotAnimator, true, 0);101RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 1, &self->spikeBallAnimator, true, 0);102103int32 radius = self->spikeRadius + self->pivotRadius;104RSDK.DrawSprite(&self->pivotAnimator, NULL, false);105106for (int32 i = 0; i < self->spikeCount; ++i) {107Vector2 drawPos;108drawPos.x = ((radius * RSDK.Cos1024((self->angleOffset & 0x3FF) + self->angle)) << 6) + self->position.x;109drawPos.y = ((radius * RSDK.Sin1024((self->angleOffset & 0x3FF) + self->angle)) << 6) + self->position.y;110RSDK.DrawSprite(&self->spikeBallAnimator, &drawPos, false);111112radius += self->spikeRadius << 1;113}114}115116void RotatingSpikes_EditorLoad(void)117{118if (RSDK.CheckSceneFolder("MSZ"))119RotatingSpikes->aniFrames = RSDK.LoadSpriteAnimation("MSZ/RotatingSpikes.bin", SCOPE_STAGE);120else if (RSDK.CheckSceneFolder("SSZ1"))121RotatingSpikes->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/RotatingSpikes.bin", SCOPE_STAGE);122123RSDK_ACTIVE_VAR(RotatingSpikes, priority);124RSDK_ENUM_VAR("Low", ROTSPIKES_PRIO_LOW);125RSDK_ENUM_VAR("High", ROTSPIKES_PRIO_HIGH);126}127#endif128129void RotatingSpikes_Serialize(void)130{131RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, pivotRadius);132RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, spikeRadius);133RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, spikeCount);134RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, rotSpeed);135RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, angleOffset);136RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, priority);137}138139140