Benutzer-Werkzeuge

Webseiten-Werkzeuge


utilscripts:aiscript

KI-Script

Dieses Script sollte bisher nur in Einzelspielerkarten verwendet werden, da in Multiplayerkarten Desyncs sehr wahrscheinlich sind. Vor allem die Upgrades und die Forschungen können zu Desyncs führen.
Außerdem wurde eine (für Mapper relativ interessante) Änderung an den Trigger-Funktionen vorgenommen, es wurde das Ereignis Events.LOGIC_EVENT_BUILDING_UPGRADED (ein Gebäude wurde ausgebaut) zusammen mit den Ereignis-Funktionen Event.GetOldBuildingID() (Gebäude-ID vor dem Ausbau) und Event.GetNewBuildingID() (Gebäude-ID nach dem Ausbau) hinzugefügt.

Wer möchte, kann ja mal den Code in eine Testmap kopieren und dann über AIScript_Setup() die KI erstellen. Parameter sind die Spieler-ID, (optional) die KI-Stärke (0 - 5) und (optional) die Aggressivität (0 - ∞, empfohlen: 0 - 4).
Außerdem gibt es die Möglichkeit, Informationen zu bekommen, was die KI gerade tut. Man muss in sein Script nur folgende Zeile einfügen:

msgVerbose = Message;

Zur Armee-Kontrolle wird TickOffensiveAIController() verwendet, das heißt Informationen über die Armeen bekommt man über

Report = Message;

Diese Befehle sollten natürlich in der endgültigen Version fehlen.

Diverse unwichtige Gebäude (Wetterturm, Wetterkraftwerk, Taverne etc.) werden aktuell nicht gebaut

Aktuelle Scriptgröße: ca. 200 KB

Versions-History und geplante Änderungen

Versions-History

  • Version 0.60
    • Leibeigenenkauf neu geschrieben
    • Upgrade-Event-Grund-Funktion geändert
    • Minen- und Dorfzentrenbau verbessert (schneller)
  • Version 0.65
    • Minen- und Dorfzentrenbau abgesichert ( 100%-ige Sicherheit kann nicht gewährleistet werden auf Grund der Zeitverzögerung )
    • Wahrscheinlichkeit des Baus von Minen erhöht
    • Den Kauf von Hauptmännern verbessert
    • Code teilweise verallgemeinert zur besseren Lesbarkeit (weitere Verallgemeinerung folgt)
  • Version 0.70
    • Hauptmännerkontrolle komplett überarbeitet
    • Forschungswahrscheinlichkeit erhöht
    • Gebäudepositionierung verbessert
    • Veredelungsgebäudebau um Welten verbessert
  • Version 0.80
    • KI greift jetzt an
    • KI berechnet nach einem bestimmten Punktesystem (kann geändert werden, die Score-Tables stehen direkt über der Klasse CMilitaryControl) die beste Angriffsposition
    • Aggressivität als Parameter hinzugefügt
    • diverse kleinere Rechenfehler beseitigt
    • KI kann beim Gebäudebau noch maximal 5 Minuten hängen bleiben (bei alter Version vergessen, die wichtigste Variable noch zurückzusetzen)
    • Gold- und Holzausgaben werden besser gemanaged
  • Version 0.90
    • Nun auch Savegame-fähig
  • Version 0.91
    • Behebung des Problems mit neutralen Gebäuden („type nil matches table“)
  • Version 1.00
    • Verbesserte Armeenkontrolle
    • Verbessertes Ressourcenmanagement
    • Fehler, der eigentlich schon in Version 0.91 gefixt sein sollte, nun hoffentlich endgültig behoben
  • Version 1.10
    • Armeeverhalten bei der Verteidigung verbessert
    • Einbau einer Versionsüberprüfungs-Funktion ermöglicht
    • Turmbau eingebaut
  • Version 1.20
    • Kauf-Verhalten verbessert (es werden nur noch Hauptmänner gekauft, wenn für die Soldaten genug Geld vorhanden ist)
    • Militär-Forschungen werden spätestens erforscht, wenn ein Mitspieler sie erforscht hat
  • Version 1.25
    • optionalen Parameter _refresh in AIScript_Setup hinzugefügt: Wenn der Wert true ist, werden voreingestellte Werte übernommen, es kann allerdings auch ein Table verwendet werden. Die Rohstoffe werden dann immer am Zahltag ausbezahlt
    • ein paar kleinere Bug-Fixes
  • Version 1.30
    • nun wird zunächst von jedem Minentyp ein Gebäude gebaut
    • Algorithmus bei den Minengebäuden geändert
    • die Refresh-Zahlen erhöht
  • Version 1.40
    • Veredelungs-Gebäudebau verbessert
    • Upgrade-Forschungen haben nun auch Auswirkungen ;-)
  • Version 1.41
    • Baubegrenzung hinzugefügt
    • Setup-Funktion umgeschrieben
  • Version 1.50
    • Fehler in CMilitaryControl behoben
    • Path-Finding-Funktionen hinzugefügt
    • Neue Indizes in AIScript_Setup():
      • noPathFindingUse (Abschalten des Path-Findings)
      • peaceTime (Ausschalten der Soldatenproduktion für eine bestimmte Zeit
    • Soldatenkauf verbessert
    • Einige neue Comfort-Funktionen zur Interaktion mit der KI
  • Version 1.51
    • Bug bei Erstellung von CU_-Soldaten behoben

bisher geplante, noch nicht vollendete Änderungen

  • Armee-Verhalten verbessern
  • Gold- und Holzausgaben müssen besser geregelt werden
  • Brückenbau-Simulation (falls möglich)
  • Veredelungsgebäudebau verbessern

aktuelles Script

Das aktuelle Script findet ihr hier.


You will find the last AI version here.

Versions-Überprüfungs-Funktion

Die folgende Funktion „AIScript_require()“ ermöglicht die Überprüfung der KI-Version. Sie gibt bei einer deutschen Siedler-Version das Problem auf Deutsch aus, bei einer anderen in Englisch. Sie sollte immer in das Map-Script gepackt werden, wenn das KI-Script extern geladen werden muss. Diese Funktion kann erst ab Version 1.10 verwendet werden, vorher kommt eine Meldung, dass das KI-Script fehlerhaft sei.

Zur Ausgabe einer Warnung, falls die KI Version 1.10 nicht vorhanden ist, kann man folgendes eingeben:

 AIScript_require( 1, 10 );

Der Parameter _additional ermöglicht es, eigene Informationen dem Spieler zu geben:

 AIScript_require( 1, 10, "Guten Morgen" );

Nun würde bei einer Warnung in der zweiten Zeile „Guten Morgen“ anstatt „Die aktuelle Version des KI-Scripts findet ihr auf http://www.chromix.de/dedk/dokuwiki/doku.php.“ stehen.

Wenn das Spiel nach der Warnung beendet werden soll, dann muss der Parameter _end den Wert true bekommen. Um trotzdem noch die normale Meldung in der zweiten Zeile zu erhalten, muss man nur false übergeben.
Beispiele:

AIScript_require( 1, 10, "Hallo", true ) --Ausgabe von "Hallo" in der zweiten Zeile und beenden des Spiels
AIScript_require( 1, 10, false, true ) --Ausgabe der normalen Meldung in der zweiten Zeile und beenden des Spiels
function AIScript_require( _major, _minor, _additional, _end )
	asserttype( _major, "number" );
	asserttype( _minor, "number" );
	local lang = XNetworkUbiCom and XNetworkUbiCom.Tool_GetCurrentLanguageShortName() == "de";
 
	_additional = _additional or ( lang and "Die aktuelle Version des KI-Scripts findet ihr auf @color:0,255,0 http://www.chromix.de/dedk/dokuwiki/doku.php @color:255,255,255 ." or "You will find the last version of the AI-Script at @color:0,255,0 http://www.chromix.de/dedk/dokuwiki/doku.php @color:255,255,255 .");
 
	if not Umlaute then
		Umlaute = function(_text)
					  local texttype = type(_text);
					  if texttype == "string" then
						  _text = string.gsub(_text, "ä", "\195\164");
						  _text = string.gsub(_text, "ö", "\195\182");
						  _text = string.gsub(_text, "ü", "\195\188");
						  _text = string.gsub(_text, "ß", "\195\159");
						  _text = string.gsub(_text, "Ä", "\195\132");
						  _text = string.gsub(_text, "Ö", "\195\150");
						  _text = string.gsub(_text, "Ü", "\195\156");
						  return _text;
					  elseif texttype == "table" then
						  for k, v in pairs(_text) do
							  _text[k] = Umlaute(v);
						  end
						  return _text;
					  else return _text;
					  end
				  end;
	end
 
	local restext;
	if not AiTools then
		restext = (lang and "Die KI ist bei dieser Karte fehlerhaft oder sie wurde nicht geladen. Benötigt wird KI Version " or "This AI version is defect or the AI-Script wasn't loaded. The required AI version is ") .. "@color:0,0,255 " .. _major .. "." .. (_minor >= 10 and _minor or ("0" .. _minor)) .. " @color:255,255,255 . @cr ";
	else 
		if type(AiTools) ~= "table" or not AiTools.version then
			restext = (lang and "Die Version der KI konnte nicht ermittelt werden. Benötigt wird die KI Version " or "The version of the AI couldn't be found out. The required AI version is ") .. "@color:0,0,255 " .. _major .. "." .. (_minor >= 10 and _minor or ("0" .. _minor)) .. " @color:255,255,255 . @cr ";
		else
			local dummy, dummy, nMajor, nMinor = string.find( AiTools.version, "^(%d+)%.(%d+)$" );
 
			if dummy then
				nMajor = tonumber(nMajor);
				nMinor = tonumber(nMinor);
 
				local tooOld;
 
				if _major > nMajor then
					tooOld = true;
				elseif _major == nMajor then
					if _minor > nMinor then
						tooOld = true;
					end
				end
 
				if tooOld then
					restext = (lang and "Die Version der KI ist zu alt. Benötigt wird die KI Version " or "The version of the AI is too old. The required AI version is ") .. "@color:0,0,255 " .. _major .. "." .. (_minor >= 10 and _minor or ("0" .. _minor)) .. " @color:255,255,255 , " .. ( lang and "die vorhandene Version ist allerdings nur " or "but the existing version is " ) .. "@color:0,0,255 " .. nMajor .. "." .. (nMinor >= 10 and nMinor or ("0" .. nMinor)) .. " @color:255,255,255 . @cr ";
				end
			else
				restext = (lang and "Die Version der KI konnte nicht ermittelt werden. Benötigt wird die KI Version " or "The version of the AI couldn't be found out. The required AI version is " ) .. "@color:0,0,255 " .. _major .. "." .. (_minor >= 10 and _minor or ("0" .. _minor)) .. " @color:255,255,255 . @cr ";
			end
		end
	end
 
	if restext then
		restext = restext .. _additional;
		StartBriefing{ { title = "@color:255,0,0 " .. (lang and "Achtung!" or "Attention!"), text = Umlaute(restext) }, finished = _end and Framework.CloseGame or nil };
	end
end

Ein paar Bilder

Das GeschehenBild
Zu Beginn eine Universitätaiscript-picture1.jpg
Die erste Mineaiscript-picture2.jpg
Die Burg wird ausgebautaiscript-picture3.jpg
Der erste Trupp des Gegnersaiscript-picture4.jpg
Nun ist auch Spieler 1 so weitaiscript-picture5.jpg
Ein Dorfzentrum wird benötigtaiscript-picture6.jpg
utilscripts/aiscript.txt · Zuletzt geändert: 2021/09/18 19:15 (Externe Bearbeitung)