Während ich immer noch am Testen der neuen Karawanen bin, habe ich in Gedanken bereits den nächsten Streich vorbereitet und gestern bereits ein wenig damit begonnen.
Es hat mir in Point Lookout hervorragend gefallen, dass Pungas niedliche und friedliche Punga-Ratten und Punga-Fliegen spawnen können.
Sowas möchte ich jetzt auch im Ödland haben und zwar dass verschiedene Aktivatoren wie Hydranten und Parkuhren friedliche oder neutrale Tiere spawnen können. Werde ich natürlich optional halten, für Leute, die noch ein wenig Performance übrig haben oder denen es eher um mehr Leben im Ödland, als um Gegnerhorden geht.
Werde vielleicht früher oder später abklären, ob ich irgend ein passendes Mesh verwenden darf. Aber im Moment beginne ich mit umgefärbten kleinen Fliegen, Ameisen und Skorpionen, die nur angreifen, wenn man in ganz nahen Radius geht oder auf sie schiesst.
Das Ziel ist, dass die möglichst performant und stabil sind, ich versuche möglichst, auf komplizierte GameMode-Funktionen zu verzichten. Solche Tiere ziehen nicht gross Performance und deshalb nenne ich die Technologie dahinter Schwarm, die sollen in Rudeln von durchschnittlich 10 bis 20 auftreten.
Es hat im Prinizp wie die Karawanen auch einen unsichtbaren und persistenten Anführer, der die Richtung bestimmt und alle andern laufen hinterher, es soll sich anfühlen wie etwa Blattschneiderameisen.
Muss jetzt natürlich experimentieren. In Point Lookout waren die Pungas hervorragende Spawn-Punkte, da sie die Sümpfe flächendeckend überziehen. Sowas elegantes gibt es im Ödland nicht, mein Traum wäre es gewesen, dass z.B. bei allen Rad-Löchern Tiere gespawnt würden, das sind landschaftlich meist sehr hübsche Orte, wo es kaum Leben hat.
Nur kann man Scripte nur auf Aktivatoren setzen und es gibt keinen speziellen Aktivator da. Wobei ich theoretisch auch Trigger neben allen Rad-Sümpfen platzieren könnte. Wenn ich mich per Use Info auf Rad-Markern durchs Ödland klicke und nur Trigger reinkopieren muss, könnte das ein vertretbarer Aufwand sein.
Macht halt schon Spass, neue Wege zu gehen und rauszufinden, wie man sie umsetzen kann.
Edit
Hier das Beta-Script, das ich nächstens einbaue, wenn alle Packages erstellt sind. Bin ich eigentlich der einzige ausser Aaaaaimi, der Freude am Scripten hat
Auf jeden Fall gibt es pro Typ nur einen einzigen Actor, von dem es eine einzige persistente und unsichtbare Referenz im Spiel gibt, die von einem Trigger als Gruppenanführer ans Ziel verschoben und gestartet wird. Und diese Referenz spawnt dann mehr vom selben Typ, die den Schwarm bilden. Die Kreatur selbst kann natürlich Variationen haben, da sie auf einer gelevelten Liste basiert, z.B. wlwVarSwarmFly.
Versuche mal die Packages auszureizen, die ja ohne eine Referenzangabe die generischen Variablen(z.B. Variable04) lesen und ändern können. Das bedeutet auch, dass man weniger Duplikate von Packages erstellen muss, da es egal ist, wer darauf zugreift.
Und das Ziel davon ist, dass jede Kreatur alle Packages hat, die dann durch die Variable04 gesteuert werden. Es kann so immer nur ein Package aktiv sein, z.B. das Fliehen-Package.
Und wenn der Anführer das Ziel gefunden hat, setzt das Find-Package selbstständig die Sandbox-Variable. Sowas wird auch z.B. bei den Todeskrallen in den Käfigen verwendet, damit sie einen Step nach dem andern machen.
Ist ungeheuer spannend, wenn man seine Kreationen im Spiel sieht, die sich dann zuerst doch nicht so verhalten, wie sie sollten.
Code:
scn wlwSwarmActorScript
short State
short Timer
short Countdown
short SwarmState
short IsLeader
short SwarmType
ref SwarmLeader
ref SwarmMember
short SwarmAggro ; Verhaltensweise des Schwarms auf Agression. 0: Fliehen, 1: Angreifen
short SwarmSize ; Multiplikator der Default-Groesse
short SwarmHitCount ; Schwarm wurde angegriffen
short SwarmHitMax ; Anzahl Hits vor Reaktion
short WasHit ; Aggro-Verhalten ausgefuehrt
; Package-Variablen
; Variable04
; Idle
; Leader-Variablen
; 1: Am Ort bleiben ; Travel-Package
; 2: Suchen ; Find-Package
; 3: Fliehen ; Flee-Package
; 4: Angreifen ; Travel-Package
; Gruppen-Variablen
; 5: Am Ort bleiben ; Sandbox-Package
; 6: Folgen ; Guard-Package
; 7: Fliehen ; Flee-Package
; 8: Angreifen ; Guard-Package
; Variable05
; 0: Follower
; 1: Leader
; Variable06
; Int: HitCount
Begin GameMode
; Generischer Countdown
If Countdown > 0
Set Countdown To Countdown - 1
EndIf
If Timer < 0
; Init
If State == 0
Set SwarmType To 0
Set IsLeader To 0
Set SwarmSize To 1
Set SwarmAggro To 0
Set SwarmHitMax To 3
Set SwarmHitCount To 0
Set WasHitTo 0
Set SwarmSize To SwarmSize * (7 + GetRandomPercent / 10)
If GetIsId wlwSwarmFlyCommon
Set SwarmType To 1
Set SwarmLeader To wlwSwarmFlyCommonLeader
If GetIsReference wlwSwarmFlyCommonLeader
PlaceAtme wlwSwarmFlyCommon SwarmSize
Set IsLeader To 1
EndIf
ElseIf GetIsId wlwSwarmScorpionCommon
Set SwarmType To 2
Set SwarmLeader To wlwSwarmScorpionCommonLeader
If GetIsReference wlwSwarmScorpionCommonLeader
PlaceAtme wlwSwarmScorpionCommon SwarmSize
Set IsLeader To 1
EndIf
ElseIf GetIsId wlwSwarmAntCommon
Set SwarmType To 3
Set SwarmLeader To wlwSwarmAntCommonLeader
If GetIsReference wlwSwarmAntCommonLeader
PlaceAtme wlwSwarmAntCommon SwarmSize
Set IsLeader To 1
EndIf
ElseIf GetIsId wlwSwarmLurkCommon
Set SwarmType To 4
Set SwarmLeader To wlwSwarmLurkCommonLeader
If GetIsReference wlwSwarmLurkCommonLeader
PlaceAtme wlwSwarmLurkCommon SwarmSize
Set IsLeader To 1
EndIf
EndIf
If SwarmLeader == 1
SetGhost 1
If wlwDebugMode == 1
SetActorAlpha 0.5
Else
SetActorAlpha 0.0
EndIf
SetAv Variable04 2 ; Suchen
SetAv Variable05 1 ; Ist Leader
SetAv Variable06 0 ; Schwarm-Hit-Count
Else
SetAv Variable04 6 ; Schwarm-Status
SetAv Variable05 0 ; Ist kein Leader
EndIf
Evp
Set State To 1
EndIf
; Ziel suchen
If WasHit == 0
; Leader Aggro-Verhalten
If IsLeader == 1
If GetAv Variable04 == 3 ; Fliehen
Set WasHit To 1
ElseIf GetAv Variable04 == 4 ; Angreifen
Set WasHit To 1
EndIf
EndIf
; Ziel suchen
If State == 1
If IsLeader == 1 && GetAv Variable04 == 1 ; Ziel erreicht, gesetzt durch PackageEnd
Set Countdown To 6000
Set State to 2
ElseIf IsLeader == 0 && SwarmLeader.GetAv Variable04 == 1 ; Ziel erreicht, gesetzt durch PackageEnd
SetAv Variable04 5
Set State to 2
EndIf
EndIf
; Ziel erreicht
If State == 2
If IsLeader == 1 && CountDown == 0 ; Zurueck ins Suchen
SetAv Variable04 2
Set State to 1
ElseIf IsLeader == 0 && SwarmLeader.GetAv Variable04 == 2 ; Zurueck ins Folgen
SetAv Variable04 6
Set State to 1
EndIf
EndIf
EndIf
; Abbruch-Bedingungen
If IsLeader == 1
If GetDistance Player > 5000
Set CountDown To 1300
Set State To 3
EndIf
Else
If SwarmLeader.GetDisabled == 1
Set CountDown To 1300
Set State To 3
EndIf
EndIf
; Aufheben
If State == 3
If CountDown == 0
Set State to 4
If IsLeader == 1
SetAv Variable04 0
MoveTo wlwNullPointMarker
Disable
ElseIf IsLeader == 0
Disable
MarkForDelete
EndIf
EndIf
EndIf
Set Timer To 1300
Else
Set Timer To Timer - 1
EndIf
End
; Aggro-Verhalten umstellen, wenn nicht getan
Begin OnHit
If IsLeader == 0 && WasHit == 0
If SwarmLeader.GetAv Variable06 < SwarmHitMax
Set SwarmHitCount To SwarmLeader.GetAv Variable06 + 1
SwarmLeader.SetAv Variable06 SwarmHitCount
Else
Set WasHit To 1
If SwarmAggro == 0 ; Fliehen
If SwarmLeader.GetAv Variable04 != 3
SwarmLeader.SetAv Variable04 3
EndIf
SetAv Variable04 7
ElseIf SwarmAggro == 1 ; Angreifen
If SwarmLeader.GetAv Variable04 != 4
SwarmLeader.SetAv Variable04 4
EndIf
SetAv Variable04 8
EndIf
EndIf
EndIf
End
Edit:
Heute früh begonnen und jetzt kann ich testen.
Habe mal alle Encounter-Trigger, Parkuhren und Feuerhydranten mit dem Script versehen, das sind an die 500 Spawnpunkte, wobei prinizipiell nur im Ödland und Point Lookoutgespawnt werden kann.
Das sind viele Trigger, aber es ist keineswegs gesagt, dass das auf die Performance geht, da nur bei TriggerEnter des Player gespawnt wird und es können nicht mehr als vier Schwärme aktiv sein.
Schade, können RadiationMarker keine Scripts tragen, denn das wäre eleganter und schöner verteilt gewesen.