version "3.4"

//Mourning Glory.
#include "zscript/MourningGlory/mourningammo.txt"
#include "zscript/MourningGlory/mourningcasing.txt"
#include "zscript/MourningGlory/mourningprojectile.txt"
#include "zscript/MourningGlory/mourningstrat.txt"
#include "zscript/MourningGlory/mourningweapon.txt"

//Emperor Launcher.
#include "zscript/GoldenEmperor/emperorprojectile.txt"
#include "zscript/GoldenEmperor/emperorstrat.txt"
#include "zscript/GoldenEmperor/emperorweapon.txt"

//Sandman.
#include "zscript/Sandman/sandmanweapon.txt"
#include "zscript/Sandman/sandmanprojectile.txt"
#include "zscript/Sandman/sandmancasings.txt"
#include "zscript/Sandman/sandmanstrat.txt"
#include "zscript/Sandman/sandmanvisor.txt"

//Monolith.
#include "zscript/Spells/Monolith.txt"

//Compat stuff.
#include "zscript/Compat/deadmaker.txt"
#include "zscript/Compat/draugh.txt"
#include "zscript/Compat/spawners.txt"

//Sabbatha.
#include "zscript/sabbatha.txt"

//This item handles the give-all and whatever stuff.
class CheatersRespite : CustomInventory
{
	Default
	{
	  Inventory.Icon "ARTISUIT";
	  Inventory.PickupMessage "This thing right here is for things to work correctly, in case of cheats.";
	  Inventory.MaxAmount 2;
	  Inventory.Amount 1;
	  Inventory.PickupSound "";
	  Inventory.UseSound "";
	  +INVENTORY.UNDROPPABLE
	  +INVENTORY.AUTOACTIVATE
	  +INVENTORY.ALWAYSPICKUP
	}
	
	States
	{
	Spawn:
		SUIT A -1;
		Stop;
	Use:
	Pickup:
		TNT1 A 0 {
			Gcs_AddonShop.Unlock("DeadmakerMask");
			/*Gcs_AddonShop.Unlock(Gcs_AddonShop.olddreadful);
			Gcs_AddonShop.Unlock(Gcs_AddonShop.mourningglory);*/
			A_GiveInventory("DeadmakerMask",1);
			A_GiveInventory("MourningStrat",1);
			A_GiveInventory("EmperorStrat",1);
			A_GiveInventory("SandmanStrat",1);
		}
		Stop;
	}
}

//The Addon Thinker handler.
/*class GC_AddonStuff : EventHandler {
    static const Class<Thinker> launchOnWorldLoad[] = {'EmperorAmmoRefill', null}; //Golden Emperor ammo refill.
    override void WorldLoaded(WorldEvent e) {
        for (int i = 0; launchOnWorldLoad[i]; ++i) {
            new(launchOnWorldLoad[i]);
        }
    }
}*/

// Static stuff you need to be only loaded once on whole game startup.
// Also note to self: Titlemap also counts for regular EventHandlers, lol.

class GC_StaticAddonItems : StaticEventHandler
{
	override void OnRegister()
	{
		let GlobalData = GC_GlobalDataHandler.Get();
		if(GlobalData) // Make sure it exists.
		{
			//Gunzerk ammo regen list.
			GlobalData.AmmoRegenTypes.Push("MourningAmmo");
			GlobalData.AmmoRegenTics.Push(270);
			
			//Chest artifact list.
			GlobalData.ChestArtifactList.Push("DeadmakerMask");
			
			//Extra ammo bars.
			HUDGodWantsYourDataFingers ();
		}
	}
	
	protected void HUDGodWantsYourDataFingers () {
		let sbar_data = Gc_SbarData(Gc_SbarData.Find("Gc_SbarData"));
	 
		if(sbar_data) {
			let ammo_bars = sbar_data.AmmoBars();
		   
			if(ammo_bars) {
				ammo_bars.Add("MourningAmmo", "CAN2BAR", "CAN2UNIT");
				ammo_bars.Add("EmperorAmmo",  "EMPRBAR", "EMPRUNIT");
			}
		}
	}
}

// Addon item unlocking for bringers.
// kd: (updated from April 2019) no longer necessary x]

class AddonBringer : BaseBringer
{
	override void UnlockSecretItem (class <Inventory> inv_class) const {
		Gcs_AddonShop.Unlock(inv_class);
	}
}


// The Addon Shop Handler.

class GC_AddonItems : EventHandler {

	// Pillow: Hijacked so I won't multiply event handlers~
	override void WorldLoaded (WorldEvent event)
	{
		GoLeviathanYouDaMang ();
	}

	// Pillow: NEUE SHOPPE, NOW WITH 100% LESS SFX (kd: this didn't age well).
	override void NewGame () {
		Gcs_AddonShop shop = new("Gcs_AddonShop");
		
		if(shop) {
			shop.PostBeginPlay ();
		}
	}
	
	// Pillow: Inventory quick-wheel addition.
	protected void GoLeviathanYouDaMang () {
		let item_select = Gcq_QuickSelectHandler.ItemSelect();
		
		if(!item_select) {
			return;
		}
		
		let arti = item_select.type_artefact;
		let inv  = item_select.type_inventory;
		let tgl  = item_select.type_toggler;
		
		item_select.Add("DeadmakerMask", arti);
	}
}

class Gcs_AddonShop : Thinker {
	protected Gcs_BaseShopPack		shops;
	protected Gcs_ShopList			shop_list;
	protected Gcs_BaseItemTypes		types;
	
	enum unlockables {
		deadmakermask,
		/*olddreadful,
		mourningglory,*/
		
		unlock_size	// kd: If you keep this last it'll always be the item count.
	}
	
	Gcs_ShopList ShopList () const {
		return shop_list;
	}
	
	static Gcs_AddonShop Find () {
		let iterator = ThinkerIterator.Create("Gcs_AddonShop", stat_static);
		return Gcs_AddonShop(iterator.next());
	}
	
	static void Unlock (class <Inventory> inv_class) {
		Gcs_BaseShop.Unlock(inv_class);
	}
	
	protected void OrinLovesHell (class <Inventory> inv_class) {
		Gc_Shop_Inv	shop;
		int			item_i;
		
		[shop, item_i] = shop_list.FindInventory(inv_class);
		
		if(shop && 0 <= item_i && shop.IsHidden(item_i)) {
			shop.Unlock(item_i);
			Console.printf(
				"\c[fire]%s \c[ice]is now available in the \c[fire]%s shop!",
				GetDefaultByType(inv_class).GetTag(),
				shop.ShopName());
		}
	}
	
	override void PostBeginPlay () {
		ChangeStatNum(stat_static);
		ChenzHouse();
	}
	
	// Instantiate shop containers:
	protected void ChenzHouse () {
		let base_shop = Gcs_BaseShop.Find();
		
		if(base_shop) {
			shops		= base_shop.ShopPack();
			shop_list	= base_shop.ShopList();
			types		= base_shop.ItemTypes();
			
			/*shops.normal.AddForSale("MourningGlory", types.weapon, 10000);
			shops.normal.AddForSale("OldDreadful", types.weapon, 16000);*/
			shops.strats.AddForSale("MourningStrat", types.strat, 3000);
			shops.strats.AddForSale("EmperorStrat", types.strat, 6000);
			shops.strats.AddForSale("SandmanStrat", types.strat, 8000);
			shops.special.AddForSale(
				"DeadmakerMask", types.artefact, 40000,
				is_secret: true,
				particle_fx: "Gc_Spart_NewItem");
			
			base_shop.ForceActiveShopListUpdate();
		}
	}
}