Class Ext_TraitZED_Summon extends Ext_TraitZEDBase
	abstract;

struct FZEDTypes
{
	var() array< class<KFPawn_Monster> > Zeds;
};
var() array<FZEDTypes> DefZedTypes;
var config array<string> ZedTypes;
var config float ZedRespawnTime;
var config int FinalLevelPrestige;

static function string GetPerkDescription()
{
	local string S;

	S = Super.GetPerkDescription();
	if( Default.FinalLevelPrestige>0 )
		S $= "|Level 6 requires prestige level: #{FF4000}"$Default.FinalLevelPrestige;
	return S;
}

static function CheckConfig()
{
	local byte i,j;

	if( Default.ZedTypes.Length==0 )
	{
		Default.ZedTypes.Length = Default.DefZedTypes.Length;
		for( i=0; i<Default.ZedTypes.Length; ++i )
		{
			for( j=0; j<Default.DefZedTypes[i].Zeds.Length; ++j )
			{
				if( j==0 )
					Default.ZedTypes[i] = PathName(Default.DefZedTypes[i].Zeds[j]);
				else Default.ZedTypes[i] $= ","$PathName(Default.DefZedTypes[i].Zeds[j]);
			}
		}
		Default.ZedRespawnTime = 60.f;
		Default.FinalLevelPrestige = 3;
		StaticSaveConfig();
	}
	else if( Default.ZedTypes.Length==5 ) // Upgrade config from old version.
	{
		Default.ZedTypes.Length = Default.DefZedTypes.Length;
		for( i=5; i<Default.ZedTypes.Length; ++i )
		{
			for( j=0; j<Default.DefZedTypes[i].Zeds.Length; ++j )
			{
				if( j==0 )
					Default.ZedTypes[i] = PathName(Default.DefZedTypes[i].Zeds[j]);
				else Default.ZedTypes[i] $= ","$PathName(Default.DefZedTypes[i].Zeds[j]);
			}
		}
		if( Default.LevelCosts.Length==5 )
			Default.LevelCosts.AddItem(Default.DefLevelCosts[5]);
		Default.FinalLevelPrestige = 3;
		StaticSaveConfig();
	}
	if( Default.ZedRespawnTime==0 )
	{
		Default.ZedRespawnTime = 60.f;
		StaticSaveConfig();
	}
	Super.CheckConfig();
	class'Ext_T_ZEDHelper'.Static.LoadMonsterList();
}

static function bool MeetsRequirements( byte Lvl, Ext_PerkBase Perk )
{
	local int i;

	// First check level.
	if( Perk.CurrentLevel<Default.MinLevel || (Lvl>=5 && Perk.CurrentPrestige<Default.FinalLevelPrestige) )
		return false;
	
	// Then check base trait.
	if( Lvl==0 && Default.BaseTrait!=None )
	{
		i = Perk.PerkStats.Find('StatType','Damage');
		if( i>=0 )
			return (Perk.PerkStats[i].CurrentValue>=30);
	}
	return true;
}
static function ApplyEffectOn( KFPawn_Human Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data )
{
	local Ext_T_ZEDHelper H;
	local int i;

	H = Player.Spawn(class'Ext_T_ZEDHelper',Player);
	if( H!=None )
		H.CurLevel = Level-1;
	
	// Make other traits refresh (apply HP/damage scalers).
	for( i=0; i<Perk.PerkTraits.Length; ++i )
		if( Perk.PerkTraits[i].CurrentLevel>0 && Class<Ext_TraitZEDBase>(Perk.PerkTraits[i].TraitType)!=None && !Class<Ext_TraitZEDBase>(Perk.PerkTraits[i].TraitType).Default.bIsSummoner )
			Perk.PerkTraits[i].TraitType.Static.ApplyEffectOn(Player,Perk,Level,Data);
}
static function CancelEffectOn( KFPawn_Human Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data )
{
	local Ext_T_ZEDHelper H;

	foreach Player.ChildActors(class'Ext_T_ZEDHelper',H)
		if( !H.bIsExtra )
			H.Destroy();
}

// Replication for final level prestige.
static function string GetRepData()
{
	local string S;
	
	S = Super.GetRepData();
	S $= IntToStr(Default.FinalLevelPrestige);
	return S;
}
static function string ClientSetRepData( string S )
{
	S = Super.ClientSetRepData(S);
	Default.FinalLevelPrestige = StrToInt(S);
	return S;
}

static function string GetValue( name PropName, int ElementIndex )
{
	switch( PropName )
	{
	case 'ZedTypes':
		return (ElementIndex==-1 ? string(Default.ZedTypes.Length) : Default.ZedTypes[ElementIndex]);
	case 'ZedRespawnTime':
		return string(Default.ZedRespawnTime);
	case 'FinalLevelPrestige':
		return string(Default.FinalLevelPrestige);
	default:
		return Super.GetValue(PropName,ElementIndex);
	}
}
static function ApplyValue( name PropName, int ElementIndex, string Value )
{
	switch( PropName )
	{
	case 'ZedTypes':
		if( Value!="#DELETE" && ElementIndex<Default.ZedTypes.Length )
			Default.ZedTypes[ElementIndex] = Value;
		break;
	case 'ZedRespawnTime':
		Default.ZedRespawnTime = float(Value);
		break;
	case 'FinalLevelPrestige':
		Default.FinalLevelPrestige = int(Value);
		break;
	default:
		Super.ApplyValue(PropName,ElementIndex,Value);
		return;
	}
	StaticSaveConfig();
}

defaultproperties
{
	bIsSummoner=true
	NumLevels=6
	DefLevelCosts(0)=20
	DefLevelCosts(1)=10
	DefLevelCosts(2)=10
	DefLevelCosts(3)=20
	DefLevelCosts(4)=30
	DefLevelCosts(5)=100
	DefMinLevel=20
	
	DefZedTypes.Add((Zeds=(Class'KFPawn_ZedClot_Alpha',Class'KFPawn_ZedClot_Slasher',Class'KFPawn_ZedClot_Cyst',Class'KFPawn_ZedCrawler')))
	DefZedTypes.Add((Zeds=(Class'KFPawn_ZedClot_Slasher',Class'KFPawn_ZedGorefast',Class'KFPawn_ZedStalker')))
	DefZedTypes.Add((Zeds=(Class'KFPawn_ZedBloat',Class'KFPawn_ZedStalker',Class'KFPawn_ZedGorefast')))
	DefZedTypes.Add((Zeds=(Class'KFPawn_ZedHusk',Class'KFPawn_ZedSirenX',Class'KFPawn_ZedScrake')))
	DefZedTypes.Add((Zeds=(Class'KFPawn_ZedSirenX',Class'KFPawn_ZedFleshpound',Class'KFPawn_ZedScrake')))
	DefZedTypes.Add((Zeds=(Class'ExtPawn_ZedHans_Pet')))
	
	WebConfigs.Add((PropType=2,PropName="ZedTypes",UIName="Zed Types",UIDesc="Type of zeds each level can spawn (separate types with a comma)",NumElements=-1))
	WebConfigs.Add((PropType=0,PropName="ZedRespawnTime",UIName="Zed RespawnTime",UIDesc="Time in seconds it takes for zeds to respawn"))
	WebConfigs.Add((PropType=0,PropName="FinalLevelPrestige",UIName="Final Level Prestige",UIDesc="Prestige level required for this perks final level"))
}