Path: blob/master/SonicMania/Objects/FBZ/PropellerShaft.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: PropellerShaft Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectPropellerShaft *PropellerShaft;1011void PropellerShaft_Update(void)12{13RSDK_THIS(PropellerShaft);1415foreach_active(Player, player)16{17int32 playerID = RSDK.GetEntitySlot(player);1819if ((1 << playerID) & self->activePlayers) {20if (!Player_CheckCollisionTouch(player, self, &self->hitbox)) {21player->state = Player_State_Air;22self->playerTimers[playerID] = 30;23self->activePlayers &= ~(1 << playerID);24}25else {26if (player->up) {27if (player->position.y > self->position.y - (self->size << 16) + 0x80000)28player->position.y -= 0x10000;29}3031if (player->down) {32if (player->position.y < self->position.y + ((self->size - 8) << 16))33player->position.y += 0x10000;34}3536if (player->jumpPress) {37self->activePlayers &= ~(1 << playerID);38self->playerTimers[playerID] = 30;39player->velocity.x = player->left ? -0x100000 : 0x100000;40player->velocity.y = -0x18000;41RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);42player->drawGroup = Zone->playerDrawGroup[0];43player->state = Player_State_Air;44}45}46}47else {48if (self->playerTimers[playerID]) {49self->playerTimers[playerID]--;50}51else {52if (Player_CheckCollisionTouch(player, self, &self->hitbox)) {53self->activePlayers |= 1 << playerID;54RSDK.PlaySfx(Player->sfxGrab, false, 255);55player->velocity.x = 0;56player->velocity.y = 0;57player->groundVel = 0;5859player->position.x = self->position.x;60if (player->position.y < self->position.y - (self->size << 16) + 0x90000)61player->position.y = self->position.y - (self->size << 16) + 0x90000;6263if (player->position.y > ((self->size - 9) << 16) + self->position.y)64player->position.y = ((self->size - 9) << 16) + self->position.y;6566RSDK.SetSpriteAnimation(player->aniFrames, ANI_SHAFT_SWING, &player->animator, false, 0);67player->rotation = 0;68player->direction = FLIP_NONE;69player->onGround = false;70player->groundedStore = false;71player->nextGroundState = StateMachine_None;72player->nextAirState = StateMachine_None;73player->state = Player_State_Static;74}75}76}77}78}7980void PropellerShaft_LateUpdate(void)81{82RSDK_THIS(PropellerShaft);8384foreach_active(Player, player)85{86if (((1 << RSDK.GetEntitySlot(player)) & self->activePlayers)) {87if (player->animator.frameID > 5)88player->drawGroup = Zone->playerDrawGroup[0] - 3;89else90player->drawGroup = Zone->playerDrawGroup[0];91}92}93}9495void PropellerShaft_StaticUpdate(void) {}9697void PropellerShaft_Draw(void) {}9899void PropellerShaft_Create(void *data)100{101RSDK_THIS(PropellerShaft);102103if (!SceneInfo->inEditor) {104self->active = ACTIVE_BOUNDS;105self->visible = true;106self->drawGroup = Zone->objectDrawGroup[1];107self->updateRange.x = 0x400000;108self->updateRange.y = self->size << 16;109110self->hitbox.left = -8;111self->hitbox.top = -self->size;112self->hitbox.right = 8;113self->hitbox.bottom = self->size;114}115}116117void PropellerShaft_StageLoad(void) {}118119#if GAME_INCLUDE_EDITOR120void PropellerShaft_EditorDraw(void)121{122RSDK_THIS(PropellerShaft);123self->drawGroup = Zone->objectDrawGroup[1];124125DrawHelpers_DrawRectOutline(self->position.x, self->position.y, 16 << 16, self->size << 17, 0xFFFF00);126}127128void PropellerShaft_EditorLoad(void) {}129#endif130131void PropellerShaft_Serialize(void) { RSDK_EDITABLE_VAR(PropellerShaft, VAR_ENUM, size); }132133134