Stationssuche per "find station in galaxy" ?

Hier ist der ideale Ort um über Scripts und Mods für X²: Die Bedrohung zu diskutieren.

Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum

User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

Hach, wieder was gelernt heute. Jetzt kann Feierabend werden. :D

Gruß
Lucike
Image
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

ticaki wrote:Wenn du eine Funktion oder ein Script aufrufst das ein Array zurück gibt brauchst du es nicht zu initialisieren.
Genau. Spart wieder einen Befehl :) Beispiel:

Code: Select all

039 @ $FabsAndProduct = [THIS] -> call script 'plugin.fabsupplysoftST1.helper' :  Array of player stations=$PSTATIONS  Label in script to go to=$LABEL
040   $ArrSize1 =  size of array $FabsAndProduct
ticaki wrote:P.S. du musst aber überprüfen ob das array initialisiert wurde... eine Funktion liefert dir nur ein gültiges Array zurück wenn wenigstens ein Element gefunden wurde ansonsten ist der Rückgabewert null.
Genau. Und auch das ist freundlich :) vom Scripteditor, denn dadurch funktioniert

Code: Select all

002   skip if $Station1 OR $ShipWare
003    return null
Oder

Code: Select all

008   if $ShipWare
"ShipWare" ist ein Array.
ArcaJeth
Posts: 2245
Joined: Mon, 10. Nov 03, 18:22
x3tc

Post by ArcaJeth »

Wenn bei fennry aber kein Dock gefunden wurde ist $anzahl = 0 und damit läuft die Schleife nicht durch ;) daher kann er die Überprüfung auch weglassen :)
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

Einspruch euer Ehren...
Es ist ein Fehler einen "size of array" auf null anzuwenden... ;)

Gruß ticaki
Zur Zeit nicht aktiv
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

ticaki wrote:Einspruch euer Ehren...
Es ist ein Fehler einen "size of array" auf null anzuwenden... ;)
Gruß ticaki
Auf welches Ursprungsposting bezieht sich diese Antwort?
Ich hab hier auch

Code: Select all

006   if  size of array $Station1
007    $LABEL = 'SUPPLYWARE'
008    $DataSetSize = 2
009   end
Um zu checken, ob "Station1" ein Array ist oder nicht.
Und das klappt wunderbar...
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

SpaceTycoon wrote:Auf welches Ursprungsposting bezieht sich diese Antwort?
Ich hab hier auch
Ich setze das auch ein. Ticaki muss etwas anderes meinen, sonst wäre keine <RetVar/IF>-Abfrage möglich und sinnfrei im SE.

Diese Möglichkeit greift, wenn ein Array keine Elemente enthält oder gar nicht existiert.

Code: Select all

006   if  size of array $Station1 
007    $LABEL = 'SUPPLYWARE' 
008    $DataSetSize = 2 
009   end
Die IF-Abfrage wird nicht ausgeführt, wenn $Station1 kein Array ist oder keine Elemente vorhanden sind.

Gruß
Lucike
Image
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

:nö: alles falsch :D

Korrekt ist:

Code: Select all

005   if $Station1 // wenn das array null ist nicht ausführen
006    if  size of array $Station1 
007     $LABEL = 'SUPPLYWARE' 
008     $DataSetSize = 2 
009    end
010   end
Gruß ticaki

P.S. das gehört zu dem was ich beim Signieren alles korrigieren muß ;)
Zur Zeit nicht aktiv
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

ticaki wrote::nö: alles falsch :D
Korrekt ist:

Code: Select all

005   if $Station1 // wenn das array null ist nicht ausführen
006    if  size of array $Station1 
007     $LABEL = 'SUPPLYWARE' 
008     $DataSetSize = 2 
009    end
010   end
Gruß ticaki
P.S. das gehört zu dem was ich beim Signieren alles korrigieren muß ;)
Stimmt, kann ich beipflichten. Aber :nö: ALLES falsch stimmt so nicht :khaak:
Auf null wird bereits vorher geprüft, diese vorherigen Zeilen hatte ich weggelassen. Verzeihung...

Code: Select all

