Path: blob/master/SonicMania/Objects/CPZ/ChemBubble.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: ChemBubble Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectChemBubble *ChemBubble;1011void ChemBubble_Update(void)12{13RSDK_THIS(ChemBubble);1415StateMachine_Run(self->state);16}1718void ChemBubble_LateUpdate(void) {}1920void ChemBubble_StaticUpdate(void) {}2122void ChemBubble_Draw(void)23{24RSDK_THIS(ChemBubble);2526RSDK.DrawSprite(&self->animator, NULL, false);27}2829void ChemBubble_Create(void *data)30{31RSDK_THIS(ChemBubble);3233if (!SceneInfo->inEditor) {34self->visible = true;35self->active = ACTIVE_NORMAL;36self->drawGroup = Zone->objectDrawGroup[1] - 2;37self->startPos = self->position;3839self->velocity.y = ZONE_RAND(-0x20000, 0);40self->angleShift = ZONE_RAND(12, 16);41self->amplitude = ZONE_RAND(9, 10);4243RSDK.SetSpriteAnimation(ChemBubble->aniFrames, RSDK.Rand(1, 3), &self->animator, true, 0);44self->drawFX = FX_SCALE;45self->state = ChemBubble_State_Appear;46}47}4849void ChemBubble_StageLoad(void) { ChemBubble->aniFrames = RSDK.LoadSpriteAnimation("CPZ/ChemPool.bin", SCOPE_STAGE); }5051void ChemBubble_State_Appear(void)52{53RSDK_THIS(ChemBubble);5455self->scale.x += 0x20;56self->scale.y = self->scale.x;5758if (self->scale.x == 0x200) {59self->drawFX = FX_NONE;60self->state = ChemBubble_State_Rising;61}62}6364void ChemBubble_State_Rising(void)65{66RSDK_THIS(ChemBubble);67EntityChemicalPool *parent = self->parent;6869self->velocity.y -= 0x2000;70self->position.y += self->velocity.y;7172int32 x = (RSDK.Sin256(self->position.y >> self->angleShift) << self->amplitude) + self->startPos.x;73self->position.x = x;7475int32 deform = ChemicalPool->surfaceDeformation[x >> 20];76int32 y = parent->offsetY + (((x >> 12) & 0xFF) * (ChemicalPool->surfaceDeformation[(x + 0x100000) >> 20] - deform) >> 8) + deform + 0x20000;7778if (self->position.y <= y) {79self->position.y = y;80if (self->animator.animationID == 2) {81RSDK.SetSpriteAnimation(ChemBubble->aniFrames, 3, &self->animator, true, 0);82self->timer = RSDK.Rand(8, 32);83}84else {85RSDK.SetSpriteAnimation(ChemBubble->aniFrames, 4, &self->animator, true, 5);86}8788self->state = ChemBubble_State_Surfaced;89}90}9192void ChemBubble_State_Surfaced(void)93{94RSDK_THIS(ChemBubble);95EntityChemicalPool *parent = self->parent;9697RSDK.ProcessAnimation(&self->animator);9899int32 x = self->position.x;100101int32 deform = ChemicalPool->surfaceDeformation[x >> 20];102self->position.y =103parent->offsetY + (((x >> 12) & 0xFF) * (ChemicalPool->surfaceDeformation[(x + 0x100000) >> 20] - deform) >> 8) + deform + 0x20000;104105if (self->animator.animationID == 4) {106if (self->animator.frameID == self->animator.frameCount - 1)107destroyEntity(self);108}109else if (--self->timer <= 0) {110RSDK.SetSpriteAnimation(ChemBubble->aniFrames, 4, &self->animator, true, 5);111}112}113114#if GAME_INCLUDE_EDITOR115void ChemBubble_EditorDraw(void)116{117RSDK_THIS(ChemBubble);118119RSDK.SetSpriteAnimation(ChemBubble->aniFrames, 1, &self->animator, true, 0);120121ChemBubble_Draw();122}123124void ChemBubble_EditorLoad(void) { ChemBubble->aniFrames = RSDK.LoadSpriteAnimation("CPZ/ChemPool.bin", SCOPE_STAGE); }125#endif126127void ChemBubble_Serialize(void) {}128129130