Hallo,
Eigentlich wollte ich mir etwas mehr Fairness im Völkerrang erscripten, siehe diesen Thread. Teac hat seine sehr umfangreiche Lösung bis heute nicht zur Verfügung gestellt, und als ungeduldiger Mensch möchte ich mir jetzt selbst etwas basteln. Was soll ich sagen, sofort lasse ich mich von der eigentlichen Aufgabe ablenken...
!ship.signal.attacked schreit nach Änderungen: wenn ein Schiff angegriffen wird, vergisst es alles andere und setzt sich zur Wehr, das ist soweit ja ganz gut. Ein Schiff einer Staffel schert aus (set follow mode -> false) und wendet sich dem Angreifer zu, während der Rest der oft weiterzieht -- das ist weniger gut.
Eigentlich sollte der Anführer ja auch ein signal.follower.attacked erhalten... aber das funktioniert wohl nicht wie geplant. Wer schonmal die M5 aus einem Khaak-Rudel stückweise erledigt hat kann bestätigen, daß das den Anführer nicht im geringsten kümmert.
Es scheint daran zu liegen, daß das angegriffene Schiff und der Staffelführer unterschiedliche Reaktionsschwellen haben:
Anführer: if not [THIS] -> get attack target
Einzelschiff: skip if not is script with prio 99 on stack
Die "get attack target"-Bedingung scheint klar: der Anführer steuert weiter auf sein Ziel zu, auch wenn das noch weit weg ist. Ein Schelm, wer dabei an Krieg der Sterne denken muß. Hier könnte man sicher noch nachbessern.
Aber wann genau liegt ein Task mit prio99 an? Reicht es, wenn das Schiff sich gerade im Kampf befindet (es wurde schon geschossen, aber vielleicht noch niemand getroffen), oder gibt es so einen Task erst dann, wenn das Schiff auf einen Angriff reagiert (und damit u.U. bereits von einem anderen Gegner abgelenkt wurde)?
Wie genau funktioniert das eigentlich mit den Prioritäten? Ich sehe nur eine Stelle, an der prio99 gesetzt wird (eben in !ship.signal.attacked). Wird die Priorität an Tochterskripte vererbt? Wenn ja, wann wird wieder prio null gesetzt? Das kann ich nämlich nirgends finden.
Mag sein, daß ich das gar nicht brauche. Für ein besseres Verhalten des Staffelführers ist es erforderlich, zwischen einer akuten Bedrohung und weiteren Aufgaben zu unterscheiden; natürlich könnte ich dazu auch die Entfernung zu den jeweiligen Gegnern messen oder ähnliches. Aber wenn das mit den Prioritäten so funktioniert wie ich es mir vorstelle, wären sie ein recht zuverlässiger Indikator. Nur: funktionieren sie so wie ich mir das vorstelle? Das Handbuch behandelt das Thema fast gar nicht.
Ich danke für jede Belehrung.
Wann genau liegt prio 99 an?
Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum
-
- Posts: 5285
- Joined: Mon, 11. Apr 05, 21:11
Die "prio" eines Scripts ist wichtig, wenn ein "interrupt" gestartet wird:
Normalerweise laufen alle Scripts mit prio 0. Soll in die laufende Routine kurz eine etwas wichtigere Aktion eingeschoben werden, wird
<object> -> interrupt task 0 with prio <prio> and script <script> ...
(oder wie das auch heißt) eingeschoben. Wenn die prio größer ist als die des laufenden Scripts, wird das laufende Script unterbrochen und kurz das interrupt-script ausgeführt; danach geht das ursprüngliche Script weiter. Ist die prio nicht größer, so wird das interrupt abgewiesen und nicht gestartet.
prio 99 ist eine sehr hohe prio und reserviert für SIGNAL_ATTACKED-scripts. Da die Reaktion auf dieses Signal nicht immer vom !ship.signal.attacked geregelt wird, sondern auch (etwa für UTs) von anderen scripts, fragt die Abfrage "skip if not is script with prio 99 on stack" nicht nach dem spezifischen Verteidigungsscript, sondern nur nach der prio, die sagt "Schiff wurde angegriffen und verteidigt sich gerade".
Normalerweise laufen alle Scripts mit prio 0. Soll in die laufende Routine kurz eine etwas wichtigere Aktion eingeschoben werden, wird
<object> -> interrupt task 0 with prio <prio> and script <script> ...
(oder wie das auch heißt) eingeschoben. Wenn die prio größer ist als die des laufenden Scripts, wird das laufende Script unterbrochen und kurz das interrupt-script ausgeführt; danach geht das ursprüngliche Script weiter. Ist die prio nicht größer, so wird das interrupt abgewiesen und nicht gestartet.
prio 99 ist eine sehr hohe prio und reserviert für SIGNAL_ATTACKED-scripts. Da die Reaktion auf dieses Signal nicht immer vom !ship.signal.attacked geregelt wird, sondern auch (etwa für UTs) von anderen scripts, fragt die Abfrage "skip if not is script with prio 99 on stack" nicht nach dem spezifischen Verteidigungsscript, sondern nur nach der prio, die sagt "Schiff wurde angegriffen und verteidigt sich gerade".
-
- Posts: 960
- Joined: Wed, 20. Sep 06, 09:57
Ich glaube sogar, in irgendeinem Script gesehen zu haben, dass die prio sehr schnell auf 98 zurückgeht. Nämlich dann, wenn das Schiff beginnt, sich zu verteidigen....
Aber eigentlich ist das richtig, dass bei diesen Scripten nachgebessert werden muss. Ich habe auch schon einmal darüber nachgedacht, dass es doch sinnvoller wäre, wenn mehrere Schiffe des Verbandes sich dann den Angreifer vornehmen. Und das am besten auch dann, wenn der Anführer angegriffen wird. Teile davon hatte ich auch schon mal begonnen zu verwirklichen, dann aber wegen anderer Sachen liegen lassen (kA, wo das Script jetzt ist
). Was mir damals aber nicht gefallen hat, war, dass das Script doch abhängig von der Stärke des Angreifers verschiedene Aktionen auslösen muss: wird ein M5 von einem M2 angegriffen, macht die Verteidigung keinen Sinn, aber eine Flucht erscheint doch vielversprechend....
Aber eigentlich ist das richtig, dass bei diesen Scripten nachgebessert werden muss. Ich habe auch schon einmal darüber nachgedacht, dass es doch sinnvoller wäre, wenn mehrere Schiffe des Verbandes sich dann den Angreifer vornehmen. Und das am besten auch dann, wenn der Anführer angegriffen wird. Teile davon hatte ich auch schon mal begonnen zu verwirklichen, dann aber wegen anderer Sachen liegen lassen (kA, wo das Script jetzt ist

-
- Posts: 79
- Joined: Sat, 9. Dec 06, 14:57
Hallo Symtec!
Danke für die schnelle Antwort.
Ich bin mir nur nicht sicher, ob ich's begriffen habe. Also mal so ganz klein-klein:
1) ein Schiff wird beschossen. Dies löst SIGNAL_ATTACKED (das Signal) aus.
2) Aufgrund des Signals wird auf dem Schiff das Skript !ship.signal.attacked mit prio 100 gestartet. Dies unterbricht alle anderen Skripte mit einer prio < 100.
3) Das Skript löst u.U. ein Ausweichmanöver aus, dann prüft es ob bereits ein Task mit prio 99 anliegt. Falls nicht, wird ein solcher auf den Stapel geworfen (!fight.attack.object mit prio 99).
4) Sobald sich !ship.signal.killed beendet, hat das Kampfskript die höchste Priorität aller anliegenden Skripte und übernimmt die Kontrolle; die bisherigen Aufgaben mit geringerer prio sind weiterhin nicht vergessen, werden aber vorerst beiseite geschoben.
5) sollte das Schiff weitere Treffer kassieren, wird immer wieder SIGNAL_ATTACKED und dadurch das betreffende Skript mit prio 100 ausgelöst; das kann zu weiteren Ausweichmanövern führen, aber weil schon ein 99er Task anliegt, wird kein neues Kampfskript gestartet. Unser Schiff bleibt also auf den ersten Angreifer konzentriert.
6) wenn das 99er-Skript endet (durch Flucht oder Zerstörung des Angreifers) kehrt unser Schiff wieder zu seiner ursprünglichen Tätigkeit zurück. Auch wenn es während des Kampfes gegen Gegner Nummer 1 noch von drei anderen beharkt wurde -- die hat es ja ignoriert, sie müssen erneut auf sich aufmerksam machen (was sicher nicht lange dauern wird). Das löst dann wieder SIGNAL_ATTACKED aus und das Spielchen beginnt von neuem.
Habe ich das soweit richtig?
Danke für die schnelle Antwort.
Ich bin mir nur nicht sicher, ob ich's begriffen habe. Also mal so ganz klein-klein:
1) ein Schiff wird beschossen. Dies löst SIGNAL_ATTACKED (das Signal) aus.
2) Aufgrund des Signals wird auf dem Schiff das Skript !ship.signal.attacked mit prio 100 gestartet. Dies unterbricht alle anderen Skripte mit einer prio < 100.
3) Das Skript löst u.U. ein Ausweichmanöver aus, dann prüft es ob bereits ein Task mit prio 99 anliegt. Falls nicht, wird ein solcher auf den Stapel geworfen (!fight.attack.object mit prio 99).
4) Sobald sich !ship.signal.killed beendet, hat das Kampfskript die höchste Priorität aller anliegenden Skripte und übernimmt die Kontrolle; die bisherigen Aufgaben mit geringerer prio sind weiterhin nicht vergessen, werden aber vorerst beiseite geschoben.
5) sollte das Schiff weitere Treffer kassieren, wird immer wieder SIGNAL_ATTACKED und dadurch das betreffende Skript mit prio 100 ausgelöst; das kann zu weiteren Ausweichmanövern führen, aber weil schon ein 99er Task anliegt, wird kein neues Kampfskript gestartet. Unser Schiff bleibt also auf den ersten Angreifer konzentriert.
6) wenn das 99er-Skript endet (durch Flucht oder Zerstörung des Angreifers) kehrt unser Schiff wieder zu seiner ursprünglichen Tätigkeit zurück. Auch wenn es während des Kampfes gegen Gegner Nummer 1 noch von drei anderen beharkt wurde -- die hat es ja ignoriert, sie müssen erneut auf sich aufmerksam machen (was sicher nicht lange dauern wird). Das löst dann wieder SIGNAL_ATTACKED aus und das Spielchen beginnt von neuem.
Habe ich das soweit richtig?