Kampfmap scripten

» Siedler Map Source Forum » Siedler DEdK Script Forum » Kampfmap scripten

Seiten: 1

L_A
#1
12.03.2020 13:34
Beiträge: 1

Kampfmap scripten

Moin Leute,
wollte den Siedlern hiermal etwas zurück geben und eine eigene Karte gestalten. Geplant ist hierfür eine einfache Kampfmap ohne viel Quest Getue.
Allerdings könnte ich etwas Hilfe beim Scripten gebrauchen. Speziell sind es folgende Dinge, die mir zu schaffen machen... Gruppierte Angriffe der KI, Soldatenrekrutierung (nicht stupides gespawne von Einheiten) der KI, Selbstaufbau der KI und Einrichtung von Handelsstraßen.
Ich bin für jede Hilfe (besonders in Form von vorgefertigten Scripten) dankbar.
Mit den besten Siedlergrüßen
L_A

Messoras
#2
12.03.2020 16:33
Beiträge: 84

Möchtest du denn eine KI benutzen oder die feindlichen Armeen selber steuern? Du könntest dir natürlich die Ubisoft Armeen aus der Scripting Tutorial Map anschauen, allerdings sind die manchmal ziemllich nerfig und lassen sich nicht so gut verwalten. Zu dem können sie nur aus maximal 8 Trupps bestehen.

Für das Ausbilden von Truppen kannst du den Befehl Logic.BarracksBuyLeader benutzen und die Soldaten dann mit AI.Entity_ConnectUnemployedLeaderToArmy einer Armee zuweisen.

Ich verwende für meine Armeen immer golgendes Script:

--[[   //  Troop Trainer  //  by Messoras
ACHTUNG: mcbs Trigger Fix wird benötigt.

== Funktionen ==

    1. BuyKITroops( UpgradeCategory leaderType, table troopTable, string bID )
        - Aufrufen um Trupp bei Gebäude mit Scriptname bID auszubilden und an Table troopTable anzuhängen
        
        == Parameter ==
        - leaderType: UpgradeCategory	-- Typ der Truppe
										-- z.B. UpgradeCategories.LeaderSword
        - troopTable: table				-- Truppenarray, dem die Truppe angehängt wird, um z.B. mit Attack(troopTable,target) anweisungen auszuführen
        - bID: string					-- Scriptname des Ausbildungsgebäudes (Kaserne, Schiessplatz, Taverne, Kanonengießerei)
		
    2. ArmyCommand( table/string/number troopTable, function command, args )
		- Aufrufen um allen Leadern im Table den Befehl command zu geben
		
	= Parameter =
	- troopTable: table				-- Table mit Leadern (oder einzelner Leader
	- command: function				-- EntityCommand z.B. Attack / Move etc.
	- args:						-- Parameter für Command Aufruf
    --
]]
function BuyKITroops(_leaderType, _troopTable, _bID)
	local barracks = GetID(_bID)
	Trigger.RequestTrigger(Events.LOGIC_EVENT_ENTITY_CREATED, nil, AttachToList,1,nil,{_troopTable}) --typ, con, act, active, acon, aact
	Logic.BarracksBuyLeader(barracks,_leaderType)
end
function AttachToList(_troopTable)
        if not _troopTable then _troopTable = {} end
	local eID = Event.GetEntityID()
	if eID and Logic.IsLeader(eID) and AI.Entity_GetConnectedArmy(eID) ~= nil and AI.Entity_GetConnectedArmy(eID) < 0 then
		table.insert(_troopTable,eID)
	end
	return true
end
function ArmyCommand(_troopTable,_command,args)
	if type(_trooptable) == "number" or type(_trooptable) == "string" then
		_command(_troopTable,args)
	elseif type(_troopTable) == "table" then
		for k = 1, table.getn(_troopTable) do
            if IsDead(_troopTable[k]) then
                table.remove(_troopTable,k)
                k = k - 1
            else
		_command(_troopTable[k],args)
            end
		end
	end
end


Benutzen könnte man das z.B. so:

function ControlAttacksJob()
    if Counter.Tick2("ControlAttacksJob",10)
        BuyKITroops(UpgradeCategories.LeaderSword,attackers,"spawnerbarracks")
        ArmyCommand(attackers,Attack,"player1HQ")
    end
end


Es werden nur Truppen ausgebildet, wenn der Spieler, dem das Ausbildungsgebbäude gehört auch die nötigen Ressourcen hat.
Wenn du stärkere Einheiten ausbilden willst, musst du die UpgradeCategory der Truppentypen mit


Logic.UpgradeSettlerCategory( UpgradeCategories.LeaderSword, EnemyPlayerId )
Logic.UpgradeSettlerCategory( UpgradeCategories.SoldierSword, EnemyPlayerId  )


aufwerten (max 3 mal)

Mit Selbstaufbau der KI kenne ich mich nicht so gut aus, da ich eigentlich fast nur Quest Maps mache, aber es gibt eine Funktion AI.Village_StartConstruction mit der man die KI ConstructionQueue startet - bin aber nicht sicher, wie man die editiert und Logic.CreateConstructionSite, mit der du manuell festlegen kannst, wo der Gegner etwas hinbaut. Ich würde vlt einen Job erstellen, der prüft, ob im Gebiet schon irgendwas gebaut ist und falls nicht eine ConstructionSite für den Gegner anlegt. Der wird sie dann automatisch fertig bauen, sofern die AI richtig inizialisiert ist.

Was du mit den Handelswegen meinst, habe ich jetzt nicht verstanden. Meinst du Travelling Salesmen die zwischen zwei Lagern hin und her laufen? Das ist einfach. Dafür musst du nur einen Job starten, z.B. so:

function TradersmoveJob()
    if not direction then direction = 1 end
    if direction == 1 then
        Move("haendler","lager1")
        if IsNear("haendler","lager1",1000) then
            direction = 2
        end
    else
        Move("haendler","lager2")
        if IsNear("haendler","lager2",1000) then
            direction = 1
        end
    end
end


Hoffe ich konnte dir behilflich sein. Falls du Fragen hast komm doch einfach auf den Discord.

LG,
Messoras

____________________
Six feet of earth make us all equal.

Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.

Dieser Beitrag wurde von Messoras am 12.03.2020 um 16:58 editiert.

Play4FuN
#3
31.03.2020 18:53
Beiträge: 704

Hey, @Messoras
Ich habe mir die BuyKITroops Funktion nun auch mal angeschaut, weil ich ähliches auch selbst bastel... mir gefällt die Idee und unter perfekten Bedingungen funktioniert das auch super. Allerdings scheint mir das ganze sehr gefährlich. Denn sobald das Ausbilden nicht klappt (AI hat keinen Siedlungsplatz frei, zu wenige Rohstoffe oder es trainieren bereits 3 Leader an dem Gebäude...) wird ein Trigger "zu viel" erstellt, der nicht wie gewollt "erfüllt" wird (also durch eine trainierte Truppe korrekt im Rahmen von AttachToList beendet). Das kann dann dazu führen, dass ein beliebiger anderer Leader in diese Liste eingetragen wird, eventuell sogar von einem anderen Spieler, schlimmstenfalls vom menschlichen.

Anmerkung: Zudem gibt Logic.IsLeader 1 bzw. 0 zurück, wenn du also nur

if eID and Logic.IsLeader(eID) and

(...) prüfst, fängst du sogar Nicht-Leader ein. (ja ich weiß, sollte durch AI.Entity_GetConnectedArmy meistens klappen, aber dennoch...)

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Seiten: 1

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

Impressum