const int chest_droprate = 64;

enum {
	CKEY_BRONZE,
	CKEY_SILVER,
	CKEY_GOLD
};

enum {
	DND_CHESTTYPE_BRONZE,
	DND_CHESTTYPE_SILVER,
	DND_CHESTTYPE_GOLD
};

Actor ChestKeyDrop : InventoryBase {
	States {
		SpawnLoop:
		Idle:
			"####" "#" 1 Bright A_LookEx(LOF_NOSOUNDCHECK, 0, 28, 0, 360, "CheckPickup")
		Loop
	
		PickupSuccess:
			TNT1 A 8 ACS_NamedExecuteAlways("DnD Stacked Item Pickup", 0, mass - 1, DND_STACKEDITEM_CHESTKEY)
		stop
	}
}

Actor ChestkeySoundPlayer : DnD_Activator {
	States {
		Pickup:
			//TNT1 A 0 A_PlaySound("Items/ChestKey", 7)
			TNT1 A 0 A_SetBlend("45 99 45", 0.6, 17)
		Stop
	}
}

Actor BronzeChestKey : ChestKeyDrop {
	States {
		Spawn:
			SBKY A 0
		Goto SpawnInit
	}
}

Actor SilverChestKey : ChestKeyDrop {
	States {
		Spawn:
			SBKY B 0
		Goto SpawnInit
	}
}

Actor GoldChestKey : ChestKeyDrop {
	States {
		Spawn:
			SBKY C 0
		Goto SpawnInit
	}
}

ACTOR DNDBronzeChest {
	Height 32
	Radius 16
	Tag "Bronze Chest"
	+USESPECIAL
	Activation THINGSPEC_ThingTargets
	States {
		Spawn:
			SUBX A 0
			SUBX A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Try Open Chestkey", DND_CHESTTYPE_BRONZE), "Open")
			SUBX A 0 A_GiveToTarget("BronzeChestMsg")
			SUBX A 1 A_ClearTarget
		Loop
		Open:
			TNT1 A 0 A_TakeFromTarget("BronzeChestKey", 1)
			SUBX A 3
		DropContent:
			SUBX B 5 A_PlaySound("Chest/Open")
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Chest Opened", 0, DND_CHESTTYPE_BRONZE)
			TNT1 AAAAA 0 A_SpawnItemEx("SmallCreditSpawner")
			TNT1 AAA 0 A_SpawnItemEx("SmallCreditSpawner_Elite")
			TNT1 A 0 A_SpawnItemEx("BudgetDropper_Low")
			SUBX B -1
		Stop
	}
}

ACTOR DNDSilverChest : DNDBronzeChest {
	States {
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Try Open Chestkey", DND_CHESTTYPE_SILVER), "Open")
			TNT1 A 0 A_GiveToTarget("SilverChestMsg")
			SUBX C 1 A_ClearTarget
		Loop
		Open:
			TNT1 A 0 
			TNT1 A 0 A_TakeFromTarget("SilverChestKey", 1)
			SUBX C 3
		DropContent:
			SUBX D 5 A_PlaySound("Chest/Open")
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Chest Opened", 0, DND_CHESTTYPE_SILVER)
			TNT1 AAAAA 0 A_SpawnItemEx("MediumCreditSpawner")
			TNT1 AAA 0 A_SpawnItemEx("MediumCreditSpawner_Elite")
			TNT1 A 0 A_SpawnItemEx("BudgetDropper_Medium")
			TNT1 A 0 A_GiveInventory("ChestResearchDropper", 1)
			SUBX D -1
		Stop
	}
}

ACTOR DNDGoldChest : DNDBronzeChest {
	States {
		Spawn:
			SUBX C 0
			SUBX C 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Try Open Chestkey", DND_CHESTTYPE_GOLD), "Open")
			SUBX C 0 A_GiveToTarget("GoldChestMsg")
			SUBX E 1 A_ClearTarget
		Loop
		Open:
			TNT1 A 0 
			TNT1 A 0 A_TakeFromTarget("GoldChestKey", 1)
			SUBX E 3
		DropContent:
			SUBX F 5 A_PlaySound("Chest/Open")
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Chest Opened", 0, DND_CHESTTYPE_GOLD)
			TNT1 AAAAAA 0 A_SpawnItemEx("LargeCreditSpawner_Elite")
			TNT1 A 0 A_SpawnItemEx("BudgetDropper_High")
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Drop Research")
			SUBX F -1
		Stop
	}
}

Actor ChestResearchDropper : DnD_Activator {
	States {
		Use:
			TNT1 A 0 A_Jump(128, "Failed")
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Drop Research")
		Stop
		Failed:
			TNT1 A 0
		Stop
	}
}

Actor BronzeChestMsg : DnD_Activator {
	States {
		Use:
			TNT1 A 0 A_PlaySound("Chest/Locked")
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Message Logger", 0, 5, CKEY_BRONZE)
		Stop
	}
}

Actor SilverChestMsg : DnD_Activator {
	States {
		Use:
			TNT1 A 0 A_PlaySound("Chest/Locked")
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Message Logger", 0, 5, CKEY_SILVER)
		Stop
	}
}

Actor GoldChestMsg : DnD_Activator {
	States {
		Use:
			TNT1 A 0 A_PlaySound("Chest/Locked")
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Message Logger", 0, 5, CKEY_GOLD)
		Stop
	}
}