Benutzer:Schnobs/Skripte: Unterschied zwischen den Versionen

Aus X-Lexikon
Zur Navigation springenZur Suche springen
(Quellcode eingefügt. Kommentare willkommen.)
Zeile 15: Zeile 15:


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


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
  001  $PageID = get global variable: name=$pageID.satdrop
  002   
  002   
Zeile 37: Zeile 34:
  004  * Automatic Satellite Deployment, startup script
  004  * Automatic Satellite Deployment, startup script
  005   
  005   
  006  $SatType = $ware[0]
  006  if $SatType == 0
 
007    $SatType = Navigationssatellit
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.
008  else
 
009    $SatType = Erweiterter Satellit
  007    
010  end
  008   * can we dock at Camp
  011    
  009   if [THIS] -> is $Camp a enemy
  012   * Andockerlaubnis am Basislager
 
013 
Und nun? Falls das Schiff an der gewählten Station keine Landeerlaubnis besitzt, sollte das Skript sich Ordnungsgemäß verabschieden. Aber wie mache ich das?
  014   if not [THIS] -> is docking allowed at $Camp
 
015    play sample 1248
  010
016    write to player logbook: printf: pageid=$PageID textid=1, $Camp, null, null, null, null
  011 * Is SatType actually a Satellite
017    return null
 
018  end
Selbes Problem. Prüfen kann ich, aber was dann? Evtl könnte ich das umgehen, indem als Eingabe ohnehin nur '''N'''avigations- oder '''E'''rweiterte Satelliten zur Wahl stehen.
019 
 
020  * sind schon Satelliten im Kofferraum
  016   * ----ab hier werden die Sektoren durchgegangen----
  021  if not [THIS] -> get amount of ware $SatType in cargo bay
  017   * erstmal ein paar variablen
  022  * aha. Ist denn wenigstens genug Platz
  018   * wie gross ist das Universum
023    if not [THIS] -> get free amount of ware $SatType in cargo bay
  019   $uniX = get max sectors in x direction
024    play sample 1253
  020   $uniY = get max sectors in y direction
025    write to player logbook: printf: pageid=$PageID textid=2, $SatType, null, null, null, null
  021    
026    return null
  022   * und wo bin ich gerade
027    end
  023   $CampSector = $Camp -> get sector
028  end
  024   $homeX = $CampSector -> get universe x index
029 
  025   $homeY = $CampSector -> get universe y index
  030   * ----ab hier werden die Sektoren durchgegangen----
  026 
  031   * erstmal ein paar variablen
027 
  032   * wie gross ist das Universum
028  * kleineren bereich abstecken...
  033   $uniX = get max sectors in x direction
029  $minX = 0
  034   $uniY = get max sectors in y direction
030   $minY = 0
  035    
  031  $minY = 0
  036   * und wo bin ich gerade
  032   $maxX = $uniX
  037   $CampSector = $Camp -> get sector
033  $maxY = $uniY
  038   $homeX = $CampSector -> get universe x index
034 
  039   $homeY = $CampSector -> get universe y index
035  skip if $homeX - $Range >= 0
  040   $SectorList array alloc: size=0
036    $minX = $homeX - $Range
  041    
037  skip if $homeY - $Range >= 0
  042   
038    $minY = $homeY - $Range
  043   * kleineren bereich abstecken...
039 
040  skip if $homeX + $Range <= $uniX
041    $maxX = $homeX + $Range
  042  skip if $homeY + $Range <= $uniY
  043   $maxY = $homeY + $Range
  044   
  044   
  045  * und jetzt fuer min max XY pruefen...
  045   $minX = $homeX - $Range
  046    
046  skip if $minX >= 0
  047   $x = $minX
047    $minX = 0
  048   $y = $minY
048  $maxX = $homeX + $Range
  049  while $x <= $maxX
049  skip if $maxX <= $uniX
  050   while $y <= $maxY
050    $maxX = $uniX
  051     $tempSec = get sector from universe index: x=$x, y=$y
051 
  052     $tempdist = get jumps from sector $CampSector to sector $tempSec
052  $minY = $homeY - $Range
  053     $test = $tempSec -> is sector known by the player
053  skip if $minY >= 0
  054     if $tempdist <= $Range AND $test == [TRUE]
054    $minY = 0
  055      
055  $maxY = $homeY + $Range
  056   * Sektor dem Array hinzufuegen, Ende der y-Schleife
056  skip if $maxY <= $uniY
  057  * wie Arrays funktionieren muss ich noch lernen
057    $maxY = $uniY
058      
058 
  059      
059   * und jetzt fuer min max XY pruefen...
  060   * ende der eigentlichen tests
  060    
  061     end
  061   $x = $minX
  062      
  062   while $x <= $maxX
  063   
  063    $y = $minY
064   * y hochsetzen, y-Schleife beenden
  064   while $y <= $maxY
  065     inc $y =  
  065     $tempSec = get sector from universe index: x=$x, y=$y
  066   end
  066     $tempdist = get jumps from sector $CampSector to sector $tempSec
  067   
  067     $known = $tempSec -> is sector known by the player
068    
  068    $nmy = [THIS] -> is $tempSec a enemy
  069   * Ende der x-Schleife
069     if $tempdist <= $Range AND $known == [TRUE] AND $nmy == [FALSE]
  070   inc $x =  
  070      
  071   end
  071   * Sektor dem Array hinzufuegen
  072    
  072     append $tempSec to array $SectorList
  073   * an dieser Stelle sollte eine Sektorenliste vorliegen
  073      
  074   * nun die Liste ins Log schreiben
  074   * ende der eigentlichen tests
  075   * und das eigentliche Skript aufrufen.
  075     end
  076   return null
  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




====offene Fragen====
===Sektoren überprüfen===
Soso, ''$minY'' habe ich gleich zweimal auf Null gesetzt... naja, doppelt genäht undsoweiter.


Ist es überhaupt erforderlich, die Variablen vorab zu initialisieren?
Script plugin.satdrop.main
 
Version: 0
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:
for Script Engine Version: 25
  ++#++   # -in Sprungweite
Description
  +###+   + -trotzdem geprüft
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


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===
===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...
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===
===Der Rest===
Ziel Anfliegen, Satellit erzeugen, ggf zurück zum Parkplatz. Nichts davon sollte ein Problem sein.
Ziel Anfliegen, Satellit erzeugen, ggf zurück zum Parkplatz. Nichts davon sollte ein Problem sein.

Version vom 23. Juni 2007, 22:04 Uhr

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

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.