Path: blob/master/SonicMania/Objects/UFO/UFO_Shadow.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: UFO_Shadow Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectUFO_Shadow *UFO_Shadow;1011void UFO_Shadow_Update(void) {}1213void UFO_Shadow_LateUpdate(void)14{15RSDK_THIS(UFO_Shadow);16Entity *parent = self->parent;1718if (parent->classID) {19self->position.x = parent->position.x;20self->position.y = parent->position.y;2122if (RSDK.GetTile(UFO_Setup->playFieldLayer, self->position.x >> 20, self->position.y >> 20) == (uint16)-1 || parent->drawGroup != 4) {23self->visible = false;24}25else {26self->visible = true;27int32 x = self->position.x >> 8;28int32 z = self->position.y >> 8;29Matrix *mat = &UFO_Camera->matWorld;3031self->zdepth = mat->values[2][3] + (z * mat->values[2][2] >> 8) + (x * mat->values[2][0] >> 8);3233if (self->zdepth >= 0x4000) {34self->visible =35abs((int32)((mat->values[0][3] << 8) + ((z * mat->values[0][2]) & 0xFFFFFF00) + ((x * mat->values[0][0]) & 0xFFFFFF00))36/ self->zdepth)37< 0x100;38}39}40}41else {42destroyEntity(self);43}44}4546void UFO_Shadow_StaticUpdate(void) {}4748void UFO_Shadow_Draw(void)49{50RSDK_THIS(UFO_Shadow);5152if (self->zdepth >= 0x4000) {53RSDK.MatrixScaleXYZ(&self->matrix, self->shadowScale, 0x100, self->shadowScale);54RSDK.MatrixTranslateXYZ(&self->matrix, self->position.x, 0, self->position.y, 0);55RSDK.MatrixMultiply(&self->matrix, &self->matrix, &UFO_Camera->matWorld);5657RSDK.Prepare3DScene(UFO_Shadow->sceneID);58RSDK.AddModelTo3DScene(UFO_Shadow->modelIndex, UFO_Shadow->sceneID, S3D_SOLIDCOLOR_SCREEN, &self->matrix, 0, 0);59RSDK.Draw3DScene(UFO_Shadow->sceneID);60}61}6263void UFO_Shadow_Create(void *data)64{65RSDK_THIS(UFO_Shadow);6667if (!SceneInfo->inEditor) {68self->inkEffect = INK_BLEND;69self->visible = true;70self->drawFX = FX_SCALE;71self->drawGroup = 3;72self->active = ACTIVE_RBOUNDS;73self->updateRange.x = 0x300;74self->updateRange.y = 0x300;75}76}7778void UFO_Shadow_StageLoad(void)79{80UFO_Shadow->modelIndex = RSDK.LoadMesh("Special/Shadow.bin", SCOPE_STAGE);81UFO_Shadow->sceneID = RSDK.Create3DScene("View:Special", 4096, SCOPE_STAGE);8283int32 slot = TEMPENTITY_START;84foreach_all(UFO_Player, player)85{86EntityUFO_Shadow *shadow = RSDK_GET_ENTITY(slot--, UFO_Shadow);87RSDK.ResetEntity(shadow, UFO_Shadow->classID, NULL);88shadow->position.x = player->position.x;89shadow->position.y = player->position.y;90shadow->parent = (Entity *)player;91shadow->shadowScale = 0x140;92}9394foreach_all(UFO_Circuit, ufo)95{96if (ufo->startNode) {97EntityUFO_Shadow *shadow = RSDK_GET_ENTITY(slot--, UFO_Shadow);98RSDK.ResetEntity(shadow, UFO_Shadow->classID, NULL);99shadow->position.x = ufo->position.x;100shadow->position.y = ufo->position.y;101shadow->parent = (Entity *)ufo;102shadow->shadowScale = 0x400;103}104}105106foreach_all(UFO_Ring, ring)107{108EntityUFO_Shadow *shadow = RSDK_GET_ENTITY(slot--, UFO_Shadow);109RSDK.ResetEntity(shadow, UFO_Shadow->classID, NULL);110shadow->position.x = ring->position.x;111shadow->position.y = ring->position.y;112shadow->parent = (Entity *)ring;113shadow->shadowScale = 0xC0;114}115116foreach_all(UFO_Sphere, sphere)117{118EntityUFO_Shadow *shadow = RSDK_GET_ENTITY(slot--, UFO_Shadow);119RSDK.ResetEntity(shadow, UFO_Shadow->classID, NULL);120shadow->position.x = sphere->position.x;121shadow->position.y = sphere->position.y;122shadow->parent = (Entity *)sphere;123shadow->shadowScale = 0x100;124}125126LogHelpers_Print("%d shadow entities spawned", TEMPENTITY_START - slot);127}128129#if GAME_INCLUDE_EDITOR130void UFO_Shadow_EditorDraw(void) {}131132void UFO_Shadow_EditorLoad(void) {}133#endif134135void UFO_Shadow_Serialize(void) {}136137138