- Removed the check for Heretic when playing *evillaugh when using the

Chaos Device. This sound is not defined by the other games so it won't
  play by default.
- Added MORPH_UNDOBYTOMEOFPOWER and MORPH_UNDOBYCHAOSDEVICE flags
  for the morph style so that the special behavior of these two items
  can be switched on and off. 

SVN r890 (trunk)
This commit is contained in:
Christoph Oelckers 2008-04-08 09:52:50 +00:00
parent a424a2f2a9
commit 4dc1b9579e
7 changed files with 34 additions and 12 deletions

View file

@ -1,4 +1,10 @@
April 8, 2008 (Changes by Graf Zahl) April 8, 2008 (Changes by Graf Zahl)
- Removed the check for Heretic when playing *evillaugh when using the
Chaos Device. This sound is not defined by the other games so it won't
play by default.
- Added MORPH_UNDOMORPHBYTOMEOFPOWER and MORPH_UNDOMORPHBYCHAOSDEVICE flags
for the morph style so that the special behavior of these two items
can be switched on and off.
- Added Martin Howe's morph system enhancement. - Added Martin Howe's morph system enhancement.
April 7, 2008 (Changes by Graf Zahl) April 7, 2008 (Changes by Graf Zahl)

View file

@ -32,7 +32,7 @@ END_DEFAULTS
bool AArtiTomeOfPower::Use (bool pickup) bool AArtiTomeOfPower::Use (bool pickup)
{ {
if (Owner->player->morphTics) if (Owner->player->morphTics && (Owner->player->MorphStyle & MORPH_UNDOBYTOMEOFPOWER))
{ // Attempt to undo chicken { // Attempt to undo chicken
if (!P_UndoPlayerMorph (Owner->player)) if (!P_UndoPlayerMorph (Owner->player))
{ // Failed { // Failed

View file

@ -59,11 +59,18 @@ bool AArtiTeleport::Use (bool pickup)
destAngle = ANG45 * (playerstarts[Owner->player - players].angle/45); destAngle = ANG45 * (playerstarts[Owner->player - players].angle/45);
} }
P_Teleport (Owner, destX, destY, ONFLOORZ, destAngle, true, true, false); P_Teleport (Owner, destX, destY, ONFLOORZ, destAngle, true, true, false);
if (gameinfo.gametype == GAME_Hexen && Owner->player->morphTics) if (Owner->player->morphTics && (Owner->player->MorphStyle & MORPH_UNDOBYCHAOSDEVICE))
{ // Teleporting away will undo any morph effects (pig) { // Teleporting away will undo any morph effects (pig)
P_UndoPlayerMorph (Owner->player); if (P_UndoPlayerMorph (Owner->player))
{
Owner->player->MorphedPlayerClass = 0;
Owner->player->MorphStyle = 0;
Owner->player->MorphExitFlash = NULL;
} }
if (gameinfo.gametype == GAME_Heretic) }
// The game check is not necessary because only Heretic defines *evillaugh by default
// However if it is there no other game can use it if it wants to.
//if (gameinfo.gametype == GAME_Heretic)
{ // Full volume laugh { // Full volume laugh
S_Sound (Owner, CHAN_VOICE, "*evillaugh", 1, ATTN_NONE); S_Sound (Owner, CHAN_VOICE, "*evillaugh", 1, ATTN_NONE);
} }

View file

@ -17,7 +17,7 @@ enum
MORPH_UNDOBYCHAOSDEVICE = 8, MORPH_UNDOBYCHAOSDEVICE = 8,
}; };
class PClass; struct PClass;
class AActor; class AActor;
class player_s; class player_s;

View file

@ -431,18 +431,23 @@ const char *cht_Morph (player_t *player, const PClass *morphclass, bool quickund
return ""; return "";
} }
PClass *oldclass = player->mo->GetClass(); PClass *oldclass = player->mo->GetClass();
// Set the standard morph style for the current game
int style = MORPH_UNDOBYTOMEOFPOWER;
if (gameinfo.gametype == GAME_Hexen) style |= MORPH_UNDOBYCHAOSDEVICE;
if (player->morphTics) if (player->morphTics)
{ {
if (P_UndoPlayerMorph (player)) if (P_UndoPlayerMorph (player))
{ {
if (!quickundo && oldclass != morphclass && P_MorphPlayer (player, morphclass)) if (!quickundo && oldclass != morphclass && P_MorphPlayer (player, morphclass, 0, style))
{ {
return "You feel even stranger."; return "You feel even stranger.";
} }
return "You feel like yourself again."; return "You feel like yourself again.";
} }
} }
else if (P_MorphPlayer (player, morphclass)) else if (P_MorphPlayer (player, morphclass, 0, style))
{ {
return "You feel strange..."; return "You feel strange...";
} }

View file

