Path: blob/master/SonicMania/Objects/UFO/UFO_Player.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: UFO_Player Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectUFO_Player *UFO_Player;1011void UFO_Player_Update(void)12{13RSDK_THIS(UFO_Player);1415StateMachine_Run(self->stateInput);16StateMachine_Run(self->state);1718RSDK.ProcessAnimation(&self->animator);19if (UFO_Setup->timedOut)20self->groundVel -= self->groundVel >> 5;21}2223void UFO_Player_LateUpdate(void)24{25RSDK_THIS(UFO_Player);26Matrix *mat = &UFO_Camera->matWorld;2728int32 x = self->position.x >> 16;29int32 y = self->height >> 16;30int32 z = self->position.y >> 16;3132self->zdepth = mat->values[2][3] + mat->values[2][0] * x + mat->values[2][1] * y + mat->values[2][2] * z;33}3435void UFO_Player_StaticUpdate(void) {}3637void UFO_Player_Draw(void)38{39RSDK_THIS(UFO_Player);4041if (self->zdepth >= 1) {42RSDK.Prepare3DScene(UFO_Player->sceneIndex);4344int32 anim = self->animator.animationID;45if (anim == 2 || anim == 3) {46RSDK.MatrixTranslateXYZ(&self->matTransform, self->position.x, self->height + 0x100000, self->position.y, true);4748RSDK.MatrixRotateX(&self->matRotate, self->angleX);49RSDK.MatrixRotateY(&self->matWorld, self->angle + (self->angleZ >> 5));5051RSDK.MatrixMultiply(&self->matNormal, &self->matRotate, &self->matWorld);52RSDK.MatrixMultiply(&self->matWorld, &self->matNormal, &self->matTransform);53RSDK.MatrixMultiply(&self->matWorld, &self->matWorld, &UFO_Camera->matWorld);54RSDK.MatrixMultiply(&self->matNormal, &self->matNormal, &UFO_Camera->matView);5556RSDK.AddModelTo3DScene(self->animator.animationID, UFO_Player->sceneIndex, S3D_SOLIDCOLOR_SHADED_BLENDED_SCREEN, &self->matWorld,57&self->matNormal, 0xFFFFFF);58}59else {60RSDK.MatrixTranslateXYZ(&self->matTransform, self->position.x, self->height, self->position.y, true);6162RSDK.MatrixRotateZ(&self->matRotate, self->angleZ >> 5);63RSDK.MatrixRotateY(&self->matWorld, self->angle + (self->angleZ >> (6 - (uint8)(UFO_Setup->machLevel))));6465RSDK.MatrixMultiply(&self->matNormal, &self->matRotate, &self->matWorld);66RSDK.MatrixMultiply(&self->matWorld, &self->matNormal, &self->matTransform);67RSDK.MatrixMultiply(&self->matWorld, &self->matWorld, &UFO_Camera->matWorld);68RSDK.MatrixRotateXYZ(&self->matNormal, 0, self->angle, 0);69RSDK.MatrixMultiply(&self->matNormal, &self->matNormal, &UFO_Camera->matView);7071RSDK.AddMeshFrameTo3DScene(self->animator.animationID, UFO_Player->sceneIndex, &self->animator, S3D_SOLIDCOLOR_SHADED_BLENDED_SCREEN,72&self->matWorld, &self->matNormal, 0xFFFFFF);73}7475RSDK.Draw3DScene(UFO_Player->sceneIndex);76}77}7879void UFO_Player_Create(void *data)80{81RSDK_THIS(UFO_Player);8283if (!SceneInfo->inEditor) {84self->active = ACTIVE_NORMAL;85self->visible = true;86self->updateRange.x = 0x800000;87self->updateRange.y = 0x800000;88self->drawFX = FX_FLIP;89self->drawGroup = 4;9091if (!self->machQuota1)92self->machQuota1 = 32;9394if (!self->machQuota2)95self->machQuota2 = 32;9697if (!self->machQuota3)98self->machQuota3 = 32;99100if (self->startingRings > 0)101UFO_Setup->rings = self->startingRings;102103UFO_Setup->machQuotas[0] = self->machQuota1;104UFO_Setup->machQuotas[1] = self->machQuota2;105UFO_Setup->machQuotas[2] = self->machQuota3;106self->angle = 0x200;107self->onGround = true;108109UFO_Player_ChangeMachState();110self->stateInput = UFO_Player_Input_P1;111self->controllerID = INPUT_NONE;112self->state = UFO_Player_State_Run;113114RSDK.SetModelAnimation(UFO_Player->jogModel, &self->animator, 128, 0, true, 0);115}116}117118void UFO_Player_StageLoad(void)119{120if (globals->playerID == ID_NONE)121globals->playerID = ID_DEFAULT_PLAYER;122123switch (GET_CHARACTER_ID(1)) {124default:125case ID_SONIC:126UFO_Player->jogModel = RSDK.LoadMesh("Special/SonicJog.bin", SCOPE_STAGE);127UFO_Player->dashModel = RSDK.LoadMesh("Special/SonicDash.bin", SCOPE_STAGE);128UFO_Player->jumpModel = RSDK.LoadMesh("Special/SonicJump.bin", SCOPE_STAGE);129UFO_Player->ballModel = RSDK.LoadMesh("Special/SonicBall.bin", SCOPE_STAGE);130UFO_Player->tumbleModel = RSDK.LoadMesh("Special/SonicTumble.bin", SCOPE_STAGE);131break;132133case ID_TAILS:134UFO_Player->jogModel = RSDK.LoadMesh("Special/TailsJog.bin", SCOPE_STAGE);135UFO_Player->dashModel = RSDK.LoadMesh("Special/TailsDash.bin", SCOPE_STAGE);136UFO_Player->jumpModel = RSDK.LoadMesh("Special/TailsJump.bin", SCOPE_STAGE);137UFO_Player->ballModel = RSDK.LoadMesh("Special/TailsBall.bin", SCOPE_STAGE);138UFO_Player->tumbleModel = RSDK.LoadMesh("Special/TailsTumble.bin", SCOPE_STAGE);139break;140141case ID_KNUCKLES:142UFO_Player->jogModel = RSDK.LoadMesh("Special/KnuxJog.bin", SCOPE_STAGE);143UFO_Player->dashModel = RSDK.LoadMesh("Special/KnuxDash.bin", SCOPE_STAGE);144UFO_Player->jumpModel = RSDK.LoadMesh("Special/KnuxJump.bin", SCOPE_STAGE);145UFO_Player->ballModel = RSDK.LoadMesh("Special/KnuxBall.bin", SCOPE_STAGE);146UFO_Player->tumbleModel = RSDK.LoadMesh("Special/KnuxTumble.bin", SCOPE_STAGE);147break;148149#if MANIA_USE_PLUS150case ID_MIGHTY:151UFO_Player->jogModel = RSDK.LoadMesh("Special/MightyJog.bin", SCOPE_STAGE);152UFO_Player->dashModel = RSDK.LoadMesh("Special/MightyDash.bin", SCOPE_STAGE);153UFO_Player->jumpModel = RSDK.LoadMesh("Special/MightyJump.bin", SCOPE_STAGE);154UFO_Player->ballModel = RSDK.LoadMesh("Special/MightyBall.bin", SCOPE_STAGE);155UFO_Player->tumbleModel = RSDK.LoadMesh("Special/MightyTumble.bin", SCOPE_STAGE);156break;157158case ID_RAY:159UFO_Player->jogModel = RSDK.LoadMesh("Special/RayJog.bin", SCOPE_STAGE);160UFO_Player->dashModel = RSDK.LoadMesh("Special/RayDash.bin", SCOPE_STAGE);161UFO_Player->jumpModel = RSDK.LoadMesh("Special/RayJump.bin", SCOPE_STAGE);162UFO_Player->ballModel = RSDK.LoadMesh("Special/RayBall.bin", SCOPE_STAGE);163UFO_Player->tumbleModel = RSDK.LoadMesh("Special/RayTumble.bin", SCOPE_STAGE);164break;165#endif166}167168UFO_Player->sceneIndex = RSDK.Create3DScene("View:Special", 4096, SCOPE_STAGE);169170RSDK.SetDiffuseColor(UFO_Player->sceneIndex, 0xA0, 0xA0, 0xA0);171RSDK.SetDiffuseIntensity(UFO_Player->sceneIndex, 8, 8, 8);172RSDK.SetSpecularIntensity(UFO_Player->sceneIndex, 15, 15, 15);173174foreach_all(UFO_Player, player)175{176EntityUFO_Player *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, UFO_Player);177RSDK.CopyEntity(player1, player, true);178}179180UFO_Player->sfxJump = RSDK.GetSfx("Global/Jump.wav");181UFO_Player->sfxCharge = RSDK.GetSfx("Global/Charge.wav");182UFO_Player->sfxRelease = RSDK.GetSfx("Global/Release.wav");183UFO_Player->sfxLoseRings = RSDK.GetSfx("Global/LoseRings.wav");184UFO_Player->sfxDrop = RSDK.GetSfx("Stage/Drop.wav");185UFO_Player->sfxBumper = RSDK.GetSfx("Stage/Bumper.wav");186UFO_Player->sfxSpring = RSDK.GetSfx("Global/Spring.wav");187UFO_Player->sfxSkid = RSDK.GetSfx("Special/Skid.wav");188UFO_Player->sfxGrittyGround = RSDK.GetSfx("Special/GrittyGround.wav");189190EntityUFO_Player *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, UFO_Player);191RSDK.ClearCameras();192RSDK.AddCamera(&player1->position, 0x100000, 0x100000, true);193}194195void UFO_Player_Input_P1(void)196{197RSDK_THIS(UFO_Player);198199if (self->controllerID < PLAYER_COUNT) {200RSDKControllerState *controller = &ControllerInfo[self->controllerID];201RSDKAnalogState *stick = &AnalogStickInfoL[self->controllerID];202203self->up = controller->keyUp.down;204self->down = controller->keyDown.down;205self->left = controller->keyLeft.down;206self->right = controller->keyRight.down;207208self->up |= stick->keyUp.down;209self->down |= stick->keyDown.down;210self->left |= stick->keyLeft.down;211self->right |= stick->keyRight.down;212213#if MANIA_USE_PLUS214self->up |= stick->vDelta > 0.3;215self->down |= stick->vDelta < -0.3;216self->left |= stick->hDelta < -0.3;217self->right |= stick->hDelta > 0.3;218#else219self->up |= stick->vDeltaL > 0.3;220self->down |= stick->vDeltaL < -0.3;221self->left |= stick->hDeltaL < -0.3;222self->right |= stick->hDeltaL > 0.3;223#endif224225if (self->left && self->right) {226self->left = false;227self->right = false;228}229230self->jumpPress = controller->keyA.press || controller->keyB.press || controller->keyC.press || controller->keyX.press;231self->jumpHold = controller->keyA.down || controller->keyB.down || controller->keyC.down || controller->keyX.down;232233if ((controller->keyStart.press || Unknown_pausePress) && SceneInfo->state == ENGINESTATE_REGULAR) {234EntityPauseMenu *pauseMenu = RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);235if (!pauseMenu->classID) {236RSDK.ResetEntitySlot(SLOT_PAUSEMENU, PauseMenu->classID, NULL);237pauseMenu->triggerPlayer = RSDK.GetEntitySlot(self);238pauseMenu->disableRestart = true;239}240}241}242}243244void UFO_Player_ChangeMachState(void)245{246RSDK_THIS(UFO_Player);247248switch (UFO_Setup->machLevel) {249default: break;250251case 0:252UFO_Player->maxSpeed = 0x70000;253self->velDivisor = 16;254self->angleVel = 128;255break;256257case 1:258UFO_Player->maxSpeed = 0xA0000;259self->velDivisor = 18;260self->angleVel = 144;261break;262263case 2:264UFO_Player->maxSpeed = 0xE0000;265self->velDivisor = 20;266self->angleVel = 160;267break;268}269}270271void UFO_Player_HandleBumperTiles(void)272{273RSDK_THIS(UFO_Player);274275int32 bumpDirMasks = 0;276277uint16 tile = RSDK.GetTile(UFO_Setup->playFieldLayer, (self->position.x - 0x80000) >> 20, (self->position.y - 0x80000) >> 20);278if (RSDK.GetTileFlags(tile, 0) == UFO_TFLAGS_BUMPER)279bumpDirMasks = 0b0001;280281tile = RSDK.GetTile(UFO_Setup->playFieldLayer, (self->position.x + 0x80000) >> 20, (self->position.y - 0x80000) >> 20);282if (RSDK.GetTileFlags(tile, 0) == UFO_TFLAGS_BUMPER)283bumpDirMasks |= 0b0010;284285tile = RSDK.GetTile(UFO_Setup->playFieldLayer, (self->position.x - 0x80000) >> 20, (self->position.y + 0x80000) >> 20);286if (RSDK.GetTileFlags(tile, 0) == UFO_TFLAGS_BUMPER)287bumpDirMasks |= 0b0100;288289tile = RSDK.GetTile(UFO_Setup->playFieldLayer, (self->position.x + 0x80000) >> 20, (self->position.y + 0x80000) >> 20);290if (RSDK.GetTileFlags(tile, 0) == UFO_TFLAGS_BUMPER)291bumpDirMasks |= 0b1000;292293if (bumpDirMasks) {294if (!self->bumperTimer)295RSDK.PlaySfx(UFO_Player->sfxBumper, false, 0xFF);296297self->bumperTimer = 16;298switch (bumpDirMasks) {299default:300case 0b0000: break;301302case 0b0001:303case 0b0110:304case 0b0111:305self->velocity.y = 0x40000;306self->velocity.x = 0x40000;307break;308309case 0b0010:310case 0b1001:311case 0b1011:312self->velocity.x = -0x40000;313self->velocity.y = 0x40000;314break;315316case 0b0011: self->velocity.y = 0x40000; break;317318case 0b0100:319case 0b1101:320self->velocity.y = -0x40000;321self->velocity.x = 0x40000;322break;323324case 0b0101: self->velocity.x = 0x40000; break;325326case 0b1000:327case 0b1110:328case 0b1111:329self->velocity.x = -0x40000;330self->velocity.y = -0x40000;331break;332333case 0b1010: self->velocity.x = -0x40000; break;334case 0b1100: self->velocity.y = -0x40000; break;335}336}337}338339void UFO_Player_HandleSpeedUp(void)340{341RSDK_THIS(UFO_Player);342343uint16 tile = RSDK.GetTile(UFO_Setup->playFieldLayer, self->position.x >> 20, self->position.y >> 20);344if (tile == (uint16)-1) {345if (++self->courseOutTimer >= 2) {346self->interaction = 0;347self->timer = 0;348self->state = UFO_Player_State_CourseOut;349self->camera->state = UFO_Camera_State_CourseOut;350351if (!UFO_Setup->timedOut)352RSDK.PlaySfx(UFO_Player->sfxDrop, false, 0xFF);353354return;355}356}357else {358self->courseOutTimer = 0;359}360361if (self->bumperTimer <= 0) {362if (RSDK.GetTileFlags(tile, 0) == UFO_TFLAGS_GRITTYGROUND) {363if (self->groundVel > UFO_Player->maxSpeed - (UFO_Player->maxSpeed >> 2))364self->groundVel = self->groundVel - (self->groundVel >> 5);365366if (!(UFO_Setup->timer & 3)) {367CREATE_ENTITY(UFO_Dust, NULL, self->position.x, self->position.y);368RSDK.PlaySfx(UFO_Player->sfxGrittyGround, false, 255);369}370}371else {372if (self->groundVel > UFO_Player->maxSpeed) {373self->groundVel -= 0x4000;374375if (self->groundVel < UFO_Player->maxSpeed)376self->groundVel = UFO_Player->maxSpeed;377}378else if (self->groundVel < UFO_Player->maxSpeed) {379self->groundVel += 0x4000;380381if (self->groundVel > UFO_Player->maxSpeed)382self->groundVel = UFO_Player->maxSpeed;383}384}385}386}387388void UFO_Player_State_Run(void)389{390RSDK_THIS(UFO_Player);391392int32 turnSpeed = UFO_Player->maxSpeed - 0x87000;393394if (self->right) {395if (self->angleZ < (turnSpeed >> 11) + 1280)396self->angleZ += (turnSpeed >> 14) + self->angleVel;397}398else if (self->left) {399if (self->angleZ > -1280 - (turnSpeed >> 11))400self->angleZ -= self->angleVel - (turnSpeed >> 14);401}402else {403self->angleZ -= self->angleZ >> 2;404}405406if (self->angleZ <= 0)407self->angle -= -self->angleZ >> 8;408else409self->angle += self->angleZ >> 8;410411self->angle &= 0x3FF;412413if (abs(self->angleZ) <= 1280 || UFO_Setup->machLevel <= 1) {414self->skidTimer = 0;415}416else {417if (self->skidTimer >= 16) {418if (!(UFO_Setup->timer & 3))419CREATE_ENTITY(UFO_Dust, NULL, self->position.x, self->position.y);420421if (!(UFO_Setup->timer & 7))422RSDK.PlaySfx(UFO_Player->sfxSkid, false, 255);423}424else {425self->skidTimer++;426}427}428429if (self->bumperTimer >= 1) {430self->bumperTimer--;431UFO_Player_HandleSpeedUp();432}433else {434UFO_Player_HandleSpeedUp();435436int32 x = (self->groundVel >> 10) * RSDK.Sin1024(self->angle);437int32 y = (self->groundVel >> 10) * RSDK.Cos1024(self->angle);438439self->velocity.x += (x - self->velocity.x) / self->velDivisor;440self->velocity.y += (-y - self->velocity.y) / self->velDivisor;441}442443self->position.x += self->velocity.x;444self->position.y += self->velocity.y;445446if (self->jumpPress && self->state != UFO_Player_State_CourseOut) {447self->gravityStrength = 0x50000;448self->onGround = false;449self->state = UFO_Player_State_Jump;450451RSDK.SetModelAnimation(UFO_Player->jumpModel, &self->animator, 128, 0, true, 0);452RSDK.PlaySfx(UFO_Player->sfxJump, false, 0xFF);453454UFO_Player_HandleBumperTiles();455}456else {457if (self->groundVel <= 0xC0000) {458RSDK.SetModelAnimation(UFO_Player->jogModel, &self->animator, 128, 0, 0, 0);459self->animator.speed = (self->groundVel >> 12) + 48;460}461else {462RSDK.SetModelAnimation(UFO_Player->dashModel, &self->animator, 160, 0, 0, 0);463}464465UFO_Player_HandleBumperTiles();466}467}468469void UFO_Player_State_Jump(void)470{471RSDK_THIS(UFO_Player);472473int32 turnSpeed = UFO_Player->maxSpeed - 0x60000;474475int32 speed = 0;476if (self->right) {477speed = (turnSpeed >> 20) + 12;478479if (self->angleZ < 1280 + (turnSpeed >> 10))480self->angleZ += (self->angleVel >> 1) + (turnSpeed >> 14);481}482else if (self->left) {483speed = -12 - (turnSpeed >> 20);484485if (self->angleZ > -1280 - (turnSpeed >> 10))486self->angleZ -= (self->angleVel >> 1) - (turnSpeed >> 14);487}488else {489speed = 0;490491self->angleZ -= self->angleZ >> 4;492}493494if (self->angleZ <= 0)495self->angle -= -self->angleZ >> 8;496else497self->angle += self->angleZ >> 8;498499self->angle &= 0x3FF;500501self->velocity.x -= self->velocity.x >> 8;502self->velocity.y -= self->velocity.y >> 8;503self->velocity.x += speed * RSDK.Cos1024(self->angle);504self->velocity.y += speed * RSDK.Sin1024(self->angle);505506self->position.x += self->velocity.x;507self->position.y += self->velocity.y;508self->gravityStrength += -0x3800 - (turnSpeed >> 7);509510self->height += self->gravityStrength;511self->angleX = (self->angleX - (UFO_Player->maxSpeed >> 13)) & 0x3FF;512513self->animator.animationID = (self->angleX & 0x100) ? UFO_Player->ballModel : UFO_Player->jumpModel;514515if (self->height < 0 && self->gravityStrength <= 0) {516self->courseOutTimer = 4;517self->height = 0;518self->onGround = true;519self->state = UFO_Player_State_Run;520self->angleZ -= (self->angleZ >> 1);521}522523UFO_Player_HandleBumperTiles();524}525526void UFO_Player_State_Springboard(void)527{528RSDK_THIS(UFO_Player);529530int32 tilt = 0;531if (self->right)532tilt = 8;533else if (self->left)534tilt = -8;535536self->velocity.x -= self->velocity.x >> 8;537self->velocity.y -= self->velocity.y >> 8;538539self->velocity.x += tilt * RSDK.Cos1024(self->angle);540self->velocity.y += tilt * RSDK.Sin1024(self->angle);541542self->position.x += self->velocity.x;543self->position.y += self->velocity.y;544545self->gravityStrength -= 0x5000;546self->height += self->gravityStrength;547548self->angleX = (self->angleX - (UFO_Player->maxSpeed >> 13)) & 0x3FF;549550self->animator.animationID = (self->angleX & 0x100) ? UFO_Player->ballModel : UFO_Player->jumpModel;551552if (self->height < 0) {553self->courseOutTimer = 4;554self->height = 0;555self->onGround = true;556self->state = UFO_Player_State_Run;557self->angleZ -= (self->angleZ >> 1);558}559560UFO_Player_HandleBumperTiles();561}562563void UFO_Player_State_Trip(void)564{565RSDK_THIS(UFO_Player);566567self->position.x += self->velocity.x;568self->position.y += self->velocity.y;569570self->velocity.x -= self->velocity.x >> 8;571self->velocity.y -= self->velocity.y >> 8;572573if (!self->onGround) {574self->gravityStrength -= 0x3800;575self->height += self->gravityStrength;576577if (self->height < 0) {578self->height = 0;579self->onGround = true;580}581}582583UFO_Player_HandleBumperTiles();584585if (++self->timer > 32) {586self->timer = 0;587588if (self->onGround)589self->state = UFO_Player_State_Run;590else591self->state = UFO_Player_State_Jump;592}593}594595void UFO_Player_State_CourseOut(void)596{597RSDK_THIS(UFO_Player);598599self->velocity.x -= (self->velocity.x >> 5);600self->velocity.y -= (self->velocity.y >> 5);601self->gravityStrength -= 0x800;602603self->position.x += self->velocity.x;604self->position.y += self->velocity.y;605self->height += self->gravityStrength;606607if (self->height < 0)608self->drawGroup = 2;609610if (RSDK_GET_ENTITY(SLOT_UFO_SETUP, UFO_Setup)->state == UFO_Setup_State_HandleRingDrain) {611++self->timer;612613if (self->timer == 120) {614UFO_Setup_Finish_Fail();615}616else if (self->timer == 16) {617if (!UFO_Setup->timedOut) {618UFO_Setup->timedOut = true;619CREATE_ENTITY(UFO_Message, INT_TO_VOID(UFO_MESSAGE_COURSEOUT), self->position.x, self->position.y);620}621}622}623}624625void UFO_Player_State_UFOCaught_Charge(void)626{627RSDK_THIS(UFO_Player);628629++self->timer;630631self->velocity.x -= (self->velocity.x >> 4);632self->velocity.y -= (self->velocity.y >> 4);633634self->position.x += self->velocity.x;635self->position.y += self->velocity.y;636637self->angleX = (self->angleX - (UFO_Player->maxSpeed >> 13)) & 0x3FF;638639if (self->timer == 2) {640RSDK.SetModelAnimation(UFO_Player->jumpModel, &self->animator, 128, 0, true, 0);641RSDK.PlaySfx(UFO_Player->sfxCharge, false, 255);642}643644if (self->timer >= 30) {645self->timer = 0;646self->camera->state = UFO_Camera_State_UFOCaught;647self->state = UFO_Player_State_UFOCaught_Released;648649self->velocity.x = (self->circuitPtr->position.x - self->position.x) >> 4;650self->velocity.y = (self->circuitPtr->position.y - self->position.y) >> 4;651self->gravityStrength = (self->circuitPtr->height - self->height + 0x200000) >> 4;652653RSDK.PlaySfx(UFO_Player->sfxRelease, false, 255);654}655}656657void UFO_Player_State_UFOCaught_Released(void)658{659RSDK_THIS(UFO_Player);660661self->gravityStrength -= 0x80;662663self->position.x += self->velocity.x;664self->position.y += self->velocity.y;665self->height += self->gravityStrength;666667++self->timer;668669self->angleX = (self->angleX - (UFO_Player->maxSpeed >> 13)) & 0x3FF;670671if (self->timer == 16)672UFO_Setup_Finish_Win();673}674675#if GAME_INCLUDE_EDITOR676void UFO_Player_EditorDraw(void)677{678RSDK_THIS(UFO_Player);679680RSDK.SetSpriteAnimation(UFO_Player->aniFrames, 0, &self->animator, true, 7);681682RSDK.DrawSprite(&self->animator, NULL, false);683}684685void UFO_Player_EditorLoad(void) { UFO_Player->aniFrames = RSDK.LoadSpriteAnimation("Editor/PlayerIcons.bin", SCOPE_STAGE); }686#endif687688void UFO_Player_Serialize(void)689{690RSDK_EDITABLE_VAR(UFO_Player, VAR_ENUM, machQuota1);691RSDK_EDITABLE_VAR(UFO_Player, VAR_ENUM, machQuota2);692RSDK_EDITABLE_VAR(UFO_Player, VAR_ENUM, machQuota3);693RSDK_EDITABLE_VAR(UFO_Player, VAR_ENUM, startingRings);694}695696697