Zweigeteilte Abfrage mit Array, ist so etwas möglich

Hier ist der ideale Ort um über Scripts und Mods für X³: Reunion zu diskutieren.

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

ChristianErding
Posts: 98
Joined: Tue, 10. May 05, 18:04
x4

Zweigeteilte Abfrage mit Array, ist so etwas möglich

Post by ChristianErding » Mon, 6. May 13, 17:44

Bin heute auf ein Scriptproblem gestossen, ich muss mehrere Abfragen kombinieren. Will dazu einen Array nutzen, stehe aber beim Thema Array noch sehr am Anfang. Kann da bitte jemand drüberlesen und helfen?
Grundsachverhalt:

Gegen Geld sollen der Spieler zusätzliche Tunings erwerben können um das Schiff über das normale Maximum hinaus zu tunen.
ABER:
Bestimmte Schiffe sollen ausgeschlossen werden!!
Dazu verwende ich ein bereits vorhandenes Script (OvertuneBBS), sieht so aus:

* When the BBS would like to offer the mission, sets the message to display

else if $Event == 'offer'
||while size of array $Array.Data
||||remove element from array $Array.Data at index 0
||end

1. Was machen diese Zeilen denn? Leeren die den Array, müsste der nicht vorher angelegt werden?

||$Station = [PLAYERSHIP]->get environment
||$Race = $Station->get owner race
||$Name = [THIS]->call script 'lib.cycrow.getname' : race=$Race
||$Price = $PlayerShip->call script 'plugin.overtune.getprice.rudder': Times=$Times
||append $Name to array $Array.Data
||append $Price to array $Array.Data
||append [PLAYERSHIP] to array $Array.Data

||$ShipID = $PlayerShip->get ID code
||$Amt = sprintf: pageid=$Page.ID textid=1100, null, null, null, null, null
||$Amt = string $Amt to integer
||$Amt = random value from zero to $Amt - 1
||$Amt = $Amt + 1101
||$Message = sprintf: pageid=$Page.ID textid=$Amt, $Name, ||[PLAYERSHIP], $ShipID, $Price, null
||set quest state with message: quest=$Object state=[Quest.Offered] msg=$Message

2. Hier werden wollen der vorher ermittelte Preis ein Zufallsname und das Spielerschiff in den GLEICHEN Array geworfen um es später für die Meldung zu verwenden. Wie man das wieder JEWEILS aus dem Array fischt ist mir schleierhaft?

* When the mision is actaly displayed on the BBS
||else if $Event == 'display'

* When one of the options was selected
||else if $Event == 'select'

||||$Money = get player money

||||$Price = $Array.Data[$DATA.PRICE]
||||$Name = $Array.Data[$DATA.NAME]

3. Was passiert hier?

||||if $Money < $Price
||||||$Message1 = sprintf: pageid=$Page.ID textid=3, $Name, null, null, null, null
||||||set quest state with message: quest=$Object state=[Quest.Aborted] msg=$Message1
||||||= speak text: page=13 id=1254 priority=99
||||||= wait 200 ms
||||end

4. Okay hier wird das Geld abgefragt und eine Fehlermeldung ausgegeben, falls zu wenig Geld vorhanden ist. Das "wait" ist von mir, ich hoffe 200 ms sind nicht zu lang?

******************
Jetzt kommt es, mein Teil des Scripts (unvollständig)!!!!!!!!!
******************
Nun soll in einer WEITEREN Abfrage überprüft werden ob das Spielerschiff mit einem der beiden Schiffe aus dem Array über einstimmt, mein Vorschlag:

||||$piratschrank = array alloc: Size 1 *Schrank mit zwei Fächer, 0 und 1*
||||$anzahl = 0 *Die sind noch leer*
||||append (teladiharrier) to array $piratschrank *Erstes Schiff wird reingelegt*
||||append (teladiharrierangreifer) to array $piratschrank *Zweites Schiff wird reingelegt*
*Es sollten nun hoffentlich zwei Schiffei in jeweils einem Fach im Array sein, aber in welchem Fach sind die, da fehlt doch noch was??? *

* Nun soll abgeglichen werden ob das Spielerschiffe eines der Schiffe im Array entspricht, falls ja soll der "quest" abgebrochen werden.

||||$Anzahl = 0
||||||while $anzahl < 1 *Hier startet ein Schleife*
||||||||if $prüfschiffausFach0und1 = (playership) *Falls das Spielerschiff einem der Schiff im Array entspricht, soll "Quest.Aborted" erfüllt sein*
||||||||||$Message1 = sprintf: pageid=$Page.ID textid=3, $Name, null, null, null, null
||||||||||set quest state with message: quest=$Object state=[Quest.Aborted] msg=$Message1
||||||||||= speak text: page=13 id=1254 priority=99
||||||||||= wait 1 ms
||||||$Anzahl=$Anzahl + 1
||||||end

