Skip to content

Commit

Permalink
Heretic|Hexen: Added “mf3_nomorph” to prevent morphing
Browse files Browse the repository at this point in the history
Mobjs flagged with MF3_NOMORPH are not affected by morphing. The previous hardcoded mobj types that weren’t affected by morphing now use this flag only.
  • Loading branch information
skyjake committed Sep 30, 2018
1 parent eea8986 commit 2ed1b8a
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 64 deletions.
4 changes: 3 additions & 1 deletion doomsday/apps/plugins/heretic/defs/flags.ded
@@ -1,4 +1,4 @@
# libheretic: Flags
# Heretic: Flags

# Mobj flags:
Flag { ID = "mf_special"; Value = 0x1; }
Expand Down Expand Up @@ -59,3 +59,5 @@ Flag { ID = "mf2_dontdraw"; Value = 0x100000; }
# Mobj flags3:
Flag { ID = "mf3_noinfight"; Value = 0x1; }
Flag { ID = "mf3_clientaction"; Value = 0x2; }
Flag { ID = "mf3_nomorph"; Value = 0x4; }

9 changes: 6 additions & 3 deletions doomsday/apps/plugins/heretic/defs/objects.ded
Expand Up @@ -456,6 +456,7 @@ Thing {
Mass = 100;
Flags = "mf_solid mf_noblood mf_shootable mf_dropoff mf_viewalign";
Flags2 = "mf2_windthrust mf2_pushable mf2_slide mf2_passmobj mf2_telestomp";
Flags3 = "mf3_nomorph";
}

Thing {
Expand Down Expand Up @@ -2503,6 +2504,7 @@ Thing {
Mass = 40;
Flags = "mf_solid mf_shootable mf_countkill mf_dropoff";
Flags2 = "mf2_windthrust mf2_footclip mf2_passmobj";
Flags3 = "mf3_nomorph";
}

Thing {
Expand Down Expand Up @@ -2930,6 +2932,7 @@ Thing {
Mass = 325;
Flags = "mf_solid mf_shootable mf_countkill mf_noblood";
Flags2 = "mf2_passmobj";
Flags3 = "mf3_nomorph";
}

Thing {
Expand Down Expand Up @@ -3383,7 +3386,7 @@ Thing {
Mass = 800;
Flags = "mf_solid mf_shootable mf_countkill";
Flags2 = "mf2_footclip mf2_passmobj mf2_boss";
Flags3 = "mf3_noinfight";
Flags3 = "mf3_noinfight mf3_nomorph";
}

Thing {
Expand Down Expand Up @@ -3438,7 +3441,7 @@ Thing {
Mass = 300;
Flags = "mf_solid mf_shootable mf_countkill mf_dropoff";
Flags2 = "mf2_footclip mf2_passmobj mf2_boss";
Flags3 = "mf3_noinfight";
Flags3 = "mf3_noinfight mf3_nomorph";
}

Thing {
Expand Down Expand Up @@ -3570,7 +3573,7 @@ Thing {
Damage = 7;
Flags = "mf_solid mf_shootable mf_countkill mf_dropoff";
Flags2 = "mf2_footclip mf2_passmobj mf2_boss";
Flags3 = "mf3_noinfight";
Flags3 = "mf3_noinfight mf3_nomorph";
}

Thing {
Expand Down
1 change: 1 addition & 0 deletions doomsday/apps/plugins/heretic/include/p_mobj.h
Expand Up @@ -156,6 +156,7 @@ class MapStateWriter;

#define MF3_NOINFIGHT 0x00000001 // Mobj will never be targeted for in-fighting
#define MF3_CLIENTACTION 0x00000002 // States' action funcs are executed by client
#define MF3_NOMORPH 0x00000004 // Mobj cannot be morphed to Chicken

// --- mobj.intflags --- (added in MOBJ_SAVEVERSION 6)
// Internal mobj flags cannot be set using an external definition.
Expand Down
37 changes: 13 additions & 24 deletions doomsday/apps/plugins/heretic/src/p_inter.c
Expand Up @@ -1127,43 +1127,32 @@ dd_bool P_MorphPlayer(player_t *player)

static dd_bool morphMonster(mobj_t *actor)
{
mobj_t *fog, *chicken, *target;
mobj_t * fog, *chicken, *target;
mobjtype_t moType;
coord_t pos[3];
angle_t angle;
int ghost;
coord_t pos[3];
angle_t angle;
int ghost;

DENG_ASSERT(actor != 0);

if(actor->player)
return false;
if (actor->player) return false;

moType = actor->type;
switch(moType)
{
case MT_POD:
case MT_CHICKEN:
case MT_HEAD:
case MT_MINOTAUR:
case MT_SORCERER1:
case MT_SORCERER2:
return false;
// Originally hardcoded to specific mobj types.
if (actor->flags3 & MF3_NOMORPH) return false;

default:
break;
}
moType = actor->type;

memcpy(pos, actor->origin, sizeof(pos));
angle = actor->angle;
ghost = actor->flags & MF_SHADOW;
angle = actor->angle;
ghost = actor->flags & MF_SHADOW;
target = actor->target;

if((chicken = P_SpawnMobj(MT_CHICKEN, pos, angle, 0)))
if ((chicken = P_SpawnMobj(MT_CHICKEN, pos, angle, 0)))
{
P_MobjChangeState(actor, S_FREETARGMOBJ);

if((fog = P_SpawnMobjXYZ(MT_TFOG, pos[VX], pos[VY], pos[VZ] + TELEFOGHEIGHT,
angle + ANG180, 0)))
if ((fog = P_SpawnMobjXYZ(
MT_TFOG, pos[VX], pos[VY], pos[VZ] + TELEFOGHEIGHT, angle + ANG180, 0)))
S_StartSound(SFX_TELEPT, fog);

chicken->special2 = moType;
Expand Down
4 changes: 3 additions & 1 deletion doomsday/apps/plugins/hexen/defs/flags.ded
@@ -1,4 +1,4 @@
# libhexen: Flags
# Hexen: Flags

# Mobj flags:
Flag { ID = "mf_special"; Value = 0x1; }
Expand Down Expand Up @@ -70,6 +70,8 @@ Flag { ID = "mf2_reflective"; Value = 0x80000000; }
# Mobj flags3:
Flag { ID = "mf3_noinfight"; Value = 0x1; }
Flag { ID = "mf3_clientaction"; Value = 0x2; }
Flag { ID = "mf3_noblast"; Value = 0x4; }
Flag { ID = "mf3_nomorph"; Value = 0x8; }

#
# Obsolete (unused) flags:
Expand Down
4 changes: 4 additions & 0 deletions doomsday/apps/plugins/hexen/defs/objects.ded
Expand Up @@ -6947,6 +6947,7 @@ Thing {
Mass = 60;
Flags = "mf_solid mf_shootable mf_countkill";
Flags2 = "mf2_windthrust mf2_floorclip mf2_passmobj mf2_pushwall mf2_telestomp";
Flags3 = "mf3_nomorph";
}

Thing {
Expand Down Expand Up @@ -9144,6 +9145,7 @@ Thing {
Mass = 100;
Flags = "mf_solid mf_shootable mf_countkill";
Flags2 = "mf2_floorclip mf2_passmobj mf2_telestomp mf2_pushwall mf2_mcross";
Flags3 = "mf3_nomorph";
}

Thing {
Expand Down Expand Up @@ -9171,6 +9173,7 @@ Thing {
Mass = 100;
Flags = "mf_solid mf_shootable mf_countkill";
Flags2 = "mf2_floorclip mf2_passmobj mf2_telestomp mf2_pushwall mf2_mcross";
Flags3 = "mf3_nomorph";
}

Thing {
Expand Down Expand Up @@ -9198,6 +9201,7 @@ Thing {
Mass = 100;
Flags = "mf_solid mf_shootable mf_countkill";
Flags2 = "mf2_floorclip mf2_passmobj mf2_telestomp mf2_pushwall mf2_mcross";
Flags3 = "mf3_nomorph";
}

Thing {
Expand Down
3 changes: 2 additions & 1 deletion doomsday/apps/plugins/hexen/include/p_mobj.h
Expand Up @@ -159,7 +159,8 @@ class MapStateWriter;

#define MF3_NOINFIGHT 0x00000001 // Mobj will never be targeted for in-fighting
#define MF3_CLIENTACTION 0x00000002 // States' action funcs are executed by client
#define MF3_NOBLAST 0x00000004 // Never affected by A_BlastRadius.
#define MF3_NOBLAST 0x00000004 // Never affected by A_BlastRadius
#define MF3_NOMORPH 0x00000008 // Mobj cannot be morphed to Pig

typedef enum dirtype_s {
DI_EAST,
Expand Down
56 changes: 22 additions & 34 deletions doomsday/apps/plugins/hexen/src/p_inter.c
Expand Up @@ -1784,68 +1784,56 @@ dd_bool P_MorphPlayer(player_t* player)
return true;
}

dd_bool P_MorphMonster(mobj_t* actor)
dd_bool P_MorphMonster(mobj_t *actor)
{
mobj_t* master, *monster, *fog;
mobj_t * master, *monster, *fog;
mobjtype_t moType;
coord_t pos[3];
mobj_t oldMonster;
angle_t oldAngle;
coord_t pos[3];
mobj_t oldMonster;
angle_t oldAngle;

if(actor->player)
return (false);
if(!(actor->flags & MF_COUNTKILL))
return false;
if(actor->flags2 & MF2_BOSS)
return false;
if (actor->player) return (false);
if (!(actor->flags & MF_COUNTKILL)) return false;
if (actor->flags2 & MF2_BOSS) return false;

moType = actor->type;
switch(moType)
{
case MT_PIG:
case MT_FIGHTER_BOSS:
case MT_CLERIC_BOSS:
case MT_MAGE_BOSS:
return false;
// Originally hardcoded to specific mobj types.
if (actor->flags3 & MF3_NOMORPH) return false;

default:
break;
}
moType = actor->type;

/// @todo Do this properly!
oldMonster = *actor;

pos[VX] = actor->origin[VX];
pos[VY] = actor->origin[VY];
pos[VZ] = actor->origin[VZ];
pos[VX] = actor->origin[VX];
pos[VY] = actor->origin[VY];
pos[VZ] = actor->origin[VZ];
oldAngle = actor->angle;

if(!(monster = P_SpawnMobj(MT_PIG, pos, oldMonster.angle, 0)))
return false;
if (!(monster = P_SpawnMobj(MT_PIG, pos, oldMonster.angle, 0))) return false;

P_MobjRemoveFromTIDList(actor);
P_MobjChangeState(actor, S_FREETARGMOBJ);

if((fog = P_SpawnMobjXYZ(MT_TFOG, pos[VX], pos[VY],
pos[VZ] + TELEFOGHEIGHT, oldAngle + ANG180, 0)))
if ((fog = P_SpawnMobjXYZ(
MT_TFOG, pos[VX], pos[VY], pos[VZ] + TELEFOGHEIGHT, oldAngle + ANG180, 0)))
S_StartSound(SFX_TELEPORT, fog);

monster->special2 = moType;
monster->special1 = MORPHTICS + P_Random();
monster->flags |= (oldMonster.flags & MF_SHADOW);
monster->target = oldMonster.target;
monster->tid = oldMonster.tid;
monster->target = oldMonster.target;
monster->tid = oldMonster.tid;
monster->special = oldMonster.special;
P_MobjInsertIntoTIDList(monster, oldMonster.tid);
memcpy(monster->args, oldMonster.args, 5);

// Check for turning off minotaur power for active icon.
if(moType == MT_MINOTAUR)
if (moType == MT_MINOTAUR)
{
master = oldMonster.tracer;
if(master && master->health > 0)
if (master && master->health > 0)
{
if(!ActiveMinotaur(master->player))
if (!ActiveMinotaur(master->player))
{
master->player->powers[PT_MINOTAUR] = 0;
}
Expand Down

0 comments on commit 2ed1b8a

Please sign in to comment.