Globales Array

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
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Globales Array

Post by Moonraven »

Bin nach langer Zeit mal wieder ein bischen am Scripten....und schon stoß ich auf Probleme.

Vorweg mal die Quellen:

Das Init-Script

Code: Select all

001   load text: id=99
002   set script command upgrade: command=COMMAND_TYPE_STATION_30  upgrade=[TRUE]
003   set script command upgrade: command=COMMAND_TYPE_SPECIAL_31  upgrade=[TRUE]
004   global script map: set: key=COMMAND_TYPE_STATION_30, class=Station, race=Player, script='stprofit.cmd', prio=0
005   global script map: set: key=COMMAND_TYPE_SPECIAL_31, class=Ship, race=Player, script='stprofit.cmd.prot', prio=0
006   $dummy =  array alloc: size=0
007   set global variable: name='gstp' value=$dummy
008   return null

Command-Script das auf der Station läuft

Code: Select all

001   skip if $Limit >= 0
002    $Limit = 0
003   $gtpa = get global variable: name='gstp'
004   $stname = [THIS] -> get name
005   append $stname to array $gtpa
006   append 0 to array $gtpa
007   $index =  size of array $gtpa
008   $index = $index - 1
009   while [TRUE]
010    $money = [THIS] -> get money
011    write to player logbook $index
012    if $money > $Limit
013     $money = $money - $Limit
014     $gtpa = get global variable: name='gstp'
015     $curmon = $gtpa[$index]
016     $curmon = $curmon + $money
017     $gtpa[$index] = $curmon
018     $playermoney = get player money
019     if $playermoney + $money > 0
020      add money to player: $money
021     end
022     $money = - $money
023     [THIS] -> add money: $money
024    end
025 @  = wait randomly from 60000 to 65000 ms
026   end
027   return null
Das Protokoll-script das auf dem Spielerschiff abläuft:

Code: Select all

001   $gtpa = get global variable: name='gstp'
002   $max =  size of array $gtpa
003   $c = 0
004   $str = ' '
005   $crlf =  read text: page=9999 id=1
006   while $c < $max
007    $money = $gtpa[$c]
008    inc $c = 
009    $cstation = $gtpa[$c]
010    $out =  read text: page=9999 id=100
011    $out = sprintf: pageid=9999 textid=100, $cstation, $money, null, null, null
012    $str = $str + $crlf + $out
013    inc $c = 
014   end
015   $out =  read text: page=9999 id=101
016   $str = $str + $crlf + $out
017   write to player logbook $str
018   return null
ok..nun zu den Fragen:

1. Ich kann tun und lassen was ich will. Im Protokollscript krieg ich nur Null und 0 raus. Irgendwie wird das nicht im globalen Array gespeichert. Wo liegt das Problem ?

2. Wenn ich das Stations-Script auf einer Station starte, erscheint in dem Slot nix, was muß ich da tun ?



Danke schonmal
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

Ich habe zwar heute schwere Augen ( ;) ), aber ich habe kein weiteres nötiges "set global variable" gesehen.

EVA = Eingabe -> Verarbeitung -> Ausgabe

Code: Select all

014     $gtpa = get global variable: name='gstp' 
Das sollte bestimmt ein Set-Befehl werden, oder?
Moonraven wrote:2. Wenn ich das Stations-Script auf einer Station starte, erscheint in dem Slot nix, was muß ich da tun ?
Im SE direkt im Script über den Argumenten den Eintrag ändern.

-> COMMAND_TYPE_STATION_30

Gruß
Lucike
Image
User avatar
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Post by Moonraven »

Nein...damit hole ich den aktuellen Stand des Arrays, das ja durch das gleiche Script auf einer anderen Station verändert worden sein könnte.

BSP. 2 SKW a und b. Das script läuft auf beiden. SKW a speichert seine Daten bei index 0 und 1, skw b bei 2 und 3. SKW a ändert seine Daten, also muß SKW b diese änderung mitbekommen, damit das komplette array auch passt:)

ok...ich habs zumindest schon mal geschaft das er den Stationnamen hält. Aber die Kohle speichert er ums verrecken nicht.
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

Ach so, ich würde ein Set-Befehl zwischen Zeile 24 und 25 setzen. Die Variable muss nach der Verarbeitung wieder gesetzt werden.

Gruß
Lucike
Image
User avatar
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Post by Moonraven »

Jo..hab ich bemerkt. ok..das script sieht jetzt wie folgt aus, tut aber immer noch nicht. Nach dem get-global in der schleife steht da trotzdem 0 drinn:

Code: Select all

