- Fixed: ActorFlagSetOrReset() wasn't receiving the + or - character from

ParseActorProperties().
- Fixed: The decorate FindFlag() function returned flags from ActorFlags
  instead of the passed flags set.
- Fixed: The CHT_CHAINSAW, CHT_POWER, CHT_HEALTH, and CHT_RESSURECT needed
  NULL player->mo checks.
- Fixed: The "give all" command didn't give the backpack in Doom, and it
  must give the backpack before giving ammo.
- Fixed: P_SetPsprite() must not call the action function if the player is
  not attached to an actor. This can happen, for instance, if the level is
  destroyed while the player is holding a powered-up Phoenix Rod. As part
  of its EndPowerup() function, it sets the psprite to the regular version,
  but the player actor has already been destroyed.
- Fixed: FinishThingdef() needs to check for valid names, because weapons
  could have inherited valid pointers from their superclass.
- Fixed: fuglyname didn't work.
- Fixed: Redefining $ambient sounds leaked memory.
- Added Jim's crashcatcher.c fix for better shell support.
- VC7.1 seems to have no trouble distinguishing between passing a (const
  TypeInfo *) reference to operator<< and the generic, templated (object *)
  version, so a few places that can benefit from it now use it. I believe
  VC6 had problems with this, which is why I didn't do it all along. The
  function's implementation was also moved out of dobject.cpp and into
  farchive.cpp.
- Fixed: UnpackPixels() unpacked all chunks in a byte, which is wrong for the
  last byte in a row if the image width is not an even multiple of the number
  pixels per byte.
- Fixed: P_TranslateLineDef() should only clear monster activation for secret
  useable lines, not crossable lines.
- Fixed: Some leftover P_IsHostile() calls still needed to be rewritten.
- Fixed: AWeaponHolder::Serialize() wrote the class type in all circumstances.


SVN r20 (trunk)
This commit is contained in:
Randy Heit 2006-03-14 06:11:39 +00:00
commit 09c28e5bf9
19 changed files with 176 additions and 103 deletions

View file

@ -162,12 +162,15 @@ void cht_DoCheat (player_t *player, int cheat)
break;
case CHT_CHAINSAW:
type = TypeInfo::FindType ("Chainsaw");
if (player->mo->FindInventory (type) == NULL)
if (player->mo != NULL)
{
player->mo->GiveInventoryType (type);
type = TypeInfo::FindType ("Chainsaw");
if (player->mo->FindInventory (type) == NULL)
{
player->mo->GiveInventoryType (type);
}
msg = GStrings("STSTR_CHOPPERS");
}
msg = GStrings("STSTR_CHOPPERS");
// [RH] The original cheat also set powers[pw_invulnerability] to true.
// Since this is a timer and not a boolean, it effectively turned off
// the invulnerability powerup, although it looks like it was meant to
@ -175,16 +178,19 @@ void cht_DoCheat (player_t *player, int cheat)
break;
case CHT_POWER:
item = player->mo->FindInventory (RUNTIME_CLASS(APowerWeaponLevel2));
if (item != NULL)
if (player->mo != NULL)
{
item->Destroy ();
msg = GStrings("TXT_CHEATPOWEROFF");
}
else
{
player->mo->GiveInventoryType (RUNTIME_CLASS(APowerWeaponLevel2));
msg = GStrings("TXT_CHEATPOWERON");
item = player->mo->FindInventory (RUNTIME_CLASS(APowerWeaponLevel2));
if (item != NULL)
{
item->Destroy ();
msg = GStrings("TXT_CHEATPOWEROFF");
}
else
{
player->mo->GiveInventoryType (RUNTIME_CLASS(APowerWeaponLevel2));
msg = GStrings("TXT_CHEATPOWERON");
}
}
break;
@ -250,8 +256,11 @@ void cht_DoCheat (player_t *player, int cheat)
break;
case CHT_HEALTH:
player->health = player->mo->health = player->mo->GetDefault()->health;
msg = GStrings("TXT_CHEATHEALTH");
if (player->mo != NULL)
{
player->health = player->mo->health = player->mo->GetDefault()->health;
msg = GStrings("TXT_CHEATHEALTH");
}
break;
case CHT_KEYS:
@ -261,7 +270,7 @@ void cht_DoCheat (player_t *player, int cheat)
// [GRB]
case CHT_RESSURECT:
if (player->playerstate != PST_LIVE)
if (player->playerstate != PST_LIVE && player->mo != NULL)
{
player->playerstate = PST_LIVE;
player->health = player->mo->health = player->mo->GetDefault()->health;
@ -274,7 +283,7 @@ void cht_DoCheat (player_t *player, int cheat)
break;
case CHT_TAKEWEAPS:
if (player->morphTics)
if (player->morphTics || player->mo != NULL)
{
return;
}
@ -314,7 +323,7 @@ void cht_DoCheat (player_t *player, int cheat)
case CHT_MDK:
if (player->mo == NULL)
{
Printf ("MDK won't work outside of a game.\n");
Printf ("What do you want to kill outside of a game?\n");
}
else if (!deathmatch)
{
@ -456,6 +465,34 @@ void cht_Give (player_t *player, char *name, int amount)
return;
}
if (giveall || stricmp (name, "backpack") == 0)
{
// Select the correct type of backpack based on the game
if (gameinfo.gametype == GAME_Heretic)
{
type = TypeInfo::FindType ("BagOfHolding");
}
else if (gameinfo.gametype == GAME_Strife)
{
type = TypeInfo::FindType ("AmmoSatchel");
}
else if (gameinfo.gametype == GAME_Doom)
{
type = TypeInfo::FindType ("Backpack");
}
else
{ // Hexen doesn't have a backpack, foo!
type = NULL;
}
if (type != NULL)
{
GiveSpawner (player, type, 1);
}
if (!giveall)
return;
}
if (giveall || stricmp (name, "ammo") == 0)
{
// Find every unique type of ammo. Give it to the player if
@ -596,23 +633,6 @@ void cht_Give (player_t *player, char *name, int amount)
return;
}
if (giveall || stricmp (name, "backpack") == 0)
{
// Select the correct type of backpack based on the game
if (gameinfo.gametype == GAME_Heretic)
{
name = "BagOfHolding";
}
else if (gameinfo.gametype == GAME_Strife)
{
name = "AmmoSatchel";
}
else if (gameinfo.gametype == GAME_Hexen && giveall)
{ // Hexen doesn't have a backpack, foo!
return;
}
}
type = TypeInfo::IFindType (name);
if (type == NULL || !type->IsDescendantOf (RUNTIME_CLASS(AInventory)))
{