Path: blob/master/SonicMania/Objects/CPZ/CaterkillerJr.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: CaterkillerJr Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectCaterkillerJr *CaterkillerJr;1011void CaterkillerJr_Update(void)12{13RSDK_THIS(CaterkillerJr);1415self->active = ACTIVE_NORMAL;16StateMachine_Run(self->state);1718if (self->classID == CaterkillerJr->classID && !RSDK.CheckOnScreen(self, NULL) && !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {19self->position = self->startPos;20CaterkillerJr_SetupPositions();21}22}2324void CaterkillerJr_LateUpdate(void) {}2526void CaterkillerJr_StaticUpdate(void) {}2728void CaterkillerJr_Draw(void)29{30RSDK_THIS(CaterkillerJr);31int32 storeDir = self->direction;3233for (int32 i = CATERKILLERJR_SEGMENT_COUNT - 1; i >= 0; --i) {34self->direction = self->bodyDirection[i];35RSDK.DrawSprite(&self->bodyAnimators[i], &self->bodyPosition[i], false);36}3738self->direction = self->bodyDirection[3];39RSDK.DrawSprite(&self->smokePuffAnimators[2], &self->bodyPosition[3], false);4041self->direction = self->bodyDirection[2];42RSDK.DrawSprite(&self->smokePuffAnimators[1], &self->bodyPosition[2], false);4344self->direction = self->bodyDirection[1];45RSDK.DrawSprite(&self->smokePuffAnimators[0], &self->bodyPosition[1], false);4647self->direction = storeDir;48}4950void CaterkillerJr_Create(void *data)51{52RSDK_THIS(CaterkillerJr);5354if (!SceneInfo->inEditor) {55self->visible = true;56self->drawGroup = Zone->objectDrawGroup[1];57self->startPos = self->position;58self->drawFX = FX_FLIP;59self->updateRange.x = 0x800000;60self->updateRange.y = 0x800000;61self->bodyVelocity[0].x = (2 * (self->direction != FLIP_NONE) - 1) << 16;6263RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 0, &self->bodyAnimators[0], true, 6);64RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 1, &self->bodyAnimators[1], true, 6);65RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 1, &self->bodyAnimators[2], true, 6);66RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 1, &self->bodyAnimators[3], true, 6);67RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 2, &self->bodyAnimators[4], true, 0);68RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 3, &self->bodyAnimators[5], true, 0);69RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 3, &self->bodyAnimators[6], true, 0);70RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 4, &self->smokePuffAnimators[0], true, 0);71RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 4, &self->smokePuffAnimators[1], true, 0);72RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 4, &self->smokePuffAnimators[2], true, 0);7374CaterkillerJr_SetupPositions();75}76}7778void CaterkillerJr_StageLoad(void)79{80if (RSDK.CheckSceneFolder("CPZ"))81CaterkillerJr->aniFrames = RSDK.LoadSpriteAnimation("CPZ/CaterkillerJr.bin", SCOPE_STAGE);82#if MANIA_USE_PLUS83else if (RSDK.CheckSceneFolder("AIZ"))84CaterkillerJr->aniFrames = RSDK.LoadSpriteAnimation("AIZ/CaterkillerJr.bin", SCOPE_STAGE);85#endif8687CaterkillerJr->hitbox.left = -16;88CaterkillerJr->hitbox.top = 8;89CaterkillerJr->hitbox.right = 0;90CaterkillerJr->hitbox.bottom = 8;9192DEBUGMODE_ADD_OBJ(CaterkillerJr);93}9495void CaterkillerJr_DebugDraw(void)96{97RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 0, &DebugMode->animator, true, 0);98RSDK.DrawSprite(&DebugMode->animator, NULL, false);99}100101void CaterkillerJr_DebugSpawn(void)102{103RSDK_THIS(CaterkillerJr);104105CREATE_ENTITY(CaterkillerJr, NULL, self->position.x, self->position.y);106}107108void CaterkillerJr_SetupPositions(void)109{110RSDK_THIS(CaterkillerJr);111112for (int32 i = 0; i < CATERKILLERJR_SEGMENT_COUNT; ++i) {113self->bodyPosition[i].x = self->position.x;114self->bodyPosition[i].y = self->position.y;115self->bodyVelocity[i].x = 0;116self->bodyVelocity[i].y = 0;117self->bodyDirection[i] = self->direction;118self->bodyTimer[i] = 0;119}120121if (self->direction) {122self->boundsL = self->position.x - 0x3C0000;123self->boundsR = self->position.x + 0xBC0000;124}125else {126self->boundsL = self->position.x - 0xBC0000;127self->boundsR = self->position.x + 0x3C0000;128}129130self->timer = 0;131132self->smokePuffAnimators[0].timer = 14;133self->smokePuffAnimators[1].timer = 10;134self->smokePuffAnimators[2].timer = 6;135self->smokePuffAnimators[0].frameID = 8;136self->smokePuffAnimators[1].frameID = 8;137self->smokePuffAnimators[2].frameID = 8;138139self->bodyVelocity[0].x = (2 * (self->direction != FLIP_NONE) - 1) << 16;140self->active = ACTIVE_BOUNDS;141142self->state = CaterkillerJr_State_SetupVelocities;143}144145void CaterkillerJr_State_SetupVelocities(void)146{147RSDK_THIS(CaterkillerJr);148149int32 velocity = (2 * (self->direction != FLIP_NONE) - 1) << 16;150151switch (++self->timer) {152case 12: self->bodyVelocity[1].x = velocity; break;153case 24: self->bodyVelocity[2].x = velocity; break;154case 36: self->bodyVelocity[3].x = velocity; break;155case 48: self->bodyVelocity[4].x = velocity; break;156case 56: self->bodyVelocity[5].x = velocity; break;157case 64:158self->timer = 0;159self->bodyVelocity[6].x = velocity;160self->state = CaterkillerJr_State_Move;161break;162}163164CaterkillerJr_State_Move();165}166167void CaterkillerJr_State_Move(void)168{169RSDK_THIS(CaterkillerJr);170171for (int32 i = 0; i < CATERKILLERJR_SEGMENT_COUNT; ++i) {172RSDK.ProcessAnimation(&self->bodyAnimators[i]);173174self->bodyPosition[i].x += self->bodyVelocity[i].x;175if (self->bodyDirection[i] && self->bodyPosition[i].x >= self->boundsR - 0x80000) {176self->bodyDirection[i] ^= FLIP_X;177self->bodyAnimators[i].timer = 0;178self->bodyAnimators[i].frameID = 0;179}180else if (!self->bodyDirection[i] && self->bodyPosition[i].x <= self->boundsL + 0x80000) {181self->bodyDirection[i] ^= FLIP_X;182self->bodyAnimators[i].timer = 0;183self->bodyAnimators[i].frameID = 0;184}185186if (self->bodyVelocity[i].x <= 0 && self->bodyPosition[i].x <= self->boundsL) {187self->bodyVelocity[i].x = -self->bodyVelocity[i].x;188self->bodyTimer[i] = 0xA00;189}190else if (self->bodyVelocity[i].x >= 0 && self->bodyPosition[i].x >= self->boundsR) {191self->bodyVelocity[i].x = -self->bodyVelocity[i].x;192self->bodyTimer[i] = 0xA00;193}194195if (self->bodyVelocity[i].x) {196int32 sine = 0;197if (self->bodyTimer[i] >= 0x800) {198self->bodyTimer[i] += 8;199sine = RSDK.Sin1024(self->bodyTimer[i]) << 10;200}201else {202self->bodyTimer[i] += 17;203sine = RSDK.Sin1024(self->bodyTimer[i]) << 8;204}205self->bodyPosition[i].y = sine + self->startPos.y;206self->bodyTimer[i] %= 0xC00;207}208}209210RSDK.ProcessAnimation(&self->smokePuffAnimators[0]);211RSDK.ProcessAnimation(&self->smokePuffAnimators[1]);212RSDK.ProcessAnimation(&self->smokePuffAnimators[2]);213214foreach_active(Player, player)215{216self->position = self->bodyPosition[0];217if (Player_CheckBadnikTouch(player, self, &CaterkillerJr->hitbox) && Player_CheckBadnikBreak(player, self, false)) {218for (int32 i = 1; i < CATERKILLERJR_SEGMENT_COUNT; ++i) {219EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->bodyPosition[i].x, self->bodyPosition[i].y);220debris->animator = self->bodyAnimators[i];221debris->velocity.x = RSDK.Rand(-16, 16) << 14;222debris->velocity.y = RSDK.Rand(-8, 8) << 14;223debris->gravityStrength = 0x3800;224debris->drawGroup = Zone->objectDrawGroup[0];225debris->updateRange.x = 0x400000;226debris->updateRange.y = 0x400000;227}228229destroyEntity(self);230self->active = ACTIVE_DISABLED;231foreach_break;232}233234if (self->classID != TYPE_BLANK) {235for (int32 i = 1; i < CATERKILLERJR_SEGMENT_COUNT; ++i) {236self->position.x = self->bodyPosition[i].x;237self->position.y = self->bodyPosition[i].y;238if (Player_CheckCollisionTouch(player, self, &CaterkillerJr->hitbox)) {239Player_Hurt(player, self);240}241}242self->position.x = self->bodyPosition[0].x;243self->position.y = self->bodyPosition[0].y;244}245}246}247248#if GAME_INCLUDE_EDITOR249void CaterkillerJr_EditorDraw(void)250{251RSDK_THIS(CaterkillerJr);252253self->visible = true;254self->drawFX = FX_FLIP;255self->startPos = self->position;256257RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 0, &self->bodyAnimators[0], true, 6);258RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 1, &self->bodyAnimators[1], true, 6);259RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 1, &self->bodyAnimators[2], true, 6);260RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 1, &self->bodyAnimators[3], true, 6);261RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 2, &self->bodyAnimators[4], true, 0);262RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 3, &self->bodyAnimators[5], true, 0);263RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 3, &self->bodyAnimators[6], true, 0);264RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 4, &self->smokePuffAnimators[0], true, 0);265RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 4, &self->smokePuffAnimators[1], true, 0);266RSDK.SetSpriteAnimation(CaterkillerJr->aniFrames, 4, &self->smokePuffAnimators[2], true, 0);267CaterkillerJr_SetupPositions();268269CaterkillerJr_Draw();270}271272void CaterkillerJr_EditorLoad(void)273{274if (RSDK.CheckSceneFolder("CPZ"))275CaterkillerJr->aniFrames = RSDK.LoadSpriteAnimation("CPZ/CaterkillerJr.bin", SCOPE_STAGE);276#if MANIA_USE_PLUS277else if (RSDK.CheckSceneFolder("AIZ"))278CaterkillerJr->aniFrames = RSDK.LoadSpriteAnimation("AIZ/CaterkillerJr.bin", SCOPE_STAGE);279#endif280281RSDK_ACTIVE_VAR(CaterkillerJr, direction);282RSDK_ENUM_VAR("Left", FLIP_NONE);283RSDK_ENUM_VAR("Right", FLIP_X);284}285#endif286287void CaterkillerJr_Serialize(void) { RSDK_EDITABLE_VAR(CaterkillerJr, VAR_UINT8, direction); }288289290