Path: blob/master/SonicMania/Objects/MSZ/Flipper.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Flipper Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectFlipper *Flipper;1011void Flipper_Update(void)12{13RSDK_THIS(Flipper);1415RSDK.ProcessAnimation(&self->animator);1617if (self->animator.animationID == 1 && self->animator.frameID == self->animator.frameCount - 1)18RSDK.SetSpriteAnimation(Flipper->aniFrames, 0, &self->animator, false, 0);1920if (self->direction == FLIP_NONE) {21foreach_active(Player, player)22{23int32 playerID = RSDK.GetEntitySlot(player);2425if (player->position.x >= self->position.x + 0x40000)26self->hitbox.top = ((player->position.x - self->position.x - 0x40000) >> 17) - 20;27else28self->hitbox.top = -20;2930self->hitbox.bottom = self->hitbox.top + 16;3132if (Player_CheckCollisionPlatform(player, self, &self->hitbox)) {33self->activePlayers |= 1 << playerID;34player->position.y += 0x80000;3536RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);3738if (player->jumpPress) {39for (int32 i = SLOT_PLAYER1; i < Player->playerCount; ++i) {40if ((1 << i) & self->activePlayers) {41EntityPlayer *playerPtr = RSDK_GET_ENTITY(i, Player);42int32 vel = (playerPtr->position.x - self->position.x) - 0x40000;43playerPtr->animator.speed = 120;44playerPtr->state = Player_State_Air;45playerPtr->jumpAbilityState = 1;46playerPtr->onGround = false;47playerPtr->velocity.x = vel / 7;48playerPtr->velocity.y = -0x68000 - (vel >> 3);49}50}5152RSDK.SetSpriteAnimation(Flipper->aniFrames, 1, &self->animator, false, 0);53RSDK.PlaySfx(Flipper->sfxFlipper, false, 255);54}55else {56player->tileCollisions = TILECOLLISION_DOWN;57player->state = Player_State_Air;5859if (player->groundVel >= 0x10000) {60if (player->groundVel > 0x20000)61player->groundVel = 0x20000;6263player->groundVel += 0x1000;64}65else {66player->groundVel = 0x10000;67player->groundVel += 0x1000;68}69}70}71else {72self->activePlayers &= ~(1 << playerID);73}74}75}76else {77foreach_active(Player, player)78{79int32 playerID = RSDK.GetEntitySlot(player);8081if (player->position.x <= self->position.x - 0x40000)82self->hitbox.top = ((self->position.x - player->position.x - 0x40000) >> 17) - 20;83else84self->hitbox.top = -20;8586self->hitbox.bottom = self->hitbox.top + 16;8788if (Player_CheckCollisionPlatform(player, self, &self->hitbox)) {89self->activePlayers |= 1 << playerID;90player->position.y += 0x80000;91RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);9293if (player->jumpPress) {94for (int32 i = SLOT_PLAYER1; i < Player->playerCount; ++i) {95if ((1 << i) & self->activePlayers) {96EntityPlayer *playerPtr = RSDK_GET_ENTITY(i, Player);97int32 vel = (self->position.x - player->position.x) - 0x40000;98playerPtr->animator.speed = 120;99playerPtr->state = Player_State_Air;100playerPtr->jumpAbilityState = 1;101playerPtr->onGround = false;102playerPtr->velocity.x = -(vel / 7);103playerPtr->velocity.y = -0x68000 - (vel >> 3);104}105}106107RSDK.SetSpriteAnimation(Flipper->aniFrames, 1, &self->animator, false, 0);108RSDK.PlaySfx(Flipper->sfxFlipper, false, 255);109}110else {111player->tileCollisions = TILECOLLISION_DOWN;112player->state = Player_State_Air;113if (player->groundVel <= -0x10000) {114if (player->groundVel < -0x20000)115player->groundVel = -0x20000;116117player->groundVel -= 0x1000;118}119else {120player->groundVel = -0x10000;121player->groundVel -= 0x1000;122}123}124}125else {126self->activePlayers &= ~(1 << playerID);127}128}129}130}131132void Flipper_LateUpdate(void) {}133134void Flipper_StaticUpdate(void) {}135136void Flipper_Draw(void)137{138RSDK_THIS(Flipper);139140RSDK.DrawSprite(&self->animator, NULL, false);141}142143void Flipper_Create(void *data)144{145RSDK_THIS(Flipper);146147self->drawFX = FX_FLIP;148if (!SceneInfo->inEditor) {149150RSDK.SetSpriteAnimation(Flipper->aniFrames, 0, &self->animator, true, 0);151self->active = ACTIVE_BOUNDS;152self->updateRange.x = 0x800000;153self->updateRange.y = 0x800000;154self->hitbox.left = Flipper->hitbox.left;155self->hitbox.right = Flipper->hitbox.right;156self->visible = true;157self->drawGroup = Zone->objectDrawGroup[0];158}159}160161void Flipper_StageLoad(void)162{163Flipper->aniFrames = RSDK.LoadSpriteAnimation("MSZ/Flipper.bin", SCOPE_STAGE);164165Flipper->hitbox.left = -12;166Flipper->hitbox.right = 56;167168Flipper->sfxFlipper = RSDK.GetSfx("Stage/Flipper.wav");169}170171#if GAME_INCLUDE_EDITOR172void Flipper_EditorDraw(void)173{174RSDK_THIS(Flipper);175176RSDK.SetSpriteAnimation(Flipper->aniFrames, 0, &self->animator, true, 0);177178Flipper_Draw();179}180181void Flipper_EditorLoad(void)182{183Flipper->aniFrames = RSDK.LoadSpriteAnimation("MSZ/Flipper.bin", SCOPE_STAGE);184185RSDK_ACTIVE_VAR(Flipper, direction);186RSDK_ENUM_VAR("Right", FLIP_NONE);187RSDK_ENUM_VAR("Left", FLIP_X);188}189#endif190191void Flipper_Serialize(void) { RSDK_EDITABLE_VAR(Flipper, VAR_UINT8, direction); }192193194