Path: blob/master/SonicMania/Objects/AIZ/AIZRockPile.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: AIZRockPile Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectAIZRockPile *AIZRockPile;1112void AIZRockPile_Update(void)13{14RSDK_THIS(AIZRockPile);1516Hitbox *hitbox = RSDK.GetHitbox(&self->animator, 1);1718foreach_active(Player, player)19{20if (self->onlyMighty && player->characterID != ID_MIGHTY) {21if (!self->onlyKnux || player->characterID != ID_KNUCKLES) {22Player_CheckCollisionBox(player, self, hitbox);23continue;24}25}26else if ((self->onlyKnux && player->characterID != ID_KNUCKLES) && (!self->onlyMighty || player->characterID != ID_MIGHTY)) {27Player_CheckCollisionBox(player, self, hitbox);28continue;29}3031int32 cMode = player->collisionMode;32int32 playerX = player->position.x;33int32 playerY = player->position.y;34int32 xVelocity = player->velocity.x;35int32 yVelocity = player->velocity.y;36int32 jumping = player->animator.animationID == ANI_JUMP;37int32 groundVel = player->groundVel;3839int32 side = Player_CheckCollisionBox(player, self, hitbox);40if (side == C_LEFT || side == C_RIGHT) {41bool32 canBreak = jumping && player->onGround && abs(groundVel) >= 0x48000;42if (player->shield == SHIELD_FIRE) {43EntityShield *shield = RSDK_GET_ENTITY(Player->playerCount + RSDK.GetEntitySlot(player), Shield);44canBreak |= shield->shieldAnimator.animationID == SHIELDANI_FIREATTACK;45}4647canBreak |= player->characterID == ID_SONIC && player->superState == SUPERSTATE_SUPER;48if (!player->sidekick && (canBreak || (player->characterID == ID_KNUCKLES))) {49player->position.x = playerX;50player->position.y = playerY;51player->velocity.x = xVelocity;52player->velocity.y = yVelocity;53player->groundVel = groundVel;54if (xVelocity <= 0)55AIZRockPile_SpawnRocks(self->rockSpeedsL);56else57AIZRockPile_SpawnRocks(self->rockSpeedsR);5859foreach_return;60}61}6263if (side == C_TOP && (!self->onlyMighty || (player->characterID == ID_MIGHTY && player->animator.animationID == ANI_HAMMERDROP))) {64bool32 canBreak = jumping;65canBreak |= player->characterID == ID_SONIC && player->animator.animationID == ANI_DROPDASH;66canBreak |= player->characterID == ID_MIGHTY && player->state == Player_State_MightyHammerDrop;67if (player->groundedStore && cMode != CMODE_LWALL && cMode != CMODE_RWALL)68canBreak = false;6970if (canBreak && !player->sidekick) {71player->onGround = false;72if (player->characterID == ID_MIGHTY && player->state == Player_State_MightyHammerDrop)73player->velocity.y = yVelocity - 0x10000;74else75player->velocity.y = -0x30000;76AIZRockPile_SpawnRocks(self->rockSpeedsT);77foreach_return;78}79}80}81}8283void AIZRockPile_LateUpdate(void) {}8485void AIZRockPile_StaticUpdate(void) {}8687void AIZRockPile_Draw(void)88{89RSDK_THIS(AIZRockPile);90RSDK.DrawSprite(&self->animator, NULL, false);91}9293void AIZRockPile_Create(void *data)94{95RSDK_THIS(AIZRockPile);9697RSDK.SetSpriteAnimation(AIZRockPile->aniFrames, 0, &self->animator, true, self->size + 3);9899if (!SceneInfo->inEditor) {100switch (self->size) {101case AIZROCKPILE_SMALL:102self->size = 4;103self->rockPositions = AIZRockPile->rockPositions_small;104self->rockSpeedsT = AIZRockPile->rockSpeedsT_small;105self->rockSpeedsL = AIZRockPile->rockSpeedsL_small;106self->rockSpeedsR = AIZRockPile->rockSpeedsR_small;107break;108109case AIZROCKPILE_MED:110self->size = 5;111self->rockPositions = AIZRockPile->rockPositions_med;112self->rockSpeedsT = AIZRockPile->rockSpeedsT_med;113self->rockSpeedsL = AIZRockPile->rockSpeedsL_med;114self->rockSpeedsR = AIZRockPile->rockSpeedsR_med;115break;116117case AIZROCKPILE_BIG:118self->size = 8;119self->rockPositions = AIZRockPile->rockPositions_large;120self->rockSpeedsT = AIZRockPile->rockSpeedsT_large;121self->rockSpeedsL = AIZRockPile->rockSpeedsL_large;122self->rockSpeedsR = AIZRockPile->rockSpeedsR_large;123break;124}125126self->active = ACTIVE_BOUNDS;127self->visible = true;128self->drawGroup = Zone->objectDrawGroup[0];129self->updateRange.x = 0x800000;130self->updateRange.y = 0x800000;131}132}133134void AIZRockPile_StageLoad(void)135{136AIZRockPile->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Platform.bin", SCOPE_STAGE);137138AIZRockPile->sfxBreak = RSDK.GetSfx("Stage/LedgeBreak3.wav");139}140141void AIZRockPile_SpawnRocks(int32 *speeds)142{143RSDK_THIS(AIZRockPile);144145for (int32 i = 0; i < self->size; ++i) {146EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_Fall, self->position.x + self->rockPositions[2 * i],147self->position.y + self->rockPositions[(2 * i) + 1]);148RSDK.SetSpriteAnimation(AIZRockPile->aniFrames, 1, &debris->animator, true, 0);149debris->velocity.x = speeds[2 * i];150debris->velocity.y = speeds[(2 * i) + 1];151debris->drawGroup = Zone->objectDrawGroup[1];152debris->updateRange.x = 0x800000;153debris->updateRange.y = 0x800000;154debris->gravityStrength = 0x1800;155}156157RSDK.PlaySfx(AIZRockPile->sfxBreak, false, 255);158destroyEntity(self);159}160161#if GAME_INCLUDE_EDITOR162void AIZRockPile_EditorDraw(void)163{164RSDK_THIS(AIZRockPile);165RSDK.SetSpriteAnimation(AIZRockPile->aniFrames, 0, &self->animator, true, self->size + 3);166167AIZRockPile_Draw();168}169170void AIZRockPile_EditorLoad(void)171{172AIZRockPile->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Platform.bin", SCOPE_STAGE);173174RSDK_ACTIVE_VAR(AIZRockPile, size);175RSDK_ENUM_VAR("Small", AIZROCKPILE_SMALL);176RSDK_ENUM_VAR("Medium", AIZROCKPILE_MED);177RSDK_ENUM_VAR("Large", AIZROCKPILE_BIG);178}179#endif180181void AIZRockPile_Serialize(void)182{183RSDK_EDITABLE_VAR(AIZRockPile, VAR_ENUM, size);184RSDK_EDITABLE_VAR(AIZRockPile, VAR_BOOL, smashTop);185RSDK_EDITABLE_VAR(AIZRockPile, VAR_BOOL, smashSides);186RSDK_EDITABLE_VAR(AIZRockPile, VAR_BOOL, onlyKnux);187RSDK_EDITABLE_VAR(AIZRockPile, VAR_BOOL, onlyMighty);188}189#endif190191192