Einiges zum Thema KI

» Siedler Map Source Forum » Siedler DEdK Script Forum » Einiges zum Thema KI

Seiten: 1

Play4FuN
#1
19.02.2018 22:13
Beiträge: 704

Einiges zum Thema KI

Abend Gemeinde,

grober Titel, weil ich hier vermutlich manche KI-Probleme meinerseits sammeln werde. Eingangs folgendes:

AI.Army_EnableLeaderAi(GetEntityId("erec"), 0)

verhindert, dass die Entity mit Namen erec von der entsprechenden KI in ihre Armeen integriert wird und von der herumkommandiert werden kann. Ganz nützlich - dachte ich - um zu verhindern, dass z.b. der gegnerische Kerberos wenn das Tor aufgeht direkt als einer der ersten an meinen Dutzend Türmen krepiert ...
Leider habe ich feststellen müssen, dass die KI dann beginnt unendlich Truppen zu rekrutieren und keine einzige davon in ihre Armeen aufzunehmen. Bei jeder Armee sagte mir der Debugger mittels

AI.Army_GetNumberOfTroops(_army.player,_army.id)

überall 0... Schade.


Anderes Problem: kann man irgendwie die KI in ihrem Bau beschleunigen? Obwohl meine KI genug Ress, Leibis und Platz hat, braucht sie mehrere Minuten um 3 Gebäude zu bauen. Finde ich wirklich uncool, wenn man einen spielernahen Aufbau simulieren möchte.


Hat bereits jemand Erfahrung, wie genau das rebuild Verhalten aussieht? Wird die randomTime auf das statische delay einfach drauf addiert?
Wenn die KI noch andere Gebäude in ihrer Warteschlange hat, baut sie diese dann erst zu Ende oder schiebt sie einen Wiederaufbau dazwischen?

Fragen über Fragen ...

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Kantelo
#2
20.02.2018 12:52
Beiträge: 357

Das mit der LeaderAi ist komisch; der Befehl ändert genau zwei Werte eines GAI::CEntityDynamic Objekts, welches für jede Einheit seperat besteht.
AI.Player_EnableAi wurde aufgerufen und du bist dir sicher dass der Fehler durch EnableLeaderAi verursacht wird?

Was die anderen Fragen angeht, kann ich bei Gelegenheit mal nachsehen was die Befehle genau bewirken, ich bin sowieso zurzeit dabei Teile des Quellcodes zu rekonstruieren

Play4FuN
#3
20.02.2018 13:04
Beiträge: 704

Zitat von Kantelo:
AI.Player_EnableAi wurde aufgerufen und du bist dir sicher dass der Fehler durch EnableLeaderAi verursacht wird?

So sicher man eben sein kann in so einem großen Skript Aber im Ernst: ohne diesen Aufruf klappte die Rekrutierung normal, mit dem Aufruf eben unendliches Rekrutieren ...
Die KI rekrutiert eben solange, wie sie nicht "HasFullStrength"

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

mcb
#4
20.02.2018 14:44
Beiträge: 1472

Meine Ki baut tatsächlich mehrere Gebäude gleichzeitig. Allerdings platziere ich die Baustellen per Script und steuere auch die Serfs selbst.
Ich glaube ich hab mal gelesen das die rebuild Zeiten einfach addiert werden, mit der reihenfolge ließe sich das wohl am einfachsten ausprobieren.

Play4FuN
#5
20.02.2018 15:15
Beiträge: 704

Hmm, eigentlich wollte ich die Serfs und Baustellen nicht manuell steuern, aber vielleicht wird das am besten sein...

Wie machst du das mit den Leibis? Ich habe auch festgestellt, dass die Leibis nach einiger Zeit gerne mal herumstehen. Mir scheint, die KI ordnet den Leibis neue Aufgaben zu, sobald ein neuer Bau/Reparatur fällig ist oder ein Auftrag abgeschlossen ist. Zwischenzeitlich stehen einige nur herum (habe testweise z.B. 20-30 Leibis verwendet)

Simulierst du den Gebäudebau komplett? Also passende Baustelle setzen und dann Gebäude langsam aus dem Boden schieben?

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

mcb
#6
20.02.2018 15:23
Beiträge: 1472

Ich erzeuge per Hook CNetEvents. Du brauchst die neueste Version vom Hook: https://bitbucket.org/settlersdev/s5hook/overview Dann kannst du PostEvent.SerfConstructBuilding verwenden. Gibt auch noch mehr Funktionen, damit du jede Aktion, die ein Spieler ausführen kann auch per Script ausführen kannst. (Sag mir Bescheid, wenn ich eine vergessen hab )

daniBIGdani
#7
20.02.2018 16:40
Beiträge: 153

Toll mit den PostEvents können ja Leibeigene der KI Resourcen abbauen oder der Kundschafter schaut mit dem Fernglas in eine bestimmte Richtung!

Es fehlt eigentlich nur noch Darios Falke auf Reise zu schicken, Salim stellt eine Falle auf, einen Leibeigenen den Befehl geben zu einem Milizsoldaten zu werden, den Scout dazu bringen auf Resourcenschächte aufmerksam zu machen und einen Leader in einem Militärgebäude auszubilden.

Play4FuN
#8
20.02.2018 16:58
Beiträge: 704

@daniBIGdani

Mit

Logic.SetTaskList(GetEntityId("scout"),TaskLists.TL_EXPLORE_WITH_BINOCULARS)

Kann man einen Kundschafter das Fernrohr benutzen lassen. Kann sein, dass man noch ein LookAt für die gewünschte Richtung einbauen kann/müsste.

@mcb

PostEvent.SerfConstructBuilding(serf_eID, building_eID)

würde der Aufruf zum Bau dann einfach so aussehen? Was muss das für eine Building ID sein? Die der ConstructionSite? Kann ja eigtl nicht sein ... eine Brickworks hat z.b. die ConstructionSite einer Mint usw ... wie dann?

Wie war das eigentlich mit dem Hook? Habe den immernoch nicht getestet (schon lange vorgehabt...) Ja klar lua Datei laden und der eine Aufruf am Anfang. Aber was ist mit savegame? Was überlebt (nicht)? Was ist, wenn aus der Hooked Map eine "normale" geladen wird usw.?

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Play4FuN
#9
20.02.2018 17:11
Beiträge: 704

Leibeigene

Nochwas

PostEvent.SerfExtractResource(eID, resourceType, posX, posY)


"normaler" Rohstofftyp oder der Raw?
Muss eine Position angegeben werden, an der (direkt) oder in deren Nähe eine entsprechende Rohstoffquelle vorhanden ist? (Suchen die Leibis dann dort...?)

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

mcb
#10
20.02.2018 17:16
Beiträge: 1472

@daniBIGdani:
Darios Falke: GUI.SendHawk(darioId, x, y)
Salim/Pilgrim Falle/Kanone: PostEvent.HeroPlaceCannonAbility(heroId, bottomType, topType, posX, posY)
Milizsoldat: GUI.ChangeToBattleSerf(id) (Musst mal für nicht-player 1 ausprobieren)
Scout Ressourcen: GUI.ScoutPointToResources(id)
Leader ausbilden: Logic.BarracksBuyLeader(_barrackId, _upgradeCategory)

@Play4Fun: Mit der Funktion gibst du den Serf den Befehl an diesem Gebäude zu bauen. Das heißt, das Gebäude muss schon existieren aber noch nicht fertig gebaut sein. (Kannst du z.B. mit Logic.CreateBuildingSite erstellen)
(es gibt auch ein CNetEvent um Gebäude zu erstellen, aber da hab ich nocht nicht so ganz kapiert wie das funktioniert. Außerdem kann man Baustellen ja schon erstellen.)

Zum Hook: Der Hook entfernt sich selbst, wenn die Map beendet wird. Praktsch alle Aufrufe des Hooks müssen nach dem laden neu ausgeführt werden (genauso wie der Hook neu geladen werden muss). Hab ne Comfort dazu geschrieben: http://www.siedler-maps.de/for...t-Forum/s5HookLoader-20421.htm

Edit: PostEvent.SerfExtractResource: Der Raw-Typ. Ich benutze immer die Koordinaten des Zielentitys.

