Script-Befehle, die man gebrauchen könnte (vielleicht 1.5?)

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
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Script-Befehle, die man gebrauchen könnte (vielleicht 1.5?)

Post by SpaceTycoon »

Halli hallo,

ich dachte, da mach ich mal ein neues Topic auf. Wer hat auch schon den einen oder anderen Befehl im Scripteditor vermisst?
Vielleicht könnte man da dann mal eine Wunschliste an BalaGi weiterreichen...
Deshalb hier für den Anfang ein paar Befehle, die ich schon recht gerne noch im Script-Editor finden würde. Also mir persönlich fehlen:

<RetVar> = get array of wares
Eine Arrayvariable, die alle Waren enthält. Für Vergleichsoperationen.
Bislang behilft man sich dafür so:

Code: Select all

009   * Create array with all products
010   $AllProducts =  array alloc: size=0
011   $No.Maintype = 17
012   while $No.Maintype > 8
013    dec $No.Maintype = 
014    $No.Subtype =  get number of subtypes of maintype $No.Maintype
015    while $No.Subtype > 0
016     dec $No.Subtype = 
017     $Product =  get ware from maintype $No.Maintype and subtype $No.Subtype
018     skip if $Product == null
019      append $Product to array $AllProducts
020    end
021   end
<RetVar><RefObj>= get formation
Die im Kommandomenü eines Ships (RefObj) eingestellte Formation (Delta, X, X-Delta, Linie, usw.) auslesen.

<RetVar> = get player owned station array in galaxy
Ein Array das alle Spielerstationen der ganzen Galaxis enthält.

<RetVar> = get array of sectors in galaxy
Ein Array das sämtliche Sektoren (namentlich) der Galaxis enthält.

<RetVar> = get array of sectors in galaxy known by player
Ein Array das alle Sektoren (namentlich) der Galaxis enthält, die dem Spieler bekannt sind.

<RetVar><RefObj>= get destination ships as array
Ein Array, das galaxisweit alle Schiffe enthält die <RefObj> (Station oder BigShip) als Landeziel (Destination) haben.

<RetVar><RefObj>= get targeting ships as array
Ein Array, das alle Schiffe enthält die <RefObj> als Angriffsziel haben.

@ = display table from array <Var/Array>, Tab:<Var/Text>, Arg1:<Var/Value>,Arg2:<Var/Value>,Arg3:<Var/Value>,Arg4:<Var/Value>
Darstellung einer Tabelle mit bis zu vier Spalten (Arg1-4) auf dem Bildschirm, wie sie vom Schnäppchenfinder/Verkaufspreisfinder gezeigt wird. Daten aus einem Array, Tab ist Text für den Reiter oben drüber.

Sicher fällt dem einen oder anderen noch weiteres ein. Damit BalaGi nicht meint er hätte nun, nach 1.4, nichts mehr zu tun :mrgreen:
User avatar
hraban
Posts: 97
Joined: Tue, 23. Mar 04, 10:00
x3

Post by hraban »

Hallo SpaceTycoon

Deinem Befehlsvorschlag:

<RetVar><RefObj>= get formation
Die im Kommandomenü eines Ships (RefObj) eingestellte Formation (Delta, X, X-Delta, Linie, usw.) auslesen.

kann ich etwas abgewinnen.

Die weiteren Befehle ... na ja ... die meisten generieren riesige Arrays die man nicht wirklich braucht. Sicher der Weg zu einem vergleichbaren Ergebnis ist aufwendig, aber machbar.


Ein eigener Vorschlag für einen Befehl:

Ein Raumschiff soll einen Asteroiden in enger Umlaufbahn mit 200 m bis 500 m Abstand umkreisen. Dabei soll das Script möglichst wenig Recourcen benötigen und die Kontrolle an das Script so schnell wie möglich zurückgegeben werden.

Ich versuchte demnach eine Umkreisung des Asteroiden, unter Verwendung von 36 Wegpunkten, mit dem Befehl

Code: Select all

@ <RetVar/IF> = <RefObj> -> move to position x=<x> y=<y> z=<z> with precision= <Var/Number> ms 
zu realisieren.

Theoretisch und praktisch funktioniert das Script, aber die Bewegung um den Asteroiden fällt, bedingt durch die Verzögerung des Schiffs bei Annäherung an den Zielort recht seltsam und unrealistisch aus. Bedingt durch die enge Umlaufbahn bleibt leider kein großer Spielraum für eine entsprechend große precision, mit der man die Verzögerung des Schiffes zum teil kompensieren könnte.

Angesichts dieses Problems wollte ich darum bitten den Script-Editor um folgenden Befehl zu erweitern:

Code: Select all

@ <RetVar/IF> = <RefObj> -> move and pass position x=<x> y=<y> z=<z> with precision= <Var/Number> stop after pass <Var/Number> ms 

Was soll der Befehl bewirken:

Das <RefObj> soll die mit <x>, <y> und <z> definierte Position mit der Genauigkeit von precision=<Var/Number> anfliegen und passieren, ohne die Geschwindigkeit zu verringern.

Wird das Argument „stop after pass <Var/Number> ms“ übergeben, beginnt <Ref/Obj> nach Ablauf der Zeit mit dem Bremsmanöver.

Wird das Argument „stop after pass“ nicht übergeben, wird die Funktion beendet und das <Ref/Obj> setzt die Bewegung mit unveränderter Geschwindigkeit fort.


Mit diesem Befehl wäre es leicht das oben beschriebene Problem in den Griff zu bekommen.


Außerdem fallen mir spontan noch ein paar Anwendungsbeispiele ein:

Mit dem neuen Befehl könnte man endlich ein Wettrennen gegen KI-Schiffe als AL-Script erstellen; Ein lang ersehnter Wunsch der Spieler.

Sektorwachen und Patrouillen könnten realistischer und ohne Aufgabe des Geschwindigkeitsvorteils durch die Sektoren dampfen.

Raumschiffe die als Objektschutz dienen würden unter Verwendung des Befehls und eines Umlaufbahn-Scripts nicht mehr bewegungslos im Raum stehen. Auch Angreifer könnten in dieser Form eingesetzt werden, was das Bekämpfen wesentlich schwieriger machen würde (Anmerkung: Dickschiffe bleiben bisher einfach vor dem zu bekämpfenden Ziel stehen und Feuern aus allen Rohren).

Die Simulation von havarierten, oder außer Kontrolle geratenen Raumschiffen, welche z.B. auf eine Planeten zustürzen wäre möglich. (Ideal für Rettungsmissionen).
Handel ist Krieg, der Einsatz von Waffen ist Ressourcenverschwendung!
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

Schöne wäre es, wenn man laufende Scripte überprüfen könnte.

<RetVar/IF><RefObj> is script <Script Name>

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

Post by SpaceTycoon »

Lucike FZ wrote:Schöne wäre es, wenn man laufende Scripte überprüfen könnte.
<RetVar/IF><RefObj> is script <Script Name>
Wenn ein Kommando (GET_WARE_BEST oder so) an das Script gebunden ist und mit "[THIS] -> set command..." im Script auch gesetzt ist kannst Du dieses abfragen:
1.027 <RetVar/IF> get script command

Prüfe doch mal, was dieser Befehl in die Variable zurückgibt, möglicherweise ist es der Scriptname (noch nicht selber ausprobiert/gebraucht). Mit wenigen Ausnahmen haben alle Scripte Prio 0:
1.012 <RetVar/IF> is script with prio <Var/Number> on stack
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

SpaceTycoon wrote:Wenn ein Kommando (GET_WARE_BEST oder so) an das Script gebunden ist und mit "[THIS] -> set command..." im Script auch gesetzt ist kannst Du dieses abfragen:
1.027 <RetVar/IF> get script command
Benutze ich auch, aber funktioniert nicht mit den Slots der Schiffe und Fabriken.
SpaceTycoon wrote:Mit wenigen Ausnahmen haben alle Scripte Prio 0:
1.012 <RetVar/IF> is script with prio <Var/Number> on stack
Ist mir zu unsicher. Oft killt ein neues Script das alte Script. Womöglich ein anderer Scripter mit der gleichen Prio. Ist ganz besonders mit den Slots nicht brauchbar.

Eine eindeutige Identifikation wäre sehr sinnvoll und hilfreich.

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

Post by Lucike »

<RetVar/IF> <RefObj> get max. shield type that can be installed

Dieser Befehl ist für Laser nicht gerade sinnvoll, denn max. von was? Dafür wären aber doch folgende Befehle bestimmt möglich.

<RetVar/IF> <RefObj> can install <Var/Ware> in laser bay <Var/Number>
<RetVar/IF> <RefObj> can install <Var/Ware> in turret <Var/Number>
<RetVar/IF> <RefObj> can install <Var/Ware> in turret <Var/Number> slot <Var/Number>