* Wenn dies nicht auch nicht zutrifft soll geschaut werden ob genügend Geld vorhanden ist UND das Spielerschiff keines der beiden im Array entspricht.

||if $Money >= $Price AND $playership != "Eines der Schiff im Array" *Frei formuliert, keine Ahnung wie das in Code aussehen würde*
||||$Message2 = sprintf: pageid=$Page.ID textid=4, $Name, null, null, null, null
||||set quest state with message: quest=$Object state=[Quest.Accepted] msg=$Message2
||||= wait 200 ms
||end

Schaffe es leider nicht die Schiffe einzeln im Array anzusprechen und mit der Bedingen !=$Payership abzuprüfen, vielleicht kann jemand mein Script so vervollständigen das es funktioniert. In Wirklichkeit müssten alle Piratenschiffe in den Array zum Testen habe ich es auf zwei beschränkt.

Vielen Dank für das Lesen bis hierher.
Die Rente ist sicher, von der Höhe hat leider keiner was gesagt.

ChristianErding
Posts: 98
Joined: Tue, 10. May 05, 18:04
x4

Post by ChristianErding » Mon, 6. May 13, 20:52

Den Code noch verfeinert, die Abfragen laufen jetzt korrekt durch, komisch ist allerdings das die while-Schleife zickt.

Denn:
-Schiff wirk korrekt geprüft
-Geld wird korrekt geprüft
-Wenn alle Bedingen erfüllt werden die Tunings installiert
ABER
trotzdem wird noch mal die Textmeldung $message1 angezeigt "Nicht genügend Credits obwohl gerade erfolgreich geprüft wurde, das genug Credits da sind.
Die Sprachausgabe unterschlägt er dann aber komischerweise, so als ob die Textmelddung noch irgendwo im Speicher hängen würde.


* When one of the options was selected
else if $Event == 'select'
||$check = 0
||$Price = $PlayerShip->call script 'plugin.overtune.getprice.rudder' : Times=$Times
||append $Price to array $Array.Data
||append [PLAYERSHIP] to array $Array.Data
||$Money = get player money
||$Price = $Array.Data[$DATA.PRICE]
||$Name = $Array.Data[$DATA.NAME]


||$pirat.array = array alloc: size = 1
||$size = size of array $pirat.array
||append {Teladi Bussard 90171} to array $pirat.array
||append {Teladi Bussard 90191 Angreifer 10001} to array $pirat.array

||while $size > 0
||||= wait 10 ms
||||$inhalt = $pirat.array[$size]
||||write to player logbook $inhalt
||||||if $PlayerShip->is of type $inhalt
||||||||$Message3 = sprintf: pageid=$Page.ID textid=5, $Name, null, null, null, null
||||||||set quest state with message: quest=$Object state=[Quest.Aborted] msg=$Message3
||||||||= speak text: page=13 id=60 priority=99
||||||||$check = 1
||||end
||||$size = $size -1
||end
||= wait 10 ms

||if $Money < $Price
||||$Message1 = sprintf: pageid=$Page.ID textid=3, $Name, null, null, null, null
||||set quest state with message: quest=$Object state=[Quest.Aborted] msg=$Message1
||||= speak text: page=13 id=1254 priority=99
||||= wait 10 ms
||end


||if $Money >= $Price AND $check != 1
||||set global variable: name='Overtune.LastOffer' value=$PlayTime
||||$Message2 = sprintf: pageid=$Page.ID textid=4, $Name, null, null, null, null
||||set quest state with message: quest=$Object state=[Quest.Accepted] msg=$Message2
||||= wait 10 ms
||end


* When the mission was accepted
else if $Event == 'accept'
* $Price = $Array.Data[$DATA.PRICE]
||$PlayerShip = $Array.Data[$DATA.SHIP]
||$install = $PlayerShip->call script 'plugin.overtune.randomdamageR' :
||= $PlayerShip->call script 'plugin.overtune.accept.rudder' : Amount=$Price install=$install
||set quest $Object timeout to 1
||= speak text: page=13 id=1350 priority=99

else if $Event == 'check' OR $Event == 'timeout'
||set quest state with message: quest=$Object state=[Quest.Finished] msg=null
end

return null
Die Rente ist sicher, von der Höhe hat leider keiner was gesagt.

Return to “X³: Reunion - Scripts und Modding”