class GC_Sabbatha : Gcs_Shopkeeper {
	Default {
		+FLOATBOB
		
		Gcs_Shopkeeper.ViewDistance 80;
		Gcs_Shopkeeper.Zoffset -5;
		FloatBobStrength 0.11337;
		RenderStyle "Translucent";
		Alpha 1.0;
		Scale 0.29666;
		
		Gcs_Shopkeeper.Icon				"shpksab";
		Gcs_Shopkeeper.NameKey			"Sabbatha";
		Gcs_Shopkeeper.TalkStartColor   Font.CR_BLACK;
		Gcs_Shopkeeper.TalkFinalColor   Font.CR_RED;
		Gcs_Shopkeeper.CanMessage		true;
		// Gcs_Shopkeeper.CommentaryColor1	Font.CR_RED;
		// Gcs_Shopkeeper.CommentaryColor2	Font.CR_WHITE;
		Gcs_Shopkeeper.ConsoleColor		"\c[gcfury]";
	}
	
	double grow_scale;
	
	States {
	
	// Frames:
	// a 1 - Neutral
	// b 2 - Tail swing
	// c 3 - -||-
	// d 4 - -||-
	// e 5 - Looky right
	// f 6 - Looky left (third eye)
	// g 7 - Looky right (third eye)
	// h 8 - Hand transition
	// i 9 - -||-
	// j 10 - Thumbs up
	// k 11 - Finger waggle
	// l 12 - -||-
	// m 13 - -||-
	// n 14 - Leg rocking
	
	Spawn:
		TNT1 A 0;
		
		SABB A 0 {
			A_SpawnItemEx("GC_SabbathaPentygram", flags: SXF_SETTARGET);
			A_SpawnItemEx("GC_SabbathaPentygram2", flags: SXF_SETTARGET);
			A_SpawnItemEx("GC_SabbathaAppears", zofs: 10);
			grow_scale = scale.x;
			scale = (0, 0);
		}
		
	Appears:
		"####" "#" 1 Bright {
			A_SetScale(scale.x + 0.01333);
			if(grow_scale <= scale.x) {
				A_SetScale(grow_scale);
				SetStateLabel("WelcomingStay");
			}
		}
		Wait;
	
	
	WelcomingStay:
		"####" "#" 45 Bright;
		goto IdleBegin;
	
	IdleBegin:
		SABB A 0 {
			let mo = Guncaster(user_mo);
			SetStateLabel("IdleNormal");
		}
		goto IdleNormal;
	
	IdleNormal:
		SABB A random(200, 400) Bright;
		goto AnyActionWillDo;
		
	AnyActionWillDo:
        SABB A 2 Bright A_Jump(100, "LookAround","LookAround2","LookAround3");
        SABB A 2 Bright A_Jump(60, "TailSwing","LegRocking");
        Goto LookAround;
		
	TailSwing:
		SABB BC 4 Bright;
		SABB D 5 Bright;
		SABB CBA 4 Bright;
		Goto IdleNormal;
		
	LookAround:
		SABB E 10 Bright;
		SABB A 5 Bright;
		Goto IdleNormal;
	LookAround2:
		SABB F 30 Bright;
		SABB A 5 Bright;
		SABB G 30 Bright;
		SABB A 5 Bright;
		Goto IdleNormal;
	LookAround3:
		SABB G 10 Bright;
		SABB A 5 Bright;
		Goto IdleNormal;
		
	LegRocking:
		SABB NA 8 Bright;
		SABB A 0 Bright A_Jump(180,"LegRockingAgain");
		Goto IdleNormal;
	LegRockingAgain:
		SABB NA 8 Bright;
		Goto IdleNormal;
		
	ThumbsUp:
		SABB HI 5 Bright;
		SABB J 30 Bright;
		SABB IH 5 Bright;
		Goto IdleBegin;
		
	Nope:
		SABB HI 5 Bright;
		SABB KLMLKLMLK 8 Bright;
		SABB IH 5 Bright;
		Goto IdleBegin;
		
	ByeBye:
		SABB HI 4 Bright;
		SABB J 20 Bright;
		SABB J 4 Bright A_SpawnItemEx("GC_SabbathaAppears",zofs:4);
		Stop;
		
	WhoopsByeBye:
		SABB F 7 Bright;
		SABB A 3 Bright;
		SABB G 7 Bright;
		SABB A 3 Bright;
		SABB A 4 Bright A_SpawnItemEx("GC_SabbathaAppears",zofs:4);
		Stop;
	}
	
