|
|
Zeile 1: |
Zeile 1: |
| 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 ein paar Skripte, die ich mir so im Laufe der Zeit geschrieben habe. Bei Interesse findet ihr in den Wiki-Menüs am linken Rand die Funktion "Email an diesen Benutzer". |
|
| |
|
| Hier der Plan. Kommentare sind herzlich willkommen.
| | ==Kleine Helferlein== |
|
| |
|
| | ===Geschützturmbefehl für den Bergbau=== |
|
| |
|
| ==Funktionsumfang==
| | Im Standard-Skript "Greife mein Ziel an" (!turret.attacktarget.std) findet sich folgendes: |
| oder<br>
| |
| '''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.
| | 012 if not [THIS] -> is $victim a enemy |
| | 013 $victim = null |
|
| |
|
| 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.
| | Damit soll verhindert werden, daß die Kanzel das Feuer auf neutrale und befreundete Schiffe und Stationen eröffnet. Eigentlich ist das ja ganz sinnvoll. Nur sind Asteroiden prinzipiell neutral und ändern ihre Meinung auch nicht, wenn man sie beschießt. Eine kleine Änderung am Skript prüft zusätzlich, ob das Ziel ein Asteroid und die Waffe ein Mobiles Bohrsystem ist. |
|
| |
|
| | Nun kann sich der Bergbauingeneur ganz auf die Steuerung des Schiffes konzentrieren, und muß nicht länger in die Heckkanzel umsteigen. |
|
| |
|
| Bedienung:<br>
| | ===Landecomputer für die KI=== |
| 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.
| | Alle mit Landecomputer ausgestatteten Schiffe benutzen ihn auch. |
|
| |
|
| 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".
| | ===Mehr Fairness beim Völkerrang=== |
|
| |
|
| 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! | | Die Flotten der Völker sind offensichtlich überfordert und schaffen es nicht, die Sicherheit in ihren Sektoren zu gewährleisten. Da ist der Spieler gefragt... und mit den Patroullienkommandos aus dem Bonuspack ist das ja durchaus zu schaffen. Nur: wo bleibt der Dank? |
|
| |
|
| Was geschieht:<br>
| | Wenn eines meiner Schiffe Völkerbesitz beschädigt, werde ich dafür persönlich zur Rechenschaft gezogen. Das gleichzeitig zahlreiche Patroullien in meinem Namen und auf meine Rechnung für Sicherheit sorgen, wird hingegen von niemandem gewürdigt. Das hat mir dermaßen Gestunken, daß ich da was unternommen habe. |
| 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.
| | Jetzt bekomme ich den vollen Völkerrang für Abschüsse durch eigenes Personal. Die Prämie muß ich mir mit dem Piloten teilen, schließlich hat er seinen Kopf hingehalten. |
|
| |
|
| 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)== | | ==Autom. Satellitenverteiler== |
| | ===Funktionsumfang=== |
| | oder<br> |
| | '''Was geht und was nicht geht''' |
|
| |
|
| ===setup.plugin.satdrop===
| | 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. |
|
| |
|
| 001 $textID = 1312
| | 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. |
| 002 $pageID = 1002
| |
| 003 load text: id=$textID
| |
| 004
| |
| 005 * link command to equipment
| |
| 006 set script command upgrade: command=COMMAND_DEPLOY_SATELLITE upgrade=Spezialsoftware MK1
| |
| 007
| |
| 008 * link command to actual script
| |
| 009 global script map: set: key=COMMAND_DEPLOY_SATELLITE, class=Light Fighter M5, race=Player, script='plugin.satdrop.start', prio=0
| |
| 010
| |
| 011 set global variable: name=$pageID.satdrop value=$pageID
| |
| 012 set global variable: name=$textID.satdrop value=$textID
| |
| 013 return null
| |
|
| |
|
|
| |
|
| ===plugin.satdrop.start===
| | Bedienung:<br> |
| | 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. |
|
| |
|
| Funktion: übernimmt die Benutzereingabe.
| | Weiterhin wird man gefragt, welche Art von Satellit man verteilen will: E = Erweitert, alle anderen Eingaben = Navigationssatellit. |
| Klappert alle Sektoren ab und schreibt sie in ein array
| |
| Schickt das Schiff zum Basislager
| |
| exportiert die notwendigen variablen
| |
| startet das eigentliche Skript
| |
|
| |
|
| Arguments
| | 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, dadurch kann man das Einsatzgebiet sinnvoll abgrenzen. Beispiel: Basislager ist die Handelsstation in Argon Prime, Sprungweite ist 7, alle außer den Argonen sind Feinde. Ergebnis: das Einsatzgebiet sind die sog. "Argonischen Kernsektoren". |
|
| |
| * 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 $textID = get global variable: name=$textID.satdrop
| |
| 002 $PageID = get global variable: name=$pageID.satdrop
| |
| 003 load text: id=$textID
| |
|
| |
|
| An dieser Stelle gibt es ein Problem: $PageID bekommt den Wert 1312 (=$textID), obwohl ich oben 1002 gesetzt und exportiert habe. Huch?
| | :''VORSICHT: Die Rassen haben ja mehr als ein Gebiet. Wenn man die Sprungweite zu hoch einstellt, landen Sektoren aus mehreren Gebieten in der Liste. Das kann erwünscht sein, aber auf jeden Fall sind die Wege lang und u.U. führen Sie durch einen Xenonsektor oder dergleichen...'' |
|
| |
|
| 004 $PageID = 1002
| | Die Liste der Sektoren wird bei Programmstart berechnet und dann 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! |
| 005
| |
| 006 * Created by Schnobs, July 2007
| |
| 007 * Automatic Satellite Deployment, startup script
| |
| 008
| |
| 009 if $SatType == 0
| |
| 010 $SatType = Navigationssatellit
| |
| 011 else
| |
| 012 $SatType = Erweiterter Satellit
| |
| 013 end
| |
| 014
| |
| 015 * Andockerlaubnis am Basislager
| |
| 016
| |
| 017 if not [THIS] -> is docking allowed at $Camp
| |
| 018 play sample 1248
| |
| 019 write to player logbook: printf: pageid=$PageID textid=1, $Camp, null, null, null, null
| |
| 020 return null
| |
| 021 end
| |
| 022
| |
| 023 * sind schon Satelliten im Kofferraum
| |
| 024 if not [THIS] -> get amount of ware $SatType in cargo bay
| |
| 025 * aha. Ist denn wenigstens genug Platz
| |
| 026 if not [THIS] -> get free amount of ware $SatType in cargo bay
| |
| 027 play sample 1253
| |
| 028 write to player logbook: printf: pageid=$PageID textid=2, $SatType, null, null, null, null
| |
| 029 return null
| |
| 030 end
| |
| 031 end
| |
| 032
| |
| 033 * ----ab hier werden die Sektoren durchgegangen----
| |
| 034 * erstmal ein paar variablen
| |
| 035 * wie gross ist das Universum
| |
| 036 $uniX = get max sectors in x direction
| |
| 037 $uniY = get max sectors in y direction
| |
| 038
| |
| 039 * und wo bin ich gerade
| |
| 040 $CampSector = $Camp -> get sector
| |
| 041 $homeX = $CampSector -> get universe x index
| |
| 042 $homeY = $CampSector -> get universe y index
| |
| 043 $SectorList = array alloc: size=0
| |
| 044
| |
| 045
| |
| 046 * kleineren bereich abstecken...
| |
| 047
| |
| 048 $minX = $homeX - $Range
| |
| 049 skip if $minX >= 0
| |
| 050 $minX = 0
| |
| 051 $maxX = $homeX + $Range
| |
| 052 skip if $maxX <= $uniX
| |
| 053 $maxX = $uniX
| |
| 054
| |
| 055 $minY = $homeY - $Range
| |
| 056 skip if $minY >= 0
| |
| 057 $minY = 0
| |
| 058 $maxY = $homeY + $Range
| |
| 059 skip if $maxY <= $uniY
| |
| 060 $maxY = $uniY
| |
| 061
| |
| 062 * und jetzt fuer min max XY pruefen...
| |
| 063
| |
| 064 $x = $minX
| |
| 065 while $x <= $maxX
| |
| 066 $y = $minY
| |
| 067 while $y <= $maxY
| |
| 068 $tempSec = get sector from universe index: x=$x, y=$y
| |
| 069 $tempdist = get jumps from sector $CampSector to sector $tempSec
| |
| 070 $known = $tempSec -> is sector known by the player
| |
| 071 $nmy = [THIS] -> is $tempSec a enemy
| |
| 072 if $tempdist <= $Range AND $known == [TRUE] AND $nmy == [FALSE]
| |
| 073
| |
| 074 * Sektor dem Array hinzufuegen
| |
| 075 skip if not is datatyp[ $tempSec ] == DATATYP_SECTOR
| |
| 076 append $tempSec to array $SectorList
| |
| 077
| |
| 078 * ende der eigentlichen tests
| |
| 079 end
| |
| 080
| |
| 081 * y hochsetzen, y-Schleife beenden
| |
| 082 inc $y =
| |
| 083 end
| |
| 084
| |
| 085 * Ende der x-Schleife
| |
| 086 inc $x =
| |
| 087 end
| |
| 088
| |
| 089 * an dieser Stelle sollte eine Sektorenliste vorliege
| |
| 090 * nun die Liste ins Log schreiben
| |
| 091
| |
| 092
| |
| 093 $i = 1
| |
| 094 $numSectors = size of array $SectorList
| |
| 095 $tempSec = $SectorList[0]
| |
| 096 $msg = $tempSec
| |
| 097 while $i < $numSectors
| |
| 098 $tempSec = $SectorList[$i]
| |
| 099 $msg = $msg + ', ' + $tempSec
| |
| 100 inc $i =
| |
| 101 end
| |
| 102
| |
| 103 write to player logbook: printf: pageid=$PageID textid=3, $SatType, $Camp, $msg, null, null
| |
| 104
| |
| 105 * erstmal zum Basislager
| |
| 106 @ = [THIS] -> call script 'lib.xi.nav' : Target=$Camp Range=null Sector Position=null
| |
| 107
| |
| 108 * variablen exportieren un das eigentliche skript aufrufen.
| |
| 109 [THIS] -> set local variable: name=$SectorList value=$SectorList
| |
| 110 [THIS] -> set local variable: name=$SatType value=$SatType
| |
| 111 @ = [THIS] -> call script 'plugin.satdrop.main' : Basislager=$Camp Nav. oder Erw. satellit=$SatType
| |
| 112 return null
| |
|
| |
|
| ===plugin.satdrop.main===
| | Was geschieht:<br> |
| | 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. |
|
| |
|
| Klappert die Sektoren im Array ab und sucht nach Satelliten. Falls keiner da ist, fliegt es los und stellt einen auf. Falls keine Satelliten (mehr) an Bord sind, wird das Nachschub-Skript aufgerufen.
| | 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. |
|
| |
|
| '''Ich hatte bei den bisherigen Tests noch nie Satelliten an Bord. Ich kann bisher nur sagen, daß dieses Skript erfolgreich das Nachschub-Skript aufruft -- und dort ist was faul.'''
| | 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. |
| | |
| | |
|
| |
| * 1: Camp , Var/Station , 'Basislager'
| |
| * 2: SatType , Var/Ware , 'Nav. oder Erw. satellit'
| |
|
| |
| Source Text
| |
|
| |
| 001 $textID = get global variable: name=$textID.satdrop
| |
| 002 $pageID = get global variable: name=$pageID.satdrop
| |
| 003 load text: id=$textID
| |
| 004 $pageID = 1002
| |
| 005
| |
| 006 * dies ist eine Endlos-Schleife
| |
| 007 while [TRUE]
| |
| 008 START:
| |
| 009 * Sektorenliste aktualisieren
| |
| 010 $SectorList = [THIS] -> get local variable: name=$SectorList
| |
| 011
| |
| 012 * sind ueberhaupt Satelliten an Bord
| |
| 013 * nicht vergessen, alles ausser 0 ist wahr...
| |
| 014 while [THIS] -> get amount of ware $SatType in cargo bay
| |
| 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 @ = wait randomly from 0 to 500 ms
| |
| 035 end
| |
| 036
| |
| 037
| |
| 038 * wenn tempSec einen Wert hat, wurde oben kein Sat gefunden...
| |
| 039 if is datatyp[ $tempSec ] == [SECTOR]
| |
| 040
| |
| 041 * lib.xi.nav erwartet ein array x,y,z,sektor
| |
| 042 * range ist keine sprungweite, sondern die abweichungvon xyz
| |
| 043 $sat.x = 0
| |
| 044 $sat.y = 30000
| |
| 045 $sat.z = 0
| |
| 046 $secpos = array alloc: size=4
| |
| 047 $secpos[0] = $sat.x
| |
| 048 $secpos[1] = $sat.y
| |
| 049 $secpos[2] = $sat.z
| |
| 050 $secpos[3] = $tempSec
| |
| 051 @ = [THIS] -> call script 'lib.xi.nav' : Target=null Range=300 Sector Position=$secpos
| |
| 052
| |
| 053 * warentyp - schiffstyp
| |
| 054 $sat.shiptype = Erweiterter Satellit
| |
| 055 skip if $SatType == Erweiterter Satellit
| |
| 056 $sat.shiptype = Navigationssatellit
| |
| 057
| |
| 058 * sat im laderaum vernichten
| |
| 059 = [THIS] -> add -1 units of $SatType
| |
| 060 * sat im weltall erzeugen
| |
| 061 $whats.this = create ship: type=$sat.shiptype owner=Player addto=$tempSec x=$sat.x y=$sat.y z=$sat.z
| |
| 062
| |
| 063 * und zurueck auf los. Wir schauen uns die restlichen
| |
| 064 * Sektoren an, noch bevor wir nach hause fliegen.
| |
| 065 @ = wait randomly from 0 to 500 ms
| |
| 066 goto label START
| |
| 067 end
| |
| 068
| |
| 069
| |
| 070 * wenn wir hier ankommen, sind alle Sektoren geprueft
| |
| 071 * und es fehlt nirgends ein Satellit.
| |
| 072 * wenn wir im Raum sind, ab nach Hause
| |
| 073 if not [THIS] -> is docked
| |
| 074 @ = [THIS] -> call script 'lib.xi.nav' : Target=$Camp Range=null Sector Position=null
| |
| 075 * andernfalls 5min aussetzen
| |
| 076 else
| |
| 077 @ = wait 300000 ms
| |
| 078 end
| |
| 079 * In jedem fall machen wir eine kurze Pause
| |
| 080 @ = wait randomly from 0 to 500 ms
| |
| 081 end
| |
| 082
| |
| 083 * wenn wir diesen punkt erreichen, sind die Satelliten alle
| |
| 084 @ = [THIS] -> call script 'plugin.satdrop.buy' : Ware=$SatType maxprice=null Basislager=$Camp
| |
| 085 end
| |
| 086 return null
| |
|
| |
| ===plugin.satdrop.buy===
| |
| | |
| Soll Satelliten nachkaufen. Klappt nicht.
| |
| | |
| Dieses Skript ist zu 90% von den "Manuellen Handelsbefehlen" der Xai Corporation abgekupfert.
| |
|
| |
| * 1: Arg1 , Value , 'Ware'
| |
| * 2: Arg2 , Value , 'maxprice'
| |
| * 3: Camp , Var/Station , 'Basislager'
| |
|
| |
| Source Text
| |
|
| |
| 001 * Created by Xai Corporation
| |
| 002 *
| |
| 003 * ---------------------------------------
| |
| 004 * Find best buy
| |
| 005 * - Arg1-Ware, Arg2-MaxPrice, Arg3-Max-Jumps
| |
| 006 * - set defaults if not already set
| |
| 007 $textID = get global variable: name=$textID.satdrop
| |
| 008 load text: id=$textID
| |
| 009 $pageID = 1002
| |
| 010
| |
| 011
| |
| 012
| |
| 013 if not $Arg1
| |
| 014 return null
| |
| 015 else if not is datatyp[ $Arg1 ] == DATATYP_WARE
| |
| 016 return null
| |
| 017 end
| |
| 018 if not $Arg2
| |
| 019 $Arg2 = get max price of ware $Arg1
| |
| 020 else if not is datatyp[ $Arg2 ] == DATATYP_INT
| |
| 021 $Arg2 = get max price of ware $Arg1
| |
| 022 end
| |
| 023
| |
| 024 $price.avg = get average price of ware $Arg1
| |
| 025
| |
| 026 $in.cargo = [THIS] -> get amount of ware $Arg1 in cargo bay
| |
| 027 $failed.attempt = 0
| |
| 028 $gametime.start = playing time
| |
| 029
| |
| 030 while $in.cargo == 0
| |
| 031
| |
| 032 * - get sectors in range
| |
| 033 enable signal/interrupt handling: [FALSE]
| |
| 034 $sector.list = [THIS] -> get local variable: name=$SectorList
| |
| | |
| XI berechnet hier eine Sektorenliste (array) nach ihren eigenen Regeln. Den ganzen Plumquatsch habe ich abgeschnitten und will stattdessen mein eigenes Array nachladen. Wenn ich den Debugger über dieses Skript laufen lasse, zeigt er mir für $sector.list ''DATATYP_NULL, null, (0)'' -- ich habe jetzt schon ein dutzend mal geprüft, das Start-Skript exportiert das Array und im main-Skript wird es auch erfolgreich geladen.
| |
| | |
| 035 $sector.list.num = size of array $sector.list
| |
| 036 * - get best price from sectors in range
| |
| 037 $best.price = get max price of ware $Arg1
| |
| 038 while $sector.list.num
| |
| 039 dec $sector.list.num =
| |
| 040 $sector = $sector.list[$sector.list.num]
| |
| 041 if $Arg2 > $price.avg
| |
| 042 $station = find station: product $Arg1 with best price: max.price=$price.avg, amount=null, max.jumps=0, startsector=$sector, trader=[THIS]
| |
| 043 skip if $station
| |
| 044 $station = find station sells: resource $Arg1 with best price: max.price=$Arg2, amount=null, max.jumps=0, startsector=$sector, trader=[THIS]
| |
| 045 end
| |
| 046 skip if $station
| |
| 047 $station = find station: product $Arg1 with best price: max.price=$Arg2, amount=null, max.jumps=0, startsector=$sector, trader=[THIS]
| |
| 048 * - set station as best if price is lowest
| |
| 049 if $station
| |
| 050 $station.isEnemy = [THIS] -> is $station a enemy
| |
| 051 if $Arg3 < 3 OR ! $station.isEnemy
| |
| 052 $range = get jumps from sector [SECTOR] to sector $sector
| |
| 053 $price = $station -> get price of ware $Arg1
| |
| 054 if $best.range > $range OR $price < $best.price
| |
| 055 $best.price = $price
| |
| 056 $Arg2 = $best.price
| |
| 057 $best.station = $station
| |
| 058 $best.range = $range
| |
| 059 end
| |
| 060 * trust me this is needed for line 59
| |
| 061 $station = null
| |
| 062 end
| |
| 063 end
| |
| 064
| |
| 065 end
| |
| 066 $station = $best.station
| |
| 067 $ware = $Arg1
| |
| 068
| |
| 069 * set Display
| |
| 070 [THIS] -> set destination to $station
| |
| 071 [THIS] -> set wanted ware to $ware
| |
| 072 [THIS] -> set command: COMMAND_GET_WARE target=$ware target2=null par1=null par2=null
| |
| 073 set script command: COMMAND_SIGN_MTC_BEST_BUY
| |
| 074
| |
| 075 * fly to station
| |
| 076 $station.name = sprintf: fmt='%s', $station, null, null, null, null
| |
| 077 while not $arrived
| |
| 078 @ $arrived = [THIS] -> call script 'lib.xi.nav' : Target=$station Range=null Sector Position=null
| |
| 079 @ = wait 300 ms
| |
| 080 end
| |
| 081
| |
| 082 * check we have arrived
| |
| 083 if [DOCKEDAT] == $station
| |
| 084 @ = [THIS] -> call script 'lib.xi.trade' : Command='buy' Ware=$ware Quantity=null
| |
| 085 end
| |
| 086
| |
| 087 * .........................................
| |
| 088 * an dieser Stelle sollten wir wieder Satelliten haben
| |
| 089 * .........................................
| |
| 090
| |
| 091 * nirgends angedockt bedeutet Probleme
| |
| 092 skip if [THIS] -> is docked
| |
| 093 @ = [THIS] -> call script 'lib.xi.nav' : Target=$Camp Range=null Sector Position=null
| |
| 094
| |
| 095
| |
| 096 $in.cargo = [THIS] -> get amount of ware $Arg1 in cargo bay
| |
| 097
| |
| 098
| |
| 099 * doch noch keine satelliten bekommen...
| |
| 100 * alle stunde nachricht an den spieler und weiter versuchen
| |
| 101 if $in.cargo == 0
| |
| 102 inc $failed.attempt =
| |
| 103 if $failed.attempt >= 12
| |
| 104 $gametime.now = playing time
| |
| 105 $gametime.passed = ( $gametime.now - $gametime.start ) mod 60
| |
| 106 write to player logbook: printf: pageid=1002 textid=4, $gametime.passed, $ware, null, null, null
| |
| 107 $failed.attempt = 0
| |
| 108 end
| |
| 109 @ = wait 300000 ms
| |
| 110 end
| |
| 111 end
| |
| 112 return null
| |
Hier ein paar Skripte, die ich mir so im Laufe der Zeit geschrieben habe. Bei Interesse findet ihr in den Wiki-Menüs am linken Rand die Funktion "Email an diesen Benutzer".
Kleine Helferlein
Geschützturmbefehl für den Bergbau
Im Standard-Skript "Greife mein Ziel an" (!turret.attacktarget.std) findet sich folgendes:
012 if not [THIS] -> is $victim a enemy
013 $victim = null
Damit soll verhindert werden, daß die Kanzel das Feuer auf neutrale und befreundete Schiffe und Stationen eröffnet. Eigentlich ist das ja ganz sinnvoll. Nur sind Asteroiden prinzipiell neutral und ändern ihre Meinung auch nicht, wenn man sie beschießt. Eine kleine Änderung am Skript prüft zusätzlich, ob das Ziel ein Asteroid und die Waffe ein Mobiles Bohrsystem ist.
Nun kann sich der Bergbauingeneur ganz auf die Steuerung des Schiffes konzentrieren, und muß nicht länger in die Heckkanzel umsteigen.
Landecomputer für die KI
Alle mit Landecomputer ausgestatteten Schiffe benutzen ihn auch.
Mehr Fairness beim Völkerrang
Die Flotten der Völker sind offensichtlich überfordert und schaffen es nicht, die Sicherheit in ihren Sektoren zu gewährleisten. Da ist der Spieler gefragt... und mit den Patroullienkommandos aus dem Bonuspack ist das ja durchaus zu schaffen. Nur: wo bleibt der Dank?
Wenn eines meiner Schiffe Völkerbesitz beschädigt, werde ich dafür persönlich zur Rechenschaft gezogen. Das gleichzeitig zahlreiche Patroullien in meinem Namen und auf meine Rechnung für Sicherheit sorgen, wird hingegen von niemandem gewürdigt. Das hat mir dermaßen Gestunken, daß ich da was unternommen habe.
Jetzt bekomme ich den vollen Völkerrang für Abschüsse durch eigenes Personal. Die Prämie muß ich mir mit dem Piloten teilen, schließlich hat er seinen Kopf hingehalten.
Autom. Satellitenverteiler
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, dadurch kann man das Einsatzgebiet sinnvoll abgrenzen. Beispiel: Basislager ist die Handelsstation in Argon Prime, Sprungweite ist 7, alle außer den Argonen sind Feinde. Ergebnis: das Einsatzgebiet sind die sog. "Argonischen Kernsektoren".
- VORSICHT: Die Rassen haben ja mehr als ein Gebiet. Wenn man die Sprungweite zu hoch einstellt, landen Sektoren aus mehreren Gebieten in der Liste. Das kann erwünscht sein, aber auf jeden Fall sind die Wege lang und u.U. führen Sie durch einen Xenonsektor oder dergleichen...
Die Liste der Sektoren wird bei Programmstart berechnet und dann 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.