mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-22 02:00:11 +00:00
Add Power-Up Aura
- Spawns on player when they use their first power-up - Lasts as long as player has any power-up - A hexagon of animated, additive, fullbright papersprites surround and move with the player, takes player's angle
This commit is contained in:
parent
b97dede82c
commit
c01a29c42a
6 changed files with 153 additions and 0 deletions
|
|
@ -161,6 +161,10 @@ void Obj_SuperFlickyPlayerCollide(mobj_t *flicky, mobj_t *player);
|
|||
void Obj_SuperFlickyLanding(mobj_t *flicky);
|
||||
boolean Obj_IsSuperFlickyWhippable(const mobj_t *flicky);
|
||||
|
||||
/* Power-Up Aura */
|
||||
void Obj_SpawnPowerUpAura(player_t* player);
|
||||
void Obj_PowerUpAuraThink(mobj_t* mobj);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -25,8 +25,26 @@ tic_t K_PowerUpRemaining(const player_t* player, kartitems_t powerup)
|
|||
}
|
||||
}
|
||||
|
||||
boolean K_AnyPowerUpRemaining(const player_t* player)
|
||||
{
|
||||
for (int k = FIRSTPOWERUP; k < ENDOFPOWERUPS; ++k)
|
||||
{
|
||||
if (K_PowerUpRemaining(player, static_cast<kartitems_t>(k)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void K_GivePowerUp(player_t* player, kartitems_t powerup, tic_t time)
|
||||
{
|
||||
if (!K_AnyPowerUpRemaining(player))
|
||||
{
|
||||
Obj_SpawnPowerUpAura(player);
|
||||
}
|
||||
|
||||
switch (powerup)
|
||||
{
|
||||
case POWERUP_SMONITOR:
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
tic_t K_PowerUpRemaining(const player_t *player, kartitems_t powerup);
|
||||
boolean K_AnyPowerUpRemaining(const player_t *player);
|
||||
void K_GivePowerUp(player_t *player, kartitems_t powerup, tic_t timer);
|
||||
void K_DropPowerUps(player_t *player);
|
||||
|
||||
|
|
|
|||
|
|
@ -22,4 +22,5 @@ target_sources(SRB2SDL2 PRIVATE
|
|||
gachabom-rebound.cpp
|
||||
servant-hand.c
|
||||
super-flicky.cpp
|
||||
powerup-aura.cpp
|
||||
)
|
||||
|
|
|
|||
121
src/objects/powerup-aura.cpp
Normal file
121
src/objects/powerup-aura.cpp
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
#include "../info.h"
|
||||
#include "../g_game.h"
|
||||
#include "../m_fixed.h"
|
||||
#include "../k_objects.h"
|
||||
#include "../k_powerup.h"
|
||||
#include "../p_local.h"
|
||||
#include "../p_mobj.h"
|
||||
#include "../tables.h"
|
||||
|
||||
// copied from objects/monitor.c
|
||||
#define FINE90 (FINEANGLES/4)
|
||||
#define FINE180 (FINEANGLES/2)
|
||||
#define TRUETAN(n) FINETANGENT(FINE90 + (n)) // bruh
|
||||
|
||||
#define part_theta(o) ((o)->movedir)
|
||||
#define part_seek(o) ((o)->extravalue1)
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
constexpr int kSpriteWidth = 32;
|
||||
constexpr int kNumSides = 6;
|
||||
|
||||
struct Aura : mobj_t
|
||||
{
|
||||
angle_t theta() const { return part_theta(this); }
|
||||
void theta(angle_t n) { part_theta(this) = n; }
|
||||
|
||||
unsigned seek() const { return part_seek(this); }
|
||||
void seek(unsigned n) { part_seek(this) = n; }
|
||||
|
||||
mobj_t* origin() const { return players[seek()].mo; }
|
||||
|
||||
static void spawn(int player)
|
||||
{
|
||||
const fixed_t angle_factor = ANGLE_MAX / kNumSides;
|
||||
|
||||
angle_t ang = 0u;
|
||||
|
||||
for (int i = 0; i < kNumSides; ++i)
|
||||
{
|
||||
Aura* x = static_cast<Aura*>(P_SpawnMobj(0, 0, 0, MT_POWERUP_AURA));
|
||||
|
||||
x->theta(ang);
|
||||
x->seek(player);
|
||||
|
||||
ang += angle_factor;
|
||||
}
|
||||
}
|
||||
|
||||
// copied from objects/monitor.c
|
||||
static fixed_t get_inradius(fixed_t length)
|
||||
{
|
||||
return FixedDiv(length, 2 * TRUETAN(FINE180 / kNumSides));
|
||||
}
|
||||
|
||||
bool valid() const
|
||||
{
|
||||
if (seek() >= MAXPLAYERS)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!playeringame[seek()])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!K_AnyPowerUpRemaining(&players[seek()]))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void move()
|
||||
{
|
||||
if (P_MobjWasRemoved(origin()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
P_MoveOrigin(this, origin()->x, origin()->y, origin()->z);
|
||||
P_InstaScale(this, 11 * origin()->scale / 10);
|
||||
|
||||
translate();
|
||||
}
|
||||
|
||||
void translate()
|
||||
{
|
||||
const fixed_t width = scale * kSpriteWidth;
|
||||
const fixed_t rad = get_inradius(width);
|
||||
const angle_t ang = theta() + origin()->angle;
|
||||
|
||||
angle = (ang - ANGLE_90);
|
||||
|
||||
sprxoff = FixedMul(FCOS(ang), rad);
|
||||
spryoff = FixedMul(FSIN(ang), rad);
|
||||
}
|
||||
};
|
||||
|
||||
}; // namespace
|
||||
|
||||
void Obj_SpawnPowerUpAura(player_t* player)
|
||||
{
|
||||
Aura::spawn(player - players);
|
||||
}
|
||||
|
||||
void Obj_PowerUpAuraThink(mobj_t* mobj)
|
||||
{
|
||||
Aura* x = static_cast<Aura*>(mobj);
|
||||
|
||||
if (!x->valid())
|
||||
{
|
||||
P_RemoveMobj(x);
|
||||
return;
|
||||
}
|
||||
|
||||
x->move();
|
||||
}
|
||||
|
|
@ -6698,6 +6698,14 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
|||
case MT_SUPER_FLICKY_CONTROLLER:
|
||||
Obj_SuperFlickyControllerThink(mobj);
|
||||
|
||||
if (P_MobjWasRemoved(mobj))
|
||||
{
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case MT_POWERUP_AURA:
|
||||
Obj_PowerUpAuraThink(mobj);
|
||||
|
||||
if (P_MobjWasRemoved(mobj))
|
||||
{
|
||||
return;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue