Path: blob/master/SonicMania/Objects/FBZ/MagPlatform.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: MagPlatform Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectMagPlatform *MagPlatform;1011void MagPlatform_Update(void) { Platform_Update(); }1213void MagPlatform_LateUpdate(void) {}1415void MagPlatform_StaticUpdate(void) {}1617void MagPlatform_Draw(void)18{19RSDK_THIS(MagPlatform);2021RSDK.DrawSprite(&self->animator, &self->drawPos, false);2223self->animator.frameID = 1;24RSDK.GetFrame(Platform->aniFrames, 3, 1)->height = (self->centerPos.y - self->drawPos.y) >> 16;25RSDK.DrawSprite(&self->animator, &self->drawPos, false);2627self->animator.frameID = 2;28RSDK.DrawSprite(&self->animator, &self->centerPos, false);2930self->animator.frameID = 0;31}3233void MagPlatform_Create(void *data)34{35RSDK_THIS(MagPlatform);3637Platform_Create(NULL);38RSDK.SetSpriteAnimation(Platform->aniFrames, 3, &self->animator, true, 0);3940if (!SceneInfo->inEditor) {41self->length <<= 16;42self->stateCollide = MagPlatform_Collide_SolidAllHazardBottom;43self->state = MagPlatform_State_Idle;44}45}4647void MagPlatform_StageLoad(void) { MagPlatform->sfxChain = RSDK.GetSfx("Stage/Chain.wav"); }4849void MagPlatform_Collide_SolidAllHazardBottom(void)50{51RSDK_THIS(MagPlatform);5253Hitbox *hitbox = RSDK.GetHitbox(&self->animator, 1);54self->stoodPlayers = 0;55self->pushPlayersL = 0;56self->pushPlayersR = 0;5758int32 playerID = 0;59foreach_active(Player, player)60{61bool32 groundStore = player->onGround;62switch (Player_CheckCollisionBox(player, self, hitbox)) {63case C_TOP:64if (!groundStore) {65self->stood = true;66if (self->state == Platform_State_Fall && !self->timer)67self->timer = 30;68self->stoodPlayers |= 1 << playerID;69player->position.x += self->collisionOffset.x;70player->position.y += self->collisionOffset.y;71player->position.y &= 0xFFFF0000;72}73break;7475case C_LEFT:76if (player->onGround && player->right)77self->pushPlayersL |= 1 << playerID;78break;7980case C_RIGHT:81if (player->onGround && player->left)82self->pushPlayersR |= 1 << playerID;83break;8485case C_BOTTOM:86if (!player->onGround) {87#if MANIA_USE_PLUS88if (!Player_CheckMightyUnspin(player, 0x400, true, &player->uncurlTimer))89#endif90Player_Hurt(player, self);91}92else if (player->collisionMode) {93if (self->velocity.y > 0) {94Player_Hurt(player, self);95}96else {97#if MANIA_USE_PLUS98if (!Player_CheckMightyUnspin(player, 0x300, true, &player->uncurlTimer))99#endif100Player_Hurt(player, self);101}102}103else {104player->deathType = PLAYER_DEATH_DIE_USESFX;105}106break;107108default: break;109}110111playerID++;112}113}114115void MagPlatform_State_Idle(void) {}116117void MagPlatform_State_Rise(void)118{119RSDK_THIS(MagPlatform);120121self->drawPos.y += self->velocity.y;122int32 posY = self->position.y;123124self->position.y = self->drawPos.y;125self->velocity.y -= 0x3800;126if (RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_ROOF, 0, 0, -0x40000, true))127self->velocity.y = 0;128129if (self->drawPos.y <= self->centerPos.y - self->length) {130self->drawPos.y = self->centerPos.y - self->length;131if (self->velocity.y < -0x20000)132RSDK.PlaySfx(MagPlatform->sfxChain, false, 255);133134self->velocity.y = 0;135}136137self->position.y = posY;138self->state = MagPlatform_State_Fall;139}140141void MagPlatform_State_Fall(void)142{143RSDK_THIS(MagPlatform);144145self->drawPos.y += self->velocity.y;146self->velocity.y += 0x3800;147if (self->velocity.y <= 0 && RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_ROOF, 0, 0, -0x40000, true))148self->velocity.y = 0;149150if (self->drawPos.y >= self->centerPos.y) {151self->velocity.y = 0;152self->drawPos.y = self->centerPos.y;153self->active = ACTIVE_BOUNDS;154self->state = MagPlatform_State_Idle;155}156}157158#if GAME_INCLUDE_EDITOR159void MagPlatform_EditorDraw(void)160{161RSDK_THIS(MagPlatform);162self->drawPos = self->centerPos = self->position;163164MagPlatform_Draw();165166if (showGizmos()) {167RSDK_DRAWING_OVERLAY(true);168self->inkEffect = INK_BLEND;169170self->drawPos.y = self->centerPos.y - (self->length << 16);171MagPlatform_Draw();172173self->inkEffect = INK_NONE;174RSDK_DRAWING_OVERLAY(false);175}176}177178void MagPlatform_EditorLoad(void) {}179#endif180181void MagPlatform_Serialize(void) { RSDK_EDITABLE_VAR(MagPlatform, VAR_ENUM, length); }182183184