Morph Drop Target from forward thrown white to lime

Blends from white into lime over 27 tics.
This commit is contained in:
James R 2023-03-19 03:52:25 -07:00
parent 05d80f9e92
commit dc024b874b
7 changed files with 110 additions and 0 deletions

View file

@ -5380,6 +5380,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_DROPTARGET", // Drop Target "MT_DROPTARGET", // Drop Target
"MT_DROPTARGET_SHIELD", "MT_DROPTARGET_SHIELD",
"MT_DROPTARGET_MORPH",
"MT_BALLHOG", // Ballhog "MT_BALLHOG", // Ballhog
"MT_BALLHOGBOOM", "MT_BALLHOGBOOM",

View file

@ -23722,6 +23722,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_DROPTARGET_MORPH
-1, // doomednum
S_DROPTARGET, // 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_None, // deathsound
0, // speed
45*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
100, // mass
1, // damage
sfx_None, // activesound
MF_SCENERY|MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_BALLHOG { // MT_BALLHOG
-1, // doomednum -1, // doomednum
S_BALLHOG1, // spawnstate S_BALLHOG1, // spawnstate

View file

@ -6452,6 +6452,7 @@ typedef enum mobj_type
MT_DROPTARGET, // Drop Target MT_DROPTARGET, // Drop Target
MT_DROPTARGET_SHIELD, MT_DROPTARGET_SHIELD,
MT_DROPTARGET_MORPH,
MT_BALLHOG, // Ballhog MT_BALLHOG, // Ballhog
MT_BALLHOGBOOM, MT_BALLHOGBOOM,

View file

@ -101,6 +101,10 @@ void Obj_InitLoopCenter(mobj_t *center);
void Obj_LinkLoopAnchor(mobj_t *anchor, mobj_t *center, UINT8 type); void Obj_LinkLoopAnchor(mobj_t *anchor, mobj_t *center, UINT8 type);
void Obj_LoopEndpointCollide(mobj_t *special, mobj_t *toucher); void Obj_LoopEndpointCollide(mobj_t *special, mobj_t *toucher);
/* Drop Target */
void Obj_BeginDropTargetMorph(mobj_t *target, skincolornum_t color);
boolean Obj_DropTargetMorphThink(mobj_t *morph);
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
#endif #endif

View file

@ -13,4 +13,5 @@ target_sources(SRB2SDL2 PRIVATE
monitor.c monitor.c
item-spot.c item-spot.c
loops.c loops.c
drop-target.c
) )

64
src/objects/drop-target.c Normal file
View file

@ -0,0 +1,64 @@
#include "../doomdef.h"
#include "../info.h"
#include "../k_objects.h"
#include "../p_local.h"
#define MORPH_TIME_FACTOR (3)
#define morph_target(o) ((o)->target)
#define morph_time(o) ((o)->extravalue1)
void
Obj_BeginDropTargetMorph
( mobj_t * target,
skincolornum_t color)
{
mobj_t *x = P_SpawnMobjFromMobj(target, 0, 0, 0,
MT_DROPTARGET_MORPH);
x->color = color;
x->colorized = true;
x->renderflags |= RF_FULLBRIGHT;
P_SetTarget(&morph_target(x), target);
morph_time(x) = tr_trans90 * MORPH_TIME_FACTOR;
x->health = target->health;
}
boolean
Obj_DropTargetMorphThink (mobj_t *x)
{
mobj_t *target = morph_target(x);
if (P_MobjWasRemoved(target))
{
P_RemoveMobj(x);
return false;
}
if (target->health != x->health)
{
P_RemoveMobj(x);
return false;
}
morph_time(x)--;
if (morph_time(x) <= 0)
{
target->health--;
target->color = x->color;
P_RemoveMobj(x);
return false;
}
x->renderflags = (x->renderflags & ~(RF_TRANSMASK))
| ((morph_time(x) / MORPH_TIME_FACTOR) << RF_TRANSSHIFT);
P_MoveOrigin(x, target->x, target->y, target->z);
return true;
}

View file

@ -6618,6 +6618,12 @@ static void P_MobjSceneryThink(mobj_t *mobj)
case MT_MONITOR_SHARD: case MT_MONITOR_SHARD:
Obj_MonitorShardThink(mobj); Obj_MonitorShardThink(mobj);
break; break;
case MT_DROPTARGET_MORPH:
if (Obj_DropTargetMorphThink(mobj) == false)
{
return;
}
break;
case MT_VWREF: case MT_VWREF:
case MT_VWREB: case MT_VWREB:
{ {
@ -7416,6 +7422,12 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
if (!--mobj->reactiontime) if (!--mobj->reactiontime)
{ {
P_SetMobjState(mobj, mobj->info->spawnstate); P_SetMobjState(mobj, mobj->info->spawnstate);
// forward thrown
if (mobj->health == 4)
{
Obj_BeginDropTargetMorph(mobj, SKINCOLOR_LIME);
}
} }
} }
else else