Path: blob/master/SonicMania/Objects/TMZ/EscapeCar.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: EscapeCar Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectEscapeCar *EscapeCar;1011void EscapeCar_Update(void)12{13RSDK_THIS(EscapeCar);1415StateMachine_Run(self->state);16}1718void EscapeCar_LateUpdate(void) {}1920void EscapeCar_StaticUpdate(void) {}2122void EscapeCar_Draw(void)23{24RSDK_THIS(EscapeCar);2526if (SceneInfo->currentDrawGroup == Zone->objectDrawGroup[0]) {27RSDK.DrawSprite(&self->driverAnimator, NULL, false);2829if (!SceneInfo->currentScreenID)30RSDK.AddDrawListRef(Zone->objectDrawGroup[1], SceneInfo->entitySlot);31}32else {33RSDK.DrawSprite(&self->carAnimator, NULL, false);34RSDK.DrawSprite(&self->thrustAnimator, NULL, false);35}36}3738void EscapeCar_Create(void *data)39{40RSDK_THIS(EscapeCar);4142if (!SceneInfo->inEditor) {43self->visible = true;44self->drawGroup = Zone->objectDrawGroup[0];45self->active = ACTIVE_BOUNDS;46self->updateRange.x = 0x800000;47self->updateRange.y = 0x800000;4849#if MANIA_USE_PLUS50if (globals->gameMode == MODE_ENCORE) {51self->state = EscapeCar_StateEncore_Setup;52RSDK.SetSpriteAnimation(EscapeCar->aniFrames, 8, &self->driverAnimator, true, 0);53}54else {55#endif56switch (GET_CHARACTER_ID(1)) {57default:58case ID_SONIC: self->driver = ESCAPECAR_DRIVER_KNUX; break;5960case ID_TAILS:61#if MANIA_USE_PLUS62case ID_MIGHTY:63case ID_RAY:64#endif65self->driver = ESCAPECAR_DRIVER_SONIC;66break;6768case ID_KNUCKLES: self->driver = CHECK_CHARACTER_ID(ID_KNUCKLES, 2) ? ESCAPECAR_DRIVER_KNUX : ESCAPECAR_DRIVER_SONIC; break;69}70self->state = EscapeCar_StateMania_AwaitPlayer;71RSDK.SetSpriteAnimation(EscapeCar->aniFrames, 2 + self->driver, &self->driverAnimator, true, 0);72#if MANIA_USE_PLUS73}74#endif7576RSDK.SetSpriteAnimation(EscapeCar->aniFrames, 0, &self->carAnimator, true, 0);77}78}7980void EscapeCar_StageLoad(void)81{82EscapeCar->aniFrames = RSDK.LoadSpriteAnimation("Phantom/EscapeCar.bin", SCOPE_STAGE);8384EscapeCar->hitbox.left = -16;85EscapeCar->hitbox.top = -16;86EscapeCar->hitbox.right = 16;87EscapeCar->hitbox.bottom = 16;8889EscapeCar->sfxBumper = RSDK.GetSfx("Stage/Bumper3.wav");90EscapeCar->sfxDrop = RSDK.GetSfx("Stage/Drop.wav");91}9293void EscapeCar_StateMania_AwaitPlayer(void)94{95RSDK_THIS(EscapeCar);9697RSDK.ProcessAnimation(&self->driverAnimator);9899// Why does this func have encore checks??? Encore has its own states..100101bool32 allAboard = true;102foreach_active(Player, player)103{104if (player->state != Player_State_Static && player->position.x > self->position.x - 0x400000 && player->sidekick) {105player->velocity.x -= 0x1000;106}107#if MANIA_USE_PLUS108if (globals->gameMode != MODE_ENCORE && player->position.x > self->position.x - 0x400000)109#else110if (player->position.x > self->position.x - 0x400000)111#endif112RSDK.SetSpriteAnimation(EscapeCar->aniFrames, 3 + self->driver, &self->driverAnimator, true, 0);113114if (Player_CheckCollisionTouch(player, self, &EscapeCar->hitbox)) {115player->state = Player_State_Static;116player->velocity.x = 0;117player->velocity.y = 0;118player->position.x = self->position.x;119player->position.y = self->position.y;120121if (player->sidekick) {122player->position.x -= 0x140000;123player->position.y -= 0x140000;124}125else {126player->position.x -= 0xC0000;127player->position.y -= 0x80000;128}129130RSDK.SetSpriteAnimation(player->aniFrames, ANI_RIDE, &player->animator, false, 0);131player->animator.speed = 0;132}133else {134allAboard = false;135}136}137138if (self->driverAnimator.animationID == 3 + self->driver) {139#if MANIA_USE_PLUS140if (globals->gameMode != MODE_ENCORE) {141#endif142if (self->driverAnimator.frameID == self->driverAnimator.frameCount - 1)143RSDK.SetSpriteAnimation(EscapeCar->aniFrames, 4 + self->driver, &self->driverAnimator, true, 0);144#if MANIA_USE_PLUS145}146#endif147}148149if (allAboard)150self->state = EscapeCar_StateMania_EnteredCar;151}152153void EscapeCar_StateMania_EnteredCar(void)154{155RSDK_THIS(EscapeCar);156157RSDK.ProcessAnimation(&self->driverAnimator);158RSDK.ProcessAnimation(&self->thrustAnimator);159160if (++self->timer == 60)161RSDK.SetSpriteAnimation(EscapeCar->aniFrames, 1, &self->thrustAnimator, true, 0);162163if (self->timer == 160) {164foreach_active(Player, player) { RSDK.SetSpriteAnimation(player->aniFrames, ANI_RIDE, &player->animator, true, 0); }165166self->timer = 0;167self->velocity.x = 0x10000;168self->state = EscapeCar_StateMania_Ride;169}170}171172void EscapeCar_StateMania_Ride(void)173{174RSDK_THIS(EscapeCar);175176RSDK.ProcessAnimation(&self->driverAnimator);177RSDK.ProcessAnimation(&self->thrustAnimator);178179if (self->velocity.x < 0x180000)180self->velocity.x += 0x2800;181182self->position.x += self->velocity.x;183184foreach_active(Player, player)185{186player->state = Player_State_Static;187player->velocity.x = 0;188player->velocity.y = 0;189player->position.x = self->position.x;190player->position.y = self->position.y;191192if (player->sidekick) {193player->position.x -= 0x140000;194player->position.y -= 0x140000;195}196else {197player->position.x -= 0xC0000;198player->position.y -= 0x80000;199}200}201}202203#if MANIA_USE_PLUS204void EscapeCar_StateEncore_Setup(void)205{206RSDK_THIS(EscapeCar);207208if (self->position.x - 0x800000 < (ScreenInfo->position.x + ScreenInfo->center.x) << 16) {209RSDK.SetSpriteAnimation(EscapeCar->aniFrames, 1, &self->thrustAnimator, true, 0);210211self->velocity.x = 0x6000;212if (SaveGame_AllChaosEmeralds())213self->state = EscapeCar_StateEncore_GoodEnd;214else215self->state = EscapeCar_StateEncore_BadEnd;216}217}218219void EscapeCar_StateEncore_BadEnd(void)220{221RSDK_THIS(EscapeCar);222223RSDK.ProcessAnimation(&self->driverAnimator);224RSDK.ProcessAnimation(&self->thrustAnimator);225226if (self->velocity.x < 0x80000)227self->velocity.x += 0x2800;228229self->position.x += self->velocity.x;230}231232void EscapeCar_StateEncore_GoodEnd(void)233{234RSDK_THIS(EscapeCar);235236RSDK.ProcessAnimation(&self->driverAnimator);237RSDK.ProcessAnimation(&self->thrustAnimator);238239if (self->velocity.x < 0x74000)240self->velocity.x += 0x2800;241242self->position.x += self->velocity.x;243244EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);245if (abs(player1->position.x - self->position.x) < 0x100000) {246EntityDebris *debris = CREATE_ENTITY(Debris, NULL, self->position.x, self->position.y);247debris->state = Debris_State_Fall;248debris->gravityStrength = 0x3800;249debris->velocity.x = 0x30000;250debris->velocity.y = -0x78000;251debris->drawFX = FX_SCALE | FX_ROTATE;252debris->scale.x = 0x200;253debris->scale.y = 0x200;254debris->drawGroup = Zone->objectDrawGroup[0] + 1;255debris->rotSpeed = 2;256RSDK.SetSpriteAnimation(Eggman->aniFrames, 7, &debris->animator, true, 0);257debris->animator.rotationStyle = ROTSTYLE_FULL;258debris->isPermanent = true;259260debris = CREATE_ENTITY(Debris, NULL, self->position.x, self->position.y);261debris->state = Debris_State_Fall;262debris->gravityStrength = 0x3800;263debris->velocity.x = 0x40000;264debris->velocity.y = -0x48000;265debris->drawFX = FX_ROTATE;266debris->drawGroup = Zone->objectDrawGroup[0] + 1;267debris->rotSpeed = -4;268debris->animator = self->carAnimator;269debris->isPermanent = true;270debris->animator.rotationStyle = ROTSTYLE_FULL;271272RSDK.PlaySfx(EscapeCar->sfxBumper, false, 255);273destroyEntity(self);274}275}276#endif277278#if GAME_INCLUDE_EDITOR279void EscapeCar_EditorDraw(void)280{281RSDK_THIS(EscapeCar);282283self->drawGroup = Zone->objectDrawGroup[0];284self->updateRange.x = 0x800000;285self->updateRange.y = 0x800000;286287#if MANIA_USE_PLUS288if (globals->gameMode == MODE_ENCORE) {289self->state = EscapeCar_StateEncore_Setup;290RSDK.SetSpriteAnimation(EscapeCar->aniFrames, 8, &self->driverAnimator, true, 0);291}292else {293#endif294switch (GET_CHARACTER_ID(1)) {295default:296case ID_SONIC: self->driver = ESCAPECAR_DRIVER_KNUX; break;297298case ID_TAILS:299#if MANIA_USE_PLUS300case ID_MIGHTY:301case ID_RAY:302#endif303self->driver = ESCAPECAR_DRIVER_SONIC;304break;305306case ID_KNUCKLES: self->driver = CHECK_CHARACTER_ID(ID_KNUCKLES, 2) ? ESCAPECAR_DRIVER_KNUX : ESCAPECAR_DRIVER_SONIC; break;307}308309RSDK.SetSpriteAnimation(EscapeCar->aniFrames, 2 + self->driver, &self->driverAnimator, true, 0);310#if MANIA_USE_PLUS311}312#endif313314RSDK.SetSpriteAnimation(EscapeCar->aniFrames, 0, &self->carAnimator, true, 0);315316RSDK.DrawSprite(&self->driverAnimator, NULL, false);317RSDK.DrawSprite(&self->carAnimator, NULL, false);318RSDK.DrawSprite(&self->thrustAnimator, NULL, false);319}320321void EscapeCar_EditorLoad(void) { EscapeCar->aniFrames = RSDK.LoadSpriteAnimation("Phantom/EscapeCar.bin", SCOPE_STAGE); }322#endif323324void EscapeCar_Serialize(void) {}325326327