Play4FuN
#11
20.02.2018 17:26
Beiträge: 704

Also haken die Leibis dann bis die Quelle leer ist? Nutzt du dann überhaupt SetupPlayerAi? Würde die mit der Kontrolle dann deiner manuellen in die Quere kommen?

Logic.CreateConstructionSite*
fordert "type of building to be created" als Parameter, d.h. ich übergebe hier z.b. Entities.PB_Brickworks1 und es wird die ConstructionSite ...Mint1 erstellt, aber deine Funktion PostEvent.SerfConstructBuilding weiß dann, dass es eigentlich eine Brickworks1 werden soll und keine Mint? Oder verstehe ich das falsch?

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

mcb
#12
20.02.2018 17:37
Beiträge: 1472

Ja, die Serfs arbeiten so lange, bis die Quelle leer ist. (Leider suchen sie danach nach der nächsten Quelle). Also so, wie wenn du sie per Mausklick zum Abbauen schickst.
Ich benutze bei mir nix von der normalen KI.

Zu Baustellen: Es werden gleichzeitig die Entities.PB_Brickworks1 und die ConstructionSite erstellt. Die ConstructionSite ist aber im Grunde genommen nur da, damit es besser aussieht. Du musst die Id des eigentlich zu bauenden Gebäudes übergeben.

Edit: PostEvent.SerfConstructBuilding hat denselben Effekt, wie wenn du Serfs zu einem bestehenden Gebäude hinzufügst. (Die 3 Serf-Funktionen sind glaub ich von yoq)

Play4FuN
#13
21.02.2018 10:49
Beiträge: 704

Gebäudebau

Logic.CreateConstructionSite(GetPosition("posBuild1").X, GetPosition("posBuild1").Y, 0, Entities.PB_Blacksmith1, 1)

so habe ich es jetzt getestet, bevor ich überhaupt mit dem Hook versuche, einen Leibeigenen dort hin zu senden.

Funzt auch (yey), aber muss ich jetzt immer vorher checken, ob dort genug Platz ist? Bzw. wie am sinnvollsten?
Ein fertiges Gebäude an der Stelle erzeugen, prüfen, ob es auch wirklich da ist, abreißen?

Edit: klar geht Entitys innerhalb des geplanten Gebäuderadius zu erstellen und deren Sektor abzufragen - aber das ist doch mega hässlich

Wenn ich den Bau 2x an der selben Stelle starte, bauen die Leibis sogar eine Schmiede IN eine Schmiede

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Dieser Beitrag wurde von Play4FuN am 21.02.2018 um 12:25 editiert.

mcb
#14
21.02.2018 15:48
Beiträge: 1472

Tja, das ist der Nachteil daran. Du musst die Position selbst finden.
Das hier

function mcbAI.buildingManager:canPlace(ety, pos)
	pos.X = math.floor(pos.X/100)*100
	pos.Y = math.floor(pos.Y/100)*100
	
	if self.leaveFree and GetDistance(self.ai.freePlace, pos)<=self.leaveFree then
		return false
	end
	
	local typ = mcbEMan.GetEntityTypeBuildBlock(ety)
	local _,_,sect = S5Hook.GetTerrainInfo(self.ai.freePlace.X, self.ai.freePlace.Y)
	local sec, z = {}, {}
	for x=pos.X+math.min(typ[1].X, typ[2].X), pos.X+math.max(typ[1].X, typ[2].X), 100 do
		for y=pos.Y+math.min(typ[1].Y, typ[2].Y), pos.Y+math.max(typ[1].Y, typ[2].Y), 100 do
			if not IsValidPosition{X=x,Y=y} then
				return false
			end
			local z2, blocking, s = S5Hook.GetTerrainInfo(x, y)
			if blocking ~= 0 then
				return false
			end
			table.insert(sec, s)
			table.insert(z, z2)
		end
	end
	for _,s in ipairs(sec) do
		if s ~= sect or s == 0 then
			return false -- blocked
		end
	end
	return (math.max(unpack(z))-math.min(unpack(z))) <= 250
end

überprüft blocking und Höhenunterschiede am potentiellen Bauplatz per Hook.

Seiten: 1

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum