StarTrekMarc wrote:Hallo Leute,
ich habe ein Problem mit einem Script, das von ausgewählten Völkern eines auslosen soll, das Script sieht so aus:
Code: Select all
Script al.random.stm.attacker.1
Version: 1
for Script Engine Version: 25
Description
Random Attack- Xenon, Khaak, Pirats
Arguments
Source Text
(Zuerst werden die globalen Variablen gehohlt - 1 oder 0 / an oder aus)
001 $glob.var.xenon = get global variable: name='al.stm.attack.plugin.xenon.start'
002 $glob.var.khaak = get global variable: name='al.stm.attack.plugin.khaak.start'
003 $glob.var.pirats = get global variable: name='al.stm.attack.plugin.pirat.start'
004
(sie kommen in ein Array)
005 $var.array.volker = array alloc: size=2
006
007 $var.array.volker[0] = $glob.var.xenon
008 $var.array.volker[1] = $glob.var.khaak
009 $var.array.volker[2] = $glob.var.pirats
010
011
(die Races werden in die "alten" Variablen gesetzt)
012 if $glob.var.xenon == 1
013 $glob.var.xenon = Xenon
014 end
015
016 if $glob.var.khaak == 1
017 $glob.var.khaak = Khaak
018 end
019
020 if $glob.var.pirats == 1
021 $glob.var.pirats = Piraten
022 end
023
024
(Random zum wählen einer zufälligen Rasse)
025 volk:
026 while $number < 15
027 $var.array.number = random value from 0 to 3 - 1
028
029 $glob.var.volk.to.attack = $var.array.volker[$var.array.number]
030
031 if not $glob.var.volk.to.attack == 1
032 inc $number =
033 goto label volk
034 end
035 if $glob.var.volk.to.attack == 1
036 goto label end
037 end
038 end
039
(jetzt wird der Array aktualisiert)
040 end:
041
042 $var.array.volker[0] = $glob.var.xenon
043 $var.array.volker[1] = $glob.var.khaak
044 $var.array.volker[2] = $glob.var.pirats
045
046
(und die globale Variable wieder ausgegeben)
047 $glob.var.volk = $var.array.volker[$var.array.number]
048 $glob.var.volk.attacker = $glob.var.volk
049
050 set global variable: name='al.stm.attack.plugin.attacker' value=$glob.var.volk.attacker
...
062 return null
Seltsamerweise, krieg ich als Ergebniss immer nur die Xenon (also die 1.), warum?
Das gleiche Script hab ich auch für das zu attackierende Volk geschrieben (mit entsprechenden Variablen ect.), doch dort das selbe, immer nur die Argonen (1.).
Kann mir bitte jemand helfen?
Schonmal danke,
Gruß
StarTrekMarc
Wenn ich das richtig sehe , ist das ein Unterscript aufgerufen vom Timerscript oder vom Eventhandler.
Und was ich nicht sehe, ist die Verwendung eines globalen Arrays als übergebenes Argument zur zentralen Datenspeicherung.
Damit hättest du dann die Todsünde Nr.2 der Al-Plugin-Programmierung begangen (die Registerscripte zur Konfiguration als Todsünde Nummer 1 hat dir ja mittlerweile schon einer der ganz großen Scriptprofis unter den Greenies nochmal als ganz böses NO NO bestätigt).
Bitte benutze ein globales Array als zentrales Datenlager und KEINE X-Dutzend globale Variablen die die die Spielstände zumüllen , unnötige Referenzbackups verursachen, die Engine belasten , den Ramspeicher verringern und generell die System-Perfomance senken.
Ansonsten werden dir alle User die das Script benutzen, für die verhunzten Spielstände sicherlich "dankbar" sein...
Und unnötige globale Variablen, die auch dann noch die Spielstände belasten wenn das Script deinstalliert wurde und nie mehr verschwinden sind mehr als ärgerlich - es sei den du baust ein Deinstallationsscript ein .
Kein anderer User freut sich wenn ein Script sein Game oder Soielstände verschlechtert, im Extremfall sogar zerstört (ich hab es auf meinem Rechner bei der Pluginprogrammierung in meiner Lernphase mal geschafft den Spielstand kaputt zu machen) - es gibt so etwas wie Verantwortung denjenigen gegenüber die nicht scripten können und dir vertrauen, daß du ihr Spiel verbesserst .
Also :
Wenn du das Script zum Download freigibst dann programmier es BITTE BITTE BITTE sauber und kunstgerecht, laß dir notfalls helfen oder LASS ES und benutze es nur selbst .
Ach ja und wenn du Schiffe für die Ki Missionen brauchst dann benutze bitte den vorhandenen Bestand , d.h. leihe sie dir von der Ki aus, speichere den alten Ausrüstungsstand, Homebase , Name , Pilot etc. ab, rüste das Schiff auf das Missionsequipment um , benutze es und gib es der Ki anschließend nach der Mission im Originalzustand wieder am Entnahmeort zurück- ansonsten wäre die Todsünde Nr. 3 erfüllt , neue Schiffe nur im äußersten Notfall - auch dafür gibt es einen Grund, System-Performance - nicht alle Leute haben eine 3 Ghz Pentium CPU und eine neue GRAKA.
Wenn du Hilfe brauchst, dafür ist der Devnet Chat da.
Zur Frage warum es immer die Xenon wählt :
Die Schleife dürfte M.E. nicht laufen, da der Zähler $Number nicht definiert wurde , somit vom Datentyp NULL ist was das Durchlaufen bis zur 15. Wiederholung verhindern dürfte, auch ist $Number nicht auf 0 gesetzt (was sinnvoll ist) , somit läuft die Zufallsabfrage nur einmal und nach meinen Beobachtungen kommt dann mit der Randomfunktion meist der Wert 0 raus.
Da das Inc bedingt ist läuft das Script dann halt zum Label End , überspringt IMO die Schleife.
Und die Arrayposition auf Index 0 sind die Xenon. Ist der Wert dort 1 dann kommen die Xenon ansonsten müßte eine Endlosscheife draus werden.
Die Zeilen 31 bis 34 können daher eine Endlosschleife werden.
Warum eigentlich mit goto bei Zeile 36 ? - break ist besser.
Außerdem für was läuft das Ding eigentlich 16 mal durch wenn nur ein Wert ermittelt werden soll ? Sollte damit sichergestellt werden, daß die Variable auch sicher geschrieben wird ? - Das geht auch einfacher.
MfG
Nemomuc