From d06793ad7ebaf49de6097359938c8d395cb40c1b Mon Sep 17 00:00:00 2001
From: Christoph Oelckers <coelckers@zdoom.fake>
Date: Thu, 4 May 2006 19:36:12 +0000
Subject: [PATCH] - Converted A_Puzzleitems.cpp and parts of
 A_HexenSpecialdecs.cpp to DECORATE and fixed a few broken Hexen items.

SVN r78 (trunk)
---
 default.cbd                                |   5 +-
 docs/rh-log.txt                            |   3 +-
 src/d_dehacked.cpp                         |   3 +
 src/g_hexen/a_hexenspecialdecs.cpp         | 448 -------------------
 src/g_hexen/a_puzzleitems.cpp              | 473 ---------------------
 src/v_font.cpp                             |   2 +-
 wadsrc/decorate/decorate.txt               |   7 +
 wadsrc/decorate/hexen/hexendecorations.txt |   2 +-
 wadsrc/decorate/hexen/hexenspecialdecs.txt | 309 +++++++++++++-
 wadsrc/decorate/hexen/puzzleitems.txt      | 297 ++++++++++++-
 10 files changed, 621 insertions(+), 928 deletions(-)

diff --git a/default.cbd b/default.cbd
index 386f453df..db340a4a4 100644
--- a/default.cbd
+++ b/default.cbd
@@ -173,10 +173,10 @@ ${COMPILER} "autostart.cpp a.nas blocks.nas misc.nas tmap.nas tmap2.nas tmap3.na
  a_clericstaff.cpp a_demons.cpp a_dragon.cpp a_ettin.cpp a_fighteraxe.cpp \
  a_fighterboss.cpp a_fighterhammer.cpp a_fighterplayer.cpp a_fighterquietus.cpp \
  a_firedemon.cpp a_flechette.cpp a_fog.cpp a_healingradius.cpp \
- a_heresiarch.cpp a_hexenarmor.cpp a_hexendecorations.cpp a_hexenkeys.cpp \
+ a_heresiarch.cpp \
  a_hexenspecialdecs.cpp a_iceguy.cpp a_korax.cpp a_mageboss.cpp a_magecone.cpp \
  a_magelightning.cpp a_mageplayer.cpp a_magestaff.cpp a_magewand.cpp a_mana.cpp \
- a_pig.cpp a_puzzleitems.cpp a_scriptprojectiles.cpp a_serpent.cpp a_speedboots.cpp \
+ a_pig.cpp a_puzzleitems.cpp a_scriptprojectiles.cpp a_serpent.cpp \
  a_spike.cpp a_summon.cpp a_teleportother.cpp a_weaponpieces.cpp a_wraith.cpp \
  hexen_sbar.cpp a_artiegg.cpp a_artitele.cpp a_minotaur.cpp a_ravenambient.cpp \
  a_acolyte.cpp a_alienspectres.cpp \
@@ -212,6 +212,7 @@ src_paths  tools/makewad
 ${COMPILER} makewad.c ioapi.c zip.c 
 ${LINK} tools/makewad/makewad
 
+LDFLAGS = ''
 src_paths  tools/xlatcc
 ${COMPILER} xlat-parse.tab.c gen.c
 ${LINK} tools/xlatcc/xlatcc
diff --git a/docs/rh-log.txt b/docs/rh-log.txt
index 4e6d919a7..59c287fb3 100644
--- a/docs/rh-log.txt
+++ b/docs/rh-log.txt
@@ -1,5 +1,6 @@
 May 4, 2006 (Changes by Graf Zahl)
-- Converted A_Hexendecorations.cpp
+- Converted A_Puzzleitems.cpp and parts of A_HexenSpecialdecs.cpp to DECORATE.
+- Converted A_Hexendecorations.cpp to DECORATE.
 - Changed the lower decal spawning code to transfer the main decal's color if
   the lower decal's default color is the same as the main decal's.
 - Changed the decal stretcher back to use the specified size parameters as a 
diff --git a/src/d_dehacked.cpp b/src/d_dehacked.cpp
index 96e235bdb..cccdf5d8c 100644
--- a/src/d_dehacked.cpp
+++ b/src/d_dehacked.cpp
@@ -2644,6 +2644,9 @@ bool ADehackedPickup::TryPickup (AActor *toucher)
 
 const char *ADehackedPickup::PickupMessage ()
 {
+	const char *message = RealPickup->GetClass()->Meta.GetMetaString (AIMETA_PickupMessage);
+	if (message != NULL) return message;
+
 	return RealPickup->PickupMessage ();
 }
 
diff --git a/src/g_hexen/a_hexenspecialdecs.cpp b/src/g_hexen/a_hexenspecialdecs.cpp
index b0bd013da..e09561a43 100644
--- a/src/g_hexen/a_hexenspecialdecs.cpp
+++ b/src/g_hexen/a_hexenspecialdecs.cpp
@@ -47,115 +47,7 @@ public:
 
 IMPLEMENT_ABSTRACT_ACTOR (ASwitchingDecoration)
 
-// Winged Statue (no skull) -------------------------------------------------
 
-class AZWingedStatueNoSkull : public ASwitchingDecoration
-{
-	DECLARE_ACTOR (AZWingedStatueNoSkull, ASwitchingDecoration)
-};
-
-FState AZWingedStatueNoSkull::States[] =
-{
-	S_NORMAL (STWN, 'A', -1, NULL, NULL),
-	S_NORMAL (STWN, 'B', -1, NULL, NULL)
-};
-
-IMPLEMENT_ACTOR (AZWingedStatueNoSkull, Hexen, 9011, 0)
-	PROP_RadiusFixed (10)
-	PROP_HeightFixed (62)
-	PROP_Flags (MF_SOLID)
-
-	PROP_SpawnState (0)
-	PROP_SeeState (1)
-	PROP_MeleeState (0)
-END_DEFAULTS
-
-// Gem pedestal -------------------------------------------------------------
-
-class AZGemPedestal : public ASwitchingDecoration
-{
-	DECLARE_ACTOR (AZGemPedestal, ASwitchingDecoration)
-};
-
-FState AZGemPedestal::States[] =
-{
-	S_NORMAL (GMPD, 'A', -1, NULL, NULL),
-	S_NORMAL (GMPD, 'B', -1, NULL, NULL)
-};
-
-IMPLEMENT_ACTOR (AZGemPedestal, Hexen, 9012, 0)
-	PROP_RadiusFixed (10)
-	PROP_HeightFixed (40)
-	PROP_Flags (MF_SOLID)
-
-	PROP_SpawnState (0)
-	PROP_SeeState (1)
-	PROP_MeleeState (0)
-END_DEFAULTS
-
-// Tree (destructible) ------------------------------------------------------
-
-class ATreeDestructible : public AActor
-{
-	DECLARE_ACTOR (ATreeDestructible, AActor)
-public:
-	void GetExplodeParms (int &damage, int &distance, bool &hurtSource);
-	void Die (AActor *source, AActor *inflictor);
-};
-
-FState ATreeDestructible::States[] =
-{
-#define S_ZTREEDESTRUCTIBLE 0
-	S_NORMAL (TRDT, 'A',   -1, NULL 					, NULL),
-
-#define S_ZTREEDES_D (S_ZTREEDESTRUCTIBLE+1)
-	S_NORMAL (TRDT, 'B',	5, NULL 					, &States[S_ZTREEDES_D+1]),
-	S_NORMAL (TRDT, 'C',	5, A_Scream 				, &States[S_ZTREEDES_D+2]),
-	S_NORMAL (TRDT, 'D',	5, NULL 					, &States[S_ZTREEDES_D+3]),
-	S_NORMAL (TRDT, 'E',	5, NULL 					, &States[S_ZTREEDES_D+4]),
-	S_NORMAL (TRDT, 'F',	5, NULL 					, &States[S_ZTREEDES_D+5]),
-	S_NORMAL (TRDT, 'G',   -1, NULL 					, NULL),
-
-#define S_ZTREEDES_X (S_ZTREEDES_D+6)
-	S_BRIGHT (TRDT, 'H',	5, A_Pain 					, &States[S_ZTREEDES_X+1]),
-	S_BRIGHT (TRDT, 'I',	5, NULL 					, &States[S_ZTREEDES_X+2]),
-	S_BRIGHT (TRDT, 'J',	5, NULL 					, &States[S_ZTREEDES_X+3]),
-	S_BRIGHT (TRDT, 'K',	5, NULL 					, &States[S_ZTREEDES_X+4]),
-	S_BRIGHT (TRDT, 'L',	5, NULL 					, &States[S_ZTREEDES_X+5]),
-	S_BRIGHT (TRDT, 'M',	5, A_Explode				, &States[S_ZTREEDES_X+6]),
-	S_BRIGHT (TRDT, 'N',	5, NULL 					, &States[S_ZTREEDES_X+7]),
-	S_NORMAL (TRDT, 'O',	5, NULL 					, &States[S_ZTREEDES_X+8]),
-	S_NORMAL (TRDT, 'P',	5, NULL 					, &States[S_ZTREEDES_X+9]),
-	S_NORMAL (TRDT, 'Q',   -1, NULL 					, NULL)
-};
-
-IMPLEMENT_ACTOR (ATreeDestructible, Hexen, 8062, 0)
-	PROP_SpawnHealth (70)
-	PROP_RadiusFixed (15)
-	PROP_HeightFixed (180)
-	PROP_MassLong (INT_MAX)
-	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
-	PROP_Flags4 (MF4_NOICEDEATH)
-
-	PROP_SpawnState (S_ZTREEDESTRUCTIBLE)
-	PROP_DeathState (S_ZTREEDES_D)
-	PROP_BDeathState (S_ZTREEDES_X)
-
-	PROP_PainSound ("TreeExplode")
-	PROP_DeathSound ("TreeBreak")
-END_DEFAULTS
-
-void ATreeDestructible::GetExplodeParms (int &damage, int &distance, bool &hurtSource)
-{
-	damage = 10;
-}
-
-void ATreeDestructible::Die (AActor *source, AActor *inflictor)
-{
-	Super::Die (source, inflictor);
-	height = 24*FRACUNIT;
-	flags &= ~MF_CORPSE;
-}
 
 // Pottery1 ------------------------------------------------------------------
 
@@ -700,175 +592,6 @@ void A_LeafCheck (AActor *actor)
 
 // Torch base class ---------------------------------------------------------
 
-// Twined torch -------------------------------------------------------------
-
-class AZTwinedTorch : public ASwitchableDecoration
-{
-	DECLARE_ACTOR (AZTwinedTorch, ASwitchableDecoration)
-public:
-	void Activate (AActor *activator);
-};
-
-FState AZTwinedTorch::States[] =
-{
-#define S_ZTWINEDTORCH 0
-	S_BRIGHT (TWTR, 'A',	4, NULL 					, &States[S_ZTWINEDTORCH+1]),
-	S_BRIGHT (TWTR, 'B',	4, NULL 					, &States[S_ZTWINEDTORCH+2]),
-	S_BRIGHT (TWTR, 'C',	4, NULL 					, &States[S_ZTWINEDTORCH+3]),
-	S_BRIGHT (TWTR, 'D',	4, NULL 					, &States[S_ZTWINEDTORCH+4]),
-	S_BRIGHT (TWTR, 'E',	4, NULL 					, &States[S_ZTWINEDTORCH+5]),
-	S_BRIGHT (TWTR, 'F',	4, NULL 					, &States[S_ZTWINEDTORCH+6]),
-	S_BRIGHT (TWTR, 'G',	4, NULL 					, &States[S_ZTWINEDTORCH+7]),
-	S_BRIGHT (TWTR, 'H',	4, NULL 					, &States[S_ZTWINEDTORCH+0]),
-
-#define S_ZTWINEDTORCH_UNLIT (S_ZTWINEDTORCH+8)
-	S_NORMAL (TWTR, 'I',   -1, NULL 					, NULL)
-};
-
-IMPLEMENT_ACTOR (AZTwinedTorch, Hexen, 116, 0)
-	PROP_RadiusFixed (10)
-	PROP_HeightFixed (64)
-	PROP_Flags (MF_SOLID)
-
-	PROP_SpawnState (S_ZTWINEDTORCH)
-	PROP_SeeState (S_ZTWINEDTORCH)
-	PROP_MeleeState (S_ZTWINEDTORCH_UNLIT)
-END_DEFAULTS
-
-void AZTwinedTorch::Activate (AActor *activator)
-{
-	Super::Activate (activator);
-	S_Sound (this, CHAN_BODY, "Ignite", 1, ATTN_NORM);
-}
-
-class AZTwinedTorchUnlit : public AZTwinedTorch
-{
-	DECLARE_STATELESS_ACTOR (AZTwinedTorchUnlit, AZTwinedTorch)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AZTwinedTorchUnlit, Hexen, 117, 0)
-	PROP_SpawnState (S_ZTWINEDTORCH_UNLIT)
-END_DEFAULTS
-
-// Wall torch ---------------------------------------------------------------
-
-class AZWallTorch : public ASwitchableDecoration
-{
-	DECLARE_ACTOR (AZWallTorch, ASwitchableDecoration)
-public:
-	void Activate (AActor *activator);
-};
-
-FState AZWallTorch::States[] =
-{
-#define S_ZWALLTORCH 0
-	S_BRIGHT (WLTR, 'A',	5, NULL 					, &States[S_ZWALLTORCH+1]),
-	S_BRIGHT (WLTR, 'B',	5, NULL 					, &States[S_ZWALLTORCH+2]),
-	S_BRIGHT (WLTR, 'C',	5, NULL 					, &States[S_ZWALLTORCH+3]),
-	S_BRIGHT (WLTR, 'D',	5, NULL 					, &States[S_ZWALLTORCH+4]),
-	S_BRIGHT (WLTR, 'E',	5, NULL 					, &States[S_ZWALLTORCH+5]),
-	S_BRIGHT (WLTR, 'F',	5, NULL 					, &States[S_ZWALLTORCH+6]),
-	S_BRIGHT (WLTR, 'G',	5, NULL 					, &States[S_ZWALLTORCH+7]),
-	S_BRIGHT (WLTR, 'H',	5, NULL 					, &States[S_ZWALLTORCH+0]),
-
-#define S_ZWALLTORCH_U (S_ZWALLTORCH+8)
-	S_NORMAL (WLTR, 'I',   -1, NULL 					, NULL)
-};
-
-IMPLEMENT_ACTOR (AZWallTorch, Hexen, 54, 0)
-	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
-	PROP_Flags4 (MF4_FIXMAPTHINGPOS)
-
-	PROP_SpawnState (S_ZWALLTORCH)
-	PROP_SeeState (S_ZWALLTORCH)
-	PROP_MeleeState (S_ZWALLTORCH_U)
-END_DEFAULTS
-
-void AZWallTorch::Activate (AActor *activator)
-{
-	Super::Activate (activator);
-	S_Sound (this, CHAN_BODY, "Ignite", 1, ATTN_NORM);
-}
-
-class AZWallTorchUnlit : public AZWallTorch
-{
-	DECLARE_STATELESS_ACTOR (AZWallTorchUnlit, AZWallTorch)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AZWallTorchUnlit, Hexen, 55, 0)
-	PROP_SpawnState (S_ZWALLTORCH_U)
-END_DEFAULTS
-
-// Shrub1 -------------------------------------------------------------------
-
-class AZShrub1 : public AActor
-{
-	DECLARE_ACTOR (AZShrub1, AActor)
-};
-
-FState AZShrub1::States[] =
-{
-#define S_ZSHRUB1 0
-	S_NORMAL (SHB1, 'A',   -1, NULL 					, NULL),
-
-#define S_ZSHRUB1_X (S_ZSHRUB1+1)
-	S_BRIGHT (SHB1, 'B',	7, NULL 					, &States[S_ZSHRUB1_X+1]),
-	S_BRIGHT (SHB1, 'C',	6, A_Scream 				, &States[S_ZSHRUB1_X+2]),
-	S_BRIGHT (SHB1, 'D',	5, NULL 					, NULL)
-};
-
-IMPLEMENT_ACTOR (AZShrub1, Hexen, 8101, 0)
-	PROP_RadiusFixed (8)
-	PROP_HeightFixed (24)
-	PROP_MassLong (FIXED_MAX)
-	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
-	PROP_Flags4 (MF4_NOICEDEATH)
-
-	PROP_SpawnState (S_ZSHRUB1)
-	PROP_BDeathState (S_ZSHRUB1_X)
-
-	PROP_DeathSound ("TreeExplode")
-END_DEFAULTS
-
-// Shrub2 -------------------------------------------------------------------
-
-class AZShrub2 : public AActor
-{
-	DECLARE_ACTOR (AZShrub2, AActor)
-public:
-	void GetExplodeParms (int &damage, int &distance, bool &hurtSrc);
-};
-
-FState AZShrub2::States[] =
-{
-#define S_ZSHRUB2 0
-	S_NORMAL (SHB2, 'A',   -1, NULL 					, NULL),
-
-#define S_ZSHRUB2_X (S_ZSHRUB2+1)
-	S_BRIGHT (SHB2, 'B',	7, NULL 					, &States[S_ZSHRUB2_X+1]),
-	S_BRIGHT (SHB2, 'C',	6, A_Scream 				, &States[S_ZSHRUB2_X+2]),
-	S_BRIGHT (SHB2, 'D',	5, A_Explode				, &States[S_ZSHRUB2_X+3]),
-	S_BRIGHT (SHB2, 'E',	5, NULL 					, NULL)
-};
-
-IMPLEMENT_ACTOR (AZShrub2, Hexen, 8102, 0)
-	PROP_RadiusFixed (16)
-	PROP_HeightFixed (40)
-	PROP_MassLong (FIXED_MAX)
-	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
-	PROP_Flags4 (MF4_NOICEDEATH)
-
-	PROP_SpawnState (S_ZSHRUB2)
-	PROP_BDeathState (S_ZSHRUB2_X)
-
-	PROP_DeathSound ("TreeExplode")
-END_DEFAULTS
-
-void AZShrub2::GetExplodeParms (int &damage, int &distance, bool &hurtSrc)
-{
-	damage = 30;
-	distance = 64;
-}
 
 
 // Poison Shroom ------------------------------------------------------------
@@ -925,62 +648,6 @@ void A_PoisonShroom (AActor *actor)
 	actor->tics = 128+(pr_shroom()<<1);
 }
 
-// Fire Bull ----------------------------------------------------------------
-
-class AZFireBull : public ASwitchableDecoration
-{
-	DECLARE_ACTOR (AZFireBull, ASwitchableDecoration)
-public:
-	void Activate (AActor *activator);
-};
-
-FState AZFireBull::States[] =
-{
-#define S_ZFIREBULL 0
-	S_BRIGHT (FBUL, 'A',	4, NULL 		, &States[S_ZFIREBULL+1]),
-	S_BRIGHT (FBUL, 'B',	4, NULL 		, &States[S_ZFIREBULL+2]),
-	S_BRIGHT (FBUL, 'C',	4, NULL 		, &States[S_ZFIREBULL+3]),
-	S_BRIGHT (FBUL, 'D',	4, NULL 		, &States[S_ZFIREBULL+4]),
-	S_BRIGHT (FBUL, 'E',	4, NULL 		, &States[S_ZFIREBULL+5]),
-	S_BRIGHT (FBUL, 'F',	4, NULL 		, &States[S_ZFIREBULL+6]),
-	S_BRIGHT (FBUL, 'G',	4, NULL 		, &States[S_ZFIREBULL+0]),
-
-#define S_ZFIREBULL_U (S_ZFIREBULL+7)
-	S_NORMAL (FBUL, 'H',   -1, NULL 		, NULL),
-
-#define S_ZFIREBULL_DEATH (S_ZFIREBULL_U+1)
-	S_BRIGHT (FBUL, 'J',	4, NULL 		, &States[S_ZFIREBULL_DEATH+1]),
-	S_BRIGHT (FBUL, 'I',	4, NULL 		, &States[S_ZFIREBULL_U]),
-
-#define S_ZFIREBULL_BIRTH (S_ZFIREBULL_DEATH+2)
-	S_BRIGHT (FBUL, 'I',	4, NULL 		, &States[S_ZFIREBULL_BIRTH+1]),
-	S_BRIGHT (FBUL, 'J',	4, NULL 		, &States[S_ZFIREBULL+0])
-};
-
-IMPLEMENT_ACTOR (AZFireBull, Hexen, 8042, 0)
-	PROP_RadiusFixed (20)
-	PROP_HeightFixed (80)
-	PROP_Flags (MF_SOLID)
-
-	PROP_SpawnState (S_ZFIREBULL)
-	PROP_SeeState (S_ZFIREBULL_BIRTH)
-	PROP_MeleeState (S_ZFIREBULL_U)
-END_DEFAULTS
-
-void AZFireBull::Activate (AActor *activator)
-{
-	Super::Activate (activator);
-	S_Sound (this, CHAN_BODY, "Ignite", 1, ATTN_NORM);
-}
-
-class AZFireBullUnlit : public AZFireBull
-{
-	DECLARE_STATELESS_ACTOR (AZFireBullUnlit, AZFireBull)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AZFireBullUnlit, Hexen, 8043, 0)
-	PROP_SpawnState (S_ZFIREBULL_U)
-END_DEFAULTS
 
 // Suit of armor ------------------------------------------------------------
 
