Path: blob/master/SonicMania/Objects/UFO/UFO_ItemBox.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: UFO_ItemBox Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectUFO_ItemBox *UFO_ItemBox;1011void UFO_ItemBox_Update(void)12{13RSDK_THIS(UFO_ItemBox);14StateMachine_Run(self->state);15}1617void UFO_ItemBox_LateUpdate(void)18{19RSDK_THIS(UFO_ItemBox);2021if (self->state == UFO_ItemBox_State_HasContents) {22self->visible = true;2324int32 x = self->position.x >> 8;25int32 y = self->height >> 8;26int32 z = self->position.y >> 8;2728Matrix *mat = &UFO_Camera->matWorld;2930self->worldX = mat->values[0][3] + (y * mat->values[0][1] >> 8) + (z * mat->values[0][2] >> 8) + (x * mat->values[0][0] >> 8);31self->worldY = mat->values[1][3] + (y * mat->values[1][1] >> 8) + (z * mat->values[1][2] >> 8) + (x * mat->values[1][0] >> 8);32self->zdepth = mat->values[2][3] + (y * mat->values[2][1] >> 8) + (z * mat->values[2][2] >> 8) + (x * mat->values[2][0] >> 8);3334if (self->zdepth >= 0x2000) {35int32 depth = (int32)((mat->values[0][3] << 8) + (y * mat->values[0][1] & 0xFFFFFF00) + (z * mat->values[0][2] & 0xFFFFFF00)36+ (x * mat->values[0][0] & 0xFFFFFF00))37/ self->zdepth;3839self->visible = abs(depth) < 0x100;40}41else {42self->visible = false;43}44}45}4647void UFO_ItemBox_StaticUpdate(void) {}4849void UFO_ItemBox_Draw(void)50{51RSDK_THIS(UFO_ItemBox);5253if (self->state == UFO_ItemBox_State_HasContents) {54RSDK_GET_ENTITY(SLOT_UFO_CAMERA, UFO_Camera);5556RSDK.Prepare3DScene(UFO_ItemBox->sceneIndex);5758RSDK.MatrixTranslateXYZ(&self->matTransform, self->position.x, self->height, self->position.y, true);59RSDK.MatrixRotateY(&self->matNormal, 8 * UFO_Setup->timer);6061RSDK.MatrixMultiply(&self->matWorld, &self->matNormal, &self->matTransform);62RSDK.MatrixMultiply(&self->matWorld, &self->matWorld, &UFO_Camera->matWorld);6364RSDK.MatrixRotateXYZ(&self->matNormal, 0, 8 * UFO_Setup->timer, 4 * UFO_Setup->timer);6566RSDK.AddModelTo3DScene(UFO_ItemBox->meshFrames, UFO_ItemBox->sceneIndex, S3D_WIREFRAME_SHADED_SCREEN, &self->matWorld, &self->matNormal,670xFFFF00);6869RSDK.Draw3DScene(UFO_ItemBox->sceneIndex);7071self->drawPos.x = (ScreenInfo->center.x + (self->worldX << 8) / self->zdepth) << 16;72self->drawPos.y = (ScreenInfo->center.y - (self->worldY << 8) / self->zdepth) << 16;73self->scale.x = 0x2000000 / self->zdepth;74self->scale.y = 0x2000000 / self->zdepth;75}7677RSDK.DrawSprite(&self->contentsAnimator, &self->drawPos, true);78}7980void UFO_ItemBox_Create(void *data)81{82RSDK_THIS(UFO_ItemBox);8384if (!SceneInfo->inEditor) {85self->visible = true;86self->drawFX = FX_SCALE;87self->drawGroup = 4;88self->active = ACTIVE_RBOUNDS;89self->updateRange.x = 0x400;90self->updateRange.y = 0x400;9192self->contentsTimer = 256;93self->sfxTimer = 10;94if (!self->height)95self->height = 12;9697self->height <<= 16;98self->state = UFO_ItemBox_State_HasContents;99100RSDK.SetSpriteAnimation(UFO_ItemBox->aniFrames, 0, &self->contentsAnimator, true, self->type);101}102}103104void UFO_ItemBox_StageLoad(void)105{106UFO_ItemBox->aniFrames = RSDK.LoadSpriteAnimation("SpecialUFO/Items.bin", SCOPE_STAGE);107108UFO_ItemBox->meshFrames = RSDK.LoadMesh("Special/ItemBox.bin", SCOPE_STAGE);109UFO_ItemBox->sceneIndex = RSDK.Create3DScene("View:Items", 1024, SCOPE_STAGE);110111UFO_ItemBox->breakCount = -1;112113RSDK.SetDiffuseColor(UFO_ItemBox->sceneIndex, 0xA0, 0xA0, 0x00);114RSDK.SetDiffuseIntensity(UFO_ItemBox->sceneIndex, 8, 8, 0);115RSDK.SetSpecularIntensity(UFO_ItemBox->sceneIndex, 14, 14, 0);116117UFO_ItemBox->sfxDestroy = RSDK.GetSfx("Global/Destroy.wav");118UFO_ItemBox->sfxRockemSockem = RSDK.GetSfx("Stage/RockemSockem.wav");119UFO_ItemBox->sfxBumper = RSDK.GetSfx("Stage/Bumper.wav");120}121122void UFO_ItemBox_State_HasContents(void)123{124RSDK_THIS(UFO_ItemBox);125126foreach_active(UFO_Player, player)127{128if (self->timer) {129self->timer--;130}131else if (player->stateInput) {132if (player->state != UFO_Player_State_CourseOut) {133int32 rx = (self->position.x - player->position.x) >> 16;134int32 ry = (self->height - player->height - 0xA0000) >> 16;135int32 rz = (self->position.y - player->position.y) >> 16;136137if (rx * rx + ry * ry + rz * rz < UFO_Player->maxSpeed >> 8) {138player->gravityStrength = 0x60000;139player->onGround = false;140player->state = UFO_Player_State_Jump;141142RSDK.SetModelAnimation(UFO_Player->jumpModel, &player->animator, 128, 0, true, 0);143144#if MANIA_USE_PLUS145if (self->type >= UFO_ITEMBOX_BUMPER) {146RSDK.PlaySfx(UFO_ItemBox->sfxBumper, false, 255);147self->timer = 16;148}149else {150#endif151RSDK.PlaySfx(UFO_ItemBox->sfxDestroy, false, 255);152self->drawGroup = 12;153self->active = 2;154self->state = UFO_ItemBox_State_ShowContents;155#if MANIA_USE_PLUS156}157#endif158++UFO_ItemBox->breakCount;159}160}161}162}163}164165void UFO_ItemBox_State_ShowContents(void)166{167RSDK_THIS(UFO_ItemBox);168169self->drawPos.x += ((ScreenInfo->center.x << 16) - self->drawPos.x) >> 3;170self->drawPos.y += (((ScreenInfo->center.x - 4) << 16) - self->drawPos.y) >> 3;171172int32 scale = self->scale.x + ((0x200 - self->scale.x) >> 3);173self->scale.x = scale;174self->scale.y = scale;175176if (self->contentsTimer > 0)177self->contentsTimer -= 8;178179if (++self->timer > 15) {180self->visible = (self->timer >> 2) & 1;181182switch (self->type) {183case UFO_ITEMBOX_RING:184if (!(self->timer & 3)) {185if (self->sfxTimer > 0) {186self->sfxTimer--;187UFO_Ring_PlayRingSfx();188}189}190break;191192case UFO_ITEMBOX_SPHERE:193if (!(self->timer & 1) && self->sfxTimer > 0) {194++UFO_Setup->machPoints;195UFO_HUD_CheckLevelUp();196UFO_Setup_PlaySphereSfx();197}198break;199200case UFO_ITEMBOX_LVLUP:201if (self->timer == 16)202UFO_HUD_LevelUpMach();203break;204}205}206207if (self->timer == 80) {208if (UFO_ItemBox->breakCount > -1)209UFO_ItemBox->breakCount--;210211destroyEntity(self);212}213}214215#if GAME_INCLUDE_EDITOR216void UFO_ItemBox_EditorDraw(void)217{218RSDK_THIS(UFO_ItemBox);219220RSDK.SetSpriteAnimation(UFO_ItemBox->aniFrames, 0, &self->contentsAnimator, true, self->type);221222RSDK.DrawSprite(&self->contentsAnimator, NULL, false);223}224225void UFO_ItemBox_EditorLoad(void)226{227UFO_ItemBox->aniFrames = RSDK.LoadSpriteAnimation("SpecialUFO/Items.bin", SCOPE_STAGE);228229RSDK_ACTIVE_VAR(UFO_ItemBox, type);230RSDK_ENUM_VAR("Rings", UFO_ITEMBOX_RING);231RSDK_ENUM_VAR("Spheres", UFO_ITEMBOX_SPHERE);232RSDK_ENUM_VAR("Level Up", UFO_ITEMBOX_LVLUP);233#if MANIA_USE_PLUS234RSDK_ENUM_VAR("Bumper", UFO_ITEMBOX_BUMPER);235#endif236}237#endif238239void UFO_ItemBox_Serialize(void)240{241RSDK_EDITABLE_VAR(UFO_ItemBox, VAR_ENUM, type);242RSDK_EDITABLE_VAR(UFO_ItemBox, VAR_ENUM, height);243}244245246