Path: blob/master/SonicMania/Objects/HCZ/Jawz.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Jawz Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectJawz *Jawz;1011void Jawz_Update(void)12{13RSDK_THIS(Jawz);1415StateMachine_Run(self->state);16}1718void Jawz_LateUpdate(void) {}1920void Jawz_StaticUpdate(void) {}2122void Jawz_Draw(void)23{24RSDK_THIS(Jawz);2526RSDK.DrawSprite(&self->animator, NULL, false);27}2829void Jawz_Create(void *data)30{31RSDK_THIS(Jawz);3233self->visible = true;34self->drawGroup = Zone->objectDrawGroup[0];35self->drawFX |= FX_FLIP;36self->startPos = self->position;37self->active = ACTIVE_BOUNDS;38self->updateRange.x = 0x800000;39self->updateRange.y = 0x800000;40self->velocity.x = 0;41RSDK.SetSpriteAnimation(Jawz->aniFrames, 0, &self->animator, true, 0);42self->state = Jawz_State_CheckPlayerTrigger;43}4445void Jawz_StageLoad(void)46{47if (RSDK.CheckSceneFolder("HCZ"))48Jawz->aniFrames = RSDK.LoadSpriteAnimation("HCZ/Jawz.bin", SCOPE_STAGE);4950Jawz->hitboxBadnik.left = -20;51Jawz->hitboxBadnik.top = -5;52Jawz->hitboxBadnik.right = 20;53Jawz->hitboxBadnik.bottom = 5;5455DEBUGMODE_ADD_OBJ(Jawz);56}5758void Jawz_DebugSpawn(void)59{60RSDK_THIS(Jawz);6162CREATE_ENTITY(Jawz, NULL, self->position.x, self->position.y);63}6465void Jawz_DebugDraw(void)66{67RSDK.SetSpriteAnimation(Jawz->aniFrames, 0, &DebugMode->animator, true, 0);68RSDK.DrawSprite(&DebugMode->animator, NULL, false);69}7071void Jawz_CheckPlayerCollisions(void)72{73RSDK_THIS(Jawz);7475foreach_active(Player, player)76{77if (Player_CheckBadnikTouch(player, self, &Jawz->hitboxBadnik) && !Player_CheckBadnikBreak(player, self, true)) {78CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_ENEMY), self->position.x, self->position.y)->drawGroup = Zone->objectDrawGroup[1];79RSDK.PlaySfx(Explosion->sfxDestroy, false, 255);80destroyEntity(self);81}82}83}8485void Jawz_State_CheckPlayerTrigger(void)86{87RSDK_THIS(Jawz);8889EntityPlayer *player = NULL;90if (Player->playerCount <= 1 || RSDK_GET_ENTITY(SLOT_PLAYER2, Player)->sidekick)91player = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);92else93player = Player_GetNearestPlayer();9495if (player) {96if (abs(player->position.x - self->position.x) < 0x1800000) {9798int32 playerID = RSDK.GetEntitySlot(player);99switch (self->triggerDir) {100case JAWS_TRIGGER_BOTH:101if (player->position.x > self->position.x) {102self->direction = FLIP_X;103self->velocity.x = 0x20000;104self->position.x = (ScreenInfo[playerID].position.x - 64) << 16;105}106else if (player->position.x <= self->position.x) {107self->direction = FLIP_NONE;108self->velocity.x = -0x20000;109self->position.x = (ScreenInfo[playerID].position.x + ScreenInfo[playerID].size.x + 64) << 16;110}111break;112113case JAWS_TRIGGER_LEFT:114if (player->position.x < self->position.x) {115self->direction = FLIP_NONE;116self->velocity.x = -0x20000;117self->position.x = (ScreenInfo[playerID].position.x + ScreenInfo[playerID].size.x + 64) << 16;118}119break;120121case JAWS_TRIGGER_RIGHT:122if (player->position.x > self->position.x) {123self->direction = FLIP_X;124self->velocity.x = 0x20000;125self->position.x = (ScreenInfo[playerID].position.x - 64) << 16;126}127break;128}129}130}131132if (self->velocity.x) {133self->active = ACTIVE_NORMAL;134self->visible = true;135136self->state = Jawz_State_Triggered;137Jawz_State_Triggered();138}139else {140self->active = ACTIVE_BOUNDS;141self->visible = false;142}143}144145void Jawz_State_Triggered(void)146{147RSDK_THIS(Jawz);148149self->position.x += self->velocity.x;150RSDK.ProcessAnimation(&self->animator);151152Jawz_CheckPlayerCollisions();153154if (!RSDK.CheckOnScreen(self, NULL) && !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {155self->position.x = self->startPos.x;156self->position.y = self->startPos.y;157158Jawz_Create(NULL);159}160}161162#if GAME_INCLUDE_EDITOR163void Jawz_EditorDraw(void)164{165RSDK_THIS(Jawz);166167self->direction = self->triggerDir == JAWS_TRIGGER_RIGHT;168169Jawz_Draw();170171if (showGizmos()) {172RSDK_DRAWING_OVERLAY(true);173174if (self->triggerDir < JAWS_TRIGGER_RIGHT)175DrawHelpers_DrawArrow(self->position.x, self->position.y, self->position.x - 0x300000, self->position.y, 0xFFFF00, INK_NONE, 0xFF);176177if (self->triggerDir != JAWS_TRIGGER_LEFT)178DrawHelpers_DrawArrow(self->position.x, self->position.y, self->position.x + 0x300000, self->position.y, 0xFFFF00, INK_NONE, 0xFF);179180RSDK_DRAWING_OVERLAY(false);181}182}183184void Jawz_EditorLoad(void)185{186Jawz->aniFrames = RSDK.LoadSpriteAnimation("HCZ/Jawz.bin", SCOPE_STAGE);187188RSDK_ACTIVE_VAR(Jawz, triggerDir);189RSDK_ENUM_VAR("Both", JAWS_TRIGGER_BOTH);190RSDK_ENUM_VAR("Left", JAWS_TRIGGER_LEFT);191RSDK_ENUM_VAR("Right", JAWS_TRIGGER_RIGHT);192}193#endif194195void Jawz_Serialize(void) { RSDK_EDITABLE_VAR(Jawz, VAR_UINT8, triggerDir); }196197198