Path: blob/master/SonicMania/Objects/TMZ/MagnetSphere.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: MagnetSphere Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectMagnetSphere *MagnetSphere;1011void MagnetSphere_Update(void)12{13RSDK_THIS(MagnetSphere);1415RSDK.ProcessAnimation(&self->plasma1Animator);16RSDK.ProcessAnimation(&self->plasma2Animator);17RSDK.ProcessAnimation(&self->centerBallAnimator);1819MagnetSphere_CheckPlayerCollision();20}2122void MagnetSphere_LateUpdate(void) {}2324void MagnetSphere_StaticUpdate(void) {}2526void MagnetSphere_Draw(void)27{28RSDK_THIS(MagnetSphere);2930self->inkEffect = INK_SUB;31RSDK.DrawSprite(&self->glassInnerAnimator, NULL, false);3233self->inkEffect = INK_ADD;34RSDK.DrawSprite(&self->plasma1Animator, NULL, false);3536self->direction = INK_ADD;37RSDK.DrawSprite(&self->plasma2Animator, NULL, false);3839self->direction = INK_NONE;40RSDK.DrawSprite(&self->glassOuterAnimator, NULL, false);4142self->inkEffect = INK_NONE;43RSDK.DrawSprite(&self->centerBallAnimator, NULL, false);44}4546void MagnetSphere_Create(void *data)47{48RSDK_THIS(MagnetSphere);4950self->drawFX = FX_FLIP;51self->visible = true;52self->drawGroup = Zone->objectDrawGroup[1];53self->active = ACTIVE_BOUNDS;54self->alpha = 0xFF;55self->updateRange.x = 0x400000;56self->updateRange.y = 0x400000;5758RSDK.SetSpriteAnimation(MagnetSphere->aniFrames, 0, &self->glassInnerAnimator, true, 0);59RSDK.SetSpriteAnimation(MagnetSphere->aniFrames, 0, &self->glassOuterAnimator, true, 1);60RSDK.SetSpriteAnimation(MagnetSphere->aniFrames, 1, &self->plasma1Animator, true, 0);61RSDK.SetSpriteAnimation(MagnetSphere->aniFrames, 1, &self->plasma2Animator, true, 8);62RSDK.SetSpriteAnimation(MagnetSphere->aniFrames, 2, &self->centerBallAnimator, true, 0);63}6465void MagnetSphere_StageLoad(void)66{67if (RSDK.CheckSceneFolder("TMZ1") || RSDK.CheckSceneFolder("TMZ2"))68MagnetSphere->aniFrames = RSDK.LoadSpriteAnimation("TMZ1/MagnetSphere.bin", SCOPE_STAGE);6970MagnetSphere->hitbox.left = -56;71MagnetSphere->hitbox.top = -56;72MagnetSphere->hitbox.right = 56;73MagnetSphere->hitbox.bottom = 56;7475MagnetSphere->sfxBumper = RSDK.GetSfx("Stage/Bumper3.wav");76MagnetSphere->sfxPlasmaBall = RSDK.GetSfx("TMZ1/PlasmaBall.wav");7778DEBUGMODE_ADD_OBJ(MagnetSphere);79}8081void MagnetSphere_DebugSpawn(void)82{83RSDK_THIS(DebugMode);8485CREATE_ENTITY(MagnetSphere, NULL, self->position.x, self->position.y);86}8788void MagnetSphere_DebugDraw(void)89{90RSDK.SetSpriteAnimation(MagnetSphere->aniFrames, 0, &DebugMode->animator, true, 1);91RSDK.DrawSprite(&DebugMode->animator, NULL, false);92}9394void MagnetSphere_CheckPlayerCollision(void)95{96RSDK_THIS(MagnetSphere);9798foreach_active(Player, player)99{100int32 playerID = RSDK.GetEntitySlot(player);101102if ((1 << playerID) & self->activePlayers) {103if (player->state != Player_State_Static) {104self->playerTimers[playerID] = 30;105self->activePlayers &= ~(1 << playerID);106107if (player->state != Player_State_Death)108player->tileCollisions = TILECOLLISION_DOWN;109}110else if (!player->jumpPress) {111if (player->left)112--MagnetSphere->playerAngles[playerID];113else if (player->right)114++MagnetSphere->playerAngles[playerID];115116MagnetSphere_MovePlayer(player, playerID);117}118else {119int32 ang =12012121* RSDK.Sin256(MagnetSphere->angleTable[MagnetSphere->sphereAngle[playerID] >> 4] | (MagnetSphere->sphereAngle[playerID] & 0xF));122123player->velocity.x = ang * RSDK.Sin256(MagnetSphere->playerAngles[playerID]);124player->velocity.y = -(ang * RSDK.Cos256(MagnetSphere->playerAngles[playerID]));125player->applyJumpCap = false;126player->jumpAbilityState = 1;127player->tileCollisions = TILECOLLISION_DOWN;128player->state = Player_State_Air;129self->playerTimers[playerID] = 30;130self->activePlayers &= ~(1 << playerID);131132RSDK.PlaySfx(Player->sfxJump, false, 255);133}134}135else {136if (!self->playerTimers[playerID] && player->state != Player_State_Static) {137if (Player_CheckCollisionTouch(player, self, &MagnetSphere->hitbox)) {138int32 angle = RSDK.ATan2(self->position.x - player->position.x, self->position.y - player->position.y);139140if (angle >= 0x80) {141MagnetSphere->sphereAngle[playerID] = -0x80;142MagnetSphere->playerAngles[playerID] = angle + -0x80;143}144else {145MagnetSphere->sphereAngle[playerID] = 0;146MagnetSphere->playerAngles[playerID] = angle;147}148MagnetSphere->playerAngles[playerID] += 0x40;149150player->velocity.x = 0;151player->velocity.y = 0;152player->groundVel = 0;153RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);154155player->onGround = false;156player->tileCollisions = TILECOLLISION_NONE;157player->state = Player_State_Static;158player->nextAirState = StateMachine_None;159player->nextGroundState = StateMachine_None;160161self->activePlayers |= 1 << playerID;162MagnetSphere_MovePlayer(player, playerID);163}164}165else if (self->playerTimers[playerID]) {166self->playerTimers[playerID]--;167}168}169}170}171172void MagnetSphere_MovePlayer(EntityPlayer *player, int32 playerID)173{174RSDK_THIS(MagnetSphere);175176int32 ang = 56 * RSDK.Cos256(MagnetSphere->sphereAngle[playerID]) >> 8;177player->velocity.x = -RSDK.Sin256(MagnetSphere->playerAngles[playerID]);178player->velocity.y = RSDK.Cos256(MagnetSphere->playerAngles[playerID]);179player->position.x = self->position.x - (ang * RSDK.Sin256(MagnetSphere->playerAngles[playerID]) << 8);180player->position.y = self->position.y + (ang * RSDK.Cos256(MagnetSphere->playerAngles[playerID]) << 8);181182if (MagnetSphere->sphereAngle[playerID] >= 0x80) {183player->drawGroup = Zone->playerDrawGroup[1];184}185else {186player->drawGroup = Zone->playerDrawGroup[0];187player->velocity.x = -player->velocity.x;188player->velocity.y = -player->velocity.y;189}190191uint8 angle = MagnetSphere->sphereAngle[playerID];192MagnetSphere->sphereAngle[playerID] += 4;193194uint32 angVal = (((uint32)MagnetSphere->sphereAngle[playerID] + 64) >> 7) & 1;195uint8 angValPrev = ((angle + 64) >> 7) & 1;196if (angVal != angValPrev && !player->sidekick)197RSDK.PlaySfx(MagnetSphere->sfxPlasmaBall, false, 255);198}199200#if GAME_INCLUDE_EDITOR201void MagnetSphere_EditorDraw(void) { MagnetSphere_Draw(); }202203void MagnetSphere_EditorLoad(void) { MagnetSphere->aniFrames = RSDK.LoadSpriteAnimation("TMZ1/MagnetSphere.bin", SCOPE_STAGE); }204#endif205206void MagnetSphere_Serialize(void) {}207208209