Dieser Befehl wäre in meinem AD Frachter Script sehr hilfreich gewesen. Stattdessen musste ich mich mit Install- und Add-Befehlen rumschlagen und das hat Zeit und Zeilen gekostet. ;)
Image
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

Lucike FZ wrote:Dafür wären aber doch folgende Befehle bestimmt möglich.
<RetVar/IF> <RefObj> can install <Var/Ware> in laser bay <Var/Number>
<RetVar/IF> <RefObj> can install <Var/Ware> in turret <Var/Number>
<RetVar/IF> <RefObj> can install <Var/Ware> in turret <Var/Number>
slot <Var/Number>
Jawoll, weiter so :)

Mir wären dann noch als brauchbare Sachen eingefallen:
<RetVar> <RefObj> get ship configuration as array
Die gesamte Konfiguration/Einstellung eines Schiffes in ein Array lesen (Typ, Schildstärke, Laser, Laderaum, Speed, Wendigkeit, Formation, Feinde, usw.).
Daraus könnte man dann zum Beispiel ganz easy ein "Zwillingsschiff" entstehen lassen: create ship from configuration array <Var/Array>
Dasselbe mit Stationen:
<RetVar> <RefObj> get station configuration as array
create station from configuration array <Var/Array>

Auch ganz nützlich wäre:
<RetVar> <RefObj> get ship freight as array
Die geladene Fracht (Ware und Menge) eines Schiffes auslesen.

Und es wäre durchaus nett, auch Funktionen, die man momentan nur über Tastendruck bekommt, in einem Script aktivieren/deaktivieren zu können:
<RefObj> set SINZA to <Value> (TRUE oder FALSE)
<RefObj> set Autopilot to <Value> (TRUE oder FALSE)
und andere ggf. sinnvolle Sachen...


@Bala Gi:
Es sollte doch eigentlich kein Problem sein, ein 1.5'er Update rauszubringen, das "nur" den Scripteditor erweitert?
Denn wenn dieser recht leistungsfähig ist, kommen andere "Updates" des Spieles per Script von ganz alleine... :mrgreen:

Ach ja: Klasse wäre es auch, wenn man besser Subroutinen machen könnte. Den Befehl return austauschen in exit und dann die Möglichkeit von go sub <Subroutine>/return, das wäre geil :)

Grüße Euch
SpaceTycoon
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

hm... mit den Vorschlägen solltet ihr euch auf Befehle begrenzen, die eine Funktion zur Verfügung stellen, die es im Moment nicht gibt.

z.B.
@Lucike
RetVar/IF> <RefObj> can install <Var/Ware> in turret <Var/Number>
Das ist der einzige der sinnvoll ist, die anderen lassen sich aus diesem ableiten... turret 0 ist übrigens die Frontkanone ;)

@SpaceTycoon
<RefObj> set SINZA to <var/number>
ist ebenfalls der einzige der wirklich Sinn mancht. Alle anderen sind jetzt schon möglich nur halt etwas aufwand. Wieso sollte man das in die Engine verlagern, da diese Befehle wohl oder übel dort zumindest ebensoviele Befehle benötigen. Schreib dir dafür ein Script ;)

Ach dann schlag ich auch mal einen vor.

set player environment to <var/ship> (msg: Hier spricht ihr freundlicher Schiffcomputer. Der Schleudersitz wurde auf Grund einer Fehlfunktion ausgelöst. Aufenthaltort: Khaak Sektor, Schönen Tag noch" :D

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

Post by Lucike »

ticaki wrote:Das ist der einzige der sinnvoll ist, die anderen lassen sich aus diesem ableiten... turret 0 ist übrigens die Frontkanone ;)
Das waren nur Vorschläge. ;) Mir würde einer der Befehle schon reichen, welcher ist mir völlig (fast ;) ) Schnuppe. Ich kann mit allen etwas anfangen.

Ich wäre aber mehr für den {InLaserBay}-Befehl, da es bereits den {FitsLaserBefehl}-Befehl gibt.
ticaki wrote:turret 0 ist übrigens die Frontkanone ;)
Was ist eine Frontkanone? :D Nee, ist bekannt. ;)

Nach dem ganzen InstallAdd-Spektakel bei mir kann ich mit ruhigen Gewissen behaupten, dass ich mittlerweile ein Waffenscriptexperte dadurch geworden bin. ;)

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

