mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-27 12:31:54 +00:00
Add Flame Shield visual object
This commit is contained in:
parent
3644f8afe7
commit
2e57c5fd8b
6 changed files with 100 additions and 3 deletions
|
|
@ -15481,7 +15481,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
|
|
||||||
{ // MT_FLAMESHIELD
|
{ // MT_FLAMESHIELD
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_FLAMESHIELD1, // spawnstate
|
S_INVISIBLE, // spawnstate
|
||||||
1000, // spawnhealth
|
1000, // spawnhealth
|
||||||
S_NULL, // seestate
|
S_NULL, // seestate
|
||||||
sfx_None, // seesound
|
sfx_None, // seesound
|
||||||
|
|
|
||||||
|
|
@ -14193,6 +14193,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
P_SetTarget(&shield->target, player->mo);
|
P_SetTarget(&shield->target, player->mo);
|
||||||
S_StartSound(player->mo, sfx_s3k3e);
|
S_StartSound(player->mo, sfx_s3k3e);
|
||||||
player->curshield = KSHIELD_FLAME;
|
player->curshield = KSHIELD_FLAME;
|
||||||
|
|
||||||
|
Obj_SpawnFlameShieldVisuals(shield);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!HOLDING_ITEM && NO_HYUDORO)
|
if (!HOLDING_ITEM && NO_HYUDORO)
|
||||||
|
|
|
||||||
|
|
@ -457,6 +457,10 @@ boolean Obj_TickBubbleShieldVisual(mobj_t *mobj);
|
||||||
void Obj_SpawnLightningShieldVisuals(mobj_t *source);
|
void Obj_SpawnLightningShieldVisuals(mobj_t *source);
|
||||||
boolean Obj_TickLightningShieldVisual(mobj_t *mobj);
|
boolean Obj_TickLightningShieldVisual(mobj_t *mobj);
|
||||||
|
|
||||||
|
/* Flame Shield */
|
||||||
|
void Obj_SpawnFlameShieldVisuals(mobj_t *source);
|
||||||
|
boolean Obj_TickFlameShieldVisual(mobj_t *mobj);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ target_sources(SRB2SDL2 PRIVATE
|
||||||
bubble-shield.cpp
|
bubble-shield.cpp
|
||||||
flybot767.c
|
flybot767.c
|
||||||
lightning-shield.cpp
|
lightning-shield.cpp
|
||||||
|
flame-shield.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
add_subdirectory(versus)
|
add_subdirectory(versus)
|
||||||
|
|
|
||||||
82
src/objects/flame-shield.cpp
Normal file
82
src/objects/flame-shield.cpp
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
// DR. ROBOTNIK'S RING RACERS
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Copyright (C) 2025 by James Robert Roman
|
||||||
|
// Copyright (C) 2025 by Kart Krew
|
||||||
|
//
|
||||||
|
// 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 "objects.hpp"
|
||||||
|
|
||||||
|
#include "../tables.h"
|
||||||
|
|
||||||
|
using namespace srb2::objects;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
struct Shield : Mobj
|
||||||
|
{
|
||||||
|
void target() = delete;
|
||||||
|
Mobj* follow() const { return Mobj::target(); }
|
||||||
|
void follow(Mobj* n) { Mobj::target(n); }
|
||||||
|
|
||||||
|
player_t* player() const { return follow()->player; }
|
||||||
|
|
||||||
|
bool valid() const { return Mobj::valid(follow()) && player(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Visual : Mobj
|
||||||
|
{
|
||||||
|
void target() = delete;
|
||||||
|
Shield* shield() const { return Mobj::target<Shield>(); }
|
||||||
|
void shield(Shield* n) { Mobj::target(n); }
|
||||||
|
|
||||||
|
bool valid() const { return Mobj::valid(shield()) && shield()->valid(); }
|
||||||
|
|
||||||
|
static void spawn
|
||||||
|
( Shield* shield,
|
||||||
|
statenum_t state,
|
||||||
|
int offset)
|
||||||
|
{
|
||||||
|
if (!shield->valid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Visual* x = Mobj::spawn<Visual>(shield->pos(), MT_FLAMESHIELD_VISUAL);
|
||||||
|
x->scale(5 * shield->follow()->scale() / 4);
|
||||||
|
x->state(state);
|
||||||
|
x->shield(shield);
|
||||||
|
x->linkdraw(shield->follow(), offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool tick()
|
||||||
|
{
|
||||||
|
if (!valid())
|
||||||
|
{
|
||||||
|
remove();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
move_origin(shield()->pos());
|
||||||
|
|
||||||
|
renderflags = (renderflags & ~RF_DONTDRAW) |
|
||||||
|
(shield()->state()->num() == S_INVISIBLE ? 0 : RF_DONTDRAW);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}; // namespace
|
||||||
|
|
||||||
|
void Obj_SpawnFlameShieldVisuals(mobj_t *shield)
|
||||||
|
{
|
||||||
|
Visual::spawn(static_cast<Shield*>(shield), S_FLMA1, 1);
|
||||||
|
Visual::spawn(static_cast<Shield*>(shield), S_FLMB1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean Obj_TickFlameShieldVisual(mobj_t *mobj)
|
||||||
|
{
|
||||||
|
return static_cast<Visual*>(mobj)->tick();
|
||||||
|
}
|
||||||
12
src/p_mobj.c
12
src/p_mobj.c
|
|
@ -6674,6 +6674,14 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MT_FLAMESHIELD_VISUAL:
|
||||||
|
{
|
||||||
|
if (!Obj_TickFlameShieldVisual(mobj))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
if (mobj->fuse)
|
if (mobj->fuse)
|
||||||
{ // Scenery object fuse! Very basic!
|
{ // Scenery object fuse! Very basic!
|
||||||
|
|
@ -8722,8 +8730,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH12)
|
if (curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH12)
|
||||||
P_SetMobjState(mobj, S_FLAMESHIELD1);
|
P_SetMobjState(mobj, S_INVISIBLE);
|
||||||
mobj->dispoffset = ((curstate - S_FLAMESHIELD1) & 1) ? -1 : 1;
|
//mobj->dispoffset = ((curstate - S_FLAMESHIELD1) & 1) ? -1 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
mobj->extravalue1 = mobj->target->player->flamedash;
|
mobj->extravalue1 = mobj->target->player->flamedash;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue