Path: blob/master/SonicMania/Objects/TMZ/TMZCable.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: TMZCable Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectTMZCable *TMZCable;1011void TMZCable_Update(void)12{13RSDK_THIS(TMZCable);1415StateMachine_Run(self->state);16}1718void TMZCable_LateUpdate(void) {}1920void TMZCable_StaticUpdate(void) {}2122void TMZCable_Draw(void)23{24RSDK_THIS(TMZCable);2526for (int32 i = 0; i < TMZCABLE_JOINT_COUNT; ++i) {27if (!self->jointVisible[i])28RSDK.DrawSprite(&self->animator, &self->jointPos[i], false);29}30}3132void TMZCable_Create(void *data)33{34RSDK_THIS(TMZCable);3536if (!SceneInfo->inEditor) {37self->visible = true;38self->drawGroup = Zone->objectDrawGroup[0];39self->cableID &= 3;40self->active = ACTIVE_BOUNDS;41self->updateRange.x = 0x800000;42self->updateRange.y = 0x800000;4344switch (self->cableID) {45case 0:46self->offset.x = -0x1C0000;47self->offset.y = 0x100000;48self->angle = 0x00;49break;5051case 1:52self->offset.x = 0x1C0000;53self->offset.y = 0x100000;54self->angle = 0x40;55break;5657case 2:58self->offset.x = -0x1C0000;59self->offset.y = -0x100000;60self->angle = 0x80;61break;6263case 3:64self->offset.x = 0x1C0000;65self->offset.y = -0x100000;66self->angle = 0xC0;67break;6869default: break;70}7172self->parentPos = (Vector2 *)data;73RSDK.SetSpriteAnimation(PhantomEgg->aniFrames, 9, &self->animator, true, 0);74}75}7677void TMZCable_StageLoad(void)78{79TMZCable->hitbox.left = -10;80TMZCable->hitbox.top = -10;81TMZCable->hitbox.right = 10;82TMZCable->hitbox.bottom = 10;83}8485void TMZCable_HandleDrawPositions(void)86{87RSDK_THIS(TMZCable);8889if (self->parentPos) {90int32 x = self->parentPos->x + self->offset.x;91int32 y = self->parentPos->y + self->offset.y;92int32 entityAngle = self->angle;93int32 angle = RSDK.ATan2((self->position.x - x) >> 16, (self->position.y - y) >> 16) + 64;9495int32 id = 0;96for (int32 i = 0; i < (18 * TMZCABLE_JOINT_COUNT); i += 18) {97self->jointPos[id].x = x + 0x20 * id * ((self->position.x - x) >> 8);98self->jointPos[id].y = y + 0x20 * id * ((self->position.y - y) >> 8);99self->jointPos[id].x += ((RSDK.Sin256(entityAngle) * RSDK.Sin256(i)) >> 5) * RSDK.Cos256(angle);100self->jointPos[id].y += ((RSDK.Sin256(entityAngle) * RSDK.Sin256(i)) >> 5) * RSDK.Sin256(angle);101102entityAngle += 32;103id++;104}105}106}107108void TMZCable_State_Idle(void)109{110RSDK_THIS(TMZCable);111112TMZCable_HandleDrawPositions();113self->angle = (self->angle + 4) & 0xFF;114}115116void TMZCable_State_Charge(void)117{118RSDK_THIS(TMZCable);119120RSDK.ProcessAnimation(&self->animator);121122if (self->animator.frameID == self->animator.frameCount - 1) {123RSDK.SetSpriteAnimation(PhantomEgg->aniFrames, 11, &self->animator, true, RSDK.Rand(0, 8));124self->state = TMZCable_State_Live;125}126}127128void TMZCable_State_Live(void)129{130RSDK_THIS(TMZCable);131132RSDK.ProcessAnimation(&self->animator);133134int32 storeX = self->position.x;135int32 storeY = self->position.y;136137for (int32 i = 1; i < TMZCABLE_JOINT_COUNT; ++i) {138self->position.x = self->jointPos[i].x;139self->position.y = self->jointPos[i].y;140141foreach_active(Player, player)142{143if (Player_CheckCollisionTouch(player, self, &TMZCable->hitbox)) {144Player_Hurt(player, self);145}146}147}148149self->position.x = storeX;150self->position.y = storeY;151152if (++self->timer == 120) {153self->timer = 0;154RSDK.SetSpriteAnimation(PhantomEgg->aniFrames, 12, &self->animator, true, 0);155self->state = TMZCable_State_Fade;156}157}158159void TMZCable_State_Fade(void)160{161RSDK_THIS(TMZCable);162163RSDK.ProcessAnimation(&self->animator);164if (self->animator.frameID == self->animator.frameCount - 1) {165RSDK.SetSpriteAnimation(PhantomEgg->aniFrames, 9, &self->animator, true, 0);166self->state = TMZCable_State_Idle;167}168}169170void TMZCable_State_Destroyed(void)171{172RSDK_THIS(TMZCable);173TMZCable_HandleDrawPositions();174175int32 id = self->timer >> 5;176if (!(Zone->timer % 3)) {177RSDK.PlaySfx(PhantomEgg->sfxExplosion2, false, 255);178if (Zone->timer & 4) {179int32 y = self->jointPos[id].y + RSDK.Rand(-0x100000, 0x100000);180int32 x = self->jointPos[id].x + RSDK.Rand(-0x100000, 0x100000);181CREATE_ENTITY(Explosion, INT_TO_VOID((RSDK.Rand(0, 256) > 192) + EXPLOSION_BOSS), x, y)->drawGroup = Zone->objectDrawGroup[1];182}183}184185self->timer += 3;186if (self->timer < 256) {187int32 timer = self->timer & 0x1F;188if (timer >= 29) {189self->jointVisible[id] = true;190191EntityDebris *debris = CREATE_ENTITY(Debris, NULL, self->jointPos[id].x, self->jointPos[id].y);192debris->state = Debris_State_Fall;193debris->gravityStrength = 0x4000;194debris->velocity.x = RSDK.Rand(-0x20000, 0x20000);195debris->velocity.y = RSDK.Rand(-0x40000, -0x10000);196debris->drawGroup = Zone->objectDrawGroup[0];197RSDK.SetSpriteAnimation(PhantomEgg->aniFrames, 9, &debris->animator, true, 0);198}199}200else {201destroyEntity(self);202}203}204205#if GAME_INCLUDE_EDITOR206void TMZCable_EditorDraw(void)207{208RSDK_THIS(TMZCable);209210if (PhantomEgg) {211uint8 angles[] = { 0x00, 0x40, 0x80, 0xC0 };212self->angle = angles[self->cableID & 3];213RSDK.SetSpriteAnimation(PhantomEgg->aniFrames, 9, &self->animator, true, 0);214215for (int32 i = 0; i < TMZCABLE_JOINT_COUNT; ++i) {216self->jointPos[i].x = self->position.x;217self->jointPos[i].y = self->position.y;218}219220TMZCable_Draw();221}222}223224void TMZCable_EditorLoad(void)225{226227RSDK_ACTIVE_VAR(TMZCable, cableID);228RSDK_ENUM_VAR("Cable 1", 0);229RSDK_ENUM_VAR("Cable 2", 1);230RSDK_ENUM_VAR("Cable 3", 2);231RSDK_ENUM_VAR("Cable 4", 3);232}233#endif234235void TMZCable_Serialize(void) { RSDK_EDITABLE_VAR(TMZCable, VAR_ENUM, cableID); }236237238