@@ -1195,118 +862,3 @@ void A_BellReset2 (AActor *actor)
 	actor->health = 5;
 }
 
-// "Christmas" Tree ---------------------------------------------------------
-
-class AZXmasTree : public AActor
-{
-	DECLARE_ACTOR (AZXmasTree, AActor)
-public:
-	void GetExplodeParms (int &damage, int &dist, bool &dmgSource);
-};
-
-FState AZXmasTree::States[] =
-{
-#define S_ZXMAS_TREE 0
-	S_NORMAL (XMAS, 'A',   -1, NULL 					, NULL),
-
-#define S_ZXMAS_TREE_X (S_ZXMAS_TREE+1)
-	S_BRIGHT (XMAS, 'B',	6, NULL 					, &States[S_ZXMAS_TREE_X+1]),
-	S_BRIGHT (XMAS, 'C',	6, A_Scream 				, &States[S_ZXMAS_TREE_X+2]),
-	S_BRIGHT (XMAS, 'D',	5, NULL 					, &States[S_ZXMAS_TREE_X+3]),
-	S_BRIGHT (XMAS, 'E',	5, A_Explode				, &States[S_ZXMAS_TREE_X+4]),
-	S_BRIGHT (XMAS, 'F',	5, NULL 					, &States[S_ZXMAS_TREE_X+5]),
-	S_BRIGHT (XMAS, 'G',	4, NULL 					, &States[S_ZXMAS_TREE_X+6]),
-	S_NORMAL (XMAS, 'H',	5, NULL 					, &States[S_ZXMAS_TREE_X+7]),
-	S_NORMAL (XMAS, 'I',	4, A_NoBlocking 			, &States[S_ZXMAS_TREE_X+8]),
-	S_NORMAL (XMAS, 'J',	4, NULL 					, &States[S_ZXMAS_TREE_X+9]),
-	S_NORMAL (XMAS, 'K',   -1, NULL 					, NULL)
-};
-
-IMPLEMENT_ACTOR (AZXmasTree, Hexen, 8068, 0)
-	PROP_SpawnHealth (20)
-	PROP_RadiusFixed (11)
-	PROP_HeightFixed (130)
-	PROP_MassLong (0x7fffffff)
-	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
-	PROP_Flags4 (MF4_NOICEDEATH)
-
-	PROP_SpawnState (S_ZXMAS_TREE)
-	PROP_BDeathState (S_ZXMAS_TREE_X)
-
-	PROP_DeathSound ("TreeExplode")
-END_DEFAULTS
-
-void AZXmasTree::GetExplodeParms (int &damage, int &dist, bool &dmgSource)
-{
-	damage = 30;
-	dist = 64;
-}
-
-// Cauldron -----------------------------------------------------------------
-
-class AZCauldron : public ASwitchableDecoration
-{
-	DECLARE_ACTOR (AZCauldron, ASwitchableDecoration)
-public:
-	void Activate (AActor *activator);
-};
-
-FState AZCauldron::States[] =
-{
-#define S_ZCAULDRON 0
-	S_BRIGHT (CDRN, 'B',	4, NULL 					, &States[S_ZCAULDRON+1]),
-	S_BRIGHT (CDRN, 'C',	4, NULL 					, &States[S_ZCAULDRON+2]),
-	S_BRIGHT (CDRN, 'D',	4, NULL 					, &States[S_ZCAULDRON+3]),
-	S_BRIGHT (CDRN, 'E',	4, NULL 					, &States[S_ZCAULDRON+4]),
-	S_BRIGHT (CDRN, 'F',	4, NULL 					, &States[S_ZCAULDRON+5]),
-	S_BRIGHT (CDRN, 'G',	4, NULL 					, &States[S_ZCAULDRON+6]),
-	S_BRIGHT (CDRN, 'H',	4, NULL 					, &States[S_ZCAULDRON+0]),
-
-#define S_ZCAULDRON_U (S_ZCAULDRON+7)
-	S_NORMAL (CDRN, 'A',   -1, NULL 					, NULL)
-};
-
-IMPLEMENT_ACTOR (AZCauldron, Hexen, 8069, 0)
-	PROP_RadiusFixed (12)
-	PROP_HeightFixed (26)
-	PROP_Flags (MF_SOLID)
-
-	PROP_SpawnState (S_ZCAULDRON)
-	PROP_SeeState (S_ZCAULDRON)
-	PROP_MeleeState (S_ZCAULDRON_U)
-END_DEFAULTS
-
-void AZCauldron::Activate (AActor *activator)
-{
-	Super::Activate (activator);
-	S_Sound (this, CHAN_BODY, "Ignite", 1, ATTN_NORM);
-}
-
-class AZCauldronUnlit : public AZCauldron
-{
-	DECLARE_STATELESS_ACTOR (AZCauldronUnlit, AZCauldron)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AZCauldronUnlit, Hexen, 8070, 0)
-	PROP_SpawnState (S_ZCAULDRON_U)
-END_DEFAULTS
-
-// Water Drip ---------------------------------------------------------------
-
-class AHWaterDrip : public AActor
-{
-	DECLARE_ACTOR (AHWaterDrip, AActor)
-};
-
-FState AHWaterDrip::States[] =
-{
-	S_NORMAL (HWAT, 'A', -1, NULL, NULL)
-};
-
-IMPLEMENT_ACTOR (AHWaterDrip, Hexen, -1, 95)
-	PROP_Flags (MF_MISSILE)
-	PROP_Flags2 (MF2_LOGRAV|MF2_NOTELEPORT)
-	PROP_Mass (1)
-	PROP_SpawnState (0)
-	PROP_DeathSound ("Drip")
-END_DEFAULTS
diff --git a/src/g_hexen/a_puzzleitems.cpp b/src/g_hexen/a_puzzleitems.cpp
index a42313a13..8ddf39deb 100644
--- a/src/g_hexen/a_puzzleitems.cpp
+++ b/src/g_hexen/a_puzzleitems.cpp
@@ -7,27 +7,6 @@
 #include "s_sound.h"
 #include "c_console.h"
 
-enum
-{
-	puzzskull,
-	puzzgembig,
-	puzzgemred,
-	puzzgemgreen1,
-	puzzgemgreen2,
-	puzzgemblue1,
-	puzzgemblue2,
-	puzzbook1,
-	puzzbook2,
-	puzzskull2,
-	puzzfweapon,
-	puzzcweapon,
-	puzzmweapon,
-	puzzgear1,
-	puzzgear2,
-	puzzgear3,
-	puzzgear4,
-};
-
 IMPLEMENT_STATELESS_ACTOR (APuzzleItem, Any, -1, 0)
 	PROP_Flags (MF_SPECIAL|MF_NOGRAVITY)
 	PROP_Inventory_FlagsSet (IF_INVBAR)