002   skip if $Station1
003    return null
004   $LABEL = 'SUPPLYFABS'
005   $DataSetSize = 4
006   if  size of array $Station1
007    $LABEL = 'SUPPLYWARE'
008    $DataSetSize = 2
009   end
Wenn $station1 gar nix ist, wird das script eh' sofort beendet. Und ansonsten ist $station1 entweder eine normale Variable oder eine Arrayvariable. Und genau das soll damit festgestellt werden (was ja auch dankenswerterweise funktioniert). :mrgreen:
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

SpaceTycoon wrote: Stimmt, kann ich beipflichten. Aber :nö: ALLES falsch stimmt so nicht :khaak:
Auf null wird bereits vorher geprüft, diese vorherigen Zeilen hatte ich weggelassen. Verzeihung...

Code: Select all

002   skip if $Station1
003    return null
004   $LABEL = 'SUPPLYFABS'
005   $DataSetSize = 4
006   if  size of array $Station1
007    $LABEL = 'SUPPLYWARE'
008    $DataSetSize = 2
009   end
Wenn $station1 gar nix ist, wird das script eh' sofort beendet. Und ansonsten ist $station1 entweder eine normale Variable oder eine Arrayvariable. Und genau das soll damit festgestellt werden (was ja auch dankenswerterweise funktioniert). :mrgreen:
DOCH :P

das kann man aber noch verbesseren... immer dieses unnötige Ressourcenverbrauchen... *tz*

Code: Select all

002   skip if $Station1
003    return null
004   if  size of array $Station1
005    $LABEL = 'SUPPLYWARE'
006    $DataSetSize = 2
007   else
008    $LABEL = 'SUPPLYFABS'
009    $DataSetSize = 4
010   end
So *ätsch* :D

Gruß ticaki
Zur Zeit nicht aktiv
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

So, das "Wie?" haben wir jetzt geklärt, aber nicht das "Warum?". Ich bin neugierig, also habe ich eben ein paar Tests durchgeführt.

Es besteht kein Array. Ergebnis 0 (nicht null)

Code: Select all

001   $test =  size of array $Array
002   write to player logbook $test
Es besteht ein Array ohne Elemente. Ergebnis 0

Code: Select all

001   $Array =  array alloc: size=0
002   $test =  size of array $Array
003   write to player logbook $test
Es besteht ein Array mit einem Elemente. Ergebnis 1

Code: Select all

001   $Array =  array alloc: size=0
002   append "blabla" to array $Array
003   $test =  size of array $Array
004   write to player logbook $test
Also, warum muss ich bei einem if size of array Befehl das Array vorher auf Existenz überprüfen? Wenn es nicht existiert wird die IF-Abfrage auch nicht ausgeführt, genau so wenig wenn keine Elemente vorhanden sind.

Gruß
Lucike
Image
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

ticaki wrote:...

P.S. das gehört zu dem was ich beim Signieren alles korrigieren muß ;)
Deshalb... sowas wird nicht signiert weils ein Fehler ist!

Gruß ticaki
Zur Zeit nicht aktiv
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

ticaki wrote:das kann man aber noch verbesseren... immer dieses unnötige Ressourcenverbrauchen... *tz*

Code: Select all

002   skip if $Station1
003    return null
004   if  size of array $Station1
005    $LABEL = 'SUPPLYWARE'
006    $DataSetSize = 2
007   else
008    $LABEL = 'SUPPLYFABS'
009    $DataSetSize = 4
010   end
So *ätsch* :D
:? :?
Was braucht unnötige oder mehr Ressourcen?
Wenn Vars neu belegt/verändert werden?
Oder wenn noch eine Codezeile mehr ausgeführt/ausgewertet werden muß?
Wie jetzt?
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

SpaceTycoon wrote:Was braucht unnötige oder mehr Ressourcen?
Wenn Vars neu belegt/verändert werden?
Oder wenn noch eine Codezeile mehr ausgeführt/ausgewertet werden muß?
Wenn wir danach gehen hätte die Handelssoftware MK3 gar nicht signiert werden dürfen. Ich persönlich finde den Code echt gruselig.

Ich will damit sagen, jeder hat seinen Schreibstil. Ob da nun eine Zeile mehr oder weniger steht oder eine Variable zuviel oder sinnfrei benutzt wird ist dabei so ziemlich zu vernachlässigen.

Zum if size of array Befehl. So wie es ausschaut können wohl Fehler entstehen, wenn man das Array vorher nicht auf Existenz überprüft. Das wissen wohl nur die Egosoft-Fummler. ;)

Gruß
Lucike
Image
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

SpaceTycoon wrote:
ticaki wrote:das kann man aber noch verbesseren... immer dieses unnötige Ressourcenverbrauchen... *tz*

Code: Select all

002   skip if $Station1
003    return null
004   if  size of array $Station1
005    $LABEL = 'SUPPLYWARE'
006    $DataSetSize = 2
007   else
008    $LABEL = 'SUPPLYFABS'
009    $DataSetSize = 4
010   end
So *ätsch* :D
:? :?
Was braucht unnötige oder mehr Ressourcen?
Wenn Vars neu belegt/verändert werden?
Oder wenn noch eine Codezeile mehr ausgeführt/ausgewertet werden muß?
Wie jetzt?
Das war mehr ein Scherz ;)

Gruß ticaki
Zur Zeit nicht aktiv
fennry
Posts: 1611
Joined: Wed, 6. Nov 02, 20:31
x3

Post by fennry »

So da bin ich wieder und mir mehr Fragen als Antworten :wink:

Code: Select all

001   * Moment bitte gleich gehts los
002 @ $ST.list = wait 100 ms
003   * liste der AD und  HS des Spielers
004   $ST.list =  array alloc: size=0
005   * sortiert nach waren
006   $St.list.SVP =  array alloc: size=0
007   $St.list.SDS =  array alloc: size=0
008   $St.list.BPH =  array alloc: size=0
009   * Wie gross ist das Universum
010   $Uni.max.x = get max sectors in x direction
011   $Uni.max.y = get max sectors in y direction
012   
013   * Schleifen zum durchsuchen aller Sektoren
014   $Uni.y = 0
015   while $Uni.y < $Uni.max.y
016    $Uni.x = 0
017    while $Uni.x < $Uni.max.x
018     
019   * ueberprueft ob Sektor vorhanden
020     $Uni.sec = get sector from universe index: x=$Uni.x, y=$Uni.y
021     if $Uni.sec != null
022   * sector existiert 
023      
024   *                  HD suchen
025      $St.result.HD =  find station: sector=$Uni.sec class or type=Trade Dock race=Player flags=[Find.Multiple] refobj=null maxdist=null maxnum=1000000 refpos=null
026      $St.result.size.HD =  size of array
027      
028   * gefundene HD in liste schreiben
029      $tmp.i.HD = 0
030      while $tmp.i.HD < $St.result.size.HD
031       $St.result.tmp.HD = $St.result.HD[$tmp.i.HD]
032       append $St.result.tmp.HD to array $ST.list
033       inc $tmp.i.HD = 
034      end
035      
036   *                 AD suchen
037      $St.result.AD =  find station: sector=$Uni.sec class or type=Equipment Dock race=Player flags=[Find.Multiple] refobj=null maxdist=null maxnum=1000000 refpos=null
038      $St.result.size.AD =  size of array $St.result.AD
039      
040   * gefundene AD in liste schreiben
041      $tmp.i.AD = 0
042      while $tmp.i.AD < $St.result.size.AD
043       $St.result.tmp.AD = $St.result.AD[$tmp.i.AD]
044       append $St.result.tmp.AD to array $ST.list
045       inc $tmp.i.AD = 
046      end
047      
048     end
049     
050     inc $Uni.x = 
051    end
052    
053    inc $Uni.y = 
054   end
055   write to player logbook $Uni.max.x
056   write to player logbook $Uni.max.y
057   write to player logbook $ST.list
058   return $ST.list
059   return null
060   $St.result.BPH = $St.result.HD -> trades with ware BPH-Erweiterungskit MK1
061   return null
Ich hab alles übern Haufen geschmissen weil ich hier im Forum was gefunden hab was sehr meinen Vorstellungen entsprach und hab das ein wenig modifiziert. Bis Zeile 059 läuft auch alles wie es soll.Zeile 005 bis 009 sind erst mal nur probehalber dort sind aber das eigentliche Ziel.
Jetzt will ich meine ST.list durchsuchen nach den Stationen die kein BPH handeln. dazu will ich das in Zeile 060 nutzen. Kann ich nun einfach die St.list abfragen oder muss ich das in Zeile 039 unterbringen und jede gefundene HD einzeln überprüfen und in ST.list.BPH einschreiben lassen?
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

Lucike wrote:Wenn wir danach gehen hätte die Handelssoftware MK3 gar nicht signiert werden dürfen. Ich persönlich finde den Code echt gruselig.
Du hast sicher meinen code noch nicht gesehen... :lol:
Lucike wrote:Zum if size of array Befehl. So wie es ausschaut können wohl Fehler entstehen, wenn man das Array vorher nicht auf Existenz überprüft. Das wissen wohl nur die Egosoft-Fummler. ;)
Ja, ja... der Scripteditor ist eh' so eine Sache für sich. :wink: Manchmal erscheint er mir etwas, sagen wir mal, ...unlogisch. :evil:
Oder ich hab' die falsche Logik :)
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

ticaki wrote:Das war mehr ein Scherz ;)
Gruß ticaki
Ach soooo... Na ja, schriftlich ist das mit Scherzen immer so ein Problem... Man sieht die Mimik nicht und die Smilies können das nicht ersetzen. :)
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

fennry wrote:So da bin ich wieder und mir mehr Fragen als Antworten :wink:
Ich hab auch eine Frage....
Kann man irgendwie eine Aktion setzen? Die Aktionen sind unter den Konstanten zu finden aber ich kann keinen passenden Befehl finden. Ein Command ist ja OK, aber ich will kein komplettes Kommand, ich will 'nur' die Aktion :tuichdoch:
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

fennry wrote:So da bin ich wieder und mir mehr Fragen als Antworten :wink:
Jetzt will ich meine ST.list durchsuchen nach den Stationen die kein BPH handeln. dazu will ich das in Zeile 060 nutzen. Kann ich nun einfach die St.list abfragen oder muss ich das in Zeile 039 unterbringen und jede gefundene HD einzeln überprüfen und in ST.list.BPH einschreiben lassen?
Und was willst Du mit den Stationen, die kein BPH handeln dann anfangen?
Du kannst das alles eigentlich viel kürzer und einfacher haben. Folgender code durchsucht jeden Sektor der ganzen Galaxis nach Ausrüstungsdocks des Spielers die mit BPH handeln. Innerhalb der While-Schleife von Zeile 22 bis 28 kannst Du eigentlich alles Mögliche anstellen (ein neues Array 'bauen', eine Message zusammenbasteln, etc.) und am Ende nach Zeile 31 dises neu gebastelte Objekt (Array/Message) weiterbehandeln.

Code: Select all

010   $shipupgrade = BPH
011   $stationclass = Equipment Dock
012   $maxsectX = get max sectors in x direction
013   while $maxsectX > 0
014    dec $maxsectX = 
015    $maxsectY = get max sectors in y direction
016    while $maxsectY > 0
017     dec $maxsectY = 
018     $sectorname = get sector from universe index: x=$maxsectX, y=$maxsectY
019     $EQDOCK =  find station: sector=$sectorname class or type=$stationclass race=player flags=[Find.Multiple] refobj=null maxdist=null maxnum=100 refpos=null
020     if $EQDOCK
021      counter1= size of array $EQDOCK
022      while counter1 > 0
023        dec counter1
024        $Playerstation = $EQDOCK (counter1)
025        If $Playerstation -> trades with ware $shipupgrade
026          HIER DEIN CODE
027        end 
028      end
029     end
030    end
031   end
fennry
Posts: 1611
Joined: Wed, 6. Nov 02, 20:31
x3

Post by fennry »

Sorry das ich erst jetzt antworte.Bin in den letzten Tagen irgendwie nicht dazu gekommen hier mal reinzuschauen.
@ SpaceTycoon Danke erst mal für die Antwort ich denke das bringt mich weiter. Was das ganze soll? Naja der Sinn des ganzen ist es BPH und SDS in meinen Docks und HS glaubhaft verfügbar zu machen und nebenbei ein wenig mehr Leben in X2 zu bekommen. Ich weis zwar noch nicht wie weit das klappt aber mal schauen.

Return to “X²: Die Bedrohung - Scripts und Modding”