skip if $Limit >= 0
002    $Limit = 0
003   $gtpa = get global variable: name='gstp'
004   $stname = [THIS] -> get name
005   if $gtpa == null
006    $gtpa =  array alloc: size=2
007    $gtpa[0] = $stname
008    $gtpa[1] = 0
009   else
010    append $stname to array $gtpa
011    append 0 to array $gtpa
012   end
013   set global variable: name='gstp' value=$gtpa
014   $index =  size of array $gtpa
015   $index = $index - 1
016   while [TRUE]
017    $money = [THIS] -> get money
018    if $money > $Limit
019     $money = $money - $Limit
020     $gtpa = get global variable: name='gstp'
021     $curmon = $gtpa[$index]
022     $curmon = $curmon + $money
023     $gtpa[$index] = $curmon
024     write to player logbook: printf: fmt='Index %d  Content %d', $index, $curmon, null, null, null
025     set global variable: name='gstp' value=$gtpa
026     $playermoney = get player money
027     if $playermoney + $money > 0
028      add money to player: $money
029     end
030     $money = - $money
031     [THIS] -> add money: $money
032    end
033 @  = wait randomly from 60000 to 65000 ms
034   end
035   return null
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]
Ghalador
Posts: 3929
Joined: Sat, 9. Nov 02, 19:33
x4

Post by Ghalador »

Also erst mal:
"if $gtpa = null" liefert afaik bei einer Array immer null, denn irgendwie sind $gtpa und $gtpa() nicht identisch. Du müsstest da eher die Size.of abfragen.
Kann's dîr nicht 100% garantieren...nur so aus einer verwaschenen Erinnerung.
Have fun: Gala Do.
User avatar
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Post by Moonraven »

Die Abfrage mit "if $gtpa == null" funktioniert schon, es wird hier ja nur gefragt ob die Variable existiert (sprich das Array) oder nicht.

Der Stationsname ($stname) wird auch korrekt gespeichert. Nur der Geldbetrach ($curmon) nicht.

Ich hab mir das script 20 * durchgelesen...es müßte eigentlich funktionieren...tuts aber net. :(
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

Hallo Moonraven,

:nö: Ein If $array == null ist wahr, wenn in der $array Variable NULL drin steht. Ein If not $array ist sicherer da es sowohl für NULL als auch für 0 wahr zurückliefert.

Desweiteren kann ich in dem Skript keinen Fehler entdecken. Ausser das der get/set global var innerhalb der Schleife unnötig ist.

Wie hast du festgestellt dass das Array NULL sein soll?

Gruß ticaki
Last edited by ticaki on Fri, 8. Apr 05, 16:47, edited 1 time in total.
Zur Zeit nicht aktiv
User avatar
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Post by Moonraven »

@ticaki

Ich hatte temporär einfach in jeden zweig ne Logbuchausgabe drinn (mit unterschiedlichem text natürlich :D )

Und da hat die Abfrage so gegriffen:)
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

naja ein array liefert immer null zurück wenn man es versucht als textargument zu verwenden. Beschreib dein Problem mal etwas genauer.

Gruß ticaki
Zur Zeit nicht aktiv
Ghalador
Posts: 3929
Joined: Sat, 9. Nov 02, 19:33
x4

Post by Ghalador »

Könnte es sein, dass ein anderes Script auch die GVar $gstp schreibt?
Würde globale- und lokale Variablen immer mit dem Scriptnamen, oder einem Kürzel einleiten. $Moneytrans.gstp.

* Hat die Station Geld?
Have fun: Gala Do.
User avatar
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Post by Moonraven »

ok...das gesammtteil besteht aus 3 scripten (siehe ganz oben).

Das Stationsscript läuft (wie das orginal) auf einer Station und überweißt, wenn ein Limit überschritten ist, den Betrag auf das Spielerkonto.

Um nun auch mal eine Übersicht zu kriegen, welche station nun welche Umsätze macht, wollte ich das so machen, das , je Station, in einem globalen Array der Stationsname und der bisherige "Gewinn" verwaltet wird. Mit dem 2. Script will ich dann quasi einen Report erzeugen, in dem die Infos ausm Array drinnstehen.

Wie gesagt, das Stationsscript läuft soweit, das es den Betrag überweißt, und auch der Stationsname wird korrekt im array gespeichert (wird korrekt über das Schiffsscript ausgegeben). Aber der Geldbetrag wird nicht gespeichert, genauso wie im Slot der Station, auf der das Script angezeigt werden sollte, nix steht.
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]
Ghalador
Posts: 3929
Joined: Sat, 9. Nov 02, 19:33
x4

Post by Ghalador »

Wegen dem angezeigten Slot:
Da musst du oben im Script, oberhalb der Übergabevariablen bei "Command Name" den Kommandoslot angeben, den du verwendet hast.
Have fun: Gala Do.
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

Das mit dem Commando hat Lucike schon beschrieben... schau mal in Game die dritte Zeile von oben, dort kann man ein Commando auswählen.

In dem 3 Skript ist in sofern ein Fehler das du Name und Geld vertauscht hast und du zweimal die Variable out beschreibst.

Gruß ticaki

P.S. ich schaus mir nachher, wenn ich zu hause bin, nochmal in Ruhe an.
Zur Zeit nicht aktiv
User avatar
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Post by Moonraven »

Es funktioniert. Das Problem waren nicht die Scripte sondern der Eintrag für die Ausgabe in der Sprachdatei. Ich hab %d für das Format verwendet, was er nicht wirklich gefressen hat.


Danke nochmal für euere Bemühungen:)
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]

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