Path: blob/master/SonicMania/Objects/MSZ/Pinata.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Pinata Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectPinata *Pinata;1011void Pinata_Update(void)12{13RSDK_THIS(Pinata);1415StateMachine_Run(self->state);16}1718void Pinata_LateUpdate(void) {}1920void Pinata_StaticUpdate(void) {}2122void Pinata_Draw(void)23{24RSDK_THIS(Pinata);2526RSDK.DrawSprite(&self->animator, NULL, false);27}2829void Pinata_Create(void *data)30{31RSDK_THIS(Pinata);3233self->drawGroup = self->priority != PINATA_PRIO_HIGH ? Zone->objectDrawGroup[0] : Zone->objectDrawGroup[1];34self->visible = true;35self->active = ACTIVE_BOUNDS;36self->updateRange.x = 0x400000;37self->updateRange.y = 0x400000;38self->state = Pinata_State_CheckPlayerCollisions;3940RSDK.SetSpriteAnimation(Pinata->aniFrames, 3, &self->animator, true, 0);41}4243void Pinata_StageLoad(void)44{45Pinata->aniFrames = RSDK.LoadSpriteAnimation("MSZ/Pinata.bin", SCOPE_STAGE);4647Pinata->hitboxPinata.left = -12;48Pinata->hitboxPinata.top = -16;49Pinata->hitboxPinata.right = 12;50Pinata->hitboxPinata.bottom = 16;5152Pinata->sfxPinata = RSDK.GetSfx("MSZ/Pinata.wav");5354DEBUGMODE_ADD_OBJ(Pinata);55}5657void Pinata_DebugDraw(void)58{59RSDK.SetSpriteAnimation(Pinata->aniFrames, 0, &DebugMode->animator, true, 0);60RSDK.DrawSprite(&DebugMode->animator, NULL, false);61}6263void Pinata_DebugSpawn(void)64{65RSDK_THIS(DebugMode);6667CREATE_ENTITY(Pinata, NULL, self->position.x, self->position.y);68}6970void Pinata_State_CheckPlayerCollisions(void)71{72RSDK_THIS(Pinata);7374RSDK.ProcessAnimation(&self->animator);7576foreach_active(Player, player)77{78if (player->animator.animationID != ANI_HURT && Player_CheckBadnikTouch(player, self, &Pinata->hitboxPinata)) {79RSDK.PlaySfx(Pinata->sfxPinata, false, 0xFF);8081#if MANIA_USE_PLUS82if (player->state != Player_State_MightyHammerDrop) {83#endif84if (player->state == Player_State_FlyCarried)85RSDK_GET_ENTITY(SLOT_PLAYER2, Player)->flyCarryTimer = 30;8687int32 anim = player->animator.animationID;88if (anim != ANI_FLY && anim != ANI_FLY_LIFT_TIRED) {89if (player->state != Player_State_TailsFlight) {90if (player->state != Player_State_DropDash)91player->state = Player_State_Air;9293if (anim != ANI_JUMP && anim != ANI_JOG && anim != ANI_RUN && anim != ANI_DASH)94player->animator.animationID = ANI_WALK;95}96}9798if (player->animator.animationID != ANI_FLY)99player->applyJumpCap = false;100101if (player->velocity.y > -0x80000)102player->velocity.y = -0x80000;103104player->onGround = false;105player->tileCollisions = TILECOLLISION_DOWN;106#if MANIA_USE_PLUS107}108#endif109CREATE_ENTITY(ScoreBonus, NULL, self->position.x, self->position.y)->animator.frameID = 16;110Player_GiveScore(player, 10);111CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_BOSSPUFF), self->position.x, self->position.y - 0x100000)->drawGroup =112Zone->objectDrawGroup[1];113114for (int32 i = 0; i < 6; ++i) {115int32 x = self->position.x + RSDK.Rand(-0x80000, 0x80000);116int32 y = self->position.y + RSDK.Rand(-0x80000, 0x80000);117EntityDebris *debris = CREATE_ENTITY(Debris, NULL, x, y);118119debris->state = Debris_State_Fall;120debris->gravityStrength = 0x4000;121debris->velocity.x = RSDK.Rand(0, 0x20000);122if (debris->position.x < self->position.x)123debris->velocity.x = -debris->velocity.x;124125debris->velocity.y = RSDK.Rand(-0x40000, -0x10000);126debris->drawFX = FX_FLIP;127debris->direction = i & 3;128debris->drawGroup = Zone->objectDrawGroup[1];129RSDK.SetSpriteAnimation(Pinata->aniFrames, 0, &debris->animator, true, RSDK.Rand(0, 4));130}131132self->state = Pinata_State_Destroyed;133self->visible = false;134self->active = ACTIVE_NORMAL;135}136}137}138139void Pinata_State_Destroyed(void)140{141RSDK_THIS(Pinata);142143Vector2 range = { TO_FIXED(256), TO_FIXED(256) };144if (!RSDK.CheckOnScreen(self, &range)) {145self->state = Pinata_State_CheckPlayerCollisions;146self->visible = true;147self->active = ACTIVE_BOUNDS;148}149}150151#if GAME_INCLUDE_EDITOR152void Pinata_EditorDraw(void) { Pinata_Draw(); }153154void Pinata_EditorLoad(void)155{156Pinata->aniFrames = RSDK.LoadSpriteAnimation("MSZ/Pinata.bin", SCOPE_STAGE);157158RSDK_ACTIVE_VAR(Pinata, priority);159RSDK_ENUM_VAR("High", PINATA_PRIO_HIGH);160RSDK_ENUM_VAR("Low", PINATA_PRIO_LOW);161}162#endif163164void Pinata_Serialize(void)165{166RSDK_EDITABLE_VAR(Pinata, VAR_BOOL, respawn);167RSDK_EDITABLE_VAR(Pinata, VAR_ENUM, priority);168}169170171