Path: blob/master/SonicMania/Objects/Continue/ContinuePlayer.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: ContinuePlayer Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectContinuePlayer *ContinuePlayer;1011void ContinuePlayer_Update(void)12{13RSDK_THIS(ContinuePlayer);1415RSDK.ProcessAnimation(&self->animator);1617StateMachine_Run(self->state);18}1920void ContinuePlayer_LateUpdate(void) {}2122void ContinuePlayer_StaticUpdate(void) {}2324void ContinuePlayer_Draw(void)25{26RSDK_THIS(ContinuePlayer);2728RSDK.DrawSprite(&self->animator, NULL, false);29}3031void ContinuePlayer_Create(void *data)32{33RSDK_THIS(ContinuePlayer);3435if (!SceneInfo->inEditor) {36self->visible = true;37self->drawGroup = 1;38self->active = ACTIVE_NORMAL;3940if (!self->isPlayer2) {41switch (GET_CHARACTER_ID(1)) {42default:43case ID_SONIC:44RSDK.SetSpriteAnimation(ContinuePlayer->aniFrames, CONTPLR_ANI_IDLE_SONIC, &self->animator, true, 0);4546if (globals->playerID & ID_TAILS_ASSIST)47self->position.x -= 0x100000;48break;4950case ID_TAILS:51RSDK.SetSpriteAnimation(ContinuePlayer->aniFrames, CONTPLR_ANI_IDLE_TAILS, &self->animator, true, 0);52self->position.y += 0x40000;53break;5455case ID_KNUCKLES: RSDK.SetSpriteAnimation(ContinuePlayer->aniFrames, CONTPLR_ANI_IDLE_KNUX, &self->animator, true, 0); break;5657#if MANIA_USE_PLUS58case ID_MIGHTY: RSDK.SetSpriteAnimation(ContinuePlayer->aniFrames, CONTPLR_ANI_IDLE_MIGHTY, &self->animator, true, 0); break;5960case ID_RAY:61RSDK.SetSpriteAnimation(ContinuePlayer->aniFrames, CONTPLR_ANI_IDLE_RAY, &self->animator, true, 0);62self->position.y += 0x40000;63break;64#endif65}6667self->timer = 60;68self->aniFrames = ContinuePlayer->playerAniFrames;69}70else {71RSDK.SetSpriteAnimation(ContinuePlayer->aniFrames, CONTPLR_ANI_IDLE_AI, &self->animator, true, 0);7273if (!(globals->playerID & ID_TAILS_ASSIST))74self->active = ACTIVE_NEVER;7576self->timer = 76;77self->aniFrames = ContinuePlayer->tailAniFrames;78}79}80}8182void ContinuePlayer_StageLoad(void)83{84ContinuePlayer->aniFrames = RSDK.LoadSpriteAnimation("Players/Continue.bin", SCOPE_STAGE);8586if (globals->playerID == ID_NONE)87globals->playerID = ID_DEFAULT_PLAYER;8889switch (GET_CHARACTER_ID(1)) {90default:91case ID_SONIC: ContinuePlayer->playerAniFrames = RSDK.LoadSpriteAnimation("Players/Sonic.bin", SCOPE_STAGE); break;92case ID_TAILS: ContinuePlayer->playerAniFrames = RSDK.LoadSpriteAnimation("Players/Tails.bin", SCOPE_STAGE); break;93case ID_KNUCKLES: ContinuePlayer->playerAniFrames = RSDK.LoadSpriteAnimation("Players/Knux.bin", SCOPE_STAGE); break;94#if MANIA_USE_PLUS95case ID_MIGHTY: ContinuePlayer->playerAniFrames = RSDK.LoadSpriteAnimation("Players/Mighty.bin", SCOPE_STAGE); break;96case ID_RAY: ContinuePlayer->playerAniFrames = RSDK.LoadSpriteAnimation("Players/Ray.bin", SCOPE_STAGE); break;97#endif98}99100ContinuePlayer->tailAniFrames = RSDK.LoadSpriteAnimation("Players/Tails.bin", SCOPE_STAGE);101102ContinuePlayer->sfxRoll = RSDK.GetSfx("Global/Roll.wav");103ContinuePlayer->sfxCharge = RSDK.GetSfx("Global/Charge.wav");104ContinuePlayer->sfxRelease = RSDK.GetSfx("Global/Release.wav");105}106107void ContinuePlayer_HandleDashAnim(void)108{109RSDK_THIS(ContinuePlayer);110111if (self->groundVel >= 0x40000) {112if (self->groundVel >= 0x60000) {113if (self->groundVel >= 0xA0000) {114RSDK.SetSpriteAnimation(self->aniFrames, ANI_DASH, &self->animator, false, 0);115self->animator.speed = 256;116}117else {118RSDK.SetSpriteAnimation(self->aniFrames, ANI_RUN, &self->animator, false, 1);119120self->animator.speed = (self->groundVel >> 12) + 96;121if (self->animator.speed > 0x100)122self->animator.speed = 0x100;123}124}125else {126RSDK.SetSpriteAnimation(self->aniFrames, ANI_JOG, &self->animator, false, 0);127int32 vel = (self->groundVel >> 16);128self->animator.speed = 4 * ((vel << 1) + vel) + 64;129}130}131else {132RSDK.SetSpriteAnimation(self->aniFrames, ANI_WALK, &self->animator, false, 0);133self->animator.speed = (self->groundVel >> 12) + 48;134}135}136137void ContinuePlayer_State_Idle(void)138{139RSDK_THIS(ContinuePlayer);140141if (self->timer <= 0) {142ContinuePlayer_HandleDashAnim();143self->state = ContinuePlayer_State_ChargeDash;144145RSDK.PlaySfx(ContinuePlayer->sfxRoll, false, 255);146}147else {148self->timer--;149}150}151152void ContinuePlayer_State_ChargeDash(void)153{154RSDK_THIS(ContinuePlayer);155156if (self->groundVel >= 0xC0000) {157RSDK.PlaySfx(ContinuePlayer->sfxRelease, false, 255);158159self->state = ContinuePlayer_State_DashRelease;160}161else {162self->groundVel += 0x4000;163}164165ContinuePlayer_HandleDashAnim();166}167168void ContinuePlayer_State_DashRelease(void)169{170RSDK_THIS(ContinuePlayer);171172self->position.x += self->groundVel;173}174175#if GAME_INCLUDE_EDITOR176void ContinuePlayer_EditorDraw(void)177{178RSDK_THIS(ContinuePlayer);179180RSDK.SetSpriteAnimation(ContinuePlayer->aniFrames, self->isPlayer2 ? CONTPLR_ANI_IDLE_SONIC : CONTPLR_ANI_IDLE_AI, &self->animator, true, 0);181182ContinuePlayer_Draw();183}184185void ContinuePlayer_EditorLoad(void) { ContinuePlayer->aniFrames = RSDK.LoadSpriteAnimation("Players/Continue.bin", SCOPE_STAGE); }186#endif187188void ContinuePlayer_Serialize(void) { RSDK_EDITABLE_VAR(ContinuePlayer, VAR_BOOL, isPlayer2); }189190191