	override void OnRemove () {
		A_SetScale(grow_scale);
		
		if(user_mo && user_mo.health < 1) {
			SetStateLabel("WhoopsByeBye");
			SpeakRandom("sabbatha_youdied", 1, 7);
		}
		
		SetStateLabel("ByeBye");
		SpeakRandom("sabbatha_byebye", 1, 9);
		
		may_talk = false;
		is_leaving = true;
	}
	
	void SpeakRandom (String lang_key, uint low, uint high) {
		String msg, sound;
		
		[msg, sound] = MsgAndVoice(lang_key, random(low, high));
		A_PlaySound(sound);
		
		if(customer.mo && consoleplayer == customer.mo.PlayerNumber()) {
			ConsoleSpeak(msg);
		}
	}
	
	override void PostBeginPlay () {
		String msg, sound;
		
		if(!!Guncaster(user_mo).user_carlton) {
			BoxSpeakVoice("sabbatha_carlton", random(1, 6));
		}
		
		else {
			BoxSpeakVoice("sabbatha_hello", random(1, 12));
		}
		
		idle_counter = 0;
		talk_timer = 35 * random(20, 25);
		may_talk = true;
	}
	
	override void OnBuy (int result, uint shop_i, uint item_i) {
		String msg, sound;
		
		switch(result) {
		case Gc_Shop_Inv.EVENT_BUY_OKAY:
		case Gc_Shop_Inv.EVENT_BUY_OKAY_BUT_WORSE:
			
			// Let's check the item.
			let inv = ItemClass(item_i);
			
			SetStateLabel("ThumbsUp");
			BoxSpeakVoice("sabbatha_buy", random(1, 11));
			
			talk_timer = 35 * random(25, 30);
			idle_counter = 0;
			break;
		
		case Gc_Shop_Inv.EVENT_BUY_POOR:
			SetStateLabel("Nope");
			BoxSpeakVoice("sabbatha_poor", random(1, 10));
			talk_timer = 35 * random(15, 20);
			break;
		
		case Gc_Shop_Inv.EVENT_BUY_MAXED:
		case Gc_Shop_Inv.EVENT_BUY_CANT_CARRY:
			SetStateLabel("Nope");
			BoxSpeakVoice("sabbatha_limit", random(1, 7));
			talk_timer = 35 * random(15, 20);
			break;
		}
	}
	
	int talk_timer;
	int idle_counter;
	bool may_talk;
	
	override void Tick () {
		super.Tick();
		
		if(may_talk) {
			if(talk_timer-- <= 0) {
				
				if(Guncaster(user_mo).user_carlton && random(0, 2) < 2) {
					SetStateLabel("ThumbsUp");
					BoxSpeakVoice("sabbatha_carlton", random(1, 4));
					idle_counter += 2;
					talk_timer = 35 * random(15, 20);
				}
				
				else if(idle_counter < 3) {
					BoxSpeakVoice("sabbatha_idle", random(1, 19));
					idle_counter++;
					talk_timer = 35 * random(20, 25);
				}
				
			}
		}
	}
	
	override void OnEquip (int result, uint shop_i, uint item_i) {
		// switch(result) {
		// case Gc_Shop_Inv.EVENT_EQUIP_ON:
			// break;
		// }
	}
}

class GC_SabbathaAppears : Actor {
    Default {
        +NOINTERACTION
		+DONTSPLASH
		+DONTBLAST
		+NOTIMEFREEZE
    }

    States {
    Spawn:
        TNT1 A 35 NoDelay {
			A_PlaySound("Matriarch/Exp",6);
			A_PlaySound("Sabbatha/Poof",5);
			A_QuakeEx(4,1,1,25,0,128,"none",QF_SCALEDOWN);
			A_SpawnItemEx("GC_NithorPoof",0,0,0,0,0,0,0,SXF_CLIENTSIDE);
			A_SpawnItemEx("GC_SabbyFlames",0,0,0,0,0,0,0,SXF_CLIENTSIDE);
		}
        Stop;
    }
}

class GC_SabbathaPentygram : Actor {
    Default {
		Scale 0.0;
		Alpha 0.0;
		Renderstyle "Add";
        +NOINTERACTION
		+DONTSPLASH
		+NOTIMEFREEZE
		+DONTBLAST
		+ROLLSPRITE
		+ROLLCENTER
		+INTERPOLATEANGLES
    }
	
	override void tick() {
		let shopkeeper_owner = Gcs_Shopkeeper(target);
		if(shopkeeper_owner) {
			SetOrigin(target.pos + 20 / shopkeeper_owner.view_distance * shopkeeper_owner.view_offset + (0, 0, 0.69 * 0.69 * 69 * 0.69 * 0.69), true); // we're adults at work I swear~
		}
		Super.Tick();
		Return;
	}
	
	double BaseAlpha;
	double TickMod;
	double ScaleMod;
	double AlphaMod;
	double RollMod;
	double RollMod2;
	int switchmod;
	
    States {

    Spawn:
        BASK B 0 NoDelay {
			if(GetCvar("GC_ToasterMode")) {
				return ResolveState("Null");
			}
			BaseAlpha = 1.0;
			TickMod = 25;
			ScaleMod = 0.08 / TickMod; // Should be fine, so long as I won't leave TickMod as zero, lol.
			AlphaMod = BaseAlpha / TickMod;
			RollMod = 360.0 / TickMod;
			RollMod2 = 0.15;
			return ResolveState(Null);
		}
	GrowUp:
		BASK B 1 Bright {
			A_SetScale(Scale.X + ScaleMod);
			A_FadeIn(AlphaMod);
			//A_SetRoll(Roll + RollMod, SPF_INTERPOLATE);
			TickMod--;
			Return A_JumpIf(TickMod <= 0, "Main");
		}
		Loop;
	Main:
		BASK B 1 Bright {
			A_SetRoll(Roll + RollMod2, SPF_INTERPOLATE);
			if(Alpha >= BaseAlpha) 	   { SwitchMod = 0; }
			else if (Alpha <= (BaseAlpha - 0.1)) { SwitchMod = 1; }
			if(SwitchMod > 0)  { A_FadeIn(0.005); A_SetScale(Scale.X - 0.00015); }
			else 		   { A_FadeOut(0.005); A_SetScale(Scale.X + 0.00015); }
			let shopkeeper_owner = Gcs_Shopkeeper(target);
			if(shopkeeper_owner.is_leaving) {
                return ResolveState("Death");
            }
			return ResolveState(Null);
        }
        Loop;
    Death:
        BASK B 1 Bright {
			A_SetScale(Scale.X - (ScaleMod * 0.5));
			A_FadeOut(AlphaMod * 0.5);
			A_SetRoll(Roll + (RollMod * 0.5), SPF_INTERPOLATE);
			
			Return A_JumpIf(Scale.X <= 0, "Null");
		}
		Loop;
    }
}

class GC_SabbathaPentygram2 : GC_SabbathaPentygram {

	States {
    Spawn:
        BASK B 0 NoDelay {
			if(GetCvar("GC_ToasterMode")) {
				return ResolveState("Null");
			}
			BaseAlpha = 0.6;
			TickMod = 25;
			ScaleMod = 0.1 / TickMod; // Should be fine, so long as I won't leave TickMod as zero, lol.
			AlphaMod = BaseAlpha / TickMod;
			RollMod = 360.0 / TickMod * -1;
			RollMod2 = -0.15;
			return ResolveState(Null);
		}
		Goto GrowUp;
	}
}

class GC_SabbyFlames : Actor {
	Default {
		+NOINTERACTION
		+DONTSPLASH
		+NOTIMEFREEZE
		+DONTBLAST
	}
	
	int bap;
	
	States {
	
	Spawn:
		TNT1 A 0 NoDelay {
			for(int honk = 0; honk < 25; honk++) {
				A_SpawnItemEx("GC_SabbyFlame",frandom(24.0,-24.0),
					frandom(24.0,-24.0),frandom(24.0,-24.0),frandom(1.0,0.1),
					0,frandom(1.0,0.1),frandom(0.0,360.0),SXF_CLIENTSIDE);
			}
			bap = 17;
		}
		TNT1 A random(0,2) {
			A_SpawnItemEx("GC_SabbyFlame",frandom(24.0,-24.0),
				frandom(24.0,-24.0),frandom(24.0,-24.0),frandom(1.0,0.1),
				0,frandom(1.0,0.1),frandom(0.0,360.0),SXF_CLIENTSIDE);
			bap--;
			Return A_JumpIf(bap <= 0, "Null");
		}
		Wait;
	}
}

class GC_SabbyFlame : Actor {
	Default {
		Scale 0.3;
		Renderstyle "Add";
		+NOINTERACTION
		+DONTSPLASH
		+NOTIMEFREEZE
		+DONTBLAST
	}
	
	States {
		Spawn:
			TNT1 A 0 NoDelay A_PlaySound("vile/firecrkl",5,0.6);
			SABF ABCDE 2 Bright;
			SABF FGH 2 Bright A_FadeOut(0.1);
			Stop;
	}
}