Benutzer:Schnobs/Skripte

Aus X-Lexikon
Zur Navigation springenZur Suche springen

Jawoll, ich will's versuchen. Mal sehen, was dabei rauskommt. Als erstes Projekt habe ich mir ein Skript vorgenommen, daß automatisch Satelliten aufstellt (und zerstörte Satelliten ersetzt).

Hier der Plan. Kommentare sind herzlich willkommen.


Funktionsumfang (der Plan)

Eine Heimatbasis im eigentlichen Sinne (Spielerstation) ist nicht erforderlich. Aber das Schiff sollte ein Basislager (beliebige Station) haben, wohin es zurückkehrt, wenn sonst nichts anliegt.

Einstellung des Einsatzgebietes über Sprungweite und Freund/Feind Einstellungen. Das Schiff plaziert Satelliten in allen Sektoren des Einsatzgebietes, und ersetzt verloren gegangene.

Die erforderlichen Satelliten werden (ebenfalls innerhalb des Einsatzgebietes) günstigst eingekauft.

Ablauf (hier brauche ich Hilfe)

Start

Erforderliche Parameter:

  • Heimatbasis (Auswahl von Karte)
  • welche Art Satellit (ebenfalls Auswahl von Karte; evtl zusammen mit der Stationswahl, dann können halt nur Satellitenfabs und HS die Satelliten führen als Heimatbasis dienen)
  • welches Muster. Ich persönlich werde meine Satelliten immer über der "Mitte" des Sektors, deutlich oberhalb der Ekliptik, errichten. Andere haben vielleicht andere Vorlieben, das Skript sollte jedenfalls leicht erweiterbar sein.
  • Sprungweite (Eingabe 0-n)


Ist:

Arguments
   * 1: Camp , Var/Station , 'Select Base Camp'
   * 2: ware , Var/Station and Ware , 'Select Satellite'
   * 3: Range , Var/Number , 'max. Jump Range'

Soweit war's einfach. Auf ein Muster habe ich dann doch verzichtet.

001   $PageID = get global variable: name=$pageID.satdrop
002   
003   * Created by Schnobs, July 2007
004   * Automatic Satellite Deployment, startup script
005   
006   $SatType = $ware[0]

Kein Ahnung, wie ich einfach nur die Page ID (Zeiger auf die Textdatei) festlege. Jetzt schreibt das Initscript eben in eine globale Variable; immerhin ist das eine Lösung, die spätere Änderungen vereinfacht.

007   
008   * can we dock at Camp
009   if [THIS] -> is $Camp a enemy

Und nun? Falls das Schiff an der gewählten Station keine Landeerlaubnis besitzt, sollte das Skript sich Ordnungsgemäß verabschieden. Aber wie mache ich das?

010
011 * Is SatType actually a Satellite

Selbes Problem. Prüfen kann ich, aber was dann? Evtl könnte ich das umgehen, indem als Eingabe ohnehin nur Navigations- oder Erweiterte Satelliten zur Wahl stehen.

016   * ----ab hier werden die Sektoren durchgegangen----
017   * erstmal ein paar variablen
018   * wie gross ist das Universum
019   $uniX = get max sectors in x direction
020   $uniY = get max sectors in y direction
021   
022   * und wo bin ich gerade
023   $CampSector = $Camp -> get sector
024   $homeX = $CampSector -> get universe x index
025   $homeY = $CampSector -> get universe y index
026   
027   
028   * kleineren bereich abstecken...
029   $minX = 0
030   $minY = 0
031   $minY = 0
032   $maxX = $uniX
033   $maxY = $uniY
034   
035   skip if $homeX - $Range >= 0
036    $minX = $homeX - $Range
037   skip if $homeY - $Range >= 0
038    $minY = $homeY - $Range
039   
040   skip if $homeX + $Range <= $uniX
041    $maxX = $homeX + $Range
042   skip if $homeY + $Range <= $uniY
043    $maxY = $homeY + $Range
044   
045   * und jetzt fuer min max XY pruefen...
046   
047   $x = $minX
048   $y = $minY
049   while $x <= $maxX
050    while $y <= $maxY
051     $tempSec = get sector from universe index: x=$x, y=$y
052     $tempdist = get jumps from sector $CampSector to sector $tempSec
053     $test = $tempSec -> is sector known by the player
054     if $tempdist <= $Range AND $test == [TRUE]
055      
056   * Sektor dem Array hinzufuegen, Ende der y-Schleife
057   * wie Arrays funktionieren muss ich noch lernen
058      
059      
060   * ende der eigentlichen tests
061     end
062     
063     
064   * y hochsetzen, y-Schleife beenden
065     inc $y = 
066    end
067    
068    
069   * Ende der x-Schleife
070    inc $x = 
071   end
072   
073   * an dieser Stelle sollte eine Sektorenliste vorliegen
074   * nun die Liste ins Log schreiben
075   * und das eigentliche Skript aufrufen.
076   return null


offene Fragen

Soso, $minY habe ich gleich zweimal auf Null gesetzt... naja, doppelt genäht undsoweiter.

Ist es überhaupt erforderlich, die Variablen vorab zu initialisieren?

Was mich wurmt: dieses Skript klappert einen quadratischen Bereich an Sektoren ab. Die Sektoren in Sprungweite sind aber günstigstenfalls rautenförmig angeordnet. Knapp die Hälfte aller Sektoren können auch bei idealer Sprungtoranbindung niemals innerhalb der Sprungweite sein. Graphische Darstellung:

++#++    # -in Sprungweite
+###+    + -trotzdem geprüft
#####
+###+
++#++

Das Skript verbrennt also nutzlos CPU-Zyklen. Eigentlich kein Problem, es gibt ja weiß Gott genug davon... aber ich sehe es, und es stört mich. Geht das auch eleganter? Kommentare gerne geich hierher.

Satelliten einkaufen

Dazu würde ich gerne auf die "Manuellen Handelsbefehle" (Skript im Bonuspack) zurückgreifen. Die Sprungweite würde dann von der Einstellung des Einsatzbereiches übernommen. Ein potentielles Problem besteht darin, daß für ein vernünftiges Einkaufsverhalten bereits einige Satelliten verteilt sein sollten...

Sektoren überprüfen

Hier wirds haarig. Es gibt zwar Anschauungsmaterial, aber die Routinen sehen alle miteinander recht langwierig aus. Das Skript soll aber zeitnah reagieren, d.h., die Sektoren in kurzen Abständen überprüfen...

Hmm. Nochmal geguckt, ein Großteil der Komplexität liegt darin, daß die existierenden Skripte jedesmal auch wieder ihren Zuständigkeitsbereich neu berechnen. Die Überprüfung, ob sich in einem Sektor ein Satellit befindet, ist hingegen recht kurz und schmerzlos. Damit ist die obige Frage auch beantwortet: lieber etwas Arbeitsspeicher belegen als jede Minute eine komplexe Berechnung anzustoßen.

Der Rest

Ziel Anfliegen, Satellit erzeugen, ggf zurück zum Parkplatz. Nichts davon sollte ein Problem sein.