Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:mercenaries

Söldnerquartiere

Söldnerquartiere sind neutrale Gebäude, mit denen der Spieler über Helden interagieren kann. In Söldnerquartieren können beliebige Truppentypen zu frei wählbaren Preisen angeboten werden und so verschiedene Zwecke erfüllen. Beispielsweise können Truppen angeboten werden, die der Spieler mit seinem aktuellen Forschungsstand nicht selbst rekrutieren kann oder gar nicht im Techtree enthalten sind, wie beispielsweise schwarze Ritter. Für den Fall, dass der Spieler keinen Schwefel zur Verfügung hat, können Kanonen oder Scharfschützen gegen Taler angeboten und dadurch trotz des Rohstoffmangels verfügbar werden.

Für die folgenden Beispiele muss ein Söldnerquartier (CB_Mercenary) mit dem Skriptnamen „MercenaryCamp“ auf der Karte sein.

Außerdem wird folgende Komfortfunktion vorausgesetzt:

-- Komfortfunktion für das Einstellen von Söldnerquartierangeboten
function AddMercenaryOffer(_MercenaryCamp, _OfferType, _OfferAmount, _Cost)
    local EntityId = GetEntityId(_MercenaryCamp)
    assert(IsAlive(_MercenaryCamp), "MercenaryCamp is no longer alive")
    assert(Logic.GetEntityType(EntityId) == Entities.CB_Mercenary, "MercenaryCamp must be of entity type CB_Mercenary")
    assert(type(_OfferType) == "number", "OfferType must be an entity type, got " .. type(_OfferType))
    assert((type(_OfferAmount) == "number") and (math.floor(_OfferAmount) == _OfferAmount), "OfferAmount must be an integer, got " .. type(_OfferAmount))
    assert(type(_Cost) == "table", "Cost must be a table, got " .. type(_Cost))
    assert(Logic.GetNumerOfMerchantOffers(EntityId) < 4, "MercenaryCamp already offers the maximum number of trades")
 
    local CostTable = {}
    for ResourceName, ResourceAmount in pairs(_Cost) do
        assert(ResourceType[ResourceName], ResourceName .. " is not a valid resource")
        assert((type(ResourceAmount) == "number") and (ResourceAmount >= 0), "Resource costs must be a positive number, got " .. ResourceName .. " = " .. type(ResourceAmount))
        table.insert(CostTable, ResourceType[ResourceName])
        table.insert(CostTable, ResourceAmount)
    end
 
    Logic.AddMercenaryOffer(EntityId, _OfferType, _OfferAmount, unpack(CostTable))
end

Die Funktion hat die folgenden Parameter:

NameTypBeschreibung
_MercenaryCamp String oder Number Skriptname oder Entity-Id des Söldnerquartiers
_OfferType Entity-Typ Entity-Typ, der im Angebot sein soll. Für Hauptmänner werden automatisch volle Trupps erzeugt
_OfferAmount Number Wie oft dieses Angebot zur Verfügung stehen soll. Kann auch -1 sein für unendlich oft
_Cost Table Die Kosten des Angebots in einem assoziativen Table, bei dem der Ressourcentyp Key und die geforderte Menge Value ist (siehe auch die folgenden Beispiele)

In unserem Söldnerquartier bieten wir 3 Truppen Breitschwertkämpfer und beliebig viele Bogenschützen-Banditen an:

AddMercenaryOffer("MercenaryCamp", Entities.PU_LeaderSword2, 3, {Gold = 400, Iron = 200})
AddMercenaryOffer("MercenaryCamp", Entities.CU_BanditLeaderBow1, -1, {Gold = 200, Wood = 200})

Beim Anbieten von Söldnern sollte die Balance im Auge behalten werden. Wie kann der Spieler durch die Nutzung von Söldnern die Karte besser bewältigen und welchen Ressourcenaufwand sollte er dafür betreiben müssen?

Tatsächlich kann in Söldnerquartieren jeder beliebige Entity-Typ angeboten werden, auch Helden und Lehmhaufen. Diesen fehlt dann das passende Icon (standardmäßig das Schwert). Vor allem unbewegliche Entities sind problematisch, da sie immer an genau der gleichen Stelle vor dem Zelt erscheinen. Blockende Entities verhindern, dass andere gekaufte Einheiten den Bereich vor dem Zelt verlassen können.


Im nächsten Kapitel wird der Einsatz von Timern und Zeitlimits erklärt.

Voriges Kapitel: Schatztruhen
Nächstes Kapitel: Zähler und Zeitlimits
Zurück nach oben

scripting/tutorials/level2/mercenaries.txt · Zuletzt geändert: 2023/11/30 08:41 von fritz_98