@ -749,10 +749,10 @@ static bool CheckFloatParm(FScanner &sc)
static int ParseMorphStyle (FScanner &sc) static int ParseMorphStyle (FScanner &sc)
{ {
static const char * morphstyles[]={ static const char * morphstyles[]={
"MRF_ADDSTAMINA", "MRF_FULLHEALTH", NULL}; "MRF_ADDSTAMINA", "MRF_FULLHEALTH", "MRF_UNDOBYTOMEOFPOWER", "MRF_UNDOBYCHAOSDEVICE", NULL};
static const int morphstyle_values[]={ static const int morphstyle_values[]={
MORPH_ADDSTAMINA, MORPH_FULLHEALTH}; MORPH_ADDSTAMINA, MORPH_FULLHEALTH, MORPH_UNDOBYTOMEOFPOWER, MORPH_UNDOBYCHAOSDEVICE};
// May be given flags by number... // May be given flags by number...
if (sc.CheckNumber()) if (sc.CheckNumber())
@ -762,6 +762,8 @@ static int ParseMorphStyle (FScanner &sc)
} }
// ... else should be flags by name. // ... else should be flags by name.
// NOTE: Later this should be removed and a normal expression used.
// The current DECORATE parser can't handle this though.
bool gotparen = sc.CheckString("("); bool gotparen = sc.CheckString("(");
int style = 0; int style = 0;
do do
@ -2679,7 +2681,7 @@ static const ActorProps props[] =
{ "morphprojectile.duration", (apf)EggFXDuration, RUNTIME_CLASS(AMorphProjectile) }, { "morphprojectile.duration", (apf)EggFXDuration, RUNTIME_CLASS(AMorphProjectile) },
{ "morphprojectile.monsterclass", (apf)EggFXMonsterClass, RUNTIME_CLASS(AMorphProjectile) }, { "morphprojectile.monsterclass", (apf)EggFXMonsterClass, RUNTIME_CLASS(AMorphProjectile) },
{ "morphprojectile.morphflash", (apf)EggFXMorphFlash, RUNTIME_CLASS(AMorphProjectile) }, { "morphprojectile.morphflash", (apf)EggFXMorphFlash, RUNTIME_CLASS(AMorphProjectile) },
// { "morphprojectile.morphstyle", (apf)EggFXMorphStyle, RUNTIME_CLASS(AMorphProjectile) }, { "morphprojectile.morphstyle", (apf)EggFXMorphStyle, RUNTIME_CLASS(AMorphProjectile) },
{ "morphprojectile.playerclass", (apf)EggFXPlayerClass, RUNTIME_CLASS(AMorphProjectile) }, { "morphprojectile.playerclass", (apf)EggFXPlayerClass, RUNTIME_CLASS(AMorphProjectile) },
{ "morphprojectile.unmorphflash", (apf)EggFXUnMorphFlash, RUNTIME_CLASS(AMorphProjectile) }, { "morphprojectile.unmorphflash", (apf)EggFXUnMorphFlash, RUNTIME_CLASS(AMorphProjectile) },
{ "obituary", ActorObituary, RUNTIME_CLASS(AActor) }, { "obituary", ActorObituary, RUNTIME_CLASS(AActor) },
@ -2708,7 +2710,7 @@ static const ActorProps props[] =
{ "player.viewheight", (apf)PlayerViewHeight, RUNTIME_CLASS(APlayerPawn) }, { "player.viewheight", (apf)PlayerViewHeight, RUNTIME_CLASS(APlayerPawn) },
{ "poisondamage", ActorPoisonDamage, RUNTIME_CLASS(AActor) }, { "poisondamage", ActorPoisonDamage, RUNTIME_CLASS(AActor) },
{ "powermorph.morphflash", (apf)PowerMorphMorphFlash, RUNTIME_CLASS(APowerMorph) }, { "powermorph.morphflash", (apf)PowerMorphMorphFlash, RUNTIME_CLASS(APowerMorph) },
//{ "powermorph.morphstyle", (apf)PowerMorphMorphStyle, RUNTIME_CLASS(APowerMorph) }, { "powermorph.morphstyle", (apf)PowerMorphMorphStyle, RUNTIME_CLASS(APowerMorph) },
{ "powermorph.playerclass", (apf)PowerMorphPlayerClass, RUNTIME_CLASS(APowerMorph) }, { "powermorph.playerclass", (apf)PowerMorphPlayerClass, RUNTIME_CLASS(APowerMorph) },
{ "powermorph.unmorphflash", (apf)PowerMorphUnMorphFlash, RUNTIME_CLASS(APowerMorph) }, { "powermorph.unmorphflash", (apf)PowerMorphUnMorphFlash, RUNTIME_CLASS(APowerMorph) },
{ "powerup.color", (apf)PowerupColor, RUNTIME_CLASS(APowerupGiver) }, { "powerup.color", (apf)PowerupColor, RUNTIME_CLASS(APowerupGiver) },

View file

@ -10,6 +10,7 @@ ACTOR EggFX : MorphProjectile
Speed 18 Speed 18
MorphProjectile.PlayerClass "ChickenPlayer" MorphProjectile.PlayerClass "ChickenPlayer"
MorphProjectile.MonsterClass "Chicken" MorphProjectile.MonsterClass "Chicken"
MorphProjectile.MorphStyle MRF_UNDOBYTOMEOFPOWER
States States
{ {
Spawn: Spawn:
@ -63,6 +64,7 @@ ACTOR PorkFX : MorphProjectile
Speed 18 Speed 18
MorphProjectile.PlayerClass "PigPlayer" MorphProjectile.PlayerClass "PigPlayer"
MorphProjectile.MonsterClass "Pig" MorphProjectile.MonsterClass "Pig"
MorphProjectile.MorphStyle MRF_UNDOBYTOMEOFPOWER|MRF_UNDOBYCHAOSDEVICE
States States
{ {
Spawn: Spawn: