Scriptproblem...

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
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Scriptproblem...

Post by StarTrekMarc »

Hi Leute!

Hab ein Problem mit einem Script!:

Code: Select all

Description
Der Script vernichtet alle Sonnenkraftwerke
Arguments

    * 1: Okay , Var/String , 'Ja oder Nein eintippen'

Source Text

001   $Typ = Paraniden Sonnenkraftwerk
002   $B = 0
003   $A = 500
004   if $Okay == 'Ja'
005    while $A > $B
006     $Objekt =  find station: sector=$S class or type=$Typ race=$R flags=$F refobj=$O maxdist=1410065407 maxnum=$X refpos=$P
007     $Objekt -> destruct: show no explosion=$Objekt
008     $B = $B + 1
009    end
010    $Text = 'Alle ' + $Typ + ' sind vernichtet worden'
011    write to player logbook $Text
012   end
013   $Typ = Boronen Sonnenkraftwerk
014   $B = 0
015   $A = 500
016   if $Okay == 'Ja'
017    while $A > $B
018     $Objekt =  find station: sector=$S class or type=$Typ race=$R flags=$F refobj=$O maxdist=1410065407 maxnum=$X refpos=$P
019     $Objekt -> destruct: show no explosion=$Objekt
020     $B = $B + 1
021    end
022    $Text = 'Alle ' + $Typ + ' sind vernichtet worden'
023    write to player logbook $Text
024   end
025   $Typ = Teladi Sonnenkraftwerk
026   $B = 0
027   $A = 500
028   if $Okay == 'Ja'
029    while $A > $B
030     $Objekt =  find station: sector=$S class or type=$Typ race=$R flags=$F refobj=$O maxdist=1410065407 maxnum=$X refpos=$P
031     $Objekt -> destruct: show no explosion=$Objekt
032     $B = $B + 1
033    end
034    $Text = 'Alle ' + $Typ + ' sind vernichtet worden'
035    write to player logbook $Text
036   end
037   $Typ = Argonen Sonnenkraftwerk
038   $B = 0
039   $A = 500
040   if $Okay == 'Ja'
041    while $A > $B
042     $Objekt =  find station: sector=$S class or type=$Typ race=$R flags=$F refobj=$O maxdist=1410065407 maxnum=$X refpos=$P
043     $Objekt -> destruct: show no explosion=$Objekt
044     $B = $B + 1
045    end
046    $Text = 'Alle ' + $Typ + ' sind vernichtet worden'
047    write to player logbook $Text
048   end
049   $Typ = Split Sonnenkraftwerk
050   $B = 0
051   $A = 500
052   if $Okay == 'Ja'
053    while $A > $B
054     $Objekt =  find station: sector=$S class or type=$Typ race=$R flags=$F refobj=$O maxdist=1410065407 maxnum=$X refpos=$P
055     $Objekt -> destruct: show no explosion=$Objekt
056     $B = $B + 1
057    end
058    $Text = 'Alle ' + $Typ + ' sind vernichtet worden'
059    write to player logbook $Text
060   end
061   return null
Das ist der Script!

Also er soll alle Sonnenkraftwerke vernichten! (CHEAT :D )

Das tut er jedoch nicht.
Ich hab schon alles ausprobiert, was soll ich machen?
Helft mir!

Gruß
STM
XeHonk
Posts: 1087
Joined: Sun, 7. Mar 04, 23:03
x3tc

Post by XeHonk »

schreib ma n vernünftiges script (sorry, aber das ding da ist wirklich total daneben)

Code: Select all

für alle sektoren
  finde alle sonnenkraftwerke (find_multiple)
  für alle stationen im array (=station)
    vernichte station
bin mir nicht ganz sicher, ob du das für alle 6 sonnenkraftwerke machen musst.. wenn ja, dann packs in 2 dateien und ruf die 2. einfach mit dem stationstyp als parameter auf
ArcaJeth
Posts: 2245
Joined: Mon, 10. Nov 03, 18:22
x3tc

Post by ArcaJeth »

1. wo bekommst du $S her ?
2. wo bekommst du $ ... ach mensch, kurz gesagt - wo bekommst du die ganzen Argumente für den find-Befehl her ? ($S,$R,$F,$O,$X,$P)

Übrigens wäre es sinnvoller alle Sektoren durchzugehen, sich das Stations-Array (neuer Befehl in 1.4) zu holen und nach SKWs zu durchsuchen ;) ... ein paar waits wären da sicher auch nicht ganz schlecht.
XeHonk
Posts: 1087
Joined: Sun, 7. Mar 04, 23:03
x3tc

Post by XeHonk »

des mit den ganzen $* dingern ist mir auch schon aufgefallen ^^ und die namen für die variablen sind eh total daneben *g*
User avatar
lenny5000
Posts: 892
Joined: Mon, 29. Sep 03, 19:06
x3

Post by lenny5000 »

Also du weißt ja nicht nicht was ein Array ist. Das muss man sich so vorstellen:
Eine Variable ist ein Quadrat, das entweder schwarz oder weiß ist.
Das entspricht im Script 1 oder 0, wobei es noch viel mehr mögliche Werte gibt.
Dann ist ein Array eine Kette von diesen Quadraten, je nach Größe des Arrays.
Ein Array erstellt man mit dem Befehl

Code: Select all

<RetVar> = array alloc: size=<Var/Number>
Wobei size die Größe des Arrays bestimmt, also in unserem Beispiel die Anzahl der Quadrate.
Um ein Element des Arrays auszulesen benutzt man den Befehl

Code: Select all

<RetVar/IF> <Var/Array>[<Var/Number>] 
Zum Beispiel

Code: Select all

$erstesElement = $Elemente[0]
Und reinschreiben tut man dann mit dem Befehl

Code: Select all

<Var/Array>[<Var/Number>] = <Value> 
Und alle die sich jetzt fragen woher ich weiß, dass STM nicht weiß, was ein Array ist... Telepathie :mrgreen:


Aber wo du die Variablen herkriegst würd mich auch mal interessieren ;)
Greets
lenny5000
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Ich hab versucht ihn zu verändern doch das mit den Arrays kapier ich nicht und jetzt sieht der Script so aus:

Code: Select all

Description
Der Script vernichtet alle Sonnenkraftwerke
Arguments

    * 1: Okay , Var/String , 'Ja oder Nein eintippen'

Source Text

001   $Typ = $TypA OR $TypB OR $TypC OR $TypD OR $TypE
002   $TypA = Paraniden Sonnenkraftwerk
003   $TypB = Boronen Sonnenkraftwerk
004   $TypC = Teladi Sonnenkraftwerk
005   $TypD = Argonen Sonnenkraftwerk
006   $TypE = Split Sonnenkraftwerk
007   $X = get max sectors in x direction
008   $Y = get max sectors in y direction
009   $Sektor = get sector from universe index: x=$X, y=$Y
010   $Station =  find station in galaxy: startsector=$Sektor class or type=$Typ race=null flags=null refobj=null serial=null max.jumps=1410065407 num=1410065407
011   $Station -> destruct: show no explosion=$Station
012   return null
Aber er klappt immer noch nicht! :cry:

Gruß
STM
User avatar
lenny5000
Posts: 892
Joined: Mon, 29. Sep 03, 19:06
x3

Post by lenny5000 »

1.) TypA TypB usw werden erst nach Typ definiert
2.) Man kann keine zufällige Variable durch eine Verknüpfung mit OR machen :lol:
Da tut man die ganzen Typen in ein Array und wählt dann einen zufälligen Arrayindex aus ;)

3.) Existiert eigentlich der Sektor den du da nimmst? Ich würd' einfach 0, 0 nehmen, weil du ja eh max.jumps auf ein paar Millionen gestellt hast.

Bei den find-Funktionen kenn' ich mich nicht so aus...
Greets
lenny5000
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

1.) Hab ich doch! :wink:

2.) Zeig mir bitte wie das geht. :roll:

3.) Ich glaub das ist richtig, so war das auch in nem anderem ähnlichen Script, der gefunut hat!

Gruß
STM
User avatar
lenny5000
Posts: 892
Joined: Mon, 29. Sep 03, 19:06
x3

Post by lenny5000 »

1.) Hab ich doch!
Jo, hast du, und das ist ja auch der Fehler *g*
2.) Zeig mir bitte wie das geht.
Eigenlich ist hier ja learning by doing, nicht? :roll:

Code: Select all

$Typen = array alloc: size=5
$Typen[0] = Paraniden SKW
$Typen[1] = Boronen SKW
...

$i = get random value from 0 to 5 -1
$Typ = $Typen[$i]
Greets
lenny5000
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Danke, werde es probieren! :roll: :roll:
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Klappt leider nicht, hier ist der veränderte Script-Code.
Schonmal Danke...

Code: Select all

Description
Der Script vernichtet alle Sonnenkraftwerke
Arguments
1: Okay , Var/String , 'Ja oder Nein eintippen' 
Source Text

001   $Typen =  array alloc: size=5
002   $Typen[1] = Paraniden Sonnenkraftwerk
003   $Typen[2] = Boronen Sonnenkraftwerk
004   $Typen[3] = Teladi Sonnenkraftwerk
005   $Typen[4] = Argonen Sonnenkraftwerk
006   $Typen[5] = Split Sonnenkraftwerk
007   $I = random value from 0 to 5 - 1
008   $Typ = $Typen[$I]
009   $Sektor = get sector from universe index: x=0, y=0
010   $Station =  find station in galaxy: startsector=$Sektor class or type=$Typ race=null flags=null refobj=null serial=null max.jumps=1410065407 num=1410065407
011   $Station -> destruct: show no explosion=$Station
012   return null
Gruß :wink:
STM
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Habs nochmal auf Hinweiß von lenny5000 geändert, klappt aber immer noch nicht!:

Code: Select all

Description
Der Script vernichtet alle Sonnenkraftwerke
Arguments
1: Okay , Var/String , 'Ja oder Nein eintippen' 
Source Text

001   $Typen =  array alloc: size=5
002   $Typen[0] = Paraniden Sonnenkraftwerk
003   $Typen[1] = Boronen Sonnenkraftwerk
004   $Typen[2] = Teladi Sonnenkraftwerk
005   $Typen[3] = Argonen Sonnenkraftwerk
006   $Typen[4] = Split Sonnenkraftwerk
007   $I = random value from 0 to 5 - 1
008   $Typ = $Typen[$I]
009   $Sektor = get sector from universe index: x=0, y=0
010   $Station =  find station in galaxy: startsector=$Sektor class or type=$Typ race=null flags=[Find.Multiple] refobj=null serial=null max.jumps=1410065407 num=1410065407
011   $Station -> destruct: show no explosion=$Station
012   return null
Gruß
STM
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Ich habs im vorigen Post nochmal verändert:

...flags=[Find.Multiple]...

Danke an XeHonk

Doch es klappt immer noch nicht!

Gruß
STM
ArcaJeth
Posts: 2245
Joined: Mon, 10. Nov 03, 18:22
x3tc

Post by ArcaJeth »

Versuchs mal damit ;) ... eine Schleife (bzw. 2 oder 3) muss auf jeden Fall rein, weil man ja jeden Sektor durchsuchen muss!! Ich habe auch nicht geprüft ob es ein SKW ist sondern ob die Station Energiezellen herstellt - somit spare ich mir die Prüfung auf die 5 (6 mit Xenon) Typen und damit einiges an Schreibkram ;) Außerdem wird in eine externe Datei geschrieben welche Station zerstört wurde, das aber nur zur Kontrolle.

Code: Select all

001   $count = 0
002   $maxX = get max sectors in x direction
003   $maxY = get max sectors in y direction
004   
005   $x = 0
006   while $x < $maxX
007    $y = 0
008    while $y < $maxY
009     $Sector = get sector from universe index: x=$x, y=$y
010     $Sector.Stations = $Sector -> get station array from sector
011     
012     $i = 0
013     $Sector.Stations.size =  size of array $Sector.Stations
014     
015     while $i < $Sector.Stations.size
016      $Sector.Stations.i = $Sector.Stations[$i]
017      $Product = $Sector.Stations.i -> get product ware
018      
019      if $Product == Energiezellen
020       write to log file #1311  append=[TRUE]  value=$Sector.Stations.i
021       $Sector.Stations.i -> destruct: show no explosion=[TRUE]
022       inc $count = 
023      end
024      inc $i = 
025     end
026     
027     inc $y = 
028    end
029    inc $x = 
030   end
031
032   write to player logbook: printf: fmt='%s Stationen gefunden und Zerstört', $count, null, null, null, null
033   return null

PS: Arrays ->
Array[1] = 'Hallo'
Array[2] = 'Welt'
Array[1:'Hallo';2:'Welt']
Arrays sind also so eine Art Listen :) (wobei es bei einigen Programmiersprachen Listen noch als extra-Type gibt, beim X²-Scripting gibts aber nur die Array)
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Danke Aj! :roll: :roll:
Der Script funktioniert! :D :)

Ich hab noch eine Abfrage eingebaut, damit man den Script nicht ausversehen ausführt, wenn ich ihn in die Menüs, für den AktionMod eingebaut hab.

Hier der endgültige Script: (Dank AJ! :roll: )

Code: Select all

Description
Der Script vernichtet alle Sonnenkraftwerke
Arguments

    * 1: Okay , Var/String , 'Ja oder Nein eintippen'

Source Text

001   if $Okay == 'Ja'
002    $Count = 0
003    $maxX = get max sectors in x direction
004    $maxY = get max sectors in y direction
005    
006    $x = 0
007    while $x < $maxX
008     $y = 0
009     while $y < $maxX
010      $Sektor = get sector from universe index: x=$x, y=$y
011      $Sektor.Stations = $Sektor -> get station array from sector
012      
013      $i = 0
014      $Sektor.Stations.Size =  size of array $Sektor.Stations
015      
016      while $i < $Sektor.Stations.Size
017       $Sektor.Stations.i = $Sektor.Stations[$i]
018       $Produkt = $Sektor.Stations.i -> get product ware
019       
020       if $Produkt == Energiezellen
021        write to log file #1311  append=[TRUE]  value=$Sektor.Stations.i
022        $Sektor.Stations.i -> destruct: show no explosion=[TRUE]
023        inc $Count = 
024       end
025       inc $i = 
026      end
027      
028      inc $y = 
029     end
030     inc $x = 
031    end
032    
033    write to player logbook: printf: fmt=$s, 'Stationen gefunden und zerstoert', null, null, null, null
034   end
035   return null
Gruß
STM :wink:
ArcaJeth
Posts: 2245
Joined: Mon, 10. Nov 03, 18:22
x3tc

Post by ArcaJeth »

Verstehst du inzwischen denn auch weshalb meins funktioniert und deins nicht wollte ? (das ist IMO das wichtigste)
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Ich verstehe es teilweiße, aber manches versuche ich gerade durchs Script-Tutorial zu lernen! :wink:
Nochmal Danke!

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