mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-18 02:12:00 +00:00
216 lines
4.4 KiB
C++
216 lines
4.4 KiB
C++
|
#include "a_pickups.h"
|
||
|
#include "a_strifeglobal.h"
|
||
|
|
||
|
// Coin ---------------------------------------------------------------------
|
||
|
|
||
|
FState ACoin::States[] =
|
||
|
{
|
||
|
S_NORMAL (COIN, 'A', -1, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
IMPLEMENT_ACTOR (ACoin, Strife, 93, 0)
|
||
|
PROP_StrifeType (168)
|
||
|
PROP_StrifeTeaserType (161)
|
||
|
PROP_StrifeTeaserType2 (165)
|
||
|
PROP_SpawnState (0)
|
||
|
PROP_Flags (MF_SPECIAL|MF_DROPPED|MF_NOTDMATCH)
|
||
|
PROP_Flags2 (MF2_FLOORCLIP)
|
||
|
PROP_Inventory_MaxAmountLong (INT_MAX)
|
||
|
PROP_Inventory_FlagsSet (IF_INVBAR)
|
||
|
PROP_Inventory_Icon ("I_COIN")
|
||
|
PROP_Tag ("coin")
|
||
|
END_DEFAULTS
|
||
|
|
||
|
const char *ACoin::PickupMessage ()
|
||
|
{
|
||
|
if (Amount == 1)
|
||
|
{
|
||
|
return "You picked up the coin.";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
static char msg[64];
|
||
|
|
||
|
sprintf (msg, "You picked up %d gold.", Amount);
|
||
|
return msg;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool ACoin::HandlePickup (AInventory *item)
|
||
|
{
|
||
|
if (item->IsKindOf (RUNTIME_CLASS(ACoin)))
|
||
|
{
|
||
|
if (Amount < MaxAmount)
|
||
|
{
|
||
|
if (MaxAmount - Amount < item->Amount)
|
||
|
{
|
||
|
Amount = MaxAmount;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Amount += item->Amount;
|
||
|
}
|
||
|
item->ItemFlags |= IF_PICKUPGOOD;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
if (Inventory != NULL)
|
||
|
{
|
||
|
return Inventory->HandlePickup (item);
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
AInventory *ACoin::CreateCopy (AActor *other)
|
||
|
{
|
||
|
if (GetClass() == RUNTIME_CLASS(ACoin))
|
||
|
{
|
||
|
return Super::CreateCopy (other);
|
||
|
}
|
||
|
AInventory *copy = Spawn<ACoin> (0,0,0);
|
||
|
copy->Amount = Amount;
|
||
|
copy->BecomeItem ();
|
||
|
GoAwayAndDie ();
|
||
|
return copy;
|
||
|
}
|
||
|
|
||
|
// 10 Gold ------------------------------------------------------------------
|
||
|
|
||
|
class AGold10 : public ACoin
|
||
|
{
|
||
|
DECLARE_ACTOR (AGold10, ACoin)
|
||
|
};
|
||
|
|
||
|
FState AGold10::States[] =
|
||
|
{
|
||
|
S_NORMAL (CRED, 'A', -1, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
IMPLEMENT_ACTOR (AGold10, Strife, 138, 0)
|
||
|
PROP_StrifeType (169)
|
||
|
PROP_StrifeTeaserType (162)
|
||
|
PROP_StrifeTeaserType2 (166)
|
||
|
PROP_SpawnState (0)
|
||
|
PROP_Inventory_Amount (10)
|
||
|
PROP_Tag ("10_gold")
|
||
|
END_DEFAULTS
|
||
|
|
||
|
// 25 Gold ------------------------------------------------------------------
|
||
|
|
||
|
class AGold25 : public ACoin
|
||
|
{
|
||
|
DECLARE_ACTOR (AGold25, ACoin)
|
||
|
};
|
||
|
|
||
|
FState AGold25::States[] =
|
||
|
{
|
||
|
S_NORMAL (SACK, 'A', -1, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
IMPLEMENT_ACTOR (AGold25, Strife, 139, 0)
|
||
|
PROP_StrifeType (170)
|
||
|
PROP_StrifeTeaserType (163)
|
||
|
PROP_StrifeTeaserType2 (167)
|
||
|
PROP_SpawnState (0)
|
||
|
PROP_Inventory_Amount (25)
|
||
|
PROP_Tag ("25_gold")
|
||
|
END_DEFAULTS
|
||
|
|
||
|
// 50 Gold ------------------------------------------------------------------
|
||
|
|
||
|
class AGold50 : public ACoin
|
||
|
{
|
||
|
DECLARE_ACTOR (AGold50, ACoin)
|
||
|
};
|
||
|
|
||
|
FState AGold50::States[] =
|
||
|
{
|
||
|
S_NORMAL (CHST, 'A', -1, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
IMPLEMENT_ACTOR (AGold50, Strife, 140, 0)
|
||
|
PROP_StrifeType (171)
|
||
|
PROP_StrifeTeaserType (164)
|
||
|
PROP_StrifeTeaserType2 (168)
|
||
|
PROP_SpawnState (0)
|
||
|
PROP_Inventory_Amount (50)
|
||
|
PROP_Tag ("50_gold")
|
||
|
END_DEFAULTS
|
||
|
|
||
|
// 300 Gold ------------------------------------------------------------------
|
||
|
|
||
|
class AGold300 : public ACoin
|
||
|
{
|
||
|
DECLARE_ACTOR (AGold300, ACoin)
|
||
|
public:
|
||
|
bool TryPickup (AActor *toucher);
|
||
|
};
|
||
|
|
||
|
FState AGold300::States[] =
|
||
|
{
|
||
|
S_NORMAL (TOKN, 'A', -1, NULL, NULL)
|
||
|
};
|
||
|
|
||
|
IMPLEMENT_ACTOR (AGold300, Strife, -1, 0)
|
||
|
PROP_StrifeType (172)
|
||
|
PROP_SpawnState (0)
|
||
|
PROP_Inventory_AmountWord (300)
|
||
|
PROP_Tag ("300_gold")
|
||
|
END_DEFAULTS
|
||
|
|
||
|
bool AGold300::TryPickup (AActor *toucher)
|
||
|
{
|
||
|
toucher->GiveInventoryType (QuestItemClasses[2]);
|
||
|
return Super::TryPickup (toucher);
|
||
|
}
|
||
|
|
||
|
//===========================================================================
|
||
|
//
|
||
|
// ACoin :: CreateTossable
|
||
|
//
|
||
|
// Gold drops in increments of 50 if you have that much, less if you don't.
|
||
|
//
|
||
|
//===========================================================================
|
||
|
|
||
|
AInventory *ACoin::CreateTossable ()
|
||
|
{
|
||
|
ACoin *tossed;
|
||
|
|
||
|
if ((ItemFlags & IF_UNDROPPABLE) || Owner == NULL || Amount <= 0)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
if (Amount >= 50)
|
||
|
{
|
||
|
Amount -= 50;
|
||
|
tossed = Spawn<AGold50> (Owner->x, Owner->y, Owner->z);
|
||
|
}
|
||
|
else if (Amount >= 25)
|
||
|
{
|
||
|
Amount -= 25;
|
||
|
tossed = Spawn<AGold25> (Owner->x, Owner->y, Owner->z);
|
||
|
}
|
||
|
else if (Amount >= 10)
|
||
|
{
|
||
|
Amount -= 10;
|
||
|
tossed = Spawn<AGold10> (Owner->x, Owner->y, Owner->z);
|
||
|
}
|
||
|
else if (Amount > 1)
|
||
|
{
|
||
|
Amount -= 1;
|
||
|
tossed = Spawn<ACoin> (Owner->x, Owner->y, Owner->z);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
BecomePickup ();
|
||
|
tossed = this;
|
||
|
}
|
||
|
tossed->flags &= ~(MF_SPECIAL|MF_SOLID);
|
||
|
tossed->DropTime = 30;
|
||
|
if (tossed != this && Amount <= 0)
|
||
|
{
|
||
|
Destroy ();
|
||
|
}
|
||
|
return tossed;
|
||
|
}
|