[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
[[http://www.siedler-portal.de/vb3/member.php?find=lastposter&t=4502|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 [[http://www.siedler-portal.de/vb3/forumdisplay.php?f=95|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,
}
\\
\\
[[:tutorials:index|Zur Tutorial-Übersicht]]