Liste und erklärung der neuen SE-befehle X²->X³

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

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

User avatar
MrWideEar
Posts: 103
Joined: Mon, 26. Dec 05, 14:21
x3

Liste und erklärung der neuen SE-befehle X²->X³

Post by MrWideEar »

moin!

da meine frage in nem anderem thread einfach untergegangen ist mache ich hier mal nen neuen auf ...

mein problem ist: die neuen Befehle stehen nicht im MSCIHandbook und per foren suche finde ich hier auch nix ...

am wichtigsten wäre mir z.b. wenn jemand weiss,
1. welche befehle neu sind <- ok das kann ich noch per abgleich machen
2. wofür die gut sind und das auch verständlich erklären kann
3. wie man mir helfen kann, so das dieser thread hier nützlicher natur wird ...
Lucike wrote:Ich bin gestern über ein paar neue Array-Befehle gestolpert. Sind die mit V1.3 gekommen oder waren sie schon vorher verfügbar?

So wie es ausschaut geht es hier um multidimensionale Arrays. Zum Test war es gestern zu spät. Werde ich nachholen, ist aber für andere vielleicht ebenfalls interessant.

1. <RetVar/IF> <Var/Array>[<Var/Number>][<Var/Number>]
2. <Var/Array>[<Var/Number>][<Var/Number>] = <Value>
3. <Var/Array>[<Var/Number>] = <Var/Array>[<Var/Number>]

F: In wie weit unterscheidet sich der Befehl 3 vom Copy- oder Clone-Befehl?

F: Kann auf eine m-dem Array auch den Append-, Remove- und Resize-Befehl ausgeführt werden?

Gruß
Lucike
Orka wrote:Was ich vermisse ist ein Ubound Befehl wenn das wircklich 2 Dimensionale Arrays sind und Wie Allociert man die den? size=1dim*2dim?
sollten hier neue Infos reinkommen werd ich diese immer auf der ersten seite hier aktualisieren ...

/edit

NEUES

Geheimnis um Arrays gelüftet!
(danke an ticaki für die hilfestellung)

<var/if>=<var/array>[<var/val>][<var/val>]
<var/array>[<var/val>][<var/val>]=<var>

praktische Verwendung beider Befehle:

Code: Select all

001   $x = 5
002   $y = 5
003   * INITIALISIERUNG
004   $arDim1 =  array alloc: size=$x
005   $i = 0
006   while $i < $x
007    $arDim2 =  array alloc: size=$y
008    $arDim1[$i] = $arDim2
009    inc $i = 
010   end
011   * BEFUELLUNG
012   $i = 0
013   while $i < $x
014    $j = 0
015    while $j < $y
016     $input = 'Spalte: ' + $i + ' Zeile: ' + $j + ' - '
017     $arDim1[$i][$j] = $input
018     inc $j = 
019    end
020    inc $i = 
021   end
022   * AUSLESUNG
023   $i = 0
024   $output = ''
025   while $i < $x
026    $j = 0
027    while $j < $y
028     $feld = $arDim1[$i][$j]
029     $output = $output + $feld
030     inc $j = 
031    end
032    inc $i = 
033   end
034   write to player logbook $output
035   return null
und jetzt in langsam:
Es gibt eine Möglichkeit in X³ ein 2-Dimensionales Array zu "simulieren".
und zwar wird dafür in jedes Feld eines normalen Arrays ein weiteres Array hinein-initialisiert.
Mit den beiden obigen Befehlen kann man nun über den 2ten Index des ersten Arrays das zweite Array in jedem Feld des ersten Arrays ansprechen, ohne seinen Namen zu kennen. Der 2te Index wird sozusagen als erster Index des 2ten Arrays übergeben.

was für mich wie ein "hack" aussieht, ist die Tatsache, daß man soviele gleichnamige Arrays hat, wie das erste Array Felder besitzt, offensichtlich ist der SE in der Lage stressfrei damit fertig zu werden ...

(Hab jezt mehrere Testreihen, mit verschiedensten Werten gemacht. und niemals "falschwerte" bekommen. Tests in Bezug mit Zugriff mit einfachen Befehlen auf das 2-dim array hab ich nicht durchgeführt)

der Vorteil von 2-dim Arrays gegenüber 1-dim Arrays, hängt vom Verwendungszweck ab:

z.B.:
einfache Arrays werden meistens dazu benutzt eine Liste von Objekten zu haben, auf die man einfach (per index) zugreifen kann ... z.b. Array von Schiffen in Sektor.

Möchte man jetzt Zusatzinformationen zu den einzelnen Schiffen aus diesem Array sammeln, benutzt man ein weiteres, ein 2-dim Array.
Die 2te Dimension sollte hier feststehen, nämlich die Anzahl der Zusatzinformationen.
so ... :wink:
nun beginnt man, indem man das erste Array mit der größe der Anzahl der Schiffe, die man gefunden hat und der Menge der Zusatzinfos zu initialisieren.
Danach fragt man über das Schiffe-Array das gewünschte Schiff ab, sammelt seine infos darüber und legt sie in das neue Array ... fertig ...

Was man dann hat, ist eine Tabelle(2-dimArray) von Listen(1-dimArray).
wobei die Länge des Tabellen(2-dim)Arrays die Anzahl der Spalten und
die Länge des Listen(1-dim)Arrays die Anzahl der Zeilen ist.

so eine Tabelle also? ... hmm wie in Excel?
genau ... das ist (bis auf die umständliche Art der Anwendung) ein wächtiges Merkzeug :D



----------------keine ahnung in wieweit die folgenden gedanken berechtigt sind, vielleicht äussert sich da jemand mit mehr ahnung als ich

nur übertreiben sollte man es nicht mit diesen schönen sachen, denn der Arbeitsspeicher leidet wohl sehr unter dieser Konstruktion ...
also keine tabelle mit 100 spalten und 100 zeilen machen, das wären dann 10.101 Variablen, die ihr da erzeugt ...
da der SE ja recht datentyp-frei arbeitet, gehe ich davon aus, daß er für jede Variable den maximal-Wert reserviert ...
(fragt mich nich wieviel das ist ... ich denk da nur an 1byte pro zeichen, was bei strings dann doch viel werden kann. Zumal die Var z.b. <var/station> ja auch aus name+sektor besteht)
Last edited by MrWideEar on Tue, 7. Feb 06, 17:06, edited 5 times in total.
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

Du mußt JEDES Array initialisieren - die Funktionen sind nur eine Arbeitserleichterung beim Zugriff auf multidimensionale Arrays.

Gruß ticaki
User avatar
MrWideEar
Posts: 103
Joined: Mon, 26. Dec 05, 14:21
x3

Post by MrWideEar »

nur um misverständnisse auszuschliessen:
$ArLaserEachTurret = array alloc: size=$TurretCount
initialisert ein eindimensionales Array, hab ich ja auch gemacht ... nur lässt die funktion keine eingabe von 2 oder mehr werten zu ...

deshalb meine verwirrung ... es gibt keinen befehl der
<var>=array alloc: sizex<var/value>sizey<var/value>
oder hab ich den nich gefunden?

oder muss ich den umständlichen weg gehen und in jedes feld des ersten array ein 2tes reinsetzen?

Wie initialisiere ich ein multidimensionales Array?


/edit :

hab gleich noch ne frage ...
ich hab ein script an ein menu gebunden, wie übergebe ich dem script das schiff, auf dem das commando aufgeführt wurde?
User avatar
Orka
Posts: 817
Joined: Wed, 7. Apr 04, 15:19
x4

Post by Orka »

MrWideEar wrote:nur um misverständnisse auszuschliessen:
$ArLaserEachTurret = array alloc: size=$TurretCount
initialisert ein eindimensionales Array, hab ich ja auch gemacht ... nur lässt die funktion keine eingabe von 2 oder mehr werten zu ...

deshalb meine verwirrung ... es gibt keinen befehl der
<var>=array alloc: sizex<var/value>sizey<var/value>
oder hab ich den nich gefunden?

oder muss ich den umständlichen weg gehen und in jedes feld des ersten array ein 2tes reinsetzen?

Wie initialisiere ich ein multidimensionales Array?


/edit :

hab gleich noch ne frage ...
ich hab ein script an ein menu gebunden, wie übergebe ich dem script das schiff, auf dem das commando aufgeführt wurde?
Einige gute Fragen.

