Path: blob/master/SonicMania/Objects/FBZ/FBZTrash.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: FBZTrash Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectFBZTrash *FBZTrash;1011void FBZTrash_Update(void)12{13RSDK_THIS(FBZTrash);1415StateMachine_Run(self->state);16}1718void FBZTrash_LateUpdate(void) {}1920void FBZTrash_StaticUpdate(void) {}2122void FBZTrash_Draw(void)23{24RSDK_THIS(FBZTrash);2526RSDK.DrawSprite(&self->animator, NULL, false);27}2829void FBZTrash_Create(void *data)30{31RSDK_THIS(FBZTrash);3233if (!SceneInfo->inEditor) {34self->active = ACTIVE_BOUNDS;35self->visible = true;36self->drawFX = FX_FLIP;3738if (data) {39self->type = VOID_TO_INT(data);40self->drawGroup = Zone->objectDrawGroup[0];4142self->hitbox.left = -8;43self->hitbox.top = -8;44self->hitbox.right = 8;45self->hitbox.bottom = 8;4647self->updateRange.x = 0x800000;48self->updateRange.y = 0x800000;49self->state = FBZTrash_State_ReactMagnet;50}51else {52self->drawGroup = Zone->objectDrawGroup[1];53self->updateRange.x = 0x800000;54self->updateRange.y = 0x200000;55self->onGround = true;5657self->direction = RSDK.Rand(0, 2);58RSDK.SetSpriteAnimation(FBZTrash->aniFrames, 0, &self->animator, true, self->frameID);59self->state = FBZTrash_State_LooseTrash;60}61}62}6364void FBZTrash_StageLoad(void) { FBZTrash->aniFrames = RSDK.LoadSpriteAnimation("FBZ/Trash.bin", SCOPE_STAGE); }6566void FBZTrash_SummonOrbinautOrbs(EntityFBZTrash *trashPtr, int32 angle)67{68EntityFBZTrash *trash = CREATE_ENTITY(FBZTrash, INT_TO_VOID(FBZTRASH_ORB), trashPtr->position.x, trashPtr->position.y);6970trash->position.x += RSDK.Cos1024(angle) << 10;71trash->position.y += RSDK.Sin1024(angle) << 10;72trash->targetPos = trash->position;73int32 size = BigSqueeze->crusherX[BIGSQUEEZE_CRUSHER_R] - BigSqueeze->crusherX[BIGSQUEEZE_CRUSHER_L];74trash->position.x = (RSDK.Rand(0, size >> 16) << 16) + BigSqueeze->crusherX[BIGSQUEEZE_CRUSHER_L];75trash->position.y = BigSqueeze->boundsB - 0x80000;76trash->parent = trashPtr;77trash->startPos = trash->position;78trash->angle = angle;79trash->radius = 10;80trash->state = FBZTrash_State_ReactMagnet;8182RSDK.SetSpriteAnimation(FBZTrash->aniFrames, 5, &trash->animator, true, RSDK.Rand(0, 2));83}8485void FBZTrash_SummonOrbinaut(int32 x, int32 y)86{87EntityFBZTrash *trash = CREATE_ENTITY(FBZTrash, INT_TO_VOID(FBZTRASH_ORBINAUT), x, y);88FBZTrash_SummonOrbinautOrbs(trash, 0);89FBZTrash_SummonOrbinautOrbs(trash, 512);9091trash->targetPos = trash->position;92int32 size = BigSqueeze->crusherX[BIGSQUEEZE_CRUSHER_R] - BigSqueeze->crusherX[BIGSQUEEZE_CRUSHER_L];93trash->position.x = (RSDK.Rand(0, size >> 16) << 16) + BigSqueeze->crusherX[BIGSQUEEZE_CRUSHER_L];94trash->position.y = BigSqueeze->boundsB - 0x80000;95trash->state = FBZTrash_State_ReactMagnet;96trash->startPos = trash->position;9798RSDK.SetSpriteAnimation(FBZTrash->aniFrames, 1, &trash->animator, true, (x >> 17) & 1);99}100101void FBZTrash_State_LooseTrash(void)102{103RSDK_THIS(FBZTrash);104105if (!self->onGround) {106self->velocity.y += 0x3800;107self->position.x += self->velocity.x;108self->position.y += self->velocity.y;109}110111if (self->velocity.y >= -0x8000) {112foreach_active(FBZTrash, trash)113{114if (trash != self) {115int32 rx = (self->position.x - trash->position.x) >> 16;116int32 ry = (self->position.y - trash->position.y) >> 16;117118if (rx * rx + ry * ry < 0x120) {119if (BigSqueeze->isCrushing)120self->rumbleMove = (self->rumbleMove + trash->rumbleMove) >> 1;121else122self->rumbleMove >>= 1;123124if (self->rumbleMove <= 0) {125self->onGround = true;126}127else {128int32 angle = RSDK.ATan2(rx, ry);129self->velocity.x = MIN(self->rumbleMove << 6, 640) * RSDK.Cos256(angle);130self->velocity.y = MIN(self->rumbleMove << 6, 640) * RSDK.Sin256(angle + RSDK.Rand(-32, 32));131self->onGround = false;132}133}134}135}136}137138if (self->position.y < BigSqueeze->boundsB - 0xC0000)139self->position.y = BigSqueeze->boundsB - 0xC0000;140141foreach_active(BigSqueeze, boss)142{143switch (boss->type) {144default: break;145146case BIGSQUEEZE_BOSS:147if (self->position.y > boss->position.y + 0xC00000) {148self->position.y = boss->position.y + 0xC00000;149self->velocity.y = -abs(self->velocity.y >> 1);150}151break;152153case BIGSQUEEZE_CRUSHER_L:154if (self->position.x < boss->position.x + 0x180000) {155self->position.x = boss->position.x + 0x180000;156self->velocity.x = 5 * boss->velocity.x;157if (self->onGround && BigSqueeze->isCrushing) {158self->rumbleMove = 128;159self->onGround = false;160}161}162break;163164case BIGSQUEEZE_CRUSHER_R:165if (self->position.x > boss->position.x - 0x180000) {166self->position.x = boss->position.x - 0x180000;167self->velocity.x = 5 * boss->velocity.x;168if (self->onGround && BigSqueeze->isCrushing) {169self->rumbleMove = 128;170self->onGround = false;171}172}173break;174}175}176}177178void FBZTrash_State_ReactMagnet(void)179{180RSDK_THIS(FBZTrash);181182self->startPos.y -= 0x8000;183self->position.x = self->startPos.x + RSDK.Rand(-0x20000, 0x20000);184self->position.y = self->startPos.y + RSDK.Rand(-0x20000, 0x20000);185186if (++self->timer == 16) {187self->timer = 0;188self->velocity.x = (self->targetPos.x - self->position.x) >> 5;189self->velocity.y = -0x80000;190self->state = FBZTrash_State_MoveToTarget;191}192}193194void FBZTrash_State_MoveToTarget(void)195{196RSDK_THIS(FBZTrash);197198self->velocity.y += 0x3800;199self->position.x += self->velocity.x;200self->position.y += self->velocity.y;201202++self->timer;203if (self->velocity.y >= 0) {204if (self->position.y > self->targetPos.y)205self->position.y = self->targetPos.y;206}207208if (self->velocity.x <= 0) {209if (self->position.x < self->targetPos.x) {210self->velocity.x = 0;211self->position.x = self->targetPos.x;212}213}214else if (self->position.x > self->targetPos.x) {215self->velocity.x = 0;216self->position.x = self->targetPos.x;217}218219if (self->timer == 60) {220self->timer = 0;221switch (self->type) {222default: break;223case FBZTRASH_ORB: self->state = FBZTrash_State_OrbinautOrb; break;224case FBZTRASH_ORBINAUT: self->state = FBZTrash_State_OrbinautMove; break;225}226}227}228229void FBZTrash_State_OrbinautOrb(void)230{231RSDK_THIS(FBZTrash);232EntityFBZTrash *trash = self->parent;233234int32 angle = 0;235if (trash->type == FBZTRASH_ORB) {236self->angle = (self->angle + 8) & 0x3FF;237angle = RSDK.Sin256(self->angle) >> 2;238}239else if (trash->type == FBZTRASH_ORBINAUT) {240self->angle = (self->angle + 16) & 0x3FF;241angle = self->angle;242}243244self->position.x = trash->position.x + (RSDK.Cos1024(angle) << self->radius);245self->position.y = trash->position.y + (RSDK.Sin1024(angle) << self->radius);246}247248void FBZTrash_State_OrbinautMove(void)249{250RSDK_THIS(FBZTrash);251252EntityPlayer *targetPlayer = Player_GetNearestPlayer();253self->angle = RSDK.ATan2(self->position.x - targetPlayer->position.x, self->position.y - targetPlayer->position.y);254self->velocity.x = RSDK.Cos256(self->angle) << 8;255self->velocity.y = RSDK.Sin256(self->angle) << 8;256self->direction = self->position.x >= targetPlayer->position.x;257self->position.x -= self->velocity.x;258self->position.y -= self->velocity.y;259260foreach_active(Player, player)261{262if (Player_CheckCollisionTouch(player, self, &self->hitbox) && Player_CheckBadnikBreak(player, self, true)) {263foreach_all(Animals, animals) { destroyEntity(animals); }264265#if MANIA_USE_PLUS266if (player->state != Player_State_MightyHammerDrop)267player->velocity.y = -0x40000;268#endif269}270}271}272273#if GAME_INCLUDE_EDITOR274void FBZTrash_EditorDraw(void)275{276RSDK_THIS(FBZTrash);277278self->updateRange.x = 0x800000;279self->updateRange.y = 0x800000;280switch (self->type) {281default: RSDK.SetSpriteAnimation(-1, 0, &self->animator, true, 0); break;282283case FBZTRASH_TRASH:284self->updateRange.x = 0x800000;285self->updateRange.y = 0x200000;286RSDK.SetSpriteAnimation(FBZTrash->aniFrames, 0, &self->animator, true, self->frameID);287break;288}289290FBZTrash_Draw();291}292293void FBZTrash_EditorLoad(void)294{295FBZTrash->aniFrames = RSDK.LoadSpriteAnimation("FBZ/Trash.bin", SCOPE_STAGE);296297RSDK_ACTIVE_VAR(FBZTrash, type);298RSDK_ENUM_VAR("Loose Trash", FBZTRASH_TRASH);299// RSDK_ENUM_VAR("(Unused)", FBZTRASH_UNUSED);300// RSDK_ENUM_VAR("Orbinaut Orb", FBZTRASH_ORB);301// RSDK_ENUM_VAR("Orbinaut", FBZTRASH_ORBINAUT);302}303#endif304305void FBZTrash_Serialize(void)306{307RSDK_EDITABLE_VAR(FBZTrash, VAR_ENUM, type);308RSDK_EDITABLE_VAR(FBZTrash, VAR_ENUM, frameID);309}310311312