Post by SpaceTycoon »

ticaki wrote:hm... mit den Vorschlägen solltet ihr euch auf Befehle begrenzen, die eine Funktion zur Verfügung stellen, die es im Moment nicht gibt.
@SpaceTycoon
<RefObj> set SINZA to <var/number>
ist ebenfalls der einzige der wirklich Sinn mancht. Alle anderen sind jetzt schon möglich nur halt etwas aufwand.
Nö. Da sind noch andere Beispiele, die momentan nicht realisierbar sind.
<RetVar><RefObj>= get formation
Oder bring mal eine Tabelle auf den Bildschirm, wie sie der Schnäppchenfinder darstellt.

Und auch die Sache mit "go sub"/"return". Daß "return" stattdessen "exit" heißen kann wäre einfach nur eine Änderung in der Sprachdatei (Page-ID "2003") und würde an der Funktion nichts ändern. Anschließend hätte man "return" als Wort frei, um mit den Befehlen go sub und return die Programmierung von Subroutinen zu ermöglichen. Daraus würden sich einige nette Vereinfachungsmöglichkeiten ergeben.
ticaki wrote:Wieso sollte man das in die Engine verlagern, da diese Befehle wohl oder übel dort zumindest ebensoviele Befehle benötigen. Schreib dir dafür ein Script ;)
Der Hintergrund:
Weniger Befehle, Scripte werden übersichtlicher.
Außerdem gehe ich davon aus, daß jeder Scriptbefehl erst von der Engine übersetzt werden muß. Insofern würde ich mir von einem Scriptbefehl, der zig Schleifendurchläufe im Script ersetzt, weniger CPU-Belastung erwarten.
Liebe Grüße
SpaceTycoon
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

Das mit dem "go sub" ist auch ok, nur möchte ich den Topic hier gerne übersichtlich, leicht verständlich und mit vielen guten Ideen angereichert sehen... so das ich sagen kann... Ey du da mach das mal :D

Nun die von dir vorgeschlagenen Scriptbefehle sind aber teilweise nicht nötig... es ist zwar schneller wenn die in KC gemacht sind, aber wie oft werden die aufgerufen? und wieviele Funktionen sind wichtiger als solche Optimierungen?

Ich hoffe du verstehst was ich meine und mein letztes Posting hat sich ausschließlich auf dein letztes bezogen, nicht auf die vorherigen Vorschläge :)

-------------
Noch ein Vorschlag

<RetVar/If> <RefObj> is hired (ob der TL gemietet ist)

Gruß ticaki
Last edited by ticaki on Wed, 8. Sep 04, 16:13, edited 1 time in total.
Zur Zeit nicht aktiv
laprican
Posts: 196
Joined: Fri, 13. Feb 04, 16:56
x2

Post by laprican »

hm...

nen befehl, mit dem man Benutzereingaben, nach dem Starten des Scripts, daher variabel, eingeben kann, wäre auch mal was schönes...
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

laprican wrote:hm...nen befehl, mit dem man Benutzereingaben, nach dem Starten des Scripts, daher variabel, eingeben kann, wäre auch mal was schönes...
:mrgreen:
Deshalb hätte ich ja unbedingt gerne den "get formation".
Damit könnte man schöne Sachen anfangen :mrgreen:
Schau Dir mal meine Versorgungssoftware unten an. Die gibt dem
User auch schon Eingriffsmöglichkeiten in den Scriptablauf bzw. die
Schiffsfunktion, ohne daß das Script beendet werden muß oder ein anderes Script zu starten ist.
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

ticaki wrote:Das mit dem "go sub" ist auch ok, nur möchte ich den Topic hier gerne übersichtlich, leicht verständlich und mit vielen guten Ideen angereichert sehen... so das ich sagen kann... Ey du da mach das mal :D
OK. Den letzten Satz würd ich auch gerne oft sagen :twisted:
ticaki wrote:Nun die von dir vorgeschlagenen Scriptbefehle sind aber teilweise nicht nötig... es ist zwar schneller wenn die in KC gemacht sind, aber wie oft werden die aufgerufen? und wieviele Funktionen sind wichtiger als solche Optimierungen?
Wo ist das Topic für diese wichtigeren Funktionen?
ticaki wrote:Ich hoffe du verstehst was ich meine und mein letztes Posting hat sich ausschließlich auf dein letztes bezogen, nicht auf die vorherigen Vorschläge :)
ACK. :)

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