Hab jetzt bissel mit multi Arrary gespielt da kommt immer null raus, wahrscheinlich weil ich auch nicht weiss wie man diese richtig initialisiert.



Zu letzten Frage. Wenn du mit menü ein Komando meinst dann läuft das script auf task 0 auf diesem schiff schon. THIS = dieses Schiff
Last edited by Orka on Wed, 1. Feb 06, 23:07, edited 1 time in total.
User avatar
MrWideEar
Posts: 103
Joined: Mon, 26. Dec 05, 14:21
x3

Post by MrWideEar »

Orka wrote:Zu letzten Frage. Wenn du mit menü ein Komando meinst dann läuft das script auf task 0 auf diesem schiff schon. THIS = dieses Schiff
also ich meine das commandomenue ;)

halt das mit navigation/kampf/handel

das problem ist, das ich das ship oder dessen id im script selbst brauche ... ohne menue hab ich das als argument übergeben ... dann funzte das, als ich dann übers menue starten wollte, hat der mich ja auch wieder nach eingabe des schiffes gefragt, was ich dann ja nicht will, da das schiff ja schon ausgewählt ist ...

mit THIS hab ich das auch schon probiert, ich bekomm da aber auch wieder "null" raus ...
und was meinste mit task 0 ?
User avatar
Orka
Posts: 817
Joined: Wed, 7. Apr 04, 15:19
x4

Post by Orka »

MrWideEar wrote:
Orka wrote:Zu letzten Frage. Wenn du mit menü ein Komando meinst dann läuft das script auf task 0 auf diesem schiff schon. THIS = dieses Schiff
also ich meine das commandomenue ;)
halt das mit navigation/kampf/handel
Das sind alles Task 0er scripts

1 bis 6 = Turm scripts

das problem ist, das ich das ship oder dessen id im script selbst brauche ...
Dein script arbeitet doch gar nicht mit ids.

ohne menue hab ich das als argument übergeben ... dann funzte das, als ich dann übers menue starten wollte, hat der mich ja auch wieder nach eingabe des schiffes gefragt, was ich dann ja nicht will, da das schiff ja schon ausgewählt ist ...
Wenn du das script über das Komandomenü des jeweiligen schiffes aufrufen will, und das script mit diesen schiff "arbeiten" soll dann ist THIS ein Zeiger/Referenz auf das objekt was dies script ausführt. Wenn THIS gleich null ist das läuft das script global.

Also dann kannst du das newship argument löschen.

Zeile 001 newship=THIS

Und wenn du das script änderst, solltet du dein setup.script, wo das kommado gemapt wird, neu aufrufen sonst kann es sein das du immer das alte script aufrufst und am neuen bastelt und dich wuderst warum sich nix ändert^^

Wenn du das script auf einer taste legst dann läuft es immer global (THIS=NULL)
User avatar
MrWideEar
Posts: 103
Joined: Mon, 26. Dec 05, 14:21
x3

Post by MrWideEar »

es handelt sich um ein zweites script ...

ok die id brauch ich vielleicht nicht aber zumindest das schiff als <var/ship>

heisst das ich muss

[THIS]=start script=plugin.... with Task=0 and prio=0, arg=null, etc benutzen?

kommt das in das setup script oder in das eigentliche? kann denn ein script sich selbst aufrufen?


Öhm wie kann ich festlegen, das das script unbedingt local läuft?


ach ich benutze immer den reinit script cache, das müsste doch alle änderungen erfassen


P.S.: mein 2tes script is nen sektorversorger, bei auswahl eines sektors, soll dass schiff, auf dem das commando gegeben wurde, alle rohstoffe rankarren, die dieser sektor braucht, mit ner maximalsprungweite von 3.

ich habs geschafft das ganze in ein verschachteltes, schächtelchen zu packen, so dass keine weiteres files nötig sind ...
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

Ein multidimesionales Array ist nicht anders als n arrays

2 Dimensional == 1+n arrays
3 Dimensional == 1+n*y arrays

Code: Select all

$arraydim1 = array alloc ($n)
$i = 0
while $i<$n
  $arraydim2 = array alloc($x)
  $arraydim1[i] = arraydim2
  inc ($i)
