Path: blob/master/SonicMania/Objects/UFO/UFO_Camera.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: UFO_Camera Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectUFO_Camera *UFO_Camera;1011void UFO_Camera_Update(void) {}1213void UFO_Camera_LateUpdate(void)14{15RSDK_THIS(UFO_Camera);1617StateMachine_Run(self->state);1819UFO_Camera_HandleCamPos();20}2122void UFO_Camera_StaticUpdate(void) {}2324void UFO_Camera_Draw(void) {}2526void UFO_Camera_Create(void *data)27{28RSDK_THIS(UFO_Camera);2930self->active = ACTIVE_NORMAL;31self->state = UFO_Camera_State_Normal;32self->height = 0x300000;33self->radius = 0x2800;3435foreach_all(UFO_Player, player)36{37player->camera = self;38self->target = (Entity *)player;39}40}4142void UFO_Camera_StageLoad(void)43{44RSDK.ResetEntitySlot(SLOT_UFO_CAMERA, UFO_Camera->classID, NULL);4546UFO_Camera->isSS7 = RSDK.CheckSceneFolder("UFO7");47}4849void UFO_Camera_HandleCamPos(void)50{51RSDK_THIS(UFO_Camera);5253int32 cos = MAX(RSDK.Cos1024(-self->angleX) << 12, 0x3C0000);5455int32 angle = self->angle - self->prevAngle;56int32 angle2 = angle - 0x400;57if (self->angle <= 0x200)58angle2 = angle + 0x400;5960if (abs(angle) >= abs(angle2))61ScreenInfo->position.x -= 2 * angle2;62else63ScreenInfo->position.x -= 2 * angle;6465int32 offset = ((RSDK.Sin1024(-self->angleX) << 12) << 8) / cos;66ScreenInfo->position.y = offset - ScreenInfo->center.y + 512;67self->prevAngle = self->angle;6869self->clipY = CLAMP(ScreenInfo->center.y - offset + 8, -0x40, ScreenInfo->size.y);70}7172void UFO_Camera_State_Normal(void)73{74RSDK_THIS(UFO_Camera);7576EntityUFO_Player *target = (EntityUFO_Player *)self->target;7778if (target) {79int32 negAngle = (-0x200 - target->angle) & 0x3FF;80int32 rot = negAngle - self->angle;8182if (abs(rot) >= abs(rot - 0x400)) {83if (abs(rot - 0x400) < abs(rot + 0x400))84self->angle += (rot - 0x400) >> 3;85else86self->angle += (rot + 0x400) >> 3;87}88else {89if (abs(rot) < abs(rot + 0x400))90self->angle += rot >> 3;91else92self->angle += (rot + 0x400) >> 3;93}9495self->angle &= 0x3FF;96if (target->state == UFO_Player_State_Springboard) {97self->angleX = -(target->height >> 18);98int32 rad = self->radius * RSDK.Cos1024(self->angleX) >> 10;99100self->position.x = target->position.x - rad * RSDK.Sin1024(self->angle);101self->position.y = target->position.y - rad * RSDK.Cos1024(self->angle);102103self->height = (target->height >> 1) - (RSDK.Sin1024(self->angleX) << 14) + 0x400000;104}105else {106self->angleX = 0;107self->position.x = target->position.x - self->radius * RSDK.Sin1024(self->angle);108self->position.y = target->position.y - self->radius * RSDK.Cos1024(self->angle);109self->height = (target->height >> 2) + 0x400000;110}111}112113RSDK.MatrixTranslateXYZ(&self->matWorld, -self->position.x, -self->height, -self->position.y, true);114RSDK.MatrixRotateXYZ(&UFO_Camera->matView, self->angleX, self->angle, 0);115116RSDK.MatrixMultiply(&UFO_Camera->matWorld, &self->matWorld, &UFO_Camera->matView);117RSDK.MatrixScaleXYZ(&self->matWorld, -0x100, 0x100, 0x100);118119RSDK.MatrixMultiply(&UFO_Camera->matView, &UFO_Camera->matView, &self->matWorld);120121if (UFO_Camera->isSS7) {122RSDK.MatrixRotateXYZ(&UFO_Camera->matTemp, self->angleX + 4 * UFO_Setup->timer, self->angle, 0);123RSDK.MatrixMultiply(&UFO_Camera->matTemp, &UFO_Camera->matTemp, &self->matWorld);124}125126RSDK.MatrixMultiply(&UFO_Camera->matWorld, &UFO_Camera->matWorld, &self->matWorld);127}128129void UFO_Camera_State_CourseOut(void)130{131RSDK_THIS(UFO_Camera);132133self->height += 0x20000;134135if (self->angleX > -0x100)136self->angleX -= 4;137138self->angle += 2;139140RSDK.MatrixTranslateXYZ(&self->matWorld, -self->position.x, -self->height, -self->position.y, true);141RSDK.MatrixRotateXYZ(&UFO_Camera->matView, self->angleX, self->angle, 0);142143RSDK.MatrixMultiply(&UFO_Camera->matWorld, &self->matWorld, &UFO_Camera->matView);144RSDK.MatrixScaleXYZ(&self->matWorld, -0x100, 0x100, 0x100);145146RSDK.MatrixMultiply(&UFO_Camera->matView, &UFO_Camera->matView, &self->matWorld);147RSDK.MatrixMultiply(&UFO_Camera->matWorld, &UFO_Camera->matWorld, &self->matWorld);148}149150void UFO_Camera_State_UFOCaught(void)151{152RSDK_THIS(UFO_Camera);153154self->height += 0x80000;155if (self->angleX > -0x100)156self->angleX -= 8;157158self->position.x += RSDK.Sin1024(self->angle) << 8;159self->position.y += RSDK.Cos1024(self->angle) << 8;160161RSDK.MatrixTranslateXYZ(&self->matWorld, -self->position.x, -self->height, -self->position.y, true);162RSDK.MatrixRotateXYZ(&UFO_Camera->matView, self->angleX, self->angle, 0);163164RSDK.MatrixMultiply(&UFO_Camera->matWorld, &self->matWorld, &UFO_Camera->matView);165RSDK.MatrixScaleXYZ(&self->matWorld, -0x100, 0x100, 0x100);166167RSDK.MatrixMultiply(&UFO_Camera->matView, &UFO_Camera->matView, &self->matWorld);168RSDK.MatrixMultiply(&UFO_Camera->matWorld, &UFO_Camera->matWorld, &self->matWorld);169}170171#if GAME_INCLUDE_EDITOR172void UFO_Camera_EditorDraw(void) {}173174void UFO_Camera_EditorLoad(void) {}175#endif176177void UFO_Camera_Serialize(void) {}178179180