@@ -69,455 +48,3 @@ bool APuzzleItem::ShouldStay ()
 	return !!multiplayer;
 }
 
-// Yorick's Skull -----------------------------------------------------------
-
-class APuzzSkull : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzSkull, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzSkull::States[] =
-{
-	S_NORMAL (ASKU, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzSkull, Hexen, 9002, 76)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzskull)
-	PROP_Inventory_Icon ("ARTISKLL")
-END_DEFAULTS
-
-const char *APuzzSkull::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZSKULL");
-}
-
-// Heart of D'Sparil --------------------------------------------------------
-
-class APuzzGemBig : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzGemBig, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzGemBig::States[] =
-{
-	S_NORMAL (ABGM, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzGemBig, Hexen, 9003, 77)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzgembig)
-	PROP_Inventory_Icon ("ARTIBGEM")
-END_DEFAULTS
-
-const char *APuzzGemBig::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZGEMBIG");
-}
-
-// Red Gem (Ruby Planet) ----------------------------------------------------
-
-class APuzzGemRed : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzGemRed, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzGemRed::States[] =
-{
-	S_NORMAL (AGMR, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzGemRed, Hexen, 9004, 78)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzgemred)
-	PROP_Inventory_Icon ("ARTIGEMR")
-END_DEFAULTS
-
-const char *APuzzGemRed::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZGEMRED");
-}
-
-// Green Gem 1 (Emerald Planet) ---------------------------------------------
-
-class APuzzGemGreen1 : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzGemGreen1, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzGemGreen1::States[] =
-{
-	S_NORMAL (AGMG, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzGemGreen1, Hexen, 9005, 79)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzgemgreen1)
-	PROP_Inventory_Icon ("ARTIGEMG")
-END_DEFAULTS
-
-const char *APuzzGemGreen1::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZGEMGREEN1");
-}
-
-// Green Gem 2 (Emerald Planet) ---------------------------------------------
-
-class APuzzGemGreen2 : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzGemGreen2, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzGemGreen2::States[] =
-{
-	S_NORMAL (AGG2, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzGemGreen2, Hexen, 9009, 80)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzgemgreen2)
-	PROP_Inventory_Icon ("ARTIGMG2")
-END_DEFAULTS
-
-const char *APuzzGemGreen2::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZGEMGREEN2");
-}
-
-// Blue Gem 1 (Sapphire Planet) ---------------------------------------------
-
-class APuzzGemBlue1 : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzGemBlue1, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzGemBlue1::States[] =
-{
-	S_NORMAL (AGMB, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzGemBlue1, Hexen, 9006, 81)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzgemblue1)
-	PROP_Inventory_Icon ("ARTIGEMB")
-END_DEFAULTS
-
-const char *APuzzGemBlue1::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZGEMBLUE1");
-}
-
-// Blue Gem 2 (Sapphire Planet) ---------------------------------------------
-
-class APuzzGemBlue2 : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzGemBlue2, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzGemBlue2::States[] =
-{
-	S_NORMAL (AGB2, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzGemBlue2, Hexen, 9010, 82)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzgemblue2)
-	PROP_Inventory_Icon ("ARTIGMB2")
-END_DEFAULTS
-
-const char *APuzzGemBlue2::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZGEMBLUE2");
-}
-
-// Book 1 (Daemon Codex) ----------------------------------------------------
-
-class APuzzBook1 : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzBook1, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzBook1::States[] =
-{
-	S_NORMAL (ABK1, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzBook1, Hexen, 9007, 83)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzbook1)
-	PROP_Inventory_Icon ("ARTIBOK1")
-END_DEFAULTS
-
-const char *APuzzBook1::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZBOOK1");
-}
-
-// Book 2 (Liber Oscura) ----------------------------------------------------
-
-class APuzzBook2 : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzBook2, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzBook2::States[] =
-{
-	S_NORMAL (ABK2, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzBook2, Hexen, 9008, 84)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzbook2)
-	PROP_Inventory_Icon ("ARTIBOK2")
-END_DEFAULTS
-
-const char *APuzzBook2::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZBOOK2");
-}
-
-// Flame Mask ---------------------------------------------------------------
-
-class APuzzFlameMask : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzFlameMask, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzFlameMask::States[] =
-{
-	S_NORMAL (ASK2, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzFlameMask, Hexen, 9014, 0)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzskull2)
-	PROP_Inventory_Icon ("ARTISKL2")
-END_DEFAULTS
-
-const char *APuzzFlameMask::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZSKULL2");
-}
-
-// Fighter Weapon (Glaive Seal) ---------------------------------------------
-
-class APuzzFWeapon : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzFWeapon, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzFWeapon::States[] =
-{
-	S_NORMAL (AFWP, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzFWeapon, Hexen, 9015, 0)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzfweapon)
-	PROP_Inventory_Icon ("ARTIFWEP")
-END_DEFAULTS
-
-const char *APuzzFWeapon::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZFWEAPON");
-}
-
-// Cleric Weapon (Holy Relic) -----------------------------------------------
-
-class APuzzCWeapon : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzCWeapon, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzCWeapon::States[] =
-{
-	S_NORMAL (ACWP, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzCWeapon, Hexen, 9016, 0)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzcweapon)
-	PROP_Inventory_Icon ("ARTICWEP")
-END_DEFAULTS
-
-const char *APuzzCWeapon::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZCWEAPON");
-}
-
-// Mage Weapon (Sigil of the Magus) -----------------------------------------
-
-class APuzzMWeapon : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzMWeapon, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzMWeapon::States[] =
-{
-	S_NORMAL (AMWP, 'A',   -1, NULL					    , NULL),
-};
-
-IMPLEMENT_ACTOR (APuzzMWeapon, Hexen, 9017, 0)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzmweapon)
-	PROP_Inventory_Icon ("ARTIMWEP")
-END_DEFAULTS
-
-const char *APuzzMWeapon::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZMWEAPON");
-}
-
-// Clock Gear 1 -------------------------------------------------------------
-
-class APuzzGear1 : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzGear1, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzGear1::States[] =
-{
-	S_BRIGHT (AGER, 'A',	4, NULL					    , &States[1]),
-	S_BRIGHT (AGER, 'B',	4, NULL					    , &States[2]),
-	S_BRIGHT (AGER, 'C',	4, NULL					    , &States[3]),
-	S_BRIGHT (AGER, 'D',	4, NULL					    , &States[4]),
-	S_BRIGHT (AGER, 'E',	4, NULL					    , &States[5]),
-	S_BRIGHT (AGER, 'F',	4, NULL					    , &States[6]),
-	S_BRIGHT (AGER, 'G',	4, NULL					    , &States[7]),
-	S_BRIGHT (AGER, 'H',	4, NULL					    , &States[0]),
-};
-
-IMPLEMENT_ACTOR (APuzzGear1, Hexen, 9018, 0)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzgear1)
-	PROP_Inventory_Icon ("ARTIGEAR")
-END_DEFAULTS
-
-const char *APuzzGear1::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZGEAR");
-}
-
-// Clock Gear 2 -------------------------------------------------------------
-
-class APuzzGear2 : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzGear2, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzGear2::States[] =
-{
-	S_BRIGHT (AGR2, 'A',	4, NULL					    , &States[1]),
-	S_BRIGHT (AGR2, 'B',	4, NULL					    , &States[2]),
-	S_BRIGHT (AGR2, 'C',	4, NULL					    , &States[3]),
-	S_BRIGHT (AGR2, 'D',	4, NULL					    , &States[4]),
-	S_BRIGHT (AGR2, 'E',	4, NULL					    , &States[5]),
-	S_BRIGHT (AGR2, 'F',	4, NULL					    , &States[6]),
-	S_BRIGHT (AGR2, 'G',	4, NULL					    , &States[7]),
-	S_BRIGHT (AGR2, 'H',	4, NULL					    , &States[0]),
-};
-
-IMPLEMENT_ACTOR (APuzzGear2, Hexen, 9019, 0)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzgear2)
-	PROP_Inventory_Icon ("ARTIGER2")
-END_DEFAULTS
-
-const char *APuzzGear2::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZGEAR");
-}
-
-// Clock Gear 3 -------------------------------------------------------------
-
-class APuzzGear3 : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzGear3, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzGear3::States[] =
-{
-	S_BRIGHT (AGR3, 'A',	4, NULL					    , &States[1]),
-	S_BRIGHT (AGR3, 'B',	4, NULL					    , &States[2]),
-	S_BRIGHT (AGR3, 'C',	4, NULL					    , &States[3]),
-	S_BRIGHT (AGR3, 'D',	4, NULL					    , &States[4]),
-	S_BRIGHT (AGR3, 'E',	4, NULL					    , &States[5]),
-	S_BRIGHT (AGR3, 'F',	4, NULL					    , &States[6]),
-	S_BRIGHT (AGR3, 'G',	4, NULL					    , &States[7]),
-	S_BRIGHT (AGR3, 'H',	4, NULL					    , &States[0]),
-};
-
-IMPLEMENT_ACTOR (APuzzGear3, Hexen, 9020, 0)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzgear3)
-	PROP_Inventory_Icon ("ARTIGER3")
-END_DEFAULTS
-
-const char *APuzzGear3::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZGEAR");
-}
-
-// Clock Gear 4 -------------------------------------------------------------
-
-class APuzzGear4 : public APuzzleItem
-{
-	DECLARE_ACTOR (APuzzGear4, APuzzleItem)
-public:
-	const char *PickupMessage ();
-};
-
-FState APuzzGear4::States[] =
-{
-	S_BRIGHT (AGR4, 'A',	4, NULL					    , &States[1]),
-	S_BRIGHT (AGR4, 'B',	4, NULL					    , &States[2]),
-	S_BRIGHT (AGR4, 'C',	4, NULL					    , &States[3]),
-	S_BRIGHT (AGR4, 'D',	4, NULL					    , &States[4]),
-	S_BRIGHT (AGR4, 'E',	4, NULL					    , &States[5]),
-	S_BRIGHT (AGR4, 'F',	4, NULL					    , &States[6]),
-	S_BRIGHT (AGR4, 'G',	4, NULL					    , &States[7]),
-	S_BRIGHT (AGR4, 'H',	4, NULL					    , &States[0]),
-};
-
-IMPLEMENT_ACTOR (APuzzGear4, Hexen, 9021, 0)
-	PROP_SpawnState (0)
-	PROP_PuzzleItem_Number (puzzgear4)
-	PROP_Inventory_Icon ("ARTIGER4")
-END_DEFAULTS
-
-const char *APuzzGear4::PickupMessage ()
-{
-	return GStrings("TXT_ARTIPUZZGEAR");
-}
diff --git a/src/v_font.cpp b/src/v_font.cpp
index b025bed18..eb887aafb 100644
--- a/src/v_font.cpp
+++ b/src/v_font.cpp
@@ -1082,7 +1082,7 @@ void FFontChar2::MakeTexture ()
 		I_FatalError ("The font %s is corrupt", name);
 	}
 
-	Spans = CreateSpans (Pixels);
+	if (Spans!=NULL) Spans = CreateSpans (Pixels);
 }
 
 //===========================================================================
diff --git a/wadsrc/decorate/decorate.txt b/wadsrc/decorate/decorate.txt
index cd7172355..a4b997a2d 100644
--- a/wadsrc/decorate/decorate.txt
+++ b/wadsrc/decorate/decorate.txt
@@ -15,3 +15,10 @@
 #include "actors/heretic/hereticdecorations.txt"
 
 #include "actors/hexen/flame.txt"
+#include "actors/hexen/hexenarmor.txt"
+#include "actors/hexen/hexendecorations.txt"
+#include "actors/hexen/hexenkeys.txt"
+#include "actors/hexen/hexenspecialdecs.txt"
+#include "actors/hexen/puzzleitems.txt"
+#include "actors/hexen/scriptprojectiles.txt"
+#include "actors/hexen/speedboots.txt"
diff --git a/wadsrc/decorate/hexen/hexendecorations.txt b/wadsrc/decorate/hexen/hexendecorations.txt
index 3fe66d98c..c4755078d 100644
--- a/wadsrc/decorate/hexen/hexendecorations.txt
+++ b/wadsrc/decorate/hexen/hexendecorations.txt
@@ -437,7 +437,7 @@ ACTOR ZMossCeiling2 59
 	States
 	{
 	Spawn:
-		MS21 A -1
+		MSS2 A -1
 		Stop
 	}
 }