end

arraydim1[i][0] = 'das ist die zweite dimension'
Als Referenze siehe ein Standard AL Controllerscript. Diese Referenze bezieht sich auf die Verwendung multidimensionaler Arrays. Das Array dort enthält eine Schiffsliste, welches im Grunde der Ansatz eines Multidimensionalen Arrays ist.

Der Befehl ist gedacht um folgenden Codestuktur zu vereinfachen:

Code: Select all

// Datensatz
$TIMESTAMP = 0
$ENABLED = 1
$VALUE = 2

$i = 0
while $index < $n
  time = $database[$index][$TIMESTAMP]
...
Gruß ticaki
Last edited by ticaki on Sat, 4. Feb 06, 16:23, edited 1 time in total.
Deleted User

Post by Deleted User »

O Gott wäre schön wenn man das auch verstehen würde...
Ich habs erst nach dem x-ten mal durchlesen Verstanden...
Vielleicht sollter man die Erklärung ein bisschen Ausführlicher schreiben.


MfG
Hudruf
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

hudruf wrote:O Gott wäre schön wenn man das auch verstehen würde...
Ich habs erst nach dem x-ten mal durchlesen Verstanden...
Vielleicht sollter man die Erklärung ein bisschen Ausführlicher schreiben.


MfG
Hudruf
Meine Erklärungen richten sich an Scripter mit einer gewissen Erfahrung, diese sollten dieses nachvollziehen können und sie anderen Nutzern mit weniger Erfahrung näher bringen. Ausufernde Erläuterungen kosten Zeit die mir nicht zur Verfügung steht.

Und mehrfaches Lesen meiner Erläuterungen ist immer nötig.

Gruß ticaki
Deleted User

Post by Deleted User »

Ich habe mich nicht auf deinen Post sondern den Post von MrWideEar bezogen.Aber ich denke wenn er online ist wird er das ganze ausführlich in seinen Thread editieren. Denn
sollten hier neue Infos reinkommen werd ich diese immer auf der ersten seite hier aktualisieren ...

MfG
Hudruf
Last edited by Deleted User on Sat, 4. Feb 06, 16:44, edited 2 times in total.
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

hudruf wrote:Ich hab mich nicht auf deinen Post sondern den Post von MrWideEar bezogen.


MfG
Hudruf
Dann entschudlige ich mich fuer das Missverständnis! :)

Gruß ticaki
User avatar
MrWideEar
Posts: 103
Joined: Mon, 26. Dec 05, 14:21
x3

Post by MrWideEar »

ahh ... das is doch schonma sehr hilfreich :)

ist also doch so, dass man in jedes feld nen neuen array packt ...

ich werd das im selbstversuch ausprobieren und dann berichten

aber vielleicht erst nachm woe :roll:
User avatar
MrWideEar
Posts: 103
Joined: Mon, 26. Dec 05, 14:21
x3

Post by MrWideEar »

soo ... das erste hättn wir dann schonmal ...
fennry
Posts: 1611
Joined: Wed, 6. Nov 02, 20:31
x3

Post by fennry »

Ich denke das gehört mit hier hin

anderes Topic wrote:
fennry wrote:Array ist erstellt und füllt sich so wie angedacht. Meine Frage:

1. wie bekomme ich die gespeicherten Infos wieder ans Tageslicht?
2. wie kann ich Daten ersetzen? Also z.B. der 3. Frachter landet und verkauft eine Ware und ist ja nun frei etwas anderes zu tun. Wie bekomme ich das in das Array?
3. geht es auch einfacher?
ticaki wrote:Nein es geht nicht leichter. Ersetzen kannst du die Daten in dem du einfach einen Arrayplatz mit einem neuen Array belegst oder auf NULL setzt.
Find index...

kann man wunderbar einsetzen um eine Datenbank mit Index zu erstellen. Dazu benötigen wir ein weiteres Array in dem der Index synchron zur Datenbank gespeichert ist. In diesem Suchen wir nun nach dem Wert und benutzen den Rückgabeindex um den korrekten Datensatz aus unserer Datenbank zu lesen.

Gruß ticaki
anderes Topic

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