Hauptquartier mit bestimmten Waren

Hier ist der ideale Ort um über Scripts und Mods für X³: Terran Conflict und X³: Albion Prelude zu diskutieren.

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

Post Reply
Shadowhawks
Posts: 3
Joined: Mon, 21. Apr 08, 22:57
x3ap

Hauptquartier mit bestimmten Waren

Post by Shadowhawks » Tue, 27. Nov 12, 12:05

Hiho, ich versuche schon ein bissl länger nen Hauptquartier mit bestimmten Resourcen/Waren zu erstellen.

Das Problem, was ich dabei habe ist nen max Wert für diese Produkte/Schiffmodifikationen einzustellen.

Mein Beispiel:

001 $x = $setLoc[0]
002 $y = $setLoc[1]
003 $z = $setLoc[2]
004 $sec = $setLoc[3]
005
006
007 $neueStation = create station: type=Hauptquartier owner=Player addto=$sec x=$x y=$y z=$z
008 = $neueStation -> install 15 units of 2 GJ Schild
009 $sstr = $neueStation -> get maximum shield strength
010 $neueStation ->set current shield strength to $sstr
011 $neueStation ->add product to factory or dock: Energiezellen
012 $neueStation ->add product to factory or dock: Laderaumerweiterung
013 $neueStation ->set name to 'Deep Space Nine'
014 $neueStation ->station trade and production tasks: on=[TRUE]
015
016 $s1 = Energiezellen
017 $s2 = Laderaumerweiterung
018 check1:
019 = $neueStation -> add 10000 units of Energiezellen
020 = $neueStation -> add 1000 units of Laderaumerweiterung
021 @ = wait 5000 ms
022 goto label check1
023 return null

Nun hab ich aber das Problem, das die beiden Waren ohne ende zunehmen, bis das Lager des Hauptquartiers voll mit Energiezellen ist. (Dann stopen beide Zähler)

Wie kann ich das begrenzen?
Oder geht es nicht beim Hauptquartier?

Mich wundert auch, das die Laderaumerweiterung als Ware und nicht als Schiffmodifikation angeboten wird.

Über Scriptbefehlbeispiele wär ich sehr angetan.

MfG
Shadwhawks :evil: :D

User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Re: Hauptquartier mit bestimmten Waren

Post by Reflexer » Tue, 27. Nov 12, 12:55

Shadowhawks wrote:Mein Beispiel:
016 $s1 = Energiezellen
017 $s2 = Laderaumerweiterung
018 check1:
019 = $neueStation -> add 10000 units of Energiezellen
020 = $neueStation -> add 1000 units of Laderaumerweiterung
021 @ = wait 5000 ms
022 goto label check1
023 return null

Nun hab ich aber das Problem, das die beiden Waren ohne ende zunehmen, bis das Lager des Hauptquartiers voll mit Energiezellen ist. (Dann stopen beide Zähler)

Wie kann ich das begrenzen?

Das ist eigentlich ganz einfach. Du musst die Begrenzung festlegen und bei jedem Durchlauf auf die Begrenzung abfragen.

So in dieser Art:

Code: Select all

$s1 = {Energiezellen}
$s1.max = 100000
check1:
$s1.current = $neueStation -> get amount of ware {Energiezellen} in cargo bay
if $s1.current < $s1.max
  * Prüfung ob weniger als die 10000 fehlen um das Maximum nicht zu überschreiten:
  $s1.dif = $s1.xax - $s1.current
  if $s1.dif >= 10000
   * in diesem Fall können die kompletten 10.000 hinzugefügt werden:
    = $neueStation -> add 10000 units of {Energiezellen}
  else
    * In diesem Fall sind es weniger als 10.000 und es werden nur die wenigen hinzugefügt:
    = $neueStation -> add $s1.dif units of {Energiezellen}
  end
end
= wait 5000 ms
goto label check1
Ich habe versucht es in Deinem "Stil" (sofern man davon reden kann) zu programmieren. Ich denke Du solltest damit klarkommen :D

Shadowhawks
Posts: 3
Joined: Mon, 21. Apr 08, 22:57
x3ap

Thx

Post by Shadowhawks » Tue, 27. Nov 12, 13:32

Danke schonmal aber denke dran bin kein Profiscripter ich such grade die Befehle im Scripteditor von X3 Terran Conflict.

Is ja leider sehr unübersichtlich

User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer » Tue, 27. Nov 12, 13:36

Ich würde halt auch nicht den SE nehmen, sondern den Exsciptor .

Der SE ist so ziemlich der bescheidenste Editor, der mir jemals untergekommen ist.

Es war nicht als Vorwurf gemeint, sondern einfach eine Feststellung.

Keine Kommentare und kryptische Variablendeklarationen sind kein Zeichen guten Programmierstils ;)

User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer » Tue, 27. Nov 12, 14:08

Ich würde Dir wärmstens ans Herz legen die beiden Abschnitte über Variablen und Arrays in meinem Tutorial mal durchzulesen!

Basierend darauf würde ich Dir dann folgendes empfehlen:

Packe alle Waren in ein Array. Wenn Du das getan hast, brauchst Du im Loop nicht jede Ware einzeln von Hand zu programmieren, sondern Du kannst alles in einer einzigen while-Schleife abarbeiten. Das macht Deinen Code deutlich schlanker und Änderungen und Erweiterungen sind schnell gemacht, ohne es an mehreren Stellen anfassen zu müssen.

