mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-26 20:11:47 +00:00
Power-ups: spawn spinning power-up icon on player
- Spins for 40 tics, speeds up over duration - Starts wide stretched, ends thin and tall - Additive, fades into translucency
This commit is contained in:
parent
19418ff1a6
commit
f7d396d150
8 changed files with 110 additions and 0 deletions
|
|
@ -3455,6 +3455,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
||||||
"MT_RANDOMITEM",
|
"MT_RANDOMITEM",
|
||||||
"MT_SPHEREBOX",
|
"MT_SPHEREBOX",
|
||||||
"MT_FLOATINGITEM",
|
"MT_FLOATINGITEM",
|
||||||
|
"MT_GOTPOWERUP",
|
||||||
"MT_ITEMCAPSULE",
|
"MT_ITEMCAPSULE",
|
||||||
"MT_ITEMCAPSULE_PART",
|
"MT_ITEMCAPSULE_PART",
|
||||||
"MT_MONITOR",
|
"MT_MONITOR",
|
||||||
|
|
|
||||||
27
src/info.c
27
src/info.c
|
|
@ -13188,6 +13188,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_GOTPOWERUP
|
||||||
|
-1, // doomednum
|
||||||
|
S_ITEMICON, // spawnstate
|
||||||
|
1, // spawnhealth
|
||||||
|
S_NULL, // seestate
|
||||||
|
sfx_None, // seesound
|
||||||
|
0, // reactiontime
|
||||||
|
sfx_None, // attacksound
|
||||||
|
S_NULL, // painstate
|
||||||
|
0, // painchance
|
||||||
|
sfx_None, // painsound
|
||||||
|
S_NULL, // meleestate
|
||||||
|
S_NULL, // missilestate
|
||||||
|
S_NULL, // deathstate
|
||||||
|
S_NULL, // xdeathstate
|
||||||
|
sfx_itpick, // deathsound
|
||||||
|
0, // speed
|
||||||
|
48*FRACUNIT, // radius
|
||||||
|
64*FRACUNIT, // height
|
||||||
|
0, // display offset
|
||||||
|
100, // mass
|
||||||
|
0, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_SCENERY|MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOSQUISH|MF_DONTENCOREMAP, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
{ // MT_ITEMCAPSULE
|
{ // MT_ITEMCAPSULE
|
||||||
2010, // doomednum
|
2010, // doomednum
|
||||||
S_ITEMCAPSULE, // spawnstate
|
S_ITEMCAPSULE, // spawnstate
|
||||||
|
|
|
||||||
|
|
@ -4475,6 +4475,7 @@ typedef enum mobj_type
|
||||||
MT_RANDOMITEM,
|
MT_RANDOMITEM,
|
||||||
MT_SPHEREBOX,
|
MT_SPHEREBOX,
|
||||||
MT_FLOATINGITEM,
|
MT_FLOATINGITEM,
|
||||||
|
MT_GOTPOWERUP,
|
||||||
MT_ITEMCAPSULE,
|
MT_ITEMCAPSULE,
|
||||||
MT_ITEMCAPSULE_PART,
|
MT_ITEMCAPSULE_PART,
|
||||||
MT_MONITOR,
|
MT_MONITOR,
|
||||||
|
|
|
||||||
|
|
@ -398,6 +398,10 @@ void Obj_TalkPointInit(mobj_t* mo);
|
||||||
void Obj_TalkPointThink(mobj_t* mo);
|
void Obj_TalkPointThink(mobj_t* mo);
|
||||||
void Obj_TalkPointOrbThink(mobj_t* mo);
|
void Obj_TalkPointOrbThink(mobj_t* mo);
|
||||||
|
|
||||||
|
/* Power-up Spinner */
|
||||||
|
void Obj_SpawnPowerUpSpinner(mobj_t *source, INT32 powerup, tic_t duration);
|
||||||
|
void Obj_TickPowerUpSpinner(mobj_t *mobj);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,7 @@ void K_GivePowerUp(player_t* player, kartitems_t powerup, tic_t time)
|
||||||
player->flashing = 2*TICRATE;
|
player->flashing = 2*TICRATE;
|
||||||
K_AddHitLag(player->mo, BATTLE_POWERUP_VFX_TIME, false);
|
K_AddHitLag(player->mo, BATTLE_POWERUP_VFX_TIME, false);
|
||||||
player->powerupVFXTimer = BATTLE_POWERUP_VFX_TIME;
|
player->powerupVFXTimer = BATTLE_POWERUP_VFX_TIME;
|
||||||
|
Obj_SpawnPowerUpSpinner(player->mo, powerup, BATTLE_POWERUP_VFX_TIME);
|
||||||
|
|
||||||
g_darkness.start = leveltime;
|
g_darkness.start = leveltime;
|
||||||
g_darkness.end = leveltime + BATTLE_POWERUP_VFX_TIME + DARKNESS_FADE_TIME;
|
g_darkness.end = leveltime + BATTLE_POWERUP_VFX_TIME + DARKNESS_FADE_TIME;
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,7 @@ target_sources(SRB2SDL2 PRIVATE
|
||||||
waterfall-particle.c
|
waterfall-particle.c
|
||||||
sealed-star.c
|
sealed-star.c
|
||||||
talk-point.cpp
|
talk-point.cpp
|
||||||
|
powerup-spinner.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
add_subdirectory(versus)
|
add_subdirectory(versus)
|
||||||
|
|
|
||||||
70
src/objects/powerup-spinner.cpp
Normal file
70
src/objects/powerup-spinner.cpp
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
// DR. ROBOTNIK'S RING RACERS
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Copyright (C) 2024 by James Robert Roman
|
||||||
|
//
|
||||||
|
// This program is free software distributed under the
|
||||||
|
// terms of the GNU General Public License, version 2.
|
||||||
|
// See the 'LICENSE' file for more details.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include "objects.hpp"
|
||||||
|
|
||||||
|
#include "../m_easing.h"
|
||||||
|
#include "../m_fixed.h"
|
||||||
|
#include "../tables.h"
|
||||||
|
|
||||||
|
using namespace srb2::objects;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
struct Spinner : Mobj
|
||||||
|
{
|
||||||
|
static constexpr int kDuration = 40;
|
||||||
|
|
||||||
|
void extravalue1() = delete;
|
||||||
|
INT32 powerup() const { return mobj_t::extravalue1; }
|
||||||
|
void powerup(INT32 n) { mobj_t::extravalue1 = n; }
|
||||||
|
|
||||||
|
void extravalue2() = delete;
|
||||||
|
INT32 duration() const { return mobj_t::extravalue2; }
|
||||||
|
void duration(INT32 n) { mobj_t::extravalue2 = n; }
|
||||||
|
|
||||||
|
static void spawn(Mobj* source, INT32 powerup, tic_t duration)
|
||||||
|
{
|
||||||
|
Spinner* x = Mobj::spawn<Spinner>(source->pos(), MT_GOTPOWERUP);
|
||||||
|
K_UpdateMobjItemOverlay(x, powerup, 1);
|
||||||
|
x->frame |= FF_PAPERSPRITE | FF_ADD;
|
||||||
|
x->fuse = duration;
|
||||||
|
x->powerup(powerup);
|
||||||
|
x->duration(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
void think()
|
||||||
|
{
|
||||||
|
fixed_t f = FRACUNIT - std::clamp(fuse, 0, duration()) * FRACUNIT / std::max(duration(), 1);
|
||||||
|
|
||||||
|
angle += Easing_InQuad(f, ANGLE_11hh, ANGLE_45);
|
||||||
|
renderflags = (renderflags & ~RF_TRANSMASK) | (Easing_Linear(f, 0, 9) << RF_TRANSSHIFT);
|
||||||
|
spritescale({Easing_Linear(f, 4*FRACUNIT, FRACUNIT/4), Easing_Linear(f, FRACUNIT, 6*FRACUNIT)});
|
||||||
|
|
||||||
|
if (--fuse <= 0)
|
||||||
|
{
|
||||||
|
remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}; // namespace
|
||||||
|
|
||||||
|
void Obj_SpawnPowerUpSpinner(mobj_t *source, INT32 powerup, tic_t duration)
|
||||||
|
{
|
||||||
|
Spinner::spawn(static_cast<Mobj*>(source), powerup, duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Obj_TickPowerUpSpinner(mobj_t *mobj)
|
||||||
|
{
|
||||||
|
static_cast<Spinner*>(mobj)->think();
|
||||||
|
}
|
||||||
|
|
@ -6596,6 +6596,11 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
||||||
Obj_SSGobletMobjThink(mobj);
|
Obj_SSGobletMobjThink(mobj);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
case MT_GOTPOWERUP:
|
||||||
|
{
|
||||||
|
Obj_TickPowerUpSpinner(mobj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
if (mobj->fuse)
|
if (mobj->fuse)
|
||||||
{ // Scenery object fuse! Very basic!
|
{ // Scenery object fuse! Very basic!
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue