Path: blob/master/SonicMania/Objects/MSZ/Armadiloid.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Armadiloid Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectArmadiloid *Armadiloid;1011void Armadiloid_Update(void)12{13RSDK_THIS(Armadiloid);1415StateMachine_Run(self->state);16}1718void Armadiloid_LateUpdate(void) {}1920void Armadiloid_StaticUpdate(void) {}2122void Armadiloid_Draw(void)23{24RSDK_THIS(Armadiloid);2526RSDK.DrawSprite(&self->boosterAnimator, NULL, false);27RSDK.DrawSprite(&self->headAnimator, NULL, false);28RSDK.DrawSprite(&self->bodyAnimator, NULL, false);29}3031void Armadiloid_Create(void *data)32{33RSDK_THIS(Armadiloid);3435self->visible = true;36self->drawGroup = Zone->objectDrawGroup[0];37self->startPos = self->position;38self->drawFX = FX_FLIP;39self->active = ACTIVE_BOUNDS;40self->updateRange.x = 0x800000;41self->updateRange.y = 0x800000;4243if (data)44self->type = ARMADILOID_RIDER;4546if (self->type != ARMADILOID_SHOOTER) {47self->hitbox.left = -10;48self->hitbox.top = -40;49self->hitbox.right = 10;50self->hitbox.bottom = -20;5152RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 4, &self->bodyAnimator, true, 0);53}54else {55self->hitbox.left = -24;56self->hitbox.top = -15;57self->hitbox.right = 24;58self->hitbox.bottom = -7;5960self->velocity.x = 0x8000;61RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 0, &self->bodyAnimator, true, 0);62RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 1, &self->headAnimator, true, 0);63RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 3, &self->boosterAnimator, true, 0);64}65self->state = Armadiloid_State_Init;66}6768void Armadiloid_StageLoad(void)69{70if (RSDK.CheckSceneFolder("MSZ"))71Armadiloid->aniFrames = RSDK.LoadSpriteAnimation("MSZ/Armadiloid.bin", SCOPE_STAGE);7273DEBUGMODE_ADD_OBJ(Armadiloid);7475Armadiloid->sfxShot = RSDK.GetSfx("Stage/Shot.wav");76}77void Armadiloid_DebugSpawn(void)78{79RSDK_THIS(DebugMode);80CREATE_ENTITY(Armadiloid, NULL, self->position.x, self->position.y);81}8283void Armadiloid_DebugDraw(void)84{85RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 0, &DebugMode->animator, true, 0);86RSDK.DrawSprite(&DebugMode->animator, NULL, false);87}8889void Armadiloid_State_Init(void)90{91RSDK_THIS(Armadiloid);9293foreach_active(Armadiloid, armadiloid)94{95if (armadiloid != self) {96if (abs(self->position.x - armadiloid->position.x) < 0x300000) {97if (abs(self->position.y - armadiloid->position.y) < 0x300000) {98if (self->type) {99if (armadiloid->type != self->type) {100self->child = armadiloid;101self->state = Armadiloid_State_Rider;102foreach_break;103}104}105else if (armadiloid->type) {106self->parent = armadiloid;107self->state = Armadiloid_State_PlatformFlying;108foreach_break;109}110}111}112}113}114}115116void Armadiloid_State_PlatformFlying(void)117{118RSDK_THIS(Armadiloid);119120RSDK.ProcessAnimation(&self->boosterAnimator);121122self->position.x += self->velocity.x;123124if (self->parent) {125EntityPlayer *player = Player_GetNearestPlayerX();126127if (abs(self->position.x - player->position.x) < 0x800000) {128RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 2, &self->headAnimator, true, 0);129self->state = Armadiloid_PlatformShootDelay;130}131}132133foreach_active(Player, player)134{135if (Player_CheckCollisionPlatform(player, self, &self->hitbox))136player->position.x += self->velocity.x;137}138}139140void Armadiloid_PlatformShootDelay(void)141{142RSDK_THIS(Armadiloid);143144RSDK.ProcessAnimation(&self->boosterAnimator);145146self->position.x += self->velocity.x;147148if (self->parent) {149if (++self->timer == 12) {150self->timer = 0;151self->state = Armadiloid_State_PlatformShoot;152}153154foreach_active(Player, player)155{156if (Player_CheckCollisionPlatform(player, self, &self->hitbox))157player->position.x += self->velocity.x;158}159}160else {161self->timer = 0;162self->state = Armadiloid_State_PlatformFlying;163}164}165166void Armadiloid_State_PlatformShoot(void)167{168RSDK_THIS(Armadiloid);169170RSDK.ProcessAnimation(&self->boosterAnimator);171RSDK.ProcessAnimation(&self->headAnimator);172173self->position.x += self->velocity.x;174175if (self->headAnimator.frameID != 4 || self->timer) {176if (self->headAnimator.frameID == self->headAnimator.frameCount - 1) {177self->timer = 0;178RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 2, &self->headAnimator, true, 0);179self->state = Armadiloid_State_PlatformFlying;180}181}182else {183self->timer = 1;184RSDK.PlaySfx(Armadiloid->sfxShot, false, 255);185186EntityProjectile *projectile = CREATE_ENTITY(Projectile, Projectile_State_Move, self->position.x - 0x120000, self->position.y + 0x90000);187projectile->velocity.x = -0x18000;188projectile->drawGroup = Zone->objectDrawGroup[0];189projectile->hitbox.left = -4;190projectile->hitbox.top = -4;191projectile->hitbox.right = 4;192projectile->hitbox.bottom = 4;193projectile->type = PROJECTILE_BASIC2;194RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 5, &projectile->animator, true, 0);195}196197foreach_active(Player, player)198{199if (Player_CheckCollisionPlatform(player, self, &self->hitbox))200player->position.x += self->velocity.x;201}202}203204void Armadiloid_State_Rider(void)205{206RSDK_THIS(Armadiloid);207208RSDK.ProcessAnimation(&self->bodyAnimator);209210EntityArmadiloid *child = self->child;211if (child) {212self->position.x = child->position.x;213self->position.y = child->position.y;214}215216foreach_active(Player, player)217{218if (Player_CheckBadnikTouch(player, self, &self->hitbox) && Player_CheckBadnikBreak(player, self, true)) {219child->parent = NULL;220}221}222}223224#if GAME_INCLUDE_EDITOR225void Armadiloid_EditorDraw(void)226{227RSDK_THIS(Armadiloid);228229if (self->type != ARMADILOID_SHOOTER) {230RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 4, &self->bodyAnimator, true, 0);231RSDK.SetSpriteAnimation(-1, 1, &self->headAnimator, true, 0);232RSDK.SetSpriteAnimation(-1, 3, &self->boosterAnimator, true, 0);233}234else {235RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 0, &self->bodyAnimator, true, 0);236RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 1, &self->headAnimator, true, 0);237RSDK.SetSpriteAnimation(Armadiloid->aniFrames, 3, &self->boosterAnimator, true, 0);238}239240RSDK.DrawSprite(&self->boosterAnimator, NULL, false);241RSDK.DrawSprite(&self->headAnimator, NULL, false);242RSDK.DrawSprite(&self->bodyAnimator, NULL, false);243}244245void Armadiloid_EditorLoad(void)246{247Armadiloid->aniFrames = RSDK.LoadSpriteAnimation("MSZ/Armadiloid.bin", SCOPE_STAGE);248249RSDK_ACTIVE_VAR(Armadiloid, type);250RSDK_ENUM_VAR("Shooter", ARMADILOID_SHOOTER);251RSDK_ENUM_VAR("Rider", ARMADILOID_RIDER);252}253#endif254255void Armadiloid_Serialize(void) { RSDK_EDITABLE_VAR(Armadiloid, VAR_ENUM, type); }256257258