Path: blob/master/SonicMania/Objects/UFO/UFO_Springboard.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: UFO_Springboard Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectUFO_Springboard *UFO_Springboard;1011void UFO_Springboard_Update(void)12{13RSDK_THIS(UFO_Springboard);14foreach_active(UFO_Player, player)15{16if (player->bumperTimer <= 12 && player->stateInput) {17Vector2 pivotPos = player->position;18Zone_RotateOnPivot(&pivotPos, &self->position, self->angle >> 2);1920if (abs(self->position.x - pivotPos.x) < 0x180000 && abs(self->position.y - pivotPos.y) < 0x180000) {21int32 height = 32 * ((pivotPos.y - self->position.y + 0x180000) / 48);22if (player->height < height) {23if (height - player->height <= 0xC0000) {24player->gravityStrength = 0xC0000;25player->onGround = false;26player->state = UFO_Player_State_Springboard;27RSDK.SetModelAnimation(UFO_Player->jumpModel, &player->animator, 128, 0, true, 0);28RSDK.PlaySfx(UFO_Player->sfxSpring, false, 255);29}30else {31player->bumperTimer = 16;32player->velocity.x = -player->velocity.x;33player->velocity.y = -player->velocity.y;34RSDK.PlaySfx(UFO_Player->sfxBumper, false, 255);35}36}37}38}39}4041if (RSDK.CheckOnScreen(self, 0)) {42if (self->scale.x < 0x100)43self->scale.x += 0x10;4445self->active = ACTIVE_NORMAL;46}47else {48self->scale.x = 0x000;49self->active = ACTIVE_BOUNDS;50}51}5253void UFO_Springboard_LateUpdate(void)54{55RSDK_THIS(UFO_Springboard);5657int32 x = self->position.x;58int32 y = self->height;59int32 z = self->position.y;6061Matrix *m = &UFO_Camera->matWorld;6263self->zdepth = m->values[2][1] * (y >> 16) + m->values[2][2] * (z >> 16) + m->values[2][0] * (x >> 16) + m->values[2][3];64if (self->zdepth >= 0x4000) {65int32 depth = (int32)((m->values[0][3] << 8) + (m->values[0][2] * (z >> 8) & 0xFFFFFF00) + (m->values[0][0] * (x >> 8) & 0xFFFFFF00)66+ (m->values[0][1] * (self->height >> 8) & 0xFFFFFF00))67/ self->zdepth;6869self->visible = abs(depth) < 0x100;70}71}7273void UFO_Springboard_StaticUpdate(void) {}7475void UFO_Springboard_Draw(void)76{77RSDK_THIS(UFO_Springboard);7879if (self->zdepth >= 0x4000) {80RSDK.Prepare3DScene(UFO_Springboard->sceneIndex);8182RSDK.MatrixScaleXYZ(&self->matTemp, 0x100, self->scale.x, 0x100);83RSDK.MatrixTranslateXYZ(&self->matTemp, self->position.x, self->height, self->position.y, 0);8485RSDK.MatrixRotateY(&self->matNormal, self->angle);86RSDK.MatrixMultiply(&self->matWorld, &self->matNormal, &self->matTemp);87RSDK.MatrixMultiply(&self->matWorld, &self->matWorld, &UFO_Camera->matWorld);88RSDK.MatrixMultiply(&self->matNormal, &self->matNormal, &UFO_Camera->matView);8990RSDK.AddMeshFrameTo3DScene(UFO_Springboard->modelIndex, UFO_Springboard->sceneIndex, &self->animator, S3D_SOLIDCOLOR_SHADED_BLENDED_SCREEN,91&self->matWorld, &self->matNormal, 0xFFFFFF);9293RSDK.Draw3DScene(UFO_Springboard->sceneIndex);94}95}9697void UFO_Springboard_Create(void *data)98{99RSDK_THIS(UFO_Springboard);100101if (!SceneInfo->inEditor) {102self->visible = true;103self->drawGroup = 4;104self->active = ACTIVE_BOUNDS;105self->updateRange.x = 0x5000000;106self->updateRange.y = 0x5000000;107}108}109110void UFO_Springboard_StageLoad(void)111{112UFO_Springboard->modelIndex = RSDK.LoadMesh("Special/Springboard.bin", SCOPE_STAGE);113UFO_Springboard->sceneIndex = RSDK.Create3DScene("View:Special", 4096, SCOPE_STAGE);114}115116#if GAME_INCLUDE_EDITOR117void UFO_Springboard_EditorDraw(void) {}118119void UFO_Springboard_EditorLoad(void) {}120#endif121122void UFO_Springboard_Serialize(void)123{124RSDK_EDITABLE_VAR(UFO_Springboard, VAR_ENUM, angle);125RSDK_EDITABLE_VAR(UFO_Springboard, VAR_UINT8, rampCount);126}127128129