Inhaltsverzeichnis
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, }