
// ************************
// MASTERSKRIPT - Zustände
// ************************

// Zum besseren Verständnis benutze ich die Namenskonventionen von Michael

// -> internals
CONST INT FMODE_NONE	=	0;
CONST INT FMODE_FIST	=	1;
CONST INT FMODE_MELEE	=	2;
CONST INT FMODE_FAR		=	6;
CONST INT FMODE_MAGIC	=	8;

/************************************************************************
*			ZS_Default													*
*			==========													*
************************************************************************/
func void ZS_Default()
{
};

func void ZS_Bezerk ()
// Keine Fluchtmöglichkeiten, also DoTheBezerk
{
		B_DrawWeapon(self); //ohne Waffe kein Angriff
		AI_Attack(self,other);// Atttacke ich komme hier nicht weg
};

/*func void ZS_Sleep ()
{
	AI_AlignToWP ( self, /*BedWP);
	if (AI_GetNearestItem (self)&& item.flags[OBJ_FLAG_LIEDOWN])
	{
		AI_LieObj(self);
	}
	else
	{
		// sieben Schritte in eine bestimmte Richtung, wenn Bett--> hinlegen
	};
};*/


func void ZS_Dead ()
{
};


func void ZS_High ()
{
};

func void ZS_Attack ()
{
	AI_Attack (self,other);
};


/*func void ZS_AssessTheft ()
{
	PrintDebug("ZS_AssessTheft");
	if (self.attitude == ATT_FRIENDLY)
	{
		B_Say(self,"HeyWasSollDerScheiß,SeineEigenenLeuteZuBeklauen?");
	}
	else
	{
		AI_DoState(self,ZS_Attack,5);
	};
};*/

func void ZS_CatchThief ()
{
};

func void ZS_AssessCall ()
{
};	

func void ZS_AssessTraveler ()
{
};

/*func void ZS_MoveMob ()
{
};
*/
func void ZS_MovePerson ()
{
};

/*func void ZS_Talk ()
{
	if (Npc_IsPlayer (other))
	{
		if (self.attitude == ATT_HOSTILE)
		{
			AI_DoState (self,ZS_AssessEnemy,3);
		}
		else
		{
			if (self.attitude == ATT_ANGRY)
			{
				if (self.memory == SC_ATTACKED)
				{
					B_Say(self,"YouAttackedMe);
				}
				else if (self.memory == SC_STOLE)
				{
					B_Say (self,"YouStoleFromMe");
				}
				else if (self.memory == SC_ANNOYED )
				{
					B_Say (self,"YouPissedMeOff");
				};
			}
			else if ( 
			{
				
};*/

func void ZS_AssessItem ()
{
};

func void ZS_GuardEntrance ()
{
};

func void ZS_GiveAlarm ()
{
};

func void ZS_GetHelp ()
{
};

/*func void ZS_Fight ()
{
};*/

func void ZS_PickOre ()
{
};

func void ZS_Cook ()
{
};

/*
func void ZS_GotoWP ()
{
	AI_GotoWP (self,self.wp);// Im Zustand gehe dahin geht Nsc dahin ! (Sonst noch fragen ?)
};
*/

func void ZS_Unconcious_Begin ()
{
	self.aivar [0] == 0;
	//AI_Output (/* hinfallen etc., evtl. B_Unconcious ?*/);
};
	
func void ZS_Unconcious ()
{
	if (self.aivar [0] != 40/*Zeitschema mit Mike absprechen, hier mal 120sek oder xxxWeltzeit */)
	{
		//AI_Lie(self,/* Boden*/);
		self.aivar [0] += 1;
	};
};

func void ZS_Unconcious_End ()
{
	//AI_Output (/*Benommen Aufstehen*/);
};