Ich gebe Dir gerne schnell ein Beispiel dazu. Ich verwende allerdings (im Gegensatz zu Deinen Deklarationen) mal sprechendere Namen ;)

Hier der entsprechende Code dazu:

1. Du erstellst Dir ein Array und fügst jeweils
  • die Waren
  • die maximale Anzahl der Ware auf der Station
  • die Anzahl der Waren die pro Prüfintervall hinzugefügt werden sollen
hinzu.

Ich nehme für mein Beispiel EZ, Erz und Computerkomponenten. Du musst es natürlich auf Deine Bedürfnisse anpassen:

Code: Select all

$WareArray = array alloc:size=0
* Energiezellen:
$SingleWare = create new array, arguments={Energiezellen}, 100000, 10000, null, null
append $SingleWare to Array $WareArray
* Erz:
$SingleWare = create new array, arguments={Erz}, 2000, 500, null, null
append $SingleWare to Array $WareArray
* Computerkomponenten:
$SingleWare = create new array, arguments={Computerkomponenten}, 500, 50, null, null
append $SingleWare to Array $WareArray
2. In Deiner Endlosschleife gehst Du nun einfach alle Einträge des Arrays in einer einfachen while-Schleife durch. Hierbei werden alle eingetragenen Waren des Arrays überprüft und fehlende Waren werden bis zu dem von Dir angegebenen Maximum aufgefüllt:

Code: Select all

Loop.Endless:
$tmpCounter = 0
$WareArrayCount = size of array $WareArray

* Es werden alle Waren des Arrays geprüft:
while $tmpCounter < $WareArrayCount
  * Ware:
  $tmpWare = $WareArray[$tmpCounter][0]
  * Maximale Anzahl:
  $tmpMaxValue = $WareArray[$tmpCounter][1]
  * Anzahl der hinzuzufügenden Waren pro Intervall:
  $tmpIntervallValue = $WareArray[$tmpCounter][2]
  * Aktuelle Anzahl der Ware auf der Station:
  $tmpCurrentValue = $neueStation -> get amount of ware $tmpWare in cargo bay
  
  if $tmpCurrentValue < $tmpMaxValue
    * In diesem Fall fehlen Waren
    * Prüfung, ob weniger als die Maximalanzahl fehlen, um sie nicht zu überschreiten:
    $tmpDifference = $tmpMaxValue - $tmpCurrentValue
    if $tmpDifference >= $tmpIntervallValue
      * In diesem Fall fehlen mehr, als pro Prüfintervall hinzugefügt werden sollen und es kann das maximum hinzugefügt werden:
      = $neueStation -> add $tmpIntervallValue units of $tmpWare
    else
      * In diesem Fall sind weniger Waren nötig und es wird lediglich die Differenz hinzugefügt:
      = $neueStation -> add $tmpDifference units of $tmpWare
    end
  end
  
  inc $tmpCounter =
end

* 5 Sekunden warten:
= wait 5000 ms

* Zurück zum Anfang:
goto label Loop.Endless
Durch diese Vorgehensweise kannst Du nun bei Änderungen einfach dem $WareArray Waren hinzufügen oder wieder löschen. Die Prüfung nimmt automatisch alle Waren - egal wie viele es sind. Du musst den Code im Loop so nicht jedesmal erweitern, wenn Du Waren hinzufügen möchtest.

Ich hoffe, dass Dir das weiterhilft :)
Last edited by Reflexer on Tue, 27. Nov 12, 18:01, edited 3 times in total.

Shadowhawks
Posts: 3
Joined: Mon, 21. Apr 08, 22:57
x3ap

Gratz

Post by Shadowhawks » Tue, 27. Nov 12, 16:03

Oki funkt wunderbar

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Tue, 27. Nov 12, 17:10

Reflexer wrote:Keine Kommentare und kryptische Variablendeklarationen sind kein Zeichen guten Programmierstils ;)
gotos ebenfalls. tausche das ganze lieber durch eine von aussen unterbrechbare Endlosschleife aus, z.B.

while not get global variable: name='MeinScript.Stop'
| *tu was du bis in alle ewigkeit tun willst
end


wenn du das Script jemals anhalten willst (um z.B. die Warentypen- und mengen zu ändern)hast du so nämlich eine einfache möglichkeit, mit nem goto-loop klappt das dagegen nicht und es kann zudem unleserlich werden.

User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer » Tue, 27. Nov 12, 17:57

UniTrader wrote:
Reflexer wrote:Keine Kommentare und kryptische Variablendeklarationen sind kein Zeichen guten Programmierstils ;)
gotos ebenfalls. tausche das ganze lieber durch eine von aussen unterbrechbare Endlosschleife aus, z.B.

while not get global variable: name='MeinScript.Stop'
| *tu was du bis in alle ewigkeit tun willst
end


wenn du das Script jemals anhalten willst (um z.B. die Warentypen- und mengen zu ändern)hast du so nämlich eine einfache möglichkeit, mit nem goto-loop klappt das dagegen nicht und es kann zudem unleserlich werden.
Informationen zu Endlosscripts kannst Du ebenfalls HIER nachlesen.

Post Reply

Return to “X³: Terran Conflict / Albion Prelude - Scripts und Modding”