Path: blob/master/SonicMania/Objects/HCZ/Spear.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Spear Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectSpear *Spear;1011void Spear_Update(void)12{13RSDK_THIS(Spear);1415int32 timer = (self->intervalOffset + Zone->timer) % self->interval;1617if (timer >= self->duration) {18if (timer - self->duration >= 6)19self->retractPos = 0;20else21self->retractPos = 0x48000 * (6 - (timer - self->duration));22}23else {24if (timer >= 6)25self->retractPos = 0x1B0000;26else27self->retractPos = 0x48000 * timer;2829if (self->retractPos == 0x48000)30RSDK.PlaySfx(Spear->sfxSpear, false, 0xFF);31}3233Spear_SetupHitboxes();3435foreach_active(Player, player)36{37if (Player_CheckCollisionTouch(player, self, &self->hitbox)) {38#if MANIA_USE_PLUS39if (!Player_CheckMightyUnspin(player, 0x200, 2, &player->uncurlTimer))40#endif41Player_Hurt(player, self);42}43}44}4546void Spear_LateUpdate(void) {}4748void Spear_StaticUpdate(void) {}4950void Spear_Draw(void)51{52RSDK_THIS(Spear);5354Vector2 drawPos = self->position;55switch (self->orientation) {56case SPEAR_UP:57drawPos.y = self->position.y + 0x1B0000;58drawPos.y = self->position.y + 0x1B0000 - self->retractPos;59break;6061case SPEAR_RIGHT:62drawPos.x = self->position.x - 0x1B0000;63drawPos.x = self->position.x - 0x1B0000 + self->retractPos;64break;6566case SPEAR_DOWN:67drawPos.y = self->position.y - 0x1B0000;68drawPos.y = self->position.y - 0x1B0000 + self->retractPos;69break;7071case SPEAR_LEFT:72drawPos.x = self->position.x + 0x1B0000;73drawPos.x = self->position.x + 0x1B0000 - self->retractPos;74break;7576default: break;77}7879RSDK.DrawSprite(&self->spearAnimator, &drawPos, false);80RSDK.DrawSprite(&self->baseAnimator, NULL, false);81}8283void Spear_Create(void *data)84{85RSDK_THIS(Spear);8687if (SceneInfo->inEditor) {88if (!self->interval)89self->interval = 120;9091if (!self->duration)92self->duration = 60;93}9495self->active = ACTIVE_BOUNDS;96self->drawGroup = Zone->objectDrawGroup[0];97self->startPos = self->position;98self->visible = true;99self->drawFX = FX_FLIP;100self->updateRange.x = 0x800000;101self->updateRange.y = 0x800000;102103int32 anim = 0;104switch (self->orientation) {105case SPEAR_UP:106self->direction = FLIP_NONE;107anim = 0;108break;109110case SPEAR_RIGHT:111self->direction = FLIP_NONE;112anim = 1;113break;114115case SPEAR_DOWN:116self->direction = FLIP_Y;117anim = 0;118break;119120case SPEAR_LEFT:121self->direction = FLIP_X;122anim = 1;123break;124125default: break;126}127128RSDK.SetSpriteAnimation(Spear->aniFrames, anim, &self->baseAnimator, true, 0);129RSDK.SetSpriteAnimation(Spear->aniFrames, anim, &self->spearAnimator, true, 1);130}131132void Spear_StageLoad(void)133{134Spear->aniFrames = RSDK.LoadSpriteAnimation("HCZ/Spear.bin", SCOPE_STAGE);135136Spear->sfxSpear = RSDK.GetSfx("HCZ/Spear.wav");137}138139void Spear_SetupHitboxes(void)140{141RSDK_THIS(Spear);142143switch (self->orientation) {144case SPEAR_UP:145case SPEAR_DOWN:146self->hitbox.right = 4;147self->hitbox.bottom = 0;148self->hitbox.left = -4;149self->hitbox.top = -15 - (self->retractPos >> 16);150break;151152case SPEAR_RIGHT:153case SPEAR_LEFT:154self->hitbox.left = 0;155self->hitbox.top = 64;156self->hitbox.right = (self->retractPos >> 16) + 15;157self->hitbox.bottom = 4;158break;159default: break;160}161}162163#if GAME_INCLUDE_EDITOR164void Spear_EditorDraw(void)165{166Spear_Create(NULL);167Spear_Draw();168}169170void Spear_EditorLoad(void)171{172Spear->aniFrames = RSDK.LoadSpriteAnimation("HCZ/Spear.bin", SCOPE_STAGE);173174RSDK_ACTIVE_VAR(Spear, orientation);175RSDK_ENUM_VAR("Up", SPEAR_UP);176RSDK_ENUM_VAR("Right", SPEAR_RIGHT);177RSDK_ENUM_VAR("Down", SPEAR_DOWN);178RSDK_ENUM_VAR("Left", SPEAR_LEFT);179}180#endif181182void Spear_Serialize(void)183{184RSDK_EDITABLE_VAR(Spear, VAR_UINT8, orientation);185RSDK_EDITABLE_VAR(Spear, VAR_UINT32, interval);186RSDK_EDITABLE_VAR(Spear, VAR_UINT32, intervalOffset);187RSDK_EDITABLE_VAR(Spear, VAR_UINT32, duration);188}189190191