[Script] EnduredBuying [fertig]

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

SirNoname
Posts: 34
Joined: Fri, 19. May 06, 19:07
x3

[Script] EnduredBuying [fertig]

Post by SirNoname » Sat, 10. Feb 07, 19:37

Guten Abend fleißige Coder-Gemeinde :wink:

Ich habe heute ein kleines Script ins Leben gerufen, was die günstige (ökonomisch als auch Faulheits-bedingt) Energiezellen-Beschaffung ermöglicht. Das unten aufgeführte Script läßt ein Schiff (vorzugsweise Frachter) an eine Station andocken, eine bestimmte Ressource zu einem bestimmten Preis kaufen, zu einer eigenen Station zurückkehren und die Ladung löschen. Dabei wartet das Schiff an der Ressourcen-Station ab, bis der Preis für die Ressource auf oder unter einen angegebenen Wert fällt.

Soviel zur Umschreibung, hier der Code:

Code: Select all

Arguments

    * 1: RessourceStation , Var/Station , 'RessourceStation'
    * 2: SupportedStation , Var/Station , 'SupportedStation'
    * 3: Ware , Var/Ware , 'Ware'
    * 4: maxPrice , Value , 'maxPrice'

Source Text

001   $numberOfCells = 0
002   $price = 0
003   * TODO:
004   * .
005   while [TRUE]
006   * Hinweg:
007 @  = [THIS] -> call script '!ship.cmd.movestation.std' :  object to land on=$RessourceStation
008    $numberOfCells = [THIS] -> get free amount of ware $Ware in cargo bay
009    $price = $RessourceStation -> get price of ware $Ware
010    if $price <= $maxPrice
011     goto label BUY
012    else
013     while $price > $maxPrice
014 @    = wait 30000 ms
015      $price = $RessourceStation -> get price of ware $Ware
016     end
017   BUY:
018     = [THIS] -> buy $numberOfCells units of $Ware to a max. price of $maxPrice Cr
019   * R�ckweg:
020 @   = [THIS] -> call script '!ship.cmd.movestation.std' :  object to land on=$SupportedStation
021   StationVoll:
022   * Variable price wird doppelt genutzt! 
023     $price = $SupportedStation -> get free amount of ware $Ware in cargo bay
024     if $numberOfCells > $price
025 @    = wait 60000 ms
026      goto label StationVoll
027     else
028      = [THIS] -> unload $numberOfCells units of $Ware
029     end
030    end
031   end
032   return null
Wie ihr seht ist das Ganze noch im Beta-Stadium (deshalb auch keine Menu-Unterstützung).

Nach ausgiebigem Testen hat eine Vorgängerversion bestens funktioniert und meine Stationen gut mit Energiezellen versorgt (die kauf ich immer ein :roll: ). Als ich das Script jedoch umbenennen wollte, hat dies dazu geführt, dass es nicht mehr im Spiel-Script-Editor angezeigt wurde. Der Name in der Datei ( <name>enduredBuying</name> ) entspricht dem Dateinamen ( enduredBuying.xml ), trotzdem wird das Script nicht angezeigt. Könnt ihr da helfen?
(Der Eintrag in den Script-Beginner-FAQs hat mir nicht weitergeholfen, da wie gesagt der Name der Datei mit dem Script-Namen übereinstimmt).

Vielen Dank für eure Hilfe, und wenn euch das Script gefällt: Testen und feedback geben! :)
Last edited by SirNoname on Tue, 13. Feb 07, 01:00, edited 1 time in total.

User avatar
Gazz
Posts: 13244
Joined: Fri, 13. Jan 06, 16:39
x4

Re: [Script] EnduredBuying

Post by Gazz » Sat, 10. Feb 07, 20:33

SirNoname wrote:Als ich das Script jedoch umbenennen wollte, hat dies dazu geführt, dass es nicht mehr im Spiel-Script-Editor angezeigt wurde
Der Filename wird auch IM File gespeichert und muß übereinstimmen.
My complete script download page. . . . . . I AM THE LAW!
There is no sense crying over every mistake. You just keep on trying till you run out of cake.

SirNoname
Posts: 34
Joined: Fri, 19. May 06, 19:07
x3

Post by SirNoname » Sat, 10. Feb 07, 20:57

Der Name in der Datei ( <name>enduredBuying</name> ) entspricht dem Dateinamen ( enduredBuying.xml ), trotzdem wird das Script nicht angezeigt.

User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc » Sat, 10. Feb 07, 21:52

Schau mal in den codearray (am Ende der Scriptdatei). Dort musst du den Namen auch anpassen.

X3 arbeitet mit dem codearray, die formatierte Quelltext ausgabe ist nur zur Ansicht.

SirNoname
Posts: 34
Joined: Fri, 19. May 06, 19:07
x3

Post by SirNoname » Sun, 11. Feb 07, 10:02

Guten Morgen!

[für die Programmierer: Guten Abend! *g* ]


