Path: blob/master/SonicMania/Objects/FBZ/FBZSinkTrash.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: FBZSinkTrash Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectFBZSinkTrash *FBZSinkTrash;1011void FBZSinkTrash_Update(void)12{13RSDK_THIS(FBZSinkTrash);1415switch (self->type) {16case FBZSINKTRASH_SINK: {17foreach_active(Player, player)18{19if (Player_CheckCollisionTouch(player, self, &self->hitboxTrash)) {20if (player->velocity.y >= 0) {21#if MANIA_USE_PLUS22if (player->state == Player_State_MightyHammerDrop) {23player->velocity.y = player->velocity.y - (player->velocity.y >> 5) - (player->velocity.y >> 4);24if (player->velocity.y >= 0x30000) {25int32 speed = abs(player->velocity.y + player->velocity.x);26if (speed > 0x10000 && !(Zone->timer & 7)) {27int32 x = player->position.x + RSDK.Rand(-0x40000, 0x40000);28int32 y = player->position.y + 0x40000 + RSDK.Rand(-0x40000, 0x40000);29EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_Fall, x, y);3031RSDK.SetSpriteAnimation(FBZSinkTrash->aniFrames, RSDK.Rand(0, 2) + 9, &debris->animator, false, 0);32debris->velocity.x = RSDK.Rand(-0x20000, 0x20000);33debris->velocity.y = -0x20000;34debris->gravityStrength = 0x3800;35debris->updateRange.y = 0x200000;36debris->updateRange.x = 0x200000;37debris->drawGroup = Zone->objectDrawGroup[0];38}39}40else {41player->state = Player_State_Air;42player->onGround = true;43player->velocity.y = 0;44player->collisionMode = CMODE_FLOOR;45player->angle = 0;46player->position.y += 0x10000;47int32 speed = abs(player->velocity.y + player->velocity.x);48if (speed > 0x10000 && !(Zone->timer & 7)) {49int32 x = player->position.x + RSDK.Rand(-0x40000, 0x40000);50int32 y = player->position.y + 0x40000 + RSDK.Rand(-0x40000, 0x40000);51EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_Fall, x, y);5253RSDK.SetSpriteAnimation(FBZSinkTrash->aniFrames, RSDK.Rand(0, 2) + 9, &debris->animator, false, 0);54debris->velocity.x = RSDK.Rand(-0x20000, 0x20000);55debris->velocity.y = -0x20000;56debris->gravityStrength = 0x3800;57debris->updateRange.y = 0x200000;58debris->updateRange.x = 0x200000;59debris->drawGroup = Zone->objectDrawGroup[0];60}61}62}63else {64#endif65player->onGround = true;66player->velocity.y = 0;67player->collisionMode = CMODE_FLOOR;68player->angle = 0;69player->position.y += 0x10000;70int32 speed = abs(player->velocity.y + player->velocity.x);71if (speed > 0x10000 && !(Zone->timer & 7)) {72int32 x = player->position.x + RSDK.Rand(-0x40000, 0x40000);73int32 y = player->position.y + 0x40000 + RSDK.Rand(-0x40000, 0x40000);74EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_Fall, x, y);7576RSDK.SetSpriteAnimation(FBZSinkTrash->aniFrames, RSDK.Rand(0, 2) + 9, &debris->animator, false, 0);77debris->velocity.x = RSDK.Rand(-0x20000, 0x20000);78debris->velocity.y = -0x20000;79debris->gravityStrength = 0x3800;80debris->updateRange.y = 0x200000;81debris->updateRange.x = 0x200000;82debris->drawGroup = Zone->objectDrawGroup[0];83}84#if MANIA_USE_PLUS85}86#endif87}88}89else if (Player_CheckCollisionTouch(player, self, &self->hitboxDebris)) {90#if MANIA_USE_PLUS91if (player->state == Player_State_MightyHammerDrop) {92player->velocity.y = player->velocity.y - (player->velocity.y >> 5) - (player->velocity.y >> 4);93if (player->velocity.y < 0x30000) {94player->state = Player_State_Air;95player->onGround = true;96player->velocity.y = 0;97player->collisionMode = 0;98player->angle = 0;99player->position.y += 0x10000;100}101}102#endif103104if (!(Zone->timer & 7)) {105EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_Fall, player->position.x + RSDK.Rand(-0x40000, 0x40000),106player->position.y + RSDK.Rand(-0x100000, 0));107RSDK.SetSpriteAnimation(FBZSinkTrash->aniFrames, 0, &debris->animator, false, RSDK.Rand(0, 20));108debris->velocity.x = RSDK.Rand(-0x20000, 0x20000);109debris->velocity.y = player->velocity.y;110debris->gravityStrength = 0x3800;111debris->updateRange.y = 0x200000;112debris->updateRange.x = 0x200000;113debris->drawGroup = Zone->objectDrawGroup[0];114}115}116}117break;118}119120default:121case FBZSINKTRASH_SOLID: {122foreach_active(Player, player) { Player_CheckCollisionPlatform(player, self, &self->hitboxTrash); }123124foreach_active(SignPost, signPost)125{126if (signPost->state == SignPost_State_Falling && signPost->position.y + 0x180000 > self->position.y - (self->size.y >> 1)) {127RSDK.PlaySfx(SignPost->sfxSlide, false, 255);128signPost->spinCount = 4;129signPost->position.y = self->position.y - (self->size.y >> 1) - 0x180000;130signPost->velocity.y = 0;131Music_FadeOut(0.025);132signPost->state = SignPost_State_Spin;133}134}135break;136}137138case FBZSINKTRASH_DECOR: break;139}140}141142void FBZSinkTrash_LateUpdate(void) {}143144void FBZSinkTrash_StaticUpdate(void) {}145146void FBZSinkTrash_Draw(void)147{148RSDK_THIS(FBZSinkTrash);149Vector2 drawPos;150151self->direction = FLIP_NONE;152int32 drawX = self->position.x - (self->size.x >> 1);153154SpriteFrame *frame = RSDK.GetFrame(FBZSinkTrash->aniFrames, 11, 0);155drawPos.x = self->position.x - (self->size.x >> 1);156drawPos.y = self->position.y - (self->size.y >> 1);157frame->width = 64;158for (int32 i = 0; i < self->size.x; i += 0x400000) {159if (self->size.x - i < 0x400000)160frame->width = (self->size.x - i) >> 16;161162RSDK.DrawSprite(&self->topAnimator, &drawPos, false);163164drawPos.x += 0x400000;165}166167frame = RSDK.GetFrame(FBZSinkTrash->aniFrames, 11, 1);168frame->height = 64;169for (int32 i = 0; i < self->size.y; i += 0x400000) {170drawPos.x = drawX;171172frame->width = 64;173if (self->size.y - i < 0x400000)174frame->height = (self->size.y - i) >> 16;175176for (int32 x = 0; x < self->size.x; x += 0x400000) {177if (self->size.x - x < 0x400000)178frame->width = (self->size.x - x) >> 16;179180RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);181182drawPos.x += 0x400000;183}184drawPos.y += 0x400000;185}186187frame = RSDK.GetFrame(FBZSinkTrash->aniFrames, 11, 0);188self->direction = FLIP_Y;189drawPos.x = drawX;190frame->width = 64;191192for (int32 i = 0; i < self->size.x; i += 0x400000) {193if (self->size.x - i < 0x400000)194frame->width = (self->size.x - i) >> 16;195196RSDK.DrawSprite(&self->topAnimator, &drawPos, false);197198drawPos.x += 0x400000;199}200201if (self->type < FBZSINKTRASH_SOLID) {202for (int32 i = 0; i < 64; ++i) {203drawPos.x = self->position.x + self->trashPos[i].x;204drawPos.y = self->position.y + self->trashPos[i].y;205self->trashAnimator.frameID = self->trashFrame[i];206self->direction = self->trashDir[i];207RSDK.DrawSprite(&self->trashAnimator, &drawPos, false);208}209210self->direction = FLIP_NONE;211}212}213214void FBZSinkTrash_Create(void *data)215{216RSDK_THIS(FBZSinkTrash);217if (!SceneInfo->inEditor) {218self->updateRange.x = self->size.x >> 1;219self->updateRange.y = (self->size.y >> 1) + 0x400000;220self->active = ACTIVE_BOUNDS;221self->visible = true;222self->drawFX = FX_FLIP;223self->drawGroup = self->type == FBZSINKTRASH_SINK ? (Zone->objectDrawGroup[1] - 2) : Zone->objectDrawGroup[0];224225self->hitboxTrash.left = -(self->size.x >> 17);226self->hitboxTrash.top = -(self->size.y >> 17);227self->hitboxTrash.right = self->size.x >> 17;228self->hitboxTrash.bottom = 24 - (self->size.y >> 17);229230self->hitboxDebris.left = -(self->size.x >> 17);231self->hitboxDebris.top = (self->size.y >> 17) - 16;232self->hitboxDebris.right = self->size.x >> 17;233self->hitboxDebris.bottom = self->size.y >> 17;234235RSDK.SetSpriteAnimation(FBZSinkTrash->aniFrames, 0, &self->trashAnimator, true, 0);236RSDK.SetSpriteAnimation(FBZSinkTrash->aniFrames, 11, &self->topAnimator, true, 0);237RSDK.SetSpriteAnimation(FBZSinkTrash->aniFrames, 11, &self->mainAnimator, true, 1);238239for (int32 i = 0; i < 64; ++i) {240self->trashPos[i].x = RSDK.Rand(-(self->size.x >> 1), self->size.x >> 1);241self->trashPos[i].y = RSDK.Rand(-(self->size.y >> 1), self->size.y >> 1);242self->trashFrame[i] = RSDK.Rand(0, 22);243self->trashDir[i] = RSDK.Rand(FLIP_NONE, FLIP_XY + 1);244}245}246}247248void FBZSinkTrash_StageLoad(void) { FBZSinkTrash->aniFrames = RSDK.LoadSpriteAnimation("FBZ/Trash.bin", SCOPE_STAGE); }249250#if GAME_INCLUDE_EDITOR251void FBZSinkTrash_EditorDraw(void)252{253RSDK_THIS(FBZSinkTrash);254255self->updateRange.x = self->size.x >> 1;256self->updateRange.y = (self->size.y >> 1) + 0x400000;257self->drawFX = FX_FLIP;258self->direction = FLIP_NONE;259260RSDK.SetSpriteAnimation(FBZSinkTrash->aniFrames, 0, &self->trashAnimator, true, 0);261RSDK.SetSpriteAnimation(FBZSinkTrash->aniFrames, 11, &self->topAnimator, true, 0);262RSDK.SetSpriteAnimation(FBZSinkTrash->aniFrames, 11, &self->mainAnimator, true, 1);263264// this is pretty nasty but I didn't wanna make new vars and I needed smth to store it265int32 *prevX = (int32 *)&self->hitboxTrash.left;266int32 *prevY = (int32 *)&self->hitboxTrash.right;267268if (*prevX != self->size.x || *prevY != self->size.y) {269for (int32 i = 0; i < 64; ++i) {270self->trashPos[i].x = RSDK.Rand(-(self->size.x >> 1), self->size.x >> 1);271self->trashPos[i].y = RSDK.Rand(-(self->size.y >> 1), self->size.y >> 1);272self->trashFrame[i] = RSDK.Rand(0, 22);273self->trashDir[i] = RSDK.Rand(0, 4);274}275276*prevX = self->size.x;277*prevY = self->size.y;278}279280// Draw everything except the trash, we'll do that seperately so it's part of the overlay, not the base sprite281int32 type = self->type;282self->type = FBZSINKTRASH_SOLID;283FBZSinkTrash_Draw();284self->type = type;285286if (self->type < FBZSINKTRASH_SOLID) {287RSDK_DRAWING_OVERLAY(true);288Vector2 drawPos;289for (int32 i = 0; i < 64; ++i) {290drawPos.x = self->position.x + self->trashPos[i].x;291drawPos.y = self->position.y + self->trashPos[i].y;292self->trashAnimator.frameID = self->trashFrame[i];293self->direction = self->trashDir[i];294RSDK.DrawSprite(&self->trashAnimator, &drawPos, false);295}296297self->direction = FLIP_NONE;298RSDK_DRAWING_OVERLAY(false);299}300301DrawHelpers_DrawRectOutline(self->position.x, self->position.y, self->size.x, self->size.y, 0xFFFF00);302}303304void FBZSinkTrash_EditorLoad(void)305{306FBZSinkTrash->aniFrames = RSDK.LoadSpriteAnimation("FBZ/Trash.bin", SCOPE_STAGE);307308RSDK_ACTIVE_VAR(FBZSinkTrash, type);309RSDK_ENUM_VAR("Sink Trash", FBZSINKTRASH_SINK);310RSDK_ENUM_VAR("Solid", FBZSINKTRASH_SOLID);311RSDK_ENUM_VAR("Decoration", FBZSINKTRASH_DECOR);312}313#endif314315void FBZSinkTrash_Serialize(void)316{317RSDK_EDITABLE_VAR(FBZSinkTrash, VAR_ENUM, type);318RSDK_EDITABLE_VAR(FBZSinkTrash, VAR_VECTOR2, size);319}320321322