// alte AI_MASTER.D
/*
FUNC VOID ZS_ReactToDamage()
// self		= getroffener NSC
// other	= Verursacher
{
	Print("Grrr, das wirst du büßen.");
	AI_Attack(self,other);
};

FUNC VOID ZS_AssessEnemy ()
// self		= NSC der Feind gesehen hat
// other	= NULL !!!
{
	Print("Habe einen Feind gesehen.");
};

FUNC VOID ZS_AssessThreat ()
// self		= NSC der Bedrohung gesehen hat
// other	= NULL !!!
{
	Print("Habe eine Bedrohung gesehen.");
};

FUNC VOID ZS_AssessFriendsDamage()
// self		= NSC - Zeuge
// other	= Täter
// victim	= Opfer
{
	B_Say(self,"$YoubrazenBastard");
	Print("Ich sehe, wie ein Freund von mir verhauen wird.");
};

FUNC VOID ZS_CatchThief()
// self		= NSC - Bestohlener
// other	= Täter
{
	Print("Ich habe dich beim Stehlen erwischt.");
};

FUNC VOID ZS_AssessTheft()
// self		= NSC - Zeuge
// other	= Täter
// victim	= Opfer
{
	Print("Ich habe dich beim Bestehlen eines anderen erwischt !");
};

FUNC VOID ZS_ObserveIntruder()
// self		= NSC - Betroffener
// other	= intruder
{
	Print("Ich behalte dich im Auge.");
};

FUNC VOID ZS_AssessCall()
// self		= NSC - "Angerufener"
// other	= "Anrufer"
{
	Print("Du schreist mich an ?");
};

FUNC VOID ZS_AssessTalk()
// self		= NSC - Angesprochener
// other	= Ansprecher
{
	Print("Ich will nicht mit dir sprechen.");
};

FUNC VOID ZS_AssessNpc()
{	
	Print("Ich sehen einen NPC.");
};

FUNC VOID ZS_AssessItem()
// self		= NSC
// item		= NULL !!!
{
	Print("Items detected.");
};

FUNC VOID ZS_AssessMob()
// self		= NSC
// mob		= NULL !!!
{
	Print("Mobs detected.");
};

FUNC VOID ZS_MoveMob()
// self		= NSC, dem der Mob im Wege steht
// mob		= der Mob
{
	Print("Mob im Weg !");
};

FUNC VOID ZS_MoveNpc()
// self		= NSC, dem der andere NSC im Wege steht
// other	= anderer NSC
{
	Print("NSC im Weg,");
};

// **************************************************************************************
// Boni - Funktions
// **************************************************************************************

FUNC VOID ZS_Dies()
{
	Print("Uargh.");
};

FUNC VOID ZS_EnemyDown()
{
	Print("Ha ! Steh auf, du Lusche !");
};

/*
FUNC INT ZS_AssessThreat()
{		
	if (Wld_DetectPlayer(self)) {
		// *** other ist Player ***
		if (Npc_IsInFightMode(other,FMODE_MAGIC)) {
			// und zwar mit Magie.- was fürn Spruch
			// spellnr = Npc_GetActiveSpell(other);
			// usw.
			Print("Magie aktiv.");
	
		} else if (Npc_IsInFightMode(other,FMODE_FIST)) {
			// Faustkampfmodus
			Print("Faust aktiv.");

		} else if (Npc_IsInFightMode(other,FMODE_FAR)) {
			// Fernkampfwaffe
			// Zielt er auf mich ?
			if (Npc_IsAiming(other,self)) {
				Print("Nimm die Fernkampfwaffe runter.");
			} else {
				Print("Fernkampfwaffe aktiv.");
			};

		} else if (!Npc_IsInFightMode(other,FMODE_NONE)) {
			// und zwar mit einer Nahkampfwaffe
			// Zielt er auf mich ?
			if (Npc_IsAiming(other,self)) {
				AI_PointAtObj	(self,other);
				Print("Hey du, nimm die Nahkampfwaffe runter.");
				AI_Wait			(self,5);
				AI_StopPointAt	(self);
			} else {
				Print("Nahkampfwaffe aktiv.");
			};
		};
	};	
};

FUNC VOID ZS_ObserveIntruder()
// NSCs sind nicht im Waffenmodus
{
	if (Wld_DetectPlayer(self)) {

		if (!Npc_IsInFightMode(other,FMODE_NONE)) {
			ZS_AssessThreat();
		
		} else {

			self.aivar[0] += 1;
			AI_PointAtObj	(self,other);
			AI_Wait			(self,1);
			AI_StopPointAt	(self);
			if (self.aivar[0] == 1) {
				Print("Hey, rück mir ja nicht auf die Pelle.");
			} else if (self.aivar[0] == 2) {
				Print("Ich sagte, verschwinde !");
			};
		};
	};	
};

FUNC INT C_AreWeStronger(VAR C_NPC self)
{
	return 1;
};

FUNC INT C_IsHostile(VAR C_NPC self, VAR C_NPC other)
{
	if ((Npc_IsPlayer(other)) && (self.attitude==ATT_HOSTILE)) {
		return 1;
	} else {
		// Hier Gildenattitude verwenden
		return 0;
	};
};

FUNC VOID ZS_Attack(VAR C_NPC self, VAR C_NPC other)
{
	AI_Attack(self,other);	
};

FUNC VOID ZS_Flee(VAR C_NPC self, VAR C_NPC other)
{
//	AI_Flee(self,other);
};

FUNC VOID ZS_AssessEnemy(VAR C_NPC self, VAR C_NPC other)
// Gegnerbewertung
{
	// Schaut, ob "other" andere befreundete NSCs bedroht
	// Bei bedrohten NSCs wird die Skript-Funktion "wurde gewarnt" ausgeführt.
	if (Npc_WarnFriends(self,other)) {
		// --- AI_Output -> "Hey, hinter dir !"
	} else

	// Ist der _SC_Feind im Fluchtradius von einem _SC_Freund ?
	if (Npc_IsPlayer(other)) && (PC_IsNearFriendlyPC(self,other)) {
		// --- do something ---
	} else

	if (C_AreWeStronger(self)) {
		// Stärker, dann angreifen
		ZS_Attack(self,other);

	} else {
		// sonst fliehen
		ZS_Flee(self,other);
	};
};
*/
/*
FUNC VOID ZS_AssessThreat(VAR C_NPC self, VAR C_NPC other)
// Bedrohung durch anderen NSC ( nicht - feindlich )
{
	// Feind ?
	if (C_IsHostile(self,other)) {
		ZS_AssessEnemy(self,other);
	} else

	if (Npc_IsInFightMode(other,FMODE_MAGIC)) {
		// und zwar mit Magie.- was fürn Spruch
		// spellnr = Npc_GetActiveSpell(other);
		// usw.
		Print("Magie aktiv.");
	
	} else if (Npc_IsInFightMode(other,FMODE_FIST)) {
		// Faustkampfmodus
		Print("Faust aktiv.");
	
	} else if (Npc_IsInFightMode(other,FMODE_FAR)) {
		// Fernkampfwaffe
		// Zielt er auf mich ?
		if (Npc_IsAiming(other,self)) {
			Print("Nimm die Fernkampfwaffe runter.");
		} else {
			Print("Fernkampfwaffe aktiv.");
		};

	} else if (!Npc_IsInFightMode(other,FMODE_NONE)) {
		// und zwar mit einer Nahkampfwaffe
		// Zielt er auf mich ?
		if (Npc_IsAiming(other,self)) {
			AI_PointAtObj(self,other);
			Print("Hey du, nimm die Nahkampfwaffe runter.");
			AI_Wait(self,5);
			AI_StopPointAt(self);
		} else {
			Print("Nahkampfwaffe aktiv.");
		};
	} else {
		Print("Normalmodus.");
	};
};

FUNC VOID ZS_Talk(VAR C_NPC self, VAR C_NPC other)
{
	// Achtung : neue Parsersyntax -> Aufruf von Member-Funktionen
	// Erst hierdurch wird einfache Modularität ermöglicht.
	// Jedem NSC kann eine andere "OfferMission" - Funktion zugewiesen werden.
	// die dann durch die Master-AI ausgeführt wird.
	//self.OfferMission();
};
/*func void ZS_ATTACK(var C_NPC self, var C_NPC other)
{
	if(C_GetTarget(self,other))
	{
		if(C_AreWeStronger(self))
		{
			B_DrawWeapon(self);
			AI_Attack(self,other);
		}
		else
		{
			AI_DoState (self,ZS_Flee,1);
		};
	else 
	{
		C_GetTarget(self);
	};
	AI_DoState (self,ZS_SeekEnemy,1);
};*/	


