Path: blob/master/SonicMania/Objects/HPZ/Redz.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Redz Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectRedz *Redz = NULL;1011void Redz_Update(void)12{13RSDK_THIS(Redz);14RSDK.ProcessAnimation(&self->animator);1516StateMachine_Run(self->state);1718if (self->state != Redz_State_Init && self->state != Redz_Flame_State && self->state != Redz_Flame_Setup) {19Redz_CheckPlayerCollisions();20if (!RSDK.CheckOnScreen(self, NULL) && !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {21self->direction = self->startDir;22self->position.x = self->startPos.x;23self->position.y = self->startPos.y;24Redz_Create(NULL);25}26}27}2829void Redz_LateUpdate(void) {}3031void Redz_StaticUpdate(void) {}3233void Redz_Draw(void)34{35RSDK_THIS(Redz);36RSDK.DrawSprite(&self->animator, NULL, false);37}3839void Redz_Create(void *data)40{41RSDK_THIS(Redz);42self->visible = true;43self->drawGroup = Zone->objectDrawGroup[0];44self->startPos = self->position;45self->startDir = self->direction;46self->drawFX = FX_FLIP;47self->active = ACTIVE_BOUNDS;48self->updateRange.x = 0x800000;49self->updateRange.y = 0x800000;50self->state = Redz_State_Init;51}5253void Redz_StageLoad(void)54{55if (RSDK.CheckSceneFolder("HPZ"))56Redz->aniFrames = RSDK.LoadSpriteAnimation("HPZ/Redz.bin", SCOPE_STAGE);5758Redz->hitboxBadnik.left = -16;59Redz->hitboxBadnik.top = -16;60Redz->hitboxBadnik.right = 16;61Redz->hitboxBadnik.bottom = 16;6263Redz->attackbox.left = -64;64Redz->attackbox.top = -96;65Redz->attackbox.right = 0;66Redz->attackbox.bottom = -8;6768Redz->hitboxFlame.left = -7;69Redz->hitboxFlame.top = -7;70Redz->hitboxFlame.right = 7;71Redz->hitboxFlame.bottom = -7;7273Redz->hitboxRange.left = 0;74Redz->hitboxRange.top = 0;75Redz->hitboxRange.right = 0;76Redz->hitboxRange.bottom = 0;7778Redz->sfxFlame = RSDK.GetSfx("Stage/Flame.wav");7980DEBUGMODE_ADD_OBJ(Redz);81}8283void Redz_DebugSpawn(void)84{85RSDK_THIS(DebugMode);8687EntityRedz *redz = CREATE_ENTITY(Redz, NULL, self->position.x, self->position.y);88redz->direction = self->direction;89redz->startDir = self->direction;90}9192void Redz_DebugDraw(void)93{94RSDK.SetSpriteAnimation(Redz->aniFrames, 0, &DebugMode->animator, true, 0);95RSDK.DrawSprite(&DebugMode->animator, NULL, false);96}9798void Redz_CheckPlayerCollisions(void)99{100RSDK_THIS(Redz);101foreach_active(Player, player)102{103if (Player_CheckBadnikTouch(player, self, &Redz->hitboxBadnik))104Player_CheckBadnikBreak(player, self, true);105}106}107108void Redz_State_Init(void)109{110RSDK_THIS(Redz);111112self->active = ACTIVE_NORMAL;113RSDK.SetSpriteAnimation(Redz->aniFrames, 0, &self->animator, true, 0);114self->animator.frameID = 0;115self->animator.speed = 1;116self->state = Redz_State_Walk;117self->velocity.x = (2 * (self->direction != FLIP_NONE) - 1) << 15;118Redz_State_Walk();119}120121void Redz_State_Walk(void)122{123RSDK_THIS(Redz);124125self->position.x += self->velocity.x;126if (!RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, (2 * (self->direction != FLIP_NONE) - 1) << 19, 0x100000, 8)) {127self->state = Redz_State_Turn;128RSDK.SetSpriteAnimation(Redz->aniFrames, 0, &self->animator, true, 0);129self->animator.frameID = 0;130self->animator.speed = 0;131}132133if (self->attackDelay <= 0) {134foreach_active(Player, player)135{136if (RSDK.CheckObjectCollisionTouchBox(player, &Redz->hitboxRange, self, &Redz->attackbox)) {137self->state = Redz_State_PrepareAttack;138RSDK.SetSpriteAnimation(Redz->aniFrames, 0, &self->animator, true, 0);139self->animator.frameID = 0;140self->attackDelay = 60;141self->animator.speed = 0;142}143}144}145else {146self->attackDelay--;147}148}149150void Redz_State_Turn(void)151{152RSDK_THIS(Redz);153154if (self->timer < 59) {155self->timer++;156}157else {158self->state = Redz_State_Walk;159self->timer = 0;160RSDK.SetSpriteAnimation(Redz->aniFrames, 0, &self->animator, true, 0);161self->animator.frameID = 0;162self->animator.speed = 1;163self->direction = self->direction == FLIP_NONE;164self->velocity.x = -self->velocity.x;165}166}167168void Redz_State_PrepareAttack(void)169{170RSDK_THIS(Redz);171if (self->timer >= 30) {172self->state = Redz_State_Attack;173self->timer = 0;174RSDK.SetSpriteAnimation(Redz->aniFrames, 1, &self->animator, true, 0);175RSDK.PlaySfx(Redz->sfxFlame, false, 255);176}177else {178self->timer++;179}180}181182void Redz_State_Attack(void)183{184RSDK_THIS(Redz);185if (self->timer >= 90) {186self->timer = 0;187RSDK.SetSpriteAnimation(Redz->aniFrames, 0, &self->animator, true, 0);188self->animator.frameID = 0;189self->animator.speed = 1;190self->state = Redz_State_Walk;191}192193if (!(self->timer & 3)) {194EntityRedz *flame = CREATE_ENTITY(Redz, self, self->position.x, self->position.y);195flame->state = Redz_Flame_Setup;196flame->position.y -= 0x40000;197flame->position.x += (2 * (self->direction != FLIP_NONE) - 1) << 19;198flame->velocity.x =199(2 * (self->direction != FLIP_NONE) - 1) * (RSDK.Cos512(((RSDK.Sin512(8 * (self->timer & 0x3F)) >> 5) - 48) & 0x1FF) << 8);200flame->velocity.y = RSDK.Sin512(((RSDK.Sin512(8 * (self->timer & 0x3F)) >> 5) - 48) & 0x1FF) << 8;201}202++self->timer;203}204205void Redz_Flame_Setup(void)206{207RSDK_THIS(Redz);208209self->active = ACTIVE_NORMAL;210RSDK.SetSpriteAnimation(Redz->aniFrames, 2, &self->animator, true, 0);211self->animator.frameID = 0;212self->state = Redz_Flame_State;213self->animator.speed = 1;214Redz_Flame_State();215}216217void Redz_Flame_State(void)218{219RSDK_THIS(Redz);220self->position.x += self->velocity.x;221self->position.y += self->velocity.y;222223foreach_active(Player, player)224{225if (Player_CheckCollisionTouch(player, self, &Redz->hitboxFlame)) {226Player_ElementHurt(player, self, SHIELD_FIRE);227}228}229230if (++self->timer > 20)231destroyEntity(self);232}233234#if GAME_INCLUDE_EDITOR235void Redz_EditorDraw(void)236{237RSDK_THIS(Redz);238RSDK.SetSpriteAnimation(Redz->aniFrames, 0, &self->animator, true, 0);239240Redz_Draw();241}242243void Redz_EditorLoad(void)244{245Redz->aniFrames = RSDK.LoadSpriteAnimation("HPZ/Redz.bin", SCOPE_STAGE);246247RSDK_ACTIVE_VAR(Redz, direction);248RSDK_ENUM_VAR("No Flip", FLIP_NONE);249RSDK_ENUM_VAR("Flip X", FLIP_X);250}251#endif252253void Redz_Serialize(void) { RSDK_EDITABLE_VAR(Redz, VAR_UINT8, direction); }254255256