Inhaltsverzeichnis

Tenji

Um die AI für einen gegnerischen Spieler festzulegen, ...


… verwendet man bisher entweder die ausführliche SetupPlayerAi-Funktion, oder die schnelle MapEditor_SetupAI.
Bei letzterer muss mann aber zusätzlich SetupPlayerAi verwenden, um die AI Rohstoffe abbauen und die Gebäude reparieren zu lassen.

In beiden Fällen muss man dann noch zusätzlich per SetPlayerName den Namen festlegen, der im Diplomatiefenster angezeigt wird und eventuell mit SetNeutral/Hostile/Friendly die Beziehungen zu anderen Spielern festlegen.
Wenn man dann noch die Farbe ändern und die Sicht mit einem anderen Spieler teilen möchte, müssen auch noch die „spezielleren“ Funktionen Display.SetPlayerColorMapping und Logic.SetShareExplorationWithPlayerFlag ran.


Das muss doch einfacher gehen, sollte man meinen... Und ja, mit dieser SetupAI-Funktion auf jeden Fall!

Sie beinhaltet zwar noch nicht die einzellnen Resourcen-Parameter der SetupPlayerAi, aber da mir bisher die MapEditor_SetupAI ausreichte, habe ich den Code darauf basieren lassen. Bei Bedarf, werde ich das ändern. Dazu bitte hier in der Scriptecke des siedler-portal-Forums melden.


Zunächst das gesamte Spektrum an Möglichkeiten, das diese Funktion bietet. Beispiele folgen weiter unten.

SetupAI{
	-- ID der AI
	id = 5, -- (immer notwendig!)
	-- Name. der im Diplomatiefenster angezeigt werden soll
	name = "Tenji",
	-- Farbe des Spielers
	color = "green", -- (verfügbar: blue, orange, yellow, white, violet, cyan, red, green, grey, black, beige)
	-- Hauptquartier des Spielers
	headquaters = "BurgVonTenji", -- oder auch position (notwendig für's setup - aber nicht für color, eyplore, freinds, enemies)
	-- regulere Daten der AI
	strength = 3,
	range = 8000,
	techlevel = 3,
	aggressiveness = 3,
	-- sollen die Leibeigenen Rohstoffe abbauen?
	extracting = true, -- (true = ja, false = nein - oder einfach weg lassen)
	-- sollen die Leibeigenen die Gebäude reparieren?
	repairing = true,
	-- Freunde der AI
	friends = true, --(bei mehreren einen Table verwenden ansonsten die playerID - true = AI ist Feind von Spieler1)
	-- friends = {1,2,5}
	-- Feinde der AI
	enemies = true,
	-- enemies = {1,2,5}	
	-- Sicht mit dem anderen Spieler teilen?
	explore = true, -- (true = Spieler1 sieht was die AI macht)
	- -- bei Multiplayerkarten, wo mehrere Spieler sehen wollen, was der andere macht
	-- explore = {2,3,5} -- (jetzt sieht nur der Spieler, für den SetupAI verwendet wird, was der andere macht)
	-- explore = {2,3,5, both = true} -- (both = beide sehen, was der andere macht)
}



Dies ist der dazu benötigte Code:

------------------------------------------------------------------------------------------------------------------------------------------------------------
--  Comfort function to setup AIs comfortable		Version 1.00						by Tenji
------------------------------------------------------------------------------------------------------------------------------------------------------------
function SetupAI(_aiTable)
 
	-- check input data:
	local ai = _aiTable;
	ai.position = ai.position or ai.headquarters or "";
	assert(ai.id and type(ai.id) == "number");
	assert(type(ai.headquarters) == "table" or "string");
 
	ai.strength = ai.strength or 0;
	ai.range = ai.range or 2500;
	ai.techlevel = ai.techlevel or 0;
	ai.aggressiveness = ai.aggressiveness or 0;
	ai.peacetime = ai.peacetime or 0;
 
	-- setup!
	MapEditor_SetupAI(ai.id, ai.strength, ai.range, ai.techlevel, ai.position, ai.aggressiveness, ai.peacetime);
	if ai.extracting then
		SetupPlayerAi(ai.id, {extracting = 1});
	end
	if _aiTable.repairing then
		SetupPlayerAi(ai.id, {repairing = 1});
	end
 
	-- relationships:
	local notNeutral = {};
	local settings = {};
	if ai.friends then
		table.insert(settings, {setRelation = SetFriendly, input = ai.friends});
	end
	if ai.enemies then
		table.insert(settings, {setRelation = SetHostile, input = ai.enemies});
	end
	if table.getn(settings) == 0 then
		SetNeutral(1, ai.id)
	end
 
	for i = 1, table.getn(settings) do
		if settings[i].input then
			if type(settings[i].input) == "table" then
				for p = 1, table.getn(settings[i].input) do
					settings[i].setRelation(ai.id, settings[i].input[p]);
					table.insert(notNeutral, settings[i].input[p]);
				end
			elseif type(settings[i].input) == "number" then
				settings[i].setRelation(ai.id, settings[i].input);
				table.insert(notNeutral, settings[i].input);
			else
				settings[i].setRelation(1, ai.id);
				table.insert(notNeutral, 1);
			end
		end
	end
	for i = 1, table.getn(notNeutral) do
		local neutral = true;
		for p = 1, 8 do
			if notNeutral[i] == p then
				neutral = false;
			end
		end
		if neutral then
			SetNeutral(ai.id, p);
		end
	end
 
	-- optical settings:
	if ai.name and type(ai.position) == "string" then 
		SetPlayerName(ai.id, ai.name); 
	end
	if ai.color then
		local colorTable = {
			blue = PLAYER_COLOR,
			orange = FRIENDLY_COLOR1, 
			yellow = FRIENDLY_COLOR2, 
			white = FRIENDLY_COLOR3, 
			violet = ENEMY_COLOR1, 
			cyan = ENEMY_COLOR2, 
			red = NEPHILIM_COLOR, 
			green = EVIL_GOVERNOR_COLOR, 
			grey = KERBEROS_COLOR, 
			black = ROBBERS_COLOR, 
			beige = NPC_COLOR,
		};
		local color = colorTable[ai.color] or ai.color;
		assert(type(color) == "number", "SetupAI(): color have to be type string! \n Please pay attention to correct spelling! Available Colors: blue, orange, yellow, white, violet, cyan, red, green, grey, black, beige. \n Or use the global variables if you like.");
		Display.SetPlayerColorMapping(ai.id, color);
	end
	if ai.explore then
		Logic.SetShareExplorationWithPlayerFlag(1, ai.id, 1);
	elseif ai.explore == false then
		Logic.SetShareExplorationWithPlayerFlag(1, ai.id, 0);
	end
 
end



Verwenden könnte man sie zB. so:


Und hier nun ein konkretes Beispiel, wie man eine normale AI damit erstellen kann:

SetupAI{
	id = 3,
	headquarters = "HQ_Player3",
	color = "black",
	strength = 2,
	range = 5000,
	techlevel = 2,
	aggressiveness = 2,
	peacetime = 300,
	enemies = true,
}


Und ein weiteres, etwas komplexeres Beispiel:

SetupAI{
	id = 4,
	name = "Atlantis",
	headquarters = "HQ_Player4",
	color = "white"
	strength = 0,
	range = 15000,
	techlevel = 3,
	aggressiveness = 3,
	extracting = true,
	repairing = true,
	friends = true,
	enemies = {2,3},
	explore = true,
}



Zur Tutorial-Übersicht