Benutzer:Schnobs/Skripte
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.