Path: blob/master/SonicMania/Objects/MSZ/BarStool.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: BarStool Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectBarStool *BarStool;1011void BarStool_Update(void)12{13RSDK_THIS(BarStool);1415if (self->spinSpeed <= 0) {16if (!self->activePlayers)17self->spinSpeed -= (self->spinSpeed >> 4);1819if (self->spinSpeed < -0x100000)20self->spinSpeed = -0x100000;21}22else {23if (!self->activePlayers)24self->spinSpeed -= (self->spinSpeed >> 4);2526if (self->spinSpeed > 0x100000)27self->spinSpeed = 0x100000;28}2930self->activePlayers = 0;31if (abs(self->spinSpeed) > 0x10000 && !(Zone->timer & 0xF))32RSDK.PlaySfx(BarStool->sfxSpin, false, 255);3334int32 playerID = 0;35foreach_active(Player, player)36{37int32 velY = player->velocity.y;38if (Player_CheckCollisionPlatform(player, self, &BarStool->hitboxStool)) {39bool32 canTurntable = true;40if (abs(player->velocity.x) <= 0x20000 && player->state != Player_State_Static) {41if (abs(self->spinSpeed) <= 0x10000)42canTurntable = false;43}4445#if MANIA_USE_PLUS46canTurntable = canTurntable && player->state != Player_State_MightyHammerDrop;47#endif4849if (canTurntable) {50RSDK.SetSpriteAnimation(player->aniFrames, ANI_TURNTABLE, &player->animator, false, 0);51if (player->state != Player_State_Static) {52if (velY >= 0)53self->spinSpeed += player->velocity.x;5455self->playerAngle[playerID] = 0;56self->playerPos[playerID] = (player->position.x - self->position.x) >> 1;5758player->state = Player_State_Static;59player->nextAirState = StateMachine_None;60player->nextGroundState = StateMachine_None;61}6263player->velocity.x = 0;64player->groundVel = 0;6566int32 ang = self->playerAngle[playerID] >> 16;6768player->position.x = CLAMP((self->playerPos[playerID] >> 8) * RSDK.Cos256(ang), -0x100000, 0x100000);69ang &= 0xFF;7071int32 frame = (ang / 21) % 12;72if (self->spinSpeed <= 0)73player->animator.frameID = 11 - frame;74else75player->animator.frameID = frame;76player->animator.speed = 0;7778player->position.x += self->position.x;7980if (self->playerPos[playerID] <= 0)81self->playerPos[playerID] -= 0x2000;82else83self->playerPos[playerID] += 0x2000;8485self->playerAngle[playerID] += self->spinSpeed;8687if (abs(self->playerPos[playerID]) > 0x100000) {88int32 speed = self->spinSpeed;8990bool32 shouldFling = true;91if (!player->left && !player->right) {92if (player->position.x <= self->position.x)93speed = -abs(speed);94else95speed = abs(speed);96}97else if (player->left) {98if (player->position.x < self->position.x)99speed = -abs(speed);100else101shouldFling = false;102}103else {104if (player->position.x > self->position.x)105speed = abs(speed);106else107shouldFling = false;108}109110if (shouldFling) {111player->velocity.x = speed;112player->onGround = false;113player->velocity.y = -0x20000;114player->state = Player_State_Air;115RSDK.SetSpriteAnimation(player->aniFrames, ANI_AIR_WALK, &player->animator, false, 0);116RSDK.PlaySfx(BarStool->sfxHop, false, 0xFF);117}118}119120if (player->jumpPress && player->state == Player_State_Static) {121int32 speed = self->spinSpeed;122if (player->position.x <= self->position.x)123speed = -abs(speed);124else125speed = -speed;126127player->velocity.x = speed;128player->onGround = false;129player->velocity.y = -0x40000;130player->state = Player_State_Air;131RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);132}133134self->activePlayers |= 1 << playerID;135}136}137138playerID++;139}140141self->spinAngle = (self->spinAngle + (self->spinSpeed >> 2)) & 0x7FFFF;142self->stoolAnimator.frameID = self->spinAngle >> 16;143}144145void BarStool_LateUpdate(void) {}146147void BarStool_StaticUpdate(void) {}148149void BarStool_Draw(void)150{151RSDK_THIS(BarStool);152153RSDK.DrawSprite(&self->poleAnimator, NULL, false);154RSDK.DrawSprite(&self->stoolAnimator, NULL, false);155}156157void BarStool_Create(void *data)158{159RSDK_THIS(BarStool);160161if (!SceneInfo->inEditor) {162RSDK.SetSpriteAnimation(BarStool->aniFrames, 0, &self->stoolAnimator, true, 0);163RSDK.SetSpriteAnimation(BarStool->aniFrames, 1, &self->poleAnimator, true, self->height);164165self->active = ACTIVE_BOUNDS;166self->updateRange.x = 0x800000;167self->updateRange.y = 0x800000;168self->visible = true;169self->drawGroup = Zone->objectDrawGroup[0];170}171}172173void BarStool_StageLoad(void)174{175BarStool->aniFrames = RSDK.LoadSpriteAnimation("MSZ/BarStool.bin", SCOPE_STAGE);176177BarStool->hitboxStool.left = -16;178BarStool->hitboxStool.top = -24;179BarStool->hitboxStool.right = 16;180BarStool->hitboxStool.bottom = -16;181182BarStool->sfxSpin = RSDK.GetSfx("MSZ/StoolSpin.wav");183BarStool->sfxHop = RSDK.GetSfx("MSZ/StoolHop.wav");184}185186#if GAME_INCLUDE_EDITOR187void BarStool_EditorDraw(void)188{189RSDK_THIS(BarStool);190191RSDK.SetSpriteAnimation(BarStool->aniFrames, 0, &self->stoolAnimator, true, 0);192RSDK.SetSpriteAnimation(BarStool->aniFrames, 1, &self->poleAnimator, true, self->height);193194RSDK.DrawSprite(&self->poleAnimator, NULL, false);195RSDK.DrawSprite(&self->stoolAnimator, NULL, false);196}197198void BarStool_EditorLoad(void)199{200BarStool->aniFrames = RSDK.LoadSpriteAnimation("MSZ/BarStool.bin", SCOPE_STAGE);201202RSDK_ACTIVE_VAR(BarStool, height);203RSDK_ENUM_VAR("Short", BARSTOOL_HEIGHT_SHORT);204RSDK_ENUM_VAR("Tall", BARSTOOL_HEIGHT_TALL);205}206#endif207208void BarStool_Serialize(void) { RSDK_EDITABLE_VAR(BarStool, VAR_UINT8, height); }209210211