diff --git a/wadsrc/decorate/hexen/hexenspecialdecs.txt b/wadsrc/decorate/hexen/hexenspecialdecs.txt
index 2cf8925e9..b7dd3be61 100644
--- a/wadsrc/decorate/hexen/hexenspecialdecs.txt
+++ b/wadsrc/decorate/hexen/hexenspecialdecs.txt
@@ -1 +1,308 @@
-// 
+
+// Winged Statue (no skull) -------------------------------------------------
+
+ACTOR ZWingedStatueNoSkull : SwitchingDecoration 9011
+{
+	Game Hexen
+	Radius 10
+	Height 62
+	+SOLID
+	States
+	{
+	Spawn:
+		STWN A -1
+		Stop
+	Active:
+		STWN B -1
+		Stop
+	}
+}
+
+
+// Gem pedestal -------------------------------------------------------------
+
+ACTOR ZGemPedestal : SwitchingDecoration 9012
+{
+	Game Hexen
+	Radius 10
+	Height 40
+	+SOLID
+	States
+	{
+	Spawn:
+		GMPD A -1
+		Stop
+	Active:
+		GMPD B -1
+		Stop
+	}
+}
+
+
+// Tree (destructible) ------------------------------------------------------
+
+ACTOR TreeDestructible 8062
+{
+	Game Hexen
+	Health 70
+	Radius 15
+	Height 180
+	DeathHeight 24
+	Mass 0x7fffffff
+	PainSound "TreeExplode"
+	DeathSound "TreeBreak"
+	+SOLID +SHOOTABLE +NOBLOOD +NOICEDEATH
+	States
+	{
+	Spawn:
+		TRDT A -1
+		Stop
+	Death:
+		TRDT B 5
+		TRDT C 5 A_Scream
+		TRDT DEF 5
+		TRDT G -1
+		Stop
+	Burn:
+		TRDT H 5 Bright A_Pain
+		TRDT IJKL 5 Bright
+		TRDT M 5 Bright A_Explode(10, 128)
+		TRDT N 5 Bright
+		TRDT OP 5
+		TRDT Q -1
+		Stop
+	} 
+}
+
+
+// Twined torch -------------------------------------------------------------
+
+ACTOR ZTwinedTorch : SwitchableDecoration 116
+{
+	Game Hexen
+	Radius 10
+	Height 64
+	+SOLID
+	States
+	{
+	Active:
+		TWTR A 0 Bright A_PlaySound("Ignite")
+	Spawn:
+		TWTR ABCDEFGH 4 Bright
+		Loop
+	Inactive:
+		TWTR I -1
+		Stop
+	}
+}
+
+ACTOR ZTwinedTorchUnlit : ZTwinedTorch 117
+{
+	States
+	{
+	Spawn:
+		TWTR I -1
+		Stop
+	}
+}
+
+
+// Wall torch ---------------------------------------------------------------
+
+ACTOR ZWallTorch : SwitchableDecoration 54
+{
+	Game Hexen
+	+NOBLOCKMAP
+	+NOGRAVITY
+	+FIXMAPTHINGPOS
+	States
+	{
+	Active:
+		WLTR A 0 Bright A_PlaySound("Ignite")
+	Spawn:
+		WLTR ABCDEFGH 5 Bright
+		Loop
+	Inactive:
+		WLTR I -1
+		Stop
+	}
+}
+
+ACTOR ZWallTorchUnlit : ZWallTorch 55
+{
+	States
+	{
+	Spawn:
+		WLTR I -1
+		Stop
+	}
+}
+
+
+// Shrub1 -------------------------------------------------------------------
+
+ACTOR ZShrub1 8101
+{
+	Game Hexen
+	Radius 8
+	Height 24
+	Health 20
+	Mass 0x7fffffff
+	+SOLID +SHOOTABLE +NOBLOOD +NOICEDEATH
+	DeathSound "TreeExplode"
+	States
+	{
+	Spawn:
+		SHB1 A -1
+		Stop
+	Burn:
+		SHB1 B 7 Bright
+		SHB1 C 6 Bright A_Scream
+		SHB1 D 5 Bright
+		Stop
+	}
+}
+
+
+// Shrub2 -------------------------------------------------------------------
+
+ACTOR ZShrub2 8102
+{
+	Game Hexen
+	Radius 16
+	Height 40
+	Health 20
+	Mass 0x7fffffff
+	+SOLID +SHOOTABLE +NOBLOOD +NOICEDEATH
+	DeathSound "TreeExplode"
+	States
+	{
+	Spawn:
+		SHB2 A -1
+		Stop
+	Burn:
+		SHB2 B 7 Bright
+		SHB2 C 6 Bright A_Scream
+		SHB2 D 5 Bright A_Explode(30, 64)
+		SHB2 E 5 Bright
+		Stop
+	}
+}
+
+
+// Fire Bull ----------------------------------------------------------------
+
+ACTOR ZFireBull : SwitchableDecoration 8042
+{
+	Game Hexen
+	Radius 20
+	Height 80
+	+SOLID
+	States
+	{
+	Active:
+		FBUL I 4 Bright A_PlaySound("Ignite")
+		FBUL J 4 Bright
+	Spawn:
+		FBUL ABCDEFG 4 Bright
+		Loop
+	Inactive:
+		FBUL JI 4 Bright
+		FBUL H -1
+		Stop
+	}
+}
+
+ACTOR ZFireBullUnlit : ZFireBull 8043
+{
+	States
+	{
+	Spawn:
+		FBUL H -1
+		Stop
+	}
+}
+
+
+// "Christmas" Tree ---------------------------------------------------------
+
+ACTOR ZXmasTree 8068
+{
+	Game Hexen
+	Radius 11
+	Height 130
+	Health 20
+	Mass 0x7fffffff
+	+SOLID +SHOOTABLE +NOBLOOD +NOICEDEATH
+	DeathSound "TreeExplode"
+	States
+	{
+	Spawn:
+		XMAS A -1
+		Stop
+	Burn:
+		XMAS B 6 Bright
+		XMAS C 6 Bright A_Scream
+		XMAS D 5 Bright
+		XMAS E 5 Bright A_Explode(30, 64)
+		XMAS F 5 Bright
+		XMAS G 4 Bright
+		XMAS H 5
+		XMAS I 4 A_NoBlocking
+		XMAS J 4
+		XMAS K -1
+		Stop
+	}
+}
+
+// Cauldron -----------------------------------------------------------------
+
+ACTOR ZCauldron : SwitchableDecoration 8069
+{
+	Game Hexen
+	Radius 12
+	Height 26
+	+SOLID
+	States
+	{
+	Active:
+		CDRN B 0 Bright A_PlaySound("Ignite")
+	Spawn:
+		CDRN BCDEFGH 4 Bright
+		Loop
+	Inactive:
+		CDRN A -1
+		Stop
+	}
+}
+
+ACTOR AZCauldronUnlit : ZCauldron
+{
+	States
+	{
+	Spawn:
+		CDRN A -1
+		Stop
+	}
+}
+
+
+// Water Drip ---------------------------------------------------------------
+
+ACTOR HWaterDrip
+{
+	Game Hexen
+	SpawnID 95
+	+MISSILE
+	+LOWGRAVITY
+	+NOTELEPORT
+	Mass 1
+	DeathSound "Drip"
+	States
+	{
+	Spawn:
+		HWAT A -1
+		Stop
+	}
+}
+
diff --git a/wadsrc/decorate/hexen/puzzleitems.txt b/wadsrc/decorate/hexen/puzzleitems.txt
index 2cf8925e9..603d2fe2f 100644
--- a/wadsrc/decorate/hexen/puzzleitems.txt
+++ b/wadsrc/decorate/hexen/puzzleitems.txt
@@ -1 +1,296 @@
-// 
+
+// Yorick's Skull -----------------------------------------------------------
+
+ACTOR PuzzSkull : PuzzleItem 9002
+{
+	Game Hexen
+	SpawnID 76
+	PuzzleItem.Number 0
+	Inventory.Icon ARTISKLL
+	Inventory.PickupMessage "$TXT_ARTIPUZZSKULL"
+	States
+	{
+	Spawn:
+		ASKU A -1
+		Stop
+	}
+}
+
+
+// Heart of D'Sparil --------------------------------------------------------
+
+ACTOR PuzzGemBig : PuzzleItem 9003
+{
+	Game Hexen
+	SpawnID 77
+	PuzzleItem.Number 1
+	Inventory.Icon ARTIBGEM
+	Inventory.PickupMessage "$TXT_ARTIPUZZGEMBIG"
+	States
+	{
+	Spawn:
+		ABGM A -1
+		Stop
+	}
+}
+
+// Red Gem (Ruby Planet) ----------------------------------------------------
+
+ACTOR PuzzGemRed : PuzzleItem 9004
+{
+	Game Hexen
+	SpawnID 78
+	PuzzleItem.Number 2
+	Inventory.Icon ARTIGEMR
+	Inventory.PickupMessage "$TXT_ARTIPUZZGEMRED"
+	States
+	{
+	Spawn:
+		AGMR A -1
+		Stop
+	}
+}
+
+
+// Green Gem 1 (Emerald Planet) ---------------------------------------------
+
+ACTOR PuzzGemGreen : PuzzleItem 9005
+{
+	Game Hexen
+	SpawnID 79
+	PuzzleItem.Number 3
+	Inventory.Icon ARTIGEMG
+	Inventory.PickupMessage "$TXT_ARTIPUZZGEMGREEN1"
+	States
+	{
+	Spawn:
+		AGMG A -1
+		Stop
+	}
+}
+
+
+// Green Gem 2 (Emerald Planet) ---------------------------------------------
+
+ACTOR PuzzGemGreen2 : PuzzleItem 9009
+{
+	Game Hexen
+	SpawnID 80
+	PuzzleItem.Number 4
+	Inventory.Icon ARTIGMG2
+	Inventory.PickupMessage "$TXT_ARTIPUZZGEMGREEN2"
+	States
+	{
+	Spawn:
+		AGG2 A -1
+		Stop
+	}
+}
+
+
+// Blue Gem 1 (Sapphire Planet) ---------------------------------------------
+
+ACTOR PuzzGemBlue1 : PuzzleItem 9006
+{
+	Game Hexen
+	SpawnID 81
+	PuzzleItem.Number 5
+	Inventory.Icon ARTIGEMB
+	Inventory.PickupMessage "$TXT_ARTIPUZZGEMBLUE1"
+	States
+	{
+	Spawn:
+		AGMB A -1
+		Stop
+	}
+}
+
+
+// Blue Gem 2 (Sapphire Planet) ---------------------------------------------
+
+ACTOR PuzzGemBlue2 : PuzzleItem 9010
+{
+	Game Hexen
+	SpawnID 82
+	PuzzleItem.Number 6
+	Inventory.Icon ARTIGMB2
+	Inventory.PickupMessage "$TXT_ARTIPUZZGEMBLUE2"
+	States
+	{
+	Spawn:
+		AGB2 A -1
+		Stop
+	}
+}
+
+
+// Book 1 (Daemon Codex) ----------------------------------------------------
+
+ACTOR PuzzBook1 : PuzzleItem 9007
+{
+	Game Hexen
+	SpawnID 83
+	PuzzleItem.Number 7
+	Inventory.Icon ARTIBOK1
+	Inventory.PickupMessage "$TXT_ARTIPUZZBOOK1"
+	States
+	{
+	Spawn:
+		ABK1 A -1
+		Stop
+	}
+}
+
+
+// Book 2 (Liber Oscura) ----------------------------------------------------
+
+ACTOR PuzzBook2 : PuzzleItem 9008
+{
+	Game Hexen
+	SpawnID 84
+	PuzzleItem.Number 8
+	Inventory.Icon ARTIBOK2
+	Inventory.PickupMessage "$TXT_ARTIPUZZBOOK2"
+	States
+	{
+	Spawn:
+		ABK2 A -1
+		Stop
+	}
+}
+
+
+// Flame Mask ---------------------------------------------------------------
+
+
+ACTOR PuzzFlameMask : PuzzleItem 9014
+{
+	Game Hexen
+	PuzzleItem.Number 9
+	Inventory.Icon ARTISKL2
+	Inventory.PickupMessage "$TXT_ARTIPUZZSKULL2"
+	States
+	{
+	Spawn:
+		ASK2 A -1
+		Stop
+	}
+}
+
+// Fighter Weapon (Glaive Seal) ---------------------------------------------
+
+ACTOR PuzzFWeapon : PuzzleItem 9015
+{
+	Game Hexen
+	PuzzleItem.Number 10
+	Inventory.Icon ARTIFWEP
+	Inventory.PickupMessage "$TXT_ARTIPUZZFWEAPON"
+	States
+	{
+	Spawn:
+		AFWP A -1
+		Stop
+	}
+}
+
+
+// Cleric Weapon (Holy Relic) -----------------------------------------------
+
+ACTOR PuzzCWeapon : PuzzleItem 9016
+{
+	Game Hexen
+	PuzzleItem.Number 11
+	Inventory.Icon ARTICWEP
+	Inventory.PickupMessage "$TXT_ARTIPUZZCWEAPON"
+	States
+	{
+	Spawn:
+		ACWP A -1
+		Stop
+	}
+}
+
+
+// Mage Weapon (Sigil of the Magus) -----------------------------------------
+
+ACTOR PuzzMWeapon : PuzzleItem 9017
+{
+	Game Hexen
+	PuzzleItem.Number 12
+	Inventory.Icon ARTIMWEP
+	Inventory.PickupMessage "$TXT_ARTIPUZZMWEAPON"
+	States
+	{
+	Spawn:
+		AMWP A -1
+		Stop
+	}
+}
+
+// Clock Gear 1 -------------------------------------------------------------
+
+ACTOR PuzzGear : PuzzleItem 9018
+{
+	Game Hexen
+	PuzzleItem.Number 13
+	Inventory.Icon ARTIGEAR
+	Inventory.PickupMessage "$TXT_ARTIPUZZGEAR"
+	States
+	{
+	Spawn:
+		AGER ABCDEFGH 4 Bright
+		Loop
+	}
+}
+
+
+// Clock Gear 2 -------------------------------------------------------------
+
+ACTOR PuzzGear2 : PuzzleItem 9019
+{
+	Game Hexen
+	PuzzleItem.Number 14
+	Inventory.Icon ARTIGER2
+	Inventory.PickupMessage "$TXT_ARTIPUZZGEAR"
+	States
+	{
+	Spawn:
+		AGR2 ABCDEFGH 4 Bright
+		Loop
+	}
+}
+
+
+// Clock Gear 3 -------------------------------------------------------------
+
+ACTOR PuzzGear3 : PuzzleItem 9020
+{
+	Game Hexen
+	PuzzleItem.Number 15
+	Inventory.Icon ARTIGER3
+	Inventory.PickupMessage "$TXT_ARTIPUZZGEAR"
+	States
+	{
+	Spawn:
+		AGR3 ABCDEFGH 4 Bright
+		Loop
+	}
+}
+
+
+// Clock Gear 4 -------------------------------------------------------------
+
+ACTOR PuzzGear4 : PuzzleItem 9021
+{
+	Game Hexen
+	PuzzleItem.Number 16
+	Inventory.Icon ARTIGER4
+	Inventory.PickupMessage "$TXT_ARTIPUZZGEAR"
+	States
+	{
+	Spawn:
+		AGR4 ABCDEFGH 4 Bright
+		Loop
+	}
+}
+