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

oder
Was geht und was nicht geht

Dies ist ein sehr schlichtes Skript, um in einem bestimmten Bereich Satelliten aufzustellen. Das Schiff plaziert Satelliten in allen Sektoren des Einsatzgebietes, und ersetzt verloren gegangene. Die erforderlichen Satelliten werden (ebenfalls innerhalb des Einsatzgebietes) günstigst eingekauft.

Dieses Skript richtet sich an den aufstrebenden Jungunternehmer: der Funktionsumfang ist bescheiden, mit Problemen kann es nicht umgehen. Dafür entstehen auch keine weiteren Kosten, keine Gebühr pro aufgestelltem Satellit oder sowas. Die Satelliten und das Schiff sind schon teuer genug.


Bedienung:
Bei Start wird man gebeten, eine Station auszuwählen: das Basislager. Dies ist keine Heimatbasis im eigentlichen Sinne, sondern lediglich der Parkplatz, den das Schiff anfliegt, wenn es sonst nichts zu tun hat. Insofern tut es jede Station, auf der man andocken kann.

Weiterhin wird man gefragt, welche Art von Satellit man verteilen will: E = Erweitert, alle anderen Eingaben = Navigationssatellit.

Zu guter letzt soll man noch eine Sprungweite angeben. Der Ausgangspunkt ist der Sektor, in dem sich das Basislager befindet. Das Einsatzgebiet wird aus der Sprungweite in Verbindung mit den Freund/Feind-Einstellungen berechnet. Beispiel: Basislager ist die Handelsstation in Argon Prime, Sprungweite ist 7, alle außer den Argonen sind Feinde. Ergebins: das Einsatzgebiet sind die sog. "Argonischen Kernsektoren".

Die Einbeziehung der Freund/Feind-Einstellungen ermöglicht eine recht sinnvolle Abgrenzung des Einsatzgebietes. Es wird einmal berechnet und dann als Liste gespeichert; es ließe sich also mit relativ wenig Aufwand ein Skript basteln, das einzelne Sektoren zur Liste hinzufügt oder daraus entfernt. Wenn man die F/F-Einstellungen später ändert, hat das KEINE Auswirkungen auf den Einsatzbereich!

Was geschieht:
Alle fünf Mizuras werden die Sektoren im Einsatzbereich abgeklopft. Wenn sich in einem Sektor kein Spieler-Satellit befindet, fliegt das Schiff hin und plaziert einen Satelliten in der Mitte des Sektors deutlich oberhalb der Ekliptik. Es kann mehrere Satelliten hintereinander aufstellen, ohne jedesmal zum Basislager zurückzukehren.

Wenn ihm die Satelliten ausgehen, versucht es innerhalb des Einsatzgebietes neue zu beschaffen. So billig wie möglich zwar, aber erforderlichenfalls werden Spitzenpreise gezahlt. Falls das aus welchem Grund auch immer nicht klappt: Kein Geld auf dem Spielerkonto? Keine Station im Einsatzgebiet handelt mit den erforderlichen Satelliten? Keine Andockerlaubnis irgendwo? Das Skript kennt das alles nicht. Es weiß nur daß immer noch keine Satelliten geladen hat, wartet ein paar Mizuras und versucht es erneut. Wenn es über längere Zeit keine Satelliten einkaufen kann, wird ca. einmal pro Stunde eine Nachricht an den Spieler geschickt, während das Schiff es einfach immer weiter versucht.

Also, nochmal zum mitschreiben: das Skript ist schlau genug, ohne Satelliten gar nicht erst zu starten. Und das ist die einzige Intelligenz, die es hat. Andere Probleme werden nicht einmal erkannt.

Ablauf (hier brauche ich Hilfe)

Start

Script plugin.satdrop.start
Version: 0
for Script Engine Version: 25
Description
Asks for relevant values, starts Sat deployment loop
Arguments                                                                                                                  

    * 1: Camp , Var/Station , 'Select Base Camp'
    * 2: SatType , Var/Number , '0 NavSat, alles andere Erw.Sat'
    * 3: Range , Var/Number , 'max. Jump Range'

Source Text

001   $PageID = get global variable: name=$pageID.satdrop
002   
003   * Created by Schnobs, July 2007
004   * Automatic Satellite Deployment, startup script
005   
006   if $SatType == 0
007    $SatType = Navigationssatellit
008   else
009    $SatType = Erweiterter Satellit
010   end
011   
012   * Andockerlaubnis am Basislager
013   
014   if not [THIS] -> is docking allowed at $Camp
015    play sample 1248
016    write to player logbook: printf: pageid=$PageID textid=1, $Camp, null, null, null, null
017    return null
018   end
019   
020   * sind schon Satelliten im Kofferraum
021   if not [THIS] -> get amount of ware $SatType in cargo bay
022   * aha. Ist denn wenigstens genug Platz
023    if not [THIS] -> get free amount of ware $SatType in cargo bay
024     play sample 1253
025     write to player logbook: printf: pageid=$PageID textid=2, $SatType, null, null, null, null
026     return null
027    end
028   end
029   
030   * ----ab hier werden die Sektoren durchgegangen----
031   * erstmal ein paar variablen
032   * wie gross ist das Universum
033   $uniX = get max sectors in x direction
034   $uniY = get max sectors in y direction
035   
036   * und wo bin ich gerade
037   $CampSector = $Camp -> get sector
038   $homeX = $CampSector -> get universe x index
039   $homeY = $CampSector -> get universe y index
040   $SectorList =  array alloc: size=0
041   
042   
043   * kleineren bereich abstecken...
044   
045   $minX = $homeX - $Range
046   skip if $minX >= 0
047    $minX = 0
048   $maxX = $homeX + $Range
049   skip if $maxX <= $uniX
050    $maxX = $uniX
051   
052   $minY = $homeY - $Range
053   skip if $minY >= 0
054    $minY = 0
055   $maxY = $homeY + $Range
056   skip if $maxY <= $uniY
057    $maxY = $uniY
058   
059   * und jetzt fuer min max XY pruefen...
060   
061   $x = $minX
062   while $x <= $maxX
063    $y = $minY
064    while $y <= $maxY
065     $tempSec = get sector from universe index: x=$x, y=$y
066     $tempdist = get jumps from sector $CampSector to sector $tempSec
067     $known = $tempSec -> is sector known by the player
068     $nmy = [THIS] -> is $tempSec a enemy
069     if $tempdist <= $Range AND $known == [TRUE] AND $nmy == [FALSE]
070      
071   * Sektor dem Array hinzufuegen
072      append $tempSec to array $SectorList
073      
074   * ende der eigentlichen tests
075     end
076     
077   * y hochsetzen, y-Schleife beenden
078     inc $y = 
079    end
080    
081   * Ende der x-Schleife
082    inc $x = 
083   end
084   
085   * an dieser Stelle sollte eine Sektorenliste vorliege
086   * nun die Liste ins Log schreiben
087   
088   
089   $i = 1
090   $numSectors =  size of array $SectorList
091   $tempSec = $SectorList[0]
092   $msg = $tempSec
093   while $i < $numSectors
094    $tempSec = $SectorList[$i]
095    $msg = $msg + ', ' + $tempSec
096    inc $i = 
097   end
098   
099   write to player logbook: printf: pageid=$PageID textid=3, $SatType, $Camp, $msg, null, null
100   
101   
102   * variablen exportieren un das eigentliche skript aufrufen.
103   [THIS] -> set local variable: name=$SectorList value=$SectorList
104   [THIS] -> set local variable: name=$SatType value=$SatType
105 @ = [THIS] -> call script 'plugin.satdrop.main' :  Basislager=$Camp  Nav. oder Erw. satellit=$SatType
106   * callscript
107   return null


Sektoren überprüfen

Script plugin.satdrop.main
Version: 0
for Script Engine Version: 25
Description
Satellite Deployment, main program loop
Arguments

    * 1: Camp , Var/Station , 'Basislager'
    * 2: SatType , Var/Ware , 'Nav. oder Erw. satellit'

Source Text

001   
002   
003   
004   
005   * dies ist eine Endlos-Schleife
006   while [TRUE]
007   START:
008   * Sektorenliste aktualisieren
009    $SectorList = [THIS] -> get local variable: name=$SectorList
010    
011   * sind ueberhaupt Satelliten an Bord
012   * nicht vergessen, alles ausser 0 ist wahr...
013    skip if [THIS] -> get amount of ware $SatType in cargo bay
014   * FEHLT einkaufskript starten
015    
016    
017    $i.sec = 0
018    $sector.count =  size of array $SectorList
019    while $i.sec < $sector.count
020     $tempSec = $SectorList[$i.sec]
021     
022   * falls wir keinen Nav.Sat finden...
023     skip if  find ship: sector=$tempSec class or type=Navigationssatellit race=Player flags=null refobj=null maxdist=null maxnum=null refpos=null
024   * und auch keinen Erw.Sat...
025     skip if  find ship: sector=$tempSec class or type=Erweiterter Satellit race=Player flags=null refobj=null maxdist=null maxnum=null refpos=null
026   * sofort aus der Schleife ausbrechen.
027     break
028     
029     
030   * wenn wir bis hier kommen, ist ein Satellit vorhanden.
031   * deshalb wird tempSec geloescht, i hochgesetzt, naechster Sektor bitte.
032     $tempSec = null
033     inc $i.sec = 
034    end
035    
036    
037   * wenn tempSec einen Wert hat, wurde oben kein Sat gefunden...
038    if  is datatyp[ $tempSec ] == [SECTOR]
039   * FEHLT script hingehen und satellit aussetzen
040     
041   * und zurueck auf los. Wir schauen uns die restlichen
042   * Sektoren an, noch bevor wir nach hause fliegen.
043 @   = wait randomly from 0 to 5000 ms
044     goto label START
045    end
046    
047    
048   * wenn wir hier ankommen, gibt es derzeit nichts weiter zu tun.
049   * aber wenn wir im raum sind, gab es was zu tun.
050   * brauchen wir nachschub an satelliten
051    if not [THIS] -> is docked
052     $sat.count = [THIS] -> get amount of ware $SatType in cargo bay
053     skip if $sat.count > 1
054   * FEHLT einkaufscript aufrufen
055 @   = wait randomly from 0 to 5000 ms
056     goto label START
057    end
058    
059    
060   * wenn wir hier ankommen, wars ein nullrunde
061   * machen wir halt 5 Mizuras Pause...
062 @  = wait 300000 ms
063   * ...plus zusatzzahl
064 @  = wait randomly from 0 to 5000 ms
065   end
066   return null


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...


Der Rest

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