Path: blob/master/SonicMania/Objects/Common/Projectile.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Projectile Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectProjectile *Projectile;1011void Projectile_Update(void)12{13RSDK_THIS(Projectile);1415StateMachine_Run(self->state);1617if (self->drawFX & FX_ROTATE)18self->rotation = (self->rotation + self->rotationSpeed) & 0x1FF;1920RSDK.ProcessAnimation(&self->animator);21}2223void Projectile_LateUpdate(void) {}2425void Projectile_StaticUpdate(void) {}2627void Projectile_Draw(void)28{29RSDK_THIS(Projectile);3031RSDK.DrawSprite(&self->animator, NULL, false);32}3334void Projectile_Create(void *data)35{36RSDK_THIS(Projectile);3738self->active = ACTIVE_NORMAL;39self->visible = true;40self->state = (Type_StateMachine)data;41}4243void Projectile_StageLoad(void) {}4445void Projectile_CheckPlayerCollisions(void)46{47RSDK_THIS(Projectile);4849foreach_active(Player, player)50{51if (Player_CheckCollisionTouch(player, self, &self->hitbox)) {52switch (self->type) {53case PROJECTILE_NOTHING: break;5455case PROJECTILE_FIRE:56if (self->isProjectile)57Player_ProjectileHurt(player, self);58else59Player_ElementHurt(player, self, SHIELD_FIRE);60break;6162case PROJECTILE_ELECTRIC:63if (self->isProjectile)64Player_ProjectileHurt(player, self);65else66Player_ElementHurt(player, self, SHIELD_LIGHTNING);67break;6869case PROJECTILE_UNUSED1: break;7071case PROJECTILE_UNUSED2: break;7273case PROJECTILE_UNUSED3: break;7475case PROJECTILE_BASIC:76case PROJECTILE_BASIC2: {77#if MANIA_USE_PLUS78int32 anim = player->animator.animationID;79#endif8081if (self->isProjectile82#if MANIA_USE_PLUS83|| (player->characterID == ID_MIGHTY84&& (anim == ANI_CROUCH || anim == ANI_JUMP || anim == ANI_SPINDASH || anim == ANI_HAMMERDROP))85#endif86) {87if (Player_ProjectileHurt(player, self)) {88self->gravityStrength = 0x3800;89self->state = Projectile_State_MoveGravity;90}91}92else {93Player_Hurt(player, self);94}95break;96}9798default: break;99}100}101}102}103104void Projectile_State_Move(void)105{106RSDK_THIS(Projectile);107108self->position.x += self->velocity.x;109self->position.y += self->velocity.y;110111if (self->hurtDelay <= 0)112Projectile_CheckPlayerCollisions();113else114self->hurtDelay--;115116if (self->timer <= 0) {117if (!RSDK.CheckOnScreen(self, NULL))118destroyEntity(self);119}120else {121if (!self->timer)122destroyEntity(self);123}124}125126void Projectile_State_MoveGravity(void)127{128RSDK_THIS(Projectile);129130self->position.x += self->velocity.x;131self->position.y += self->velocity.y;132self->velocity.y += self->gravityStrength;133134if (self->hurtDelay <= 0)135Projectile_CheckPlayerCollisions();136else137self->hurtDelay--;138139if (self->timer <= 0) {140if (!RSDK.CheckOnScreen(self, NULL))141destroyEntity(self);142}143else {144if (!self->timer)145destroyEntity(self);146}147}148149#if GAME_INCLUDE_EDITOR150void Projectile_EditorDraw(void) {}151152void Projectile_EditorLoad(void) {}153#endif154155void Projectile_Serialize(void) {}156157158