Ich hab mich wohl ein wenig schlecht ausgedrückt, das basierte auf purer Unwissenheit. Aaaaalso:
Ich hab nicht nur die Datei umbenannt, sondern auch Code geändert (also nicht nur den Namen, sondern auch funktionalen Code). Das führt natürlich dazu, dass das Code-Array Blödsinn ist. Eigentlich nicht schlimm, denn das Script hätte einfach nur das gemacht, was es vor der Änderung getan hätte. Soweit, so schlecht. Also war es gar nicht so schlecht, dass das nicht funktioniert hat *g* *positiv-Denker sei*. Das Problem wurde "analog" umgangen: Code ausgedruckt (so viel ist es ja nicht ;) ) und mit viel Fingerspitzengefühl während der nervigen Menu-Auswahl in den Editor gehackt. Das sieht nicht nur schick aus, sondern funktioniert auch :idea:
Ich schreibe das, damit sich niemand (umsonst) die Mühe macht, ein Problem zu klären, was ich falsch beschrieben habe.


Zum Scirpt:

Ich werde noch einige Fehler beheben (Abtippen will gekonnt sein), das Ganze in die Menustruktur einbinden und dann ab damit in den Script-Installer.

Danke für eure Hilfe, ich poste weiter :D

SirNoname
Posts: 34
Joined: Fri, 19. May 06, 19:07
x3

Post by SirNoname » Mon, 12. Feb 07, 15:17

Hallo Leute!

Haltet mich für blöd ... aber ich sitz seit geraumer Zeit an diesem blöden Algorithmus und die Schiffe tun nicht das, was sie sollen. :evil:

Zuerst die Fehlerbeschreibung:
Kaufen funktioniert super. Die Schiffe docken an der Station an, warten bis der Preis unter dem Maximalpreis liegt und laden sich voll. Dann fliegen sie zur eigenen Station und docken an. Und dann passierts: Anstatt die Ware auszuladen, fliegen sie einfach wieder mit vollen Frachtraum weg, um "noch mehr" zu kaufen.
Wie kann das sein?! ... Ich hab sogar schon ein Struktogramm gemacht für dieses einfache Problem und mich in den Hilfe-Threads über die Bedingungen belesen (kann ja sein, dass die Script-Engine irgendwelche total abgefahrenen Bedingungsgesetze nutzt) ... aber es will nicht funktionieren.
Vielleicht noch wichtige Info: Die eigenen Stationen waren bis auf den Boden des Lagers leer.

Hier nun der Code:

Code: Select all

Arguments

    * 1: RessourceStation , Var/Station , 'RessourceStation'
    * 2: SupportedStation , Var/Station , 'SupportedStation'
    * 3: Ware , Var/Ware , 'Ware'
    * 4: maxPrice , Value , 'maxPrice'

Source Text

001   $amount = 0
002   $price = 0
003   while [TRUE]
004   * way to:
005 @  = [THIS] -> call script '!ship.cmd.movestation.std' :  object to land on=$RessourceStation
006    $amount = [THIS] -> get free amount of ware $Ware in cargo bay
007    $price = $RessourceStation -> get price of ware $Ware
008    if $price <= $maxPrice
009     goto label Buy
010    else
011     while $price > $maxPrice
012 @    = wait 30000 ms
013      $price = $RessourceStation -> get price of ware $Ware
014     end
015    end
016   Buy:
017    = [THIS] -> buy $amount units of $Ware
018   * way back
019 @  = [THIS] -> call script '!ship.cmd.movestation.std' :  object to land on=$SupportedStation
020   * variable 'price' is used twice!
021    $price = $SupportedStation -> get free amount of ware $Ware in cargo bay
022    if $amount <= $price
023     goto label Unload
024    else
025     while $amount > $price
026 @    = wait 60000 ms
027      $price = $SupportedStation -> get free amount of ware $Ware in cargo bay
028     end
029    end
030   Unload:
031    = [THIS] -> unload $amount units of $Ware
032   end
033   return null
Es wäre super, wenn ihr mir meinen (wahrscheinlich billigen) Fehler zeigen könntet. Danke!

User avatar
Dragon_Darkhawk
Posts: 158
Joined: Tue, 26. Dec 06, 00:52
x3

Post by Dragon_Darkhawk » Mon, 12. Feb 07, 15:45

