Schiffe bilden keine Formation/bleiben reglos im all stehen

Hier ist der ideale Ort um über Scripts und Mods für X²: Die Bedrohung zu diskutieren.

Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum

gandharzero
Posts: 25
Joined: Tue, 14. Dec 04, 03:18
x2

Schiffe bilden keine Formation/bleiben reglos im all stehen

Post by gandharzero »

Hallo.

Ich zwar habe ich da ein Problem mit einem selbst erstellen Pirat-Kaperscript.
Ich zwar soll das Piratenschiff erstmal überprüfen ob das zu kapernde schiff auch Lohnenswert ist(primar TS und Fighter),
nicht zu stark oder auch komplett zum kapern ungeeignet(Stationen/Asteroiden). Und dann natürlich das Schiff kapern /zugehörigkeit
wechseln.

Ich habe in der Abfrage zunächt den Objekt-Typ 'Big Ship' als nicht kaperbar gekennzeichnet. Das hatte aber merkwürdiger-
weise nicht funktioniert, obwohl Big Ship die Wurzelklasse von den Grosschiffen ist(M6,TL,M2,M1). Nun habe ich es eben so
versucht. Was auch momentan auch zu klappen scheint.

Das ist aber nicht das Hauptproblem.
Und zwar sollen die gekaperten Schiffe abhängig von ihrer Klasse dem Angreifer/Kaperer in einer Formation eskortieren(Fighter)
oder zur Heimatbasis zurückkehren(nächste Piratenbasis,Nur TS Frachter).

Die Frachter fliegen zwar zum Sprungtor aber sie bleiben manchmal 'reglos' im Raum stehen.
Die Fighterschiffe(M5,M4,M3) bleiben auch manchmal vollkommen reglos stehen und wollen dem Kaperer NICHT eskortieren.
Wahrscheinlich wird irgendein Interrupt gestartet welcher die Funktion objekt-> escort ship <LeaderShip> unterbricht.
Wegem dem eskortieren habe ich folgenden Code im init-script ,am Piratenschiff,verwendet.

Code: Select all

030   $pship -> give formation leadership to $pship
031   $pship -> set formation [Formation.X]
Wenn ich mir die reglos im all stehenden schiffe mal genauer ansehe und unter Schiffsinfo mir die Laufenden Tasks/Prozesse
ansehe, merke ich das nur Mein Task(Hauptscript) läuft nachdem es auf den gekaperten Schiffen ausgeführt/übertragen wurde.
Seht dazu einfach mal die letzten Zeile dieses Codestücks an.

Dann habe ich die 'Übertragung' meines Tasks auf die gekaperten SChiffe gestoppt, und die gekaperten Schiffe bleiben
trotzdem manchmal im all reglos stehen!! Nur steht dieses mal unter den Schiffsinfos das der Haupttask mit seinen Prozessen/Scripts
läuft(dann wäre doch alles in Ordnung). Das ist doch merkwürdig?!

* * * * *
Ich beschreibe mal wie meine Scripte ablaufen und welches das andere aufrüft.
Das Hauptscript mit der Endlosschleife ist plugin.gandharzero.pirates.think. Von da werde alle externen scripte geladen
auch dieses untere.

Das Hauptscript wird auf dem Objekt welches ein Piratenschiff ist ausgeführt unter dem Task 101(Prio:0). Unter Task 0 konnte ich es nicht
zum laufen bringen weil die 'Startaction' des Objekts(Finde/eleminiere Feinde) es immer überschreibt.

Wie gesagt wird unteres Script vom plugin.gandharzero.pirates.think script ausgeführt. Hier die Stelle wo es passiert.

Code: Select all

038   * try to capture the attacked target
039   $thetarget = $ship -> get attack target
040   $cchance = random value from 0 to 99 - 1
041   if $cchance >= 85 AND $thetarget != null
042 @  = $ship -> call script 'plugin.gandharzero.pirates.cptr' :  arg1=$thetarget  arg2=$ship
043   end
Meine Frage(n) ist/sind deshalb:
1)Warum bleiben die gekapertern schiffe manchmal reglos im Raum stehen
2)Weshalb wieso wird der Klassentyp Big Ship als 'Filterkriterium' nicht erkannt. Daher kapern die Piri-Schiffchen auch Korvetten
TL's obwohl sie es nach dem Obigen Big Ship-Klassentyp(als Auswahlfilter, !=Big Ship = alle Dickschiffe nicht kapern!) nicht dürften.
3)Warum eskortieren die gekaperten schiffe(nur Fighter sollen das) den 'Kaperer/Angreifer' nicht?

Und hier der Problemcode:

Code: Select all

