Add Lightning Shield visual object

This commit is contained in:
James R 2025-05-19 18:29:53 -07:00
parent 835785d940
commit 3644f8afe7
6 changed files with 90 additions and 1 deletions

View file

@ -15373,7 +15373,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
{ // MT_LIGHTNINGSHIELD
-1, // doomednum
S_LIGHTNINGSHIELD1, // spawnstate
S_INVISIBLE, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound

View file

@ -14059,6 +14059,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
P_SetTarget(&shield->target, player->mo);
S_StartSound(player->mo, sfx_s3k41);
player->curshield = KSHIELD_LIGHTNING;
Obj_SpawnLightningShieldVisuals(shield);
}
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)

View file

@ -453,6 +453,10 @@ void K_DoBallhogAttack(player_t *player, UINT8 num_hogs);
void Obj_SpawnBubbleShieldVisuals(mobj_t *source);
boolean Obj_TickBubbleShieldVisual(mobj_t *mobj);
/* Lightning Shield */
void Obj_SpawnLightningShieldVisuals(mobj_t *source);
boolean Obj_TickLightningShieldVisual(mobj_t *mobj);
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -62,6 +62,7 @@ target_sources(SRB2SDL2 PRIVATE
ballhog.cpp
bubble-shield.cpp
flybot767.c
lightning-shield.cpp
)
add_subdirectory(versus)

View file

@ -0,0 +1,74 @@
// 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); }
bool valid() const { return Mobj::valid(follow()); }
};
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)
{
if (!shield->valid())
return;
Visual* x = Mobj::spawn<Visual>(shield->pos(), MT_LIGHTNINGSHIELD_VISUAL);
x->scale(5 * shield->follow()->scale() / 4);
x->shield(shield);
x->linkdraw(shield->follow());
x->tick();
}
bool tick()
{
if (!valid())
{
remove();
return false;
}
move_origin(shield()->pos());
dispoffset = state()->num() == S_THNB1 ? -1 : 1;
return true;
}
};
}; // namespace
void Obj_SpawnLightningShieldVisuals(mobj_t *shield)
{
Visual::spawn(static_cast<Shield*>(shield));
}
boolean Obj_TickLightningShieldVisual(mobj_t *mobj)
{
return static_cast<Visual*>(mobj)->tick();
}

View file

@ -6666,6 +6666,14 @@ static void P_MobjSceneryThink(mobj_t *mobj)
}
break;
}
case MT_LIGHTNINGSHIELD_VISUAL:
{
if (!Obj_TickLightningShieldVisual(mobj))
{
return;
}
break;
}
default:
if (mobj->fuse)
{ // Scenery object fuse! Very basic!