FUNC VOID ZS_WatchForPlayer()
{
	// Do nothing...
};

FUNC VOID ZS_WatchForPlayer_Loop()
{
	if (Wld_DetectPlayer(self)) {
		AI_Attack(self,other);
	};
};

FUNC VOID ZS_Bribe()
{
	AI_GotoWP(self,self.wp);
};

FUNC VOID ZS_Bribe_Loop()
{
	VAR C_ITEM selfWeapon;
	VAR C_ITEM otherWeapon;

	if ((self.aivar[0]==0) && (Wld_DetectPlayer(self))) {
		if (Npc_HasEquippedMeleeWeapon(self) && Npc_HasEquippedMeleeWeapon(other))
		{
			selfWeapon	= Npc_GetEquippedMeleeWeapon(self);
			otherWeapon = Npc_GetEquippedMeleeWeapon(other);

			if (selfWeapon.dam_weapon < otherWeapon.dam_weapon)
			{
				self.aivar[0] = 1;	// Asked...
				AI_TurnToNpc	(self,	other);
				//AI_Ask			(self,	"Grunt: 'He Kleiner, deine Klinge gefällt mir. GIB SIE MIR!!!",Bribe_Yes,Bribe_No);
			};
		};
	};
};

FUNC VOID Bribe_Yes()
{
	VAR C_ITEM otherWeapon;

	otherWeapon =	Npc_GetEquippedMeleeWeapon(other);
	Npc_GiveItem	(other,	otherWeapon, self);
	AI_EquipBestMeleeWeapon(self);

	AI_PointAtObj	(self,	other);
	
	AI_Wait			(self,	0.5);
	AI_StopPointAt	(self);	
};

FUNC VOID Bribe_No()
{
	
	AI_Attack		(self,	other);
};

func void ZS_Heal ()
{
};

FUNC VOID ZS_AssessFriendsDamage()
// self		= NSC - Zeuge
// other	= Täter
// victim	= Opfer
{
	Print("Ich sehe, wie ein Freund von mir verhauen wird.");
	
};

FUNC VOID ZS_AssessTalk()
// self		= NSC - Angesprochener
// other	= Ansprecher
{
	PrintDebug("Ich will nicht mit dir sprechen.");
};

	FUNC VOID ZS_AssessMob()
// self		= NSC
// mob		= NULL !!!
{
	PrintDebug("Mobs detected.");
};


FUNC VOID ZS_MoveNpc()
// self		= NSC, dem der andere NSC im Wege steht
// other	= anderer NSC
{
	PrintDebug("NSC im Weg,");
};

FUNC VOID ZS_Dies()
{
	PrintDebug("Uargh.");
};

FUNC VOID ZS_EnemyDown()
{
	PrintDebug("Ha ! Steh auf, du Lusche !");
};

