#include "a_keys.h"
#include "a_strifeglobal.h"
#include "p_local.h"

IMPLEMENT_STATELESS_ACTOR (AStrifeKey, Strife, -1, 0)
	PROP_RadiusFixed (20)
	PROP_HeightFixed (16)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_Flags2 (MF2_FLOORCLIP)
END_DEFAULTS

// Base Key -----------------------------------------------------------------

class ABaseKey : public AStrifeKey
{
	DECLARE_ACTOR (ABaseKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState ABaseKey::States[] =
{
	S_NORMAL (FUSL, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (ABaseKey, Strife, 230, 0)
	PROP_StrifeType (133)
	PROP_StrifeTeaserType (129)
	PROP_StrifeTeaserType2 (132)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (1)
	PROP_Inventory_Icon ("I_FUSL")
	PROP_Tag ("Base_Key")
END_DEFAULTS

const char *ABaseKey::PickupMessage ()
{
	return "You picked up the Base Key.";
}

// Govs Key -----------------------------------------------------------------

class AGovsKey : public AStrifeKey
{
	DECLARE_ACTOR (AGovsKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState AGovsKey::States[] =
{
	S_NORMAL (REBL, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AGovsKey, Strife, -1, 0)
	PROP_StrifeType (134)
	PROP_StrifeTeaserType (130)
	PROP_StrifeTeaserType2 (133)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (2)
	PROP_Inventory_Icon ("I_REBL")
	PROP_Tag ("Govs_Key")	// "Rebel_Key" in the Teaser
END_DEFAULTS

const char *AGovsKey::PickupMessage ()
{
	return "You picked up the Govs Key.";
}

// Passcard -----------------------------------------------------------------

class APasscard : public AStrifeKey
{
	DECLARE_ACTOR (APasscard, AStrifeKey)
public:
	const char *PickupMessage ();
	const char *NeedKeyMessage (bool remote, int keynum);
};

FState APasscard::States[] =
{
	S_NORMAL (TPAS, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (APasscard, Strife, 185, 0)
	PROP_StrifeType (135)
	PROP_StrifeTeaserType (131)
	PROP_StrifeTeaserType2 (134)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (3)
	PROP_Inventory_Icon ("I_TPAS")
	PROP_Tag ("Passcard")
END_DEFAULTS

const char *APasscard::PickupMessage ()
{
	return "You picked up the Passcard.";
}

const char *APasscard::NeedKeyMessage (bool remote, int keynum)
{
	return remote ? "You need a pass card"
		: "You need a pass card to open this door";
}

// ID Badge -----------------------------------------------------------------

class AIDBadge : public AStrifeKey
{
	DECLARE_ACTOR (AIDBadge, AStrifeKey)
public:
	const char *PickupMessage ();
	const char *NeedKeyMessage (bool remote, int keynum);
};

FState AIDBadge::States[] =
{
	S_NORMAL (CRD1, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AIDBadge, Strife, 184, 0)
	PROP_StrifeType (136)
	PROP_StrifeTeaserType (132)
	PROP_StrifeTeaserType2 (135)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (4)
	PROP_Inventory_Icon ("I_CRD1")
	PROP_Tag ("ID_Badge")
END_DEFAULTS

const char *AIDBadge::PickupMessage ()
{
	return "You picked up the ID Badge.";
}

const char *AIDBadge::NeedKeyMessage (bool remote, int keynum)
{
	return remote ? "You need an id badge" :
		"You need an id badge to open this door";
}

// Prison Key ---------------------------------------------------------------

class APrisonKey : public AStrifeKey
{
	DECLARE_ACTOR (APrisonKey, AStrifeKey)
public:
	bool TryPickup (AActor *toucher);
	const char *PickupMessage ();
	const char *NeedKeyMessage (bool remote, int keynum);
};

FState APrisonKey::States[] =
{
	S_NORMAL (PRIS, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (APrisonKey, Strife, -1, 0)
	PROP_StrifeType (137)
	PROP_StrifeTeaserType (133)
	PROP_StrifeTeaserType2 (136)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (5)
	PROP_Inventory_Icon ("I_PRIS")
	PROP_Tag ("Prison_Key")
END_DEFAULTS

bool APrisonKey::TryPickup (AActor *toucher)
{
	if (Super::TryPickup (toucher))
	{
		toucher->GiveInventoryType (QuestItemClasses[10]);
		return true;
	}
	return false;
}

const char *APrisonKey::PickupMessage ()
{
	return "You picked up the Prsion Key.";
}

const char *APrisonKey::NeedKeyMessage (bool remote, int keynum)
{
	return "You don't have the key to the prison";
}

// Severed Hand -------------------------------------------------------------

class ASeveredHand : public AStrifeKey
{
	DECLARE_ACTOR (ASeveredHand, AStrifeKey)
public:
	bool TryPickup (AActor *toucher);
	const char *PickupMessage ();
	const char *NeedKeyMessage (bool remote, int keynum);
};

FState ASeveredHand::States[] =
{
	S_NORMAL (HAND, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (ASeveredHand, Strife, 91, 0)
	PROP_StrifeType (138)
	PROP_StrifeTeaserType (134)
	PROP_StrifeTeaserType2 (137)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (6)
	PROP_Inventory_Icon ("I_HAND")
	PROP_Tag ("Severed_Hand")
END_DEFAULTS

bool ASeveredHand::TryPickup (AActor *toucher)
{
	if (Super::TryPickup (toucher))
	{
		toucher->GiveInventoryType (QuestItemClasses[11]);
		return true;
	}
	return false;
}

const char *ASeveredHand::PickupMessage ()
{
	return "You picked up the Severed Hand.";
}

const char *ASeveredHand::NeedKeyMessage (bool remote, int keynum)
{
	return "Hand print not on file";
}

// Power1 Key ---------------------------------------------------------------

class APower1Key : public AStrifeKey
{
	DECLARE_ACTOR (APower1Key, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState APower1Key::States[] =
{
	S_NORMAL (PWR1, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (APower1Key, Strife, -1, 0)
	PROP_StrifeType (139)
	PROP_StrifeTeaserType (135)
	PROP_StrifeTeaserType2 (138)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (7)
	PROP_Inventory_Icon ("I_PWR1")
	PROP_Tag ("Power1_Key")
END_DEFAULTS

const char *APower1Key::PickupMessage ()
{
	return "You picked up the Power1 Key.";
}

// Power2 Key ---------------------------------------------------------------

class APower2Key : public AStrifeKey
{
	DECLARE_ACTOR (APower2Key, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState APower2Key::States[] =
{
	S_NORMAL (PWR2, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (APower2Key, Strife, -1, 0)
	PROP_StrifeType (140)
	PROP_StrifeTeaserType (136)
	PROP_StrifeTeaserType2 (139)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (8)
	PROP_Inventory_Icon ("I_PWR2")
	PROP_Tag ("Power2_Key")
END_DEFAULTS

const char *APower2Key::PickupMessage ()
{
	return "You picked up the Power2 Key.";
}

// Power3 Key ---------------------------------------------------------------

class APower3Key : public AStrifeKey
{
	DECLARE_ACTOR (APower3Key, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState APower3Key::States[] =
{
	S_NORMAL (PWR3, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (APower3Key, Strife, -1, 0)
	PROP_StrifeType (141)
	PROP_StrifeTeaserType (137)
	PROP_StrifeTeaserType2 (140)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (9)
	PROP_Inventory_Icon ("I_PWR3")
	PROP_Tag ("Power3_Key")
END_DEFAULTS

const char *APower3Key::PickupMessage ()
{
	return "You picked up the Power3 Key.";
}

// Gold Key -----------------------------------------------------------------

class AGoldKey : public AStrifeKey
{
	DECLARE_ACTOR (AGoldKey, AStrifeKey)
public:
	const char *PickupMessage ();
	const char *NeedKeyMessage (bool remote, int keynum);
};

FState AGoldKey::States[] =
{
	S_NORMAL (KY1G, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AGoldKey, Strife, 40, 0)
	PROP_StrifeType (142)
	PROP_StrifeTeaserType (138)
	PROP_StrifeTeaserType2 (141)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (10)
	PROP_Inventory_Icon ("I_KY1G")
	PROP_Tag ("Gold_Key")
END_DEFAULTS

const char *AGoldKey::PickupMessage ()
{
	return "You picked up the Gold Key.";
}

const char *AGoldKey::NeedKeyMessage (bool remote, int keynum)
{
	return "You need a gold key";
}

// ID Card ------------------------------------------------------------------

class AIDCard : public AStrifeKey
{
	DECLARE_ACTOR (AIDCard, AStrifeKey)
public:
	const char *PickupMessage ();
	const char *NeedKeyMessage (bool remote, int keynum);
};

FState AIDCard::States[] =
{
	S_NORMAL (CRD2, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AIDCard, Strife, 13, 0)
	PROP_StrifeType (143)
	PROP_StrifeTeaserType (139)
	PROP_StrifeTeaserType2 (142)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (11)
	PROP_Inventory_Icon ("I_CRD2")
	PROP_Tag ("ID_Card")
END_DEFAULTS

const char *AIDCard::PickupMessage ()
{
	return "You picked up the ID Card.";
}

const char *AIDCard::NeedKeyMessage (bool remote, int keynum)
{
	return remote ? "You need an id card"
		: "You need an id card to open this door";
}


// Silver Key ---------------------------------------------------------------

class ASilverKey : public AStrifeKey
{
	DECLARE_ACTOR (ASilverKey, AStrifeKey)
public:
	const char *PickupMessage ();
	const char *NeedKeyMessage (bool remote, int keynum);
};

FState ASilverKey::States[] =
{
	S_NORMAL (KY2S, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (ASilverKey, Strife, 38, 0)
	PROP_StrifeType (144)
	PROP_StrifeTeaserType (140)
	PROP_StrifeTeaserType2 (143)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (12)
	PROP_Inventory_Icon ("I_KY2S")
	PROP_Tag ("Silver_Key")
END_DEFAULTS

const char *ASilverKey::PickupMessage ()
{
	return "You picked up the Silver Key.";
}

const char *ASilverKey::NeedKeyMessage (bool remote, int keynum)
{
	return "You need a silver key";
}

// Oracle Key ---------------------------------------------------------------

class AOracleKey : public AStrifeKey
{
	DECLARE_ACTOR (AOracleKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState AOracleKey::States[] =
{
	S_NORMAL (ORAC, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AOracleKey, Strife, 61, 0)
	PROP_StrifeType (145)
	PROP_StrifeTeaserType (141)
	PROP_StrifeTeaserType2 (144)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (13)
	PROP_Inventory_Icon ("I_ORAC")
	PROP_Tag ("Oracle_Key")
END_DEFAULTS

const char *AOracleKey::PickupMessage ()
{
	return "You picked up the Oracle Key.";
}

// Military ID --------------------------------------------------------------

class AMilitaryID : public AStrifeKey
{
	DECLARE_ACTOR (AMilitaryID, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState AMilitaryID::States[] =
{
	S_NORMAL (GYID, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AMilitaryID, Strife, -1, 0)
	PROP_StrifeType (146)
	PROP_StrifeTeaserType (142)
	PROP_StrifeTeaserType2 (145)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (14)
	PROP_Inventory_Icon ("I_GYID")
	PROP_Tag ("Military ID")
END_DEFAULTS

const char *AMilitaryID::PickupMessage ()
{
	return "You picked up the Military ID.";
}

// Order Key ----------------------------------------------------------------

class AOrderKey : public AStrifeKey
{
	DECLARE_ACTOR (AOrderKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState AOrderKey::States[] =
{
	S_NORMAL (FUBR, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AOrderKey, Strife, 86, 0)
	PROP_StrifeType (147)
	PROP_StrifeTeaserType (143)
	PROP_StrifeTeaserType2 (146)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (15)
	PROP_Inventory_Icon ("I_FUBR")
	PROP_Tag ("Order_Key")
END_DEFAULTS

const char *AOrderKey::PickupMessage ()
{
	return "You picked up the Order Key.";
}

// Warehouse Key ------------------------------------------------------------

class AWarehouseKey : public AStrifeKey
{
	DECLARE_ACTOR (AWarehouseKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState AWarehouseKey::States[] =
{
	S_NORMAL (WARE, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AWarehouseKey, Strife, 166, 0)
	PROP_StrifeType (148)
	PROP_StrifeTeaserType (144)
	PROP_StrifeTeaserType2 (147)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (16)
	PROP_Inventory_Icon ("I_WARE")
	PROP_Tag ("Warehouse_Key")
END_DEFAULTS

const char *AWarehouseKey::PickupMessage ()
{
	return "You picked up the Warehouse Key.";
}

// Brass Key ----------------------------------------------------------------

class ABrassKey : public AStrifeKey
{
	DECLARE_ACTOR (ABrassKey, AStrifeKey)
public:
	const char *PickupMessage ();
	const char *NeedKeyMessage (bool remote, int keynum);
};

FState ABrassKey::States[] =
{
	S_NORMAL (KY3B, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (ABrassKey, Strife, -1, 0)
	PROP_StrifeType (149)
	PROP_StrifeTeaserType (145)
	PROP_StrifeTeaserType2 (148)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (17)
	PROP_Inventory_Icon ("I_KY3B")
	PROP_Tag ("Brass_Key")
END_DEFAULTS

const char *ABrassKey::PickupMessage ()
{
	return "You picked up the Brass Key.";
}

const char *ABrassKey::NeedKeyMessage (bool remote, int keynum)
{
	return "You need a brass key";
}

// Red Crystal Key ----------------------------------------------------------

class ARedCrystalKey : public AStrifeKey
{
	DECLARE_ACTOR (ARedCrystalKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState ARedCrystalKey::States[] =
{
	S_BRIGHT (RCRY, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (ARedCrystalKey, Strife, 192, 0)
	PROP_StrifeType (150)
	PROP_StrifeTeaserType (146)
	PROP_StrifeTeaserType2 (149)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (18)
	PROP_Inventory_Icon ("I_RCRY")
	PROP_Tag ("Red_Crystal_Key")
END_DEFAULTS

const char *ARedCrystalKey::PickupMessage ()
{
	return "You picked up the Red Crystal Key.";
}

// Blue Crystal Key ---------------------------------------------------------

class ABlueCrystalKey : public AStrifeKey
{
	DECLARE_ACTOR (ABlueCrystalKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState ABlueCrystalKey::States[] =
{
	S_BRIGHT (BCRY, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (ABlueCrystalKey, Strife, 193, 0)
	PROP_StrifeType (151)
	PROP_StrifeTeaserType (147)
	PROP_StrifeTeaserType2 (150)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (19)
	PROP_Inventory_Icon ("I_BCRY")
	PROP_Tag ("Blue_Crystal_Key")
END_DEFAULTS

const char *ABlueCrystalKey::PickupMessage ()
{
	return "You picked up the Blue Crystal Key.";
}

// Chapel Key ---------------------------------------------------------------

class AChapelKey : public AStrifeKey
{
	DECLARE_ACTOR (AChapelKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState AChapelKey::States[] =
{
	S_NORMAL (CHAP, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AChapelKey, Strife, 195, 0)
	PROP_StrifeType (152)
	PROP_StrifeTeaserType (148)
	PROP_StrifeTeaserType2 (151)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (20)
	PROP_Inventory_Icon ("I_CHAP")
	PROP_Tag ("Chapel_Key")
END_DEFAULTS

const char *AChapelKey::PickupMessage ()
{
	return "You picked up the Chapel Key.";
}

// Catacomb Key -------------------------------------------------------------

class ACatacombKey : public AStrifeKey
{
	DECLARE_ACTOR (ACatacombKey, AStrifeKey)
public:
	bool TryPickup (AActor *toucher);
	const char *PickupMessage ();
};

FState ACatacombKey::States[] =
{
	S_NORMAL (TUNL, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (ACatacombKey, Strife, -1, 0)
	PROP_StrifeType (153)
	PROP_StrifeTeaserType (149)
	PROP_StrifeTeaserType2 (152)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (21)
	PROP_Inventory_Icon ("I_TUNL")
	PROP_Tag ("Catacomb_Key")	// "Tunnel_Key" in the Teaser
END_DEFAULTS

bool ACatacombKey::TryPickup (AActor *toucher)
{
	if (Super::TryPickup (toucher))
	{
		toucher->GiveInventoryType (QuestItemClasses[27]);
		return true;
	}
	return false;
}

const char *ACatacombKey::PickupMessage ()
{
	return "You picked up the Catacomb Key.";
}

// Security Key -------------------------------------------------------------

class ASecurityKey : public AStrifeKey
{
	DECLARE_ACTOR (ASecurityKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState ASecurityKey::States[] =
{
	S_NORMAL (SECK, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (ASecurityKey, Strife, -1, 0)
	PROP_StrifeType (154)
	PROP_StrifeTeaserType (150)
	PROP_StrifeTeaserType2 (153)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (22)
	PROP_Inventory_Icon ("I_SECK")
	PROP_Tag ("Security_Key")
END_DEFAULTS

const char *ASecurityKey::PickupMessage ()
{
	return "You picked up the Security Key.";
}

// Core Key -----------------------------------------------------------------

class ACoreKey : public AStrifeKey
{
	DECLARE_ACTOR (ACoreKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState ACoreKey::States[] =
{
	S_NORMAL (GOID, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (ACoreKey, Strife, 236, 0)
	PROP_StrifeType (155)
	PROP_StrifeTeaserType (151)
	PROP_StrifeTeaserType2 (154)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (23)
	PROP_Inventory_Icon ("I_GOID")
	PROP_Tag ("Core_Key")	// "New_Key1" in the Teaser
END_DEFAULTS

const char *ACoreKey::PickupMessage ()
{
	return "You picked up the Core Key.";
}

// Mauler Key ---------------------------------------------------------------

class AMaulerKey : public AStrifeKey
{
	DECLARE_ACTOR (AMaulerKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState AMaulerKey::States[] =
{
	S_NORMAL (BLTK, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AMaulerKey, Strife, 233, 0)
	PROP_StrifeType (156)
	PROP_StrifeTeaserType (152)
	PROP_StrifeTeaserType2 (155)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (24)
	PROP_Inventory_Icon ("I_BLTK")
	PROP_Tag ("Mauler_Key")	// "New_Key2" in the Teaser
END_DEFAULTS

const char *AMaulerKey::PickupMessage ()
{
	return "You picked up the Mauler Key.";
}

// Factory Key --------------------------------------------------------------

class AFactoryKey : public AStrifeKey
{
	DECLARE_ACTOR (AFactoryKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState AFactoryKey::States[] =
{
	S_NORMAL (PROC, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AFactoryKey, Strife, 234, 0)
	PROP_StrifeType (157)
	PROP_StrifeTeaserType (153)
	PROP_StrifeTeaserType2 (156)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (25)
	PROP_Inventory_Icon ("I_PROC")
	PROP_Tag ("Factory_Key")	// "New_Key3" in the Teaser
END_DEFAULTS

const char *AFactoryKey::PickupMessage ()
{
	return "You picked up the Factory Key.";
}

// Mine Key -----------------------------------------------------------------

class AMineKey : public AStrifeKey
{
	DECLARE_ACTOR (AMineKey, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState AMineKey::States[] =
{
	S_NORMAL (MINE, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AMineKey, Strife, 235, 0)
	PROP_StrifeType (158)
	PROP_StrifeTeaserType (154)
	PROP_StrifeTeaserType2 (157)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (26)
	PROP_Inventory_Icon ("I_MINE")	// "New_Key4" in the Teaser
	PROP_Tag ("MINE_KEY")
END_DEFAULTS

const char *AMineKey::PickupMessage ()
{
	return "You picked up the Mine Key.";
}

// New Key5 -----------------------------------------------------------------

class ANewKey5 : public AStrifeKey
{
	DECLARE_ACTOR (ANewKey5, AStrifeKey)
public:
	const char *PickupMessage ();
};

FState ANewKey5::States[] =
{
	S_NORMAL (BLTK, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (ANewKey5, Strife, -1, 0)
	PROP_StrifeType (159)
	PROP_StrifeTeaserType (155)
	PROP_StrifeTeaserType2 (158)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (27)
	PROP_Inventory_Icon ("I_BLTK")
	PROP_Tag ("New_Key5")
END_DEFAULTS

const char *ANewKey5::PickupMessage ()
{
	return "You picked up the New Key5.";
}

// Prison Pass --------------------------------------------------------------

class APrisonPass : public AKey
{
	DECLARE_ACTOR (APrisonPass, AKey)
public:
	bool TryPickup (AActor *toucher);
	bool SpecialDropAction (AActor *dropper);
	const char *PickupMessage ();
};

FState APrisonPass::States[] =
{
	S_NORMAL (TOKN, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (APrisonPass, Strife, -1, 0)
	PROP_StrifeType (304)
	PROP_StrifeTeaserType (286)
	PROP_StrifeTeaserType2 (303)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (50)
	PROP_Inventory_Icon ("I_TOKN")
	PROP_Tag ("Prison_pass")
END_DEFAULTS

bool APrisonPass::TryPickup (AActor *toucher)
{
	Super::TryPickup (toucher);
	EV_DoDoor (DDoor::doorOpen, NULL, toucher, 223, 2*FRACUNIT, 0, 0, 0);
	toucher->GiveInventoryType (QuestItemClasses[9]);
	return true;
}

const char *APrisonPass::PickupMessage ()
{
	return "You picked up the Prison pass.";
}

//============================================================================
//
// APrisonPass :: SpecialDropAction
//
// Trying to make a monster that drops a prison pass turns it into an
// OpenDoor223 item instead. That means the only way to get it in Strife
// is through dialog, which is why it doesn't have its own sprite.
//
//============================================================================

bool APrisonPass::SpecialDropAction (AActor *dropper)
{
	EV_DoDoor (DDoor::doorOpen, NULL, dropper, 223, 2*FRACUNIT, 0, 0, 0);
	Destroy ();
	return true;
}

// Oracle Pass --------------------------------------------------------------

class AOraclePass : public AKey
{
	DECLARE_ACTOR (AOraclePass, AKey)
public:
	bool TryPickup (AActor *toucher);
	const char *PickupMessage ();
	const char *NeedKeyMessage (bool remote, int keynum);
};

FState AOraclePass::States[] =
{
	S_NORMAL (OTOK, 'A', -1, NULL, NULL)
};

IMPLEMENT_ACTOR (AOraclePass, Strife, -1, 0)
	PROP_StrifeType (311)
	PROP_StrifeTeaserType (292)
	PROP_StrifeTeaserType2 (309)
	PROP_SpawnState (0)
	PROP_Key_KeyNumber (51)
	PROP_Inventory_Icon ("I_OTOK")
	PROP_Tag ("Oracle_Pass")
END_DEFAULTS

bool AOraclePass::TryPickup (AActor *toucher)
{
	if (Super::TryPickup (toucher))
	{
		toucher->GiveInventoryType (QuestItemClasses[17]);
		return true;
	}
	return false;
}

const char *AOraclePass::PickupMessage ()
{
	return "You picked up the Oracle Pass.";
}

const char *AOraclePass::NeedKeyMessage (bool remote, int keynum)
{
	return "You need the Oracle Pass!";
}