Klingt für mich so, als wär Dein Frachter einmal vor dem Entladen von der Station verstoßen worden (passiert ja manchmal, wenn zuviele Schiffe andocken...
Einmal voll zurückgeflogen ist $amount nach dem Kauf 0, da der Frachter ja bereits voll war und ab da dreht er mit Kaufe 0 und entlade 0 seine Runden...
Kann das sein?

Versuchs mal so:

Code: Select all

Arguments 

    * 1: RessourceStation , Var/Station , 'RessourceStation' 
    * 2: SupportedStation , Var/Station , 'SupportedStation' 
    * 3: Ware , Var/Ware , 'Ware' 
    * 4: maxPrice , Value , 'maxPrice' 

Source Text 

001   while [TRUE] 
002   * way to: 
003 @  = [THIS] -> call script '!ship.cmd.movestation.std' :  object to land on=$RessourceStation 
004    $amount = [THIS] -> get free amount of ware $Ware in cargo bay 
005    $price = $RessourceStation -> get price of ware $Ware 
006    while $price > $maxPrice 
007 @   = wait 30000 ms 
008     $price = $RessourceStation -> get price of ware $Ware 
009    end 
010    = [THIS] -> buy $amount units of $Ware 
011 @  = [THIS] -> call script '!ship.cmd.movestation.std' :  object to land on=$SupportedStation 
012   Unload:
013    = [THIS] -> unload $amount units of $Ware 
014    $amount = [THIS] -> get amount of ware $Ware in cargo bay 
015    if $amount > 0 
016 @   = wait 60000 ms 
017     goto label Unload
018    end 
019   end 
020   return null
oder alternativ mit "wiederandock-sicherung":

Code: Select all

Arguments 

    * 1: RessourceStation , Var/Station , 'RessourceStation' 
    * 2: SupportedStation , Var/Station , 'SupportedStation' 
    * 3: Ware , Var/Ware , 'Ware' 
    * 4: maxPrice , Value , 'maxPrice' 

Source Text 

001   while [TRUE] 
002   wayto: 
003 @  = [THIS] -> call script '!ship.cmd.movestation.std' :  object to land on=$RessourceStation 
004    $amount = [THIS] -> get free amount of ware $Ware in cargo bay 
005    $price = $RessourceStation -> get price of ware $Ware 
006    while $price > $maxPrice
007 @   = wait 30000 ms 
008	  skip if [ENVIRONMENT] == $RessourceStation
009	   goto label wayto
010     $price = $RessourceStation -> get price of ware $Ware 
011    end 
012    = [THIS] -> buy $amount units of $Ware 
013   wayback:
014 @  = [THIS] -> call script '!ship.cmd.movestation.std' :  object to land on=$SupportedStation 
015   Unload:
016    = [THIS] -> unload $amount units of $Ware 
017    $amount = [THIS] -> get amount of ware $Ware in cargo bay 
018    if $amount > 0 
019 @   = wait 60000 ms 
020	  skip if [ENVIRONMENT] == $SupportedStation
021	   goto label wayback
022     goto label Unload
023    end 
024   end 
025   return null
Scripter aus Leidenschaft :D

SirNoname
Posts: 34
Joined: Fri, 19. May 06, 19:07
x3

Post by SirNoname » Mon, 12. Feb 07, 15:50

Hmm. Das mit dem "Verstoßen" ist eine Theorie, könnte sein. Allerdings glaube ich das nicht, denn ich hab das Script in dieser Version zur Versorgung von 2 Komplexen und 2 Minen getestet, jeweils mit einem Frachter voll Energiezellen.
Beim letzten Test sind beide Komplex-Frachter und ein Minen-Frachter ohne Entladen wieder abgedockt. Gut, ich hab nicht "zugesehen". Weiß also nicht, ob sie wirklich angedockt sind oder nicht, aber die Wahrscheinlichkeit ist bei drei Frachtern doch recht gering. Ich werde das sofort visuell prüfen *X anschmeiß*

Edit-PS:
Unabhängig davon, ob das jetzt so wirklich passiert ist, hast du Recht: Wenn die Frachter durch einen dummen Zufall voll wieder zurückfliegen, war`s das mit der schönen Fracht-Kette. Ich werde das sofort ändern.

SirNoname
Posts: 34
Joined: Fri, 19. May 06, 19:07
x3

Post by SirNoname » Mon, 12. Feb 07, 16:09

Japp, das war es!

:lol:

Keine Ahnung, wie er "unterwegs vergessen" hat, dass er was geladen hat ... aber nach dem Einfügen der Zeile

Code: Select all

021    $amount = [THIS] -> get amount of ware $Ware in cargo bay
laden alle Frachter ordnungsgemäß aus. Sehr schön! Danke! :wink:

SirNoname
Posts: 34
Joined: Fri, 19. May 06, 19:07
x3

Post by SirNoname » Mon, 12. Feb 07, 19:07

Hallo nochmal in die Scripter-Gemeinde! :lol:

Nach einigen recht lustigen Bugs hab ich es nun in die erste Beta geschafft! *freu*. Mit Hilfe der absolut spitzenmäßigen Ratschläge von UniTrader {KBG}, herzlichsten Dank an dieser Stelle, hab ich folgende Script-Datei fertiggetellt

www.sirnonamesplace.de/EnduredBuying.spk

und würde mich freuen, wenn ihr sie kurz testen könntet. Eine Readme gibt es noch nicht, denn vielleicht werde ich noch einige weitere Befehle hinzufügen.

Vielen Dank nochmal!

Ich geh jetzt erstmal die Befehle registrieren :roll:

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