001   $shiptype = $target -> get object class
002   $dist = get distance between $target and $attaker
003   $distcapt = random value from 340 to 1450 - 1
004   $sector = $target -> get sector
005   
006   if $target != [PLAYERSHIP] AND $dist <= $distcapt AND $shiptype != Cruiser M6 AND $shiptype != Large Transport TL AND $shiptype != Destroyer M2 AND $shiptype != Battle Ship M1
007    
008    $attkr = $target -> get attacker
009    if $attkr
010     $target -> set owner race to Piraten
011     $attkrname = $attaker -> get pilot name
012     $target -> set pilot name to $attkrname
013     $homestation =  find station in galaxy: startsector=$sector class or type=Piraten Basis race=null flags=[Find.Nearest] refobj=null serial=null max.jumps=25
014     $target -> set homebase to $homestation
015     
016     if $shiptype == Fighter
017      $target -> add to formation with leader $attaker
018 @    = $target -> escort ship $attaker
019     else if $shiptype == Small Transport TS
020      $target -> set destination to $homestation
021 @    = $target -> fly to home base
022     end
023   * the captured ship inherits all parents functions
024   *$target -> start task 101 with script plugin.gandharzero.pirates.think and prio 0: arg1=$target arg2=null arg3=null arg4=null arg5=null
025   *$cptrstr = sprintf: fmt='Gekapertes Schiff %s. Schiffstyp %s. Angreifer %s.', $target, $shiptype, $attkr, null, null
026   *write to player logbook $cptrstr
027    end
028   end
029   
030   return null
Vielen dank für kommende Antworten
Ghalador
Posts: 3929
Joined: Sat, 9. Nov 02, 19:33
x4

Post by Ghalador »

Ich glaub, das Problem mit dem Schiffstyp ist mir auch schon untergekommen. Das liegt an der Vergleichsoperationen. Soweit ich feststellen konnte beinhaltet der IF-Operator keine Hirarchie.
$shiptype = $target -> get object class
Wenn $target nun ein M6 ist, liefert die Funktion "Cruiser M6". Wenn du nun aber einen IF Vergleich ziehst, dann endest du da:
If "Cruiser M6" == "Big Ship" ...und das liefert !=
Zwar IST ein M6 ein Big Ship, aber das weiss der IF Vergleich nicht. Er sieht nur, dass die beiden Klassifikationen nicht identisch sind.
Es gibt da einen anderen Befehl. Ich habe das selbe Problem in TelCat so gelöst:
if $player.target -> is of class Moveable Ship
Da dies nicht ein reiner IF Vergleich ist, sondern eine Funktion beinhaltet, erlaubt er hirarchische Vergleiche. IF erhält nur ein TRUE, oder ein FALSE, basierend auf der Rückmeldung der Funktion.

------------------
Hmmm.... hast du ein kleines Durcheinander in den Variablen? 2 Typen:
1. $attkr = $target -> get attacker
2. = $target -> escort ship $attaker

Geht da eventuell der Leader verloren?

------------------
Ich habe momentan ein bischen Mühe, der Struktur des Scriptes zu folgen, aber ich würde prinzipiell eine Rückmeldung erlauben.

021 void = $target -> fly to home base
Have fun: Gala Do.
gandharzero
Posts: 25
Joined: Tue, 14. Dec 04, 03:18
x2

Post by gandharzero »

Danke erstmal für die schnelle und ausführliche Antwort.

Interessant.. ich wusste nicht das die Boolschen Ausdrücke keine Vererbung erkennen. Naja.. egal..

Ich glaube ich habe das Problem gelöst mit der "fehlerhaften" Formationsbildung.

Es waren eigentlich(wahrscheinlich) zwei Probleme.
Erstens wurde folgender Code nicht ausgeführt weil(wie du schon erwähnt hast) die Abfrage nur die wirklichen Klassen miteinander vergleicht. Aber hier war es nicht der Fall weil ich die Klasse "Fighter" angegeben hatte.

Und zweitens wurde der Befehl "@=obj -> escort ship <leader>" nicht ganz korrekt ausgeführ wie ich es wollte. Manchmal wurde er ausgeführt manchmal nicht.
Aber immerhin wurde er überhaupt ausgeführ nachdem die Abfrage geändert wurde.

Nun benutzte ich anstatt obj-> escort <leader> den Kommandobefehl
"Start command" womit man auch vordefinierte Kommandos angeben kann. Anscheinend wird dieser Befehl nicht so schnell unterbrochen von anderen scripten.
Diue gekaperten Schiffe gehen nun eine Formation mit dem Kaperer ein, wenn dieser nicht zu schnell ist :)(muss die Leadereigenschaften noch ändern, nach speed,waffen etc sortieren /auswählen).

Ahja dann noch das nervigste Problem, was aber am einfachsten zu lösen war:
Die Piratenschiffe kapern keine Grossschiffe mehr; ich habe einfach die Bedingung $IsSmallship == TRUE genommen als Kaperkriterium somit fallen alle anderen Kanidaten wie Dronen, Transporter etc. weg.

Woran ich gerade pfeile ist eine Ausweichroutine der Piraten welche versucht die aktuelle Waffen Feuerrate der Feinde zu ermitteln und das Piri-Schiff dann veranlasst ein Ausweichmanöver zu fliegen um die Schilde zu regenerieren.

Die funktioniert zwar inetwa wie ich es mir vcorgestellt habe aber man könnte es sichern noch verbessern.

Momentan messe ich die Feuerrate der Gegner indem ich die Schildstärke des Piri-Scchiffes zwischen zwei Zeiträumen teste.
Daraus ergibt sich eine Schadensdifferenz welche ab einem bestimmten Wert die Asuweichroutine anstößt.

Jetzt frage ich mich ob es besser ist die Zeiträume in realer Zeit zu messen (wait randomly) oder mit der Spielzeit. Denn irgendwie reagieren die Piraten manchmal nicht auf hefitges Waffenfeuer.

Ghalador. Hast du auch mal versucht so was ähnliches zu realisieren?

Danke für kommende Antworten

EDIT: Habe Rechtschreibfehler entfernt.
Ghalador
Posts: 3929
Joined: Sat, 9. Nov 02, 19:33
x4

Post by Ghalador »

Ja, ich habe sowas schon versucht. Um genau zu sein, ich kaue noch immer daran herum. Ich versuche die Träger zu vebessern und da brauche ich ein erweitertes Jägerscript.

Die Sache ist nicht einfach. Steuerst du den Primärbefehl von einem Sekundärslot aus, oder ist das ein Primärscript?

Setz jedenfalls mal die Scriptpriority auf 100, die Interruptscripts, welche im Falle eines Angriffes ungefragt antanzen besitzen Priority 99.
Have fun: Gala Do.
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

Hallo,

der Befehl escort ship funktioniert immer... Jedoch ist es ein "Lowlevel" Flugkommando welches dir Werte zurückliefert wenn z.B. ein Feher auftritt oder ein Ereignis einsetzt, welches von der Routine nicht bearbeitet wird und den Eingriff einer höheren Logik erfordert :)

Gruß ticaki
Zur Zeit nicht aktiv
gandharzero
Posts: 25
Joined: Tue, 14. Dec 04, 03:18
x2

Post by gandharzero »

Hallo nochmals und danke für eure Antworten.


@Ghalador

ich starte die Ausweichprozedur auf dem Haupttask wenn du du damit Primärscript meinst und zwar mit der Priorität 11000! weil ich beobachten kann das die Piratenschiffe auch oft mit prio 100 auf Task 0 arbeiten, und damit meine scripte überschreiben weil sie mit 100 eben warten müssen o.ä.

Deshaln nehme ich eben einen möglichst hohen Prioritätswert damit die Ausweichprozedur auch möglichst immer ausgeführt wird wenn heftiges Waffenfeuer ermittelt wird. Kann auch sein das ich damit auch einen "großen Mist" begehe.

Nun hier ist das codefragment aus dem Hauptscript plugin.gandharzero.pirates.thin(läuft auf Task 101, prio 0) welches das Asuweichmanöver startet und Feuerrate ermittelt.

Code: Select all

* Check fire rate of attacking enemys.
017   $dshield1 = $ship -> get shield percent
018 @ = wait 200 ms
019   $dshield2 = $ship -> get shield percent
020   $dmgdelta = $dshield2 - $dshield1
021   $allowedsdamage = random value from 3 to 6 - 1
022   $sregtimeout = random value from 6400 to 7800 - 1
023   
024   if $dmgdelta <= - $allowedsdamage
025   *write to player logbook 'Starte Ausweichprozedur...'
026    $nearestenemy = $ship -> find nearest enemy ship: max.dist=99999
027    $ship -> interrupt task 0 with script 'plugin.gandharzero.pirates.rshld' and prio 11000: arg1=$ship arg2=$sregtimeout arg3=$nearestenemy arg4=null
028   end
Die Funktion die Aufgerufen wird ist nicht sonderlich spektakulär und startet vorerst nur einen "defensive move". Später wird es natürlich erweitert wenn die Feuerratenermittlung auch perfekt(zumindest fast) funktioniert.

@ticaki

escort ship ist doch eine sogennante "endlos"-funktion. stimmts? Sie wird also erst beendet wenn das Führungsschiff explodiert/zerstört wird oder man die escortion manuell beendet (fet follow mode[TRUE/FALSE]).

Dann bedeutet dies also wenn man diese Funktion zum ersten mal aufruft bekommt man nur dann einen Rückgabewert wenn obige Bedingungen auftreten. Andernfalls tut dieses Schiffs nichts anderes und der Programmfluss wird an der Stelle unterbrochen wo die escortion startet?

Return to “X²: Die Bedrohung - Scripts und Modding”