Path: blob/master/SonicMania/Objects/BSS/BSS_Player.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: BSS_Player Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectBSS_Player *BSS_Player;1011void BSS_Player_Update(void)12{13RSDK_THIS(BSS_Player);1415EntityBSS_Setup *setup = RSDK_GET_ENTITY(SLOT_BSS_SETUP, BSS_Setup);1617StateMachine_Run(self->stateInput);1819if (self->onGround) {20if (self->jumpPress) {21self->velocity.y = -TO_FIXED(16);22self->onGround = false;23RSDK.SetSpriteAnimation(self->aniFrames, 2, &self->animator, false, 0);24RSDK.PlaySfx(BSS_Player->sfxJump, false, 255);25}26}27else {28self->gravityStrength += self->velocity.y;2930int32 speed = !setup->speedupLevel ? 16 : setup->speedupLevel;31self->velocity.y += (speed << 12);32if (self->gravityStrength >= 0) {33self->gravityStrength = 0;34self->onGround = true;3536if (!self->sidekick) {37if (self->animator.animationID == 3)38setup->globeSpeed >>= 1;3940setup->globeSpeedInc = 2;41}4243if (setup->speedupLevel)44RSDK.SetSpriteAnimation(self->aniFrames, 1, &self->animator, false, 0);45else46RSDK.SetSpriteAnimation(self->aniFrames, 0, &self->animator, false, 0);47}48}4950self->position.y = (self->gravityStrength >> 1) - (self->gravityStrength >> 4);51self->position.y += SceneInfo->entitySlot ? TO_FIXED(186) : TO_FIXED(170);5253if (self->animator.animationID == 1) {54self->animator.timer += abs(setup->globeSpeed);55self->animator.speed = abs(setup->globeSpeed);5657if (self->animator.timer > 0x1F) {58self->animator.timer &= 0x1F;5960if (setup->globeSpeed <= 0) {61if (--self->animator.frameID < 0)62self->animator.frameID = 11;63}64else if (++self->animator.frameID > 11) {65self->animator.frameID = 0;66}67}68}69else if (self->animator.animationID >= 2) {70self->animator.speed = MAX(abs(setup->speedupLevel), 0x10);71RSDK.ProcessAnimation(&self->animator);72}7374self->tailAnimator.speed = abs(setup->speedupLevel) + 40;75RSDK.ProcessAnimation(&self->tailAnimator);76}7778void BSS_Player_LateUpdate(void) {}7980void BSS_Player_StaticUpdate(void) {}8182void BSS_Player_Draw(void)83{84RSDK_THIS(BSS_Player);8586Vector2 drawPos;87drawPos.x = TO_FIXED(ScreenInfo->center.x);88drawPos.y = self->position.y;89RSDK.DrawSprite(&self->animator, &drawPos, true);9091// if we're tails, draw his tail92if (CHECK_CHARACTER_ID(ID_TAILS, 1))93RSDK.DrawSprite(&self->tailAnimator, &drawPos, true);94#if MANIA_USE_PLUS95// if we're ray, draw his tail96else if (CHECK_CHARACTER_ID(ID_RAY, 1) && self->animator.animationID == 1)97RSDK.DrawSprite(&self->tailAnimator, &drawPos, true);98#endif99}100101void BSS_Player_Create(void *data)102{103RSDK_THIS(BSS_Player);104105if (!SceneInfo->inEditor) {106self->active = ACTIVE_NORMAL;107self->visible = true;108self->drawGroup = 4;109self->updateRange.x = TO_FIXED(128);110self->updateRange.y = TO_FIXED(128);111112switch (GET_CHARACTER_ID(1)) {113default:114case ID_SONIC: self->aniFrames = BSS_Player->sonicFrames; break;115116case ID_TAILS:117self->aniFrames = BSS_Player->tailsFrames;118RSDK.SetSpriteAnimation(self->aniFrames, 4, &self->tailAnimator, true, 0);119break;120121case ID_KNUCKLES: self->aniFrames = BSS_Player->knuxFrames; break;122123#if MANIA_USE_PLUS124case ID_MIGHTY: self->aniFrames = BSS_Player->mightyFrames; break;125126case ID_RAY:127self->aniFrames = BSS_Player->rayFrames;128RSDK.SetSpriteAnimation(self->aniFrames, 4, &self->tailAnimator, true, 0);129break;130#endif131}132133// The BSS Player gets reset into P1 slot, no other player entities ever get set, so sidekick BSS player behaviour goes unused...134if (SceneInfo->entitySlot) {135self->stateInput = BSS_Player_Input_P2;136self->sidekick = true;137}138else {139self->stateInput = BSS_Player_Input_P1;140self->controllerID = CONT_P1;141self->sidekick = false;142}143144RSDK.SetSpriteAnimation(self->aniFrames, 0, &self->animator, true, 0);145}146}147148void BSS_Player_StageLoad(void)149{150BSS_Player->sonicFrames = RSDK.LoadSpriteAnimation("SpecialBS/Sonic.bin", SCOPE_STAGE);151BSS_Player->tailsFrames = RSDK.LoadSpriteAnimation("SpecialBS/Tails.bin", SCOPE_STAGE);152BSS_Player->knuxFrames = RSDK.LoadSpriteAnimation("SpecialBS/Knuckles.bin", SCOPE_STAGE);153BSS_Player->mightyFrames = RSDK.LoadSpriteAnimation("SpecialBS/Mighty.bin", SCOPE_STAGE);154BSS_Player->rayFrames = RSDK.LoadSpriteAnimation("SpecialBS/Ray.bin", SCOPE_STAGE);155156if (globals->playerID == ID_NONE)157globals->playerID = ID_DEFAULT_PLAYER;158159RSDK.ResetEntitySlot(SLOT_PLAYER1, BSS_Player->classID, NULL);160161BSS_Player->sfxJump = RSDK.GetSfx("Global/Jump.wav");162}163164void BSS_Player_Input_P1(void)165{166RSDK_THIS(BSS_Player);167168if (self->controllerID < PLAYER_COUNT) {169RSDKControllerState *controller = &ControllerInfo[self->controllerID];170RSDKAnalogState *stick = &AnalogStickInfoL[self->controllerID];171172self->up = controller->keyUp.down;173self->down = controller->keyDown.down;174self->left = controller->keyLeft.down;175self->right = controller->keyRight.down;176177self->up |= stick->keyUp.down;178self->down |= stick->keyDown.down;179self->left |= stick->keyLeft.down;180self->right |= stick->keyRight.down;181182#if MANIA_USE_PLUS183self->up |= stick->vDelta > 0.3;184self->down |= stick->vDelta < -0.3;185self->left |= stick->hDelta < -0.3;186self->right |= stick->hDelta > 0.3;187#else188self->up |= stick->vDeltaL > 0.3;189self->down |= stick->vDeltaL < -0.3;190self->left |= stick->hDeltaL < -0.3;191self->right |= stick->hDeltaL > 0.3;192#endif193194if (self->left && self->right) {195self->left = false;196self->right = false;197}198self->jumpPress = controller->keyA.press || controller->keyB.press || controller->keyC.press || controller->keyX.press;199200if (controller->keyStart.press || Unknown_pausePress) {201if (SceneInfo->state == ENGINESTATE_REGULAR) {202EntityPauseMenu *pauseMenu = RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);203if (!pauseMenu->classID) {204RSDK.ResetEntitySlot(SLOT_PAUSEMENU, PauseMenu->classID, NULL);205pauseMenu->triggerPlayer = RSDK.GetEntitySlot(self);206pauseMenu->disableRestart = true;207}208}209}210}211}212213void BSS_Player_Input_P2(void)214{215RSDK_THIS(BSS_Player);216217// Bug Details:218// this uses "self->jumpPress" for the state rather than "player1->jumpPress" as intended219// this results in P2 never actually jumping220// Fix:221// replace "BSS_Player->jumpPressState |= self->jumpPress;" with "BSS_Player->jumpPressState |= player1->jumpPress;"222223// EntityBSS_Player *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, BSS_Player);224BSS_Player->jumpPressState <<= 1;225BSS_Player->jumpPressState |= self->jumpPress;226BSS_Player->jumpPressState &= 0xFFFF;227228self->jumpPress = BSS_Player->jumpPressState >> 15;229}230231#if GAME_INCLUDE_EDITOR232void BSS_Player_EditorDraw(void)233{234RSDK_THIS(BSS_Player);235236RSDK.SetSpriteAnimation(BSS_Player->sonicFrames, 0, &self->animator, false, 0);237238RSDK.DrawSprite(&self->animator, NULL, true);239}240241void BSS_Player_EditorLoad(void) { BSS_Player->sonicFrames = RSDK.LoadSpriteAnimation("SpecialBS/Sonic.bin", SCOPE_STAGE); }242#endif243244void BSS_Player_Serialize(void) {}245246247