AL-Script::Frage: Daten in globalen Variablen oder in Plugin.Data speichern?

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

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

Saburac
Posts: 15
Joined: Thu, 11. May 06, 23:59
x3tc

AL-Script::Frage: Daten in globalen Variablen oder in Plugin.Data speichern?

Post by Saburac »

Hallo,

wo legt Ihr die Einstellungen für ein AL-Script ab? Direkt in den Plugin-Daten oder in separaten globalen Variablen?

Beispiel:
Ich habe ein AL-Script geschrieben, dass von zeit zu zeit neue Asteroiden in zufälligen Sektoren erstellt.
In Plugin.Data habe ich bisher nur die Daten zu Scriptversion, Status, Playtime, Timer.
Weitere Einstellungen - Maximum Asteroiden pro Sektor, Minimum und Maximum Mineraliengehalt, wie viele Trümmer und so - habe ich bisher in globalen Variablen abgelegt. Diese Daten können vom Spieler verändert werden.

Könnte/Sollte ich diese Daten auch direkt in Plugin.Data ablegen? Was sind Vor- und Nachteile?

Hat da schon jemand Erfahrungen?

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

Post by UniTrader »

Eigentlich sollte man so sparsam wie möglich mit globalen variablen umgehen, weil diese auch bestehen bleiben wenn das plagen irgendwann entfernt wird. Zudem kann es zu Konflikten bei den variablennamen kommen wenn du viele gv verwendest und andere mod-macher ne ähnliche Idee haben. Daher ist es gut mit diesen sparsam zu sein.

Auf der anderen Seite ist das Management von Werten in einem Array mit ein wenig mehr Aufwand verbunden als für jeden Zweck ne eigene Variable zu machen (und ne eigene Variable ist scriptübergreifend übersichtlicher)

Im Endeffekt würde ich sagen dass du es machen solltest wie du es besser findest - nutz aber bei eigenen gv eindeutiges prefix um variablenkonflikte zu vermeiden ;)
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)
User avatar
JSDD
Posts: 1379
Joined: Fri, 21. Mar 14, 20:51
x3tc

Re: AL-Script::Frage: Daten in globalen Variablen oder in Plugin.Data speichern?

Post by JSDD »

Saburac wrote:... wo legt Ihr die Einstellungen für ein AL-Script ab? Direkt in den Plugin-Daten oder in separaten globalen Variablen?
... ich persönlich pack gern alles in 1 array, dass global gespeichert wird
... ist aber von typ zu typ unterschiedlich, richtig oder falsch gibts da nich' ^^

Saburac wrote:Könnte/Sollte ich diese Daten auch direkt in Plugin.Data ablegen? Was sind Vor- und Nachteile?
... pro / contra ?? ich kenn keine ... ist mMn nur ne sache des geschmacks
soweit ich weiß machen globale vars nur (performance-) probleme, wenn man die zu häufig im mission director nutzt (sagt zumindest ketraar)


kannst dir ja mal anschauen, wie ich soo von prinzip her ALPs gestalten würd:

Code: Select all

Script al.plugin.template.register
Version: 1
for Script Engine Version: 53
Description
--- AL PlugIn: Registration ---
Arguments

Source Text

001   
002   al engine: register script='al.plugin.template.events'
003   
004   return null
005   

Code: Select all

Script al.plugin.template.events
Version: 1
for Script Engine Version: 53
Description
--- AL PlugIn: Event Handler ---
Arguments

    1: Plugin.ID , Var/String , 'Plugin ID'
    2: Plugin.Event , Var/String , 'Plugin Event'

Source Text

001   
002   skip if is datatype[ $Plugin.Event ] == DATATYPE_STRING
003   |return null
004   
005   gosub Get.Constants
006   
007   $Plugin.ID = get script name
008   $Plugin.Data = get global variable: name=$Plugin.ID
009   $Script.Version = get script version
010   
011   
012   * ===========================================
013   if $Plugin.Event == $Event.Init OR $Plugin.Event == $Event.Reinit
014   |
015   |load text: id=$Page.ID
016   |
017   |if not is datatype[ $Plugin.Data ] == DATATYPE_ARRAY
018   ||$Plugin.Data = array alloc: size=10
019   ||set global variable: name=$Plugin.ID value=$Plugin.Data
020   ||$Plugin.Data[$Index.Name] = $Plugin.Name.Default
021   ||$Plugin.Data[$Index.State] = [FALSE]
022   ||$Plugin.Data[$Index.Version] = $Script.Version
023   ||$Plugin.Data[$Index.Timer] = 300
024   ||$Plugin.Timer = $Plugin.Data[$Index.Timer]
025   ||$Time.Next.Timer.Event = $Time + $Plugin.Timer
026   ||$Plugin.Data[$Index.Timer.Next] = $Time.Next.Timer.Event
027   * ... ggf sonstige dinge die man speichern will
028   |end
029   |
030   |$Plugin.Name = $Plugin.Data[$Index.Name]
031   |$Plugin.Timer = $Plugin.Data[$Index.Timer]
032   |al engine: set plugin $Plugin.ID description to $Plugin.Name
033   |al engine: set plugin $Plugin.ID timer interval to $Plugin.Timer s
034   |
035   |gosub Updates
036   |gosub Init.Event
037   |
038   else if $Plugin.Event == $Event.Start OR $Plugin.Event == $Event.Stop
039   |
040   |goto label Setup.Menu
041   |
042   else if $Plugin.Event == $Event.Isenabled
043   |
044   |$Plugin.State = $Plugin.Data[$Index.State]
045   |return $Plugin.State
046   |
047   else if $Plugin.Event == $Event.Timer
048   |
049   |$Plugin.Timer = $Plugin.Data[$Index.Timer]
050   |$Time.Next.Timer.Event = $Time + $Plugin.Timer
051   |$Plugin.Data[$Index.Timer.Next] = $Time.Next.Timer.Event
052   |
053   |do if $Plugin.Data[$Index.State]
054   ||gosub Timer.Event
055   |
056   end
057   * ===========================================
058   
059   return null
060   
061   
062   
063   * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
064   
065   Get.Constants:
066   
067   $Null = null
068   
069   $Page.ID = 1234
070   
071   * zur ausgabe von informationen ins verzeichnis ".../Dokumente/Egosoft/12345.txt"
072   $Log.File = 12345
073   
074   $Event.Init = 'init'
075   $Event.Reinit = 'reinit'
076   $Event.Start = 'start'
077   $Event.Stop = 'stop'
078   $Event.Isenabled = 'isenabled'
079   $Event.Timer = 'timer'
080   
081   $Index.Name = 0
082   $Index.State = 1
083   $Index.Version = 2
084   $Index.Timer = 3
085   $Index.Timer.Next = 4
086   
087   $Plugin.Name.Default = 'TEMPLATE AL PLUGIN'
088   
089   $Time = playing time
090   
091   endsub
092   
093   * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
094   
095   
096   
097   * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
098   
099   Updates:
100   
101   $Script.Version.Saved = $Plugin.Data[$Index.Version]
102   skip if $Script.Version > $Script.Version.Saved
103   |endsub
104   
105   START speak text: page=13 id=1332 priority=99
106   
107   * ... updates kommen hier hin, damit kann man vorherige versionen korrigieren
108   
109   
110   
111   
112   
113   
114   
115   endsub
116   
117   * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
118   
119   
120   
121   * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
122   
123   Setup.Menu:
124   
125   * menue vorbereiten
126   skip if is datatype[ $Menu ] == DATATYPE_ARRAY
127   |$Menu = create custom menu array
128   
129   resize array $Menu to 0
130   
131   $Text.1 = 'AL Plugin Einstellungen'
132   add custom menu heading to array $Menu: title=$Text.1
133   
134   * menue kleiner halten, dass es nicht bis ganz nach unten geht
135   set menu option: $Menu, maximum menu height=27 lines
136   
137   
138   * menue punkt zum veraendern des al plugin name
139   $Text.1 = 'Name'
140   $Plugin.Name = $Plugin.Data[$Index.Name]
141   $Text.1 = create text for custom menu, left=$Text.1, right=$Plugin.Name
142   add custom menu item to array $Menu: text=$Text.1 returnvalue='RENAME'
143   
144   
145   * menue punkt zum starten / stoppen des al plugins
146   $Text.1 = 'Status'
147   $Text.2 = 'eingeschaltet'
148   skip if $Plugin.Data[$Index.State]
149   |$Text.2 = 'ausgeschaltet'
150   $Text.1 = create text for custom menu, left=$Text.1, right=$Text.2
151   add custom menu item to array $Menu: text=$Text.1 returnvalue='ON_OFF'
152   
153   
154   * menue punkt zum veraendern des al plugin timers
155   $Text.1 = 'AL Timer'
156   $Plugin.Timer = $Plugin.Data[$Index.Timer]
157   $Text.2 = format time: $Plugin.Timer
158   $Text.1 = create text for custom menu, left=$Text.1, right=$Text.2
159   add custom menu item to array $Menu: text=$Text.1 returnvalue='TIMER'
160   
161   
162   * menue punkt zur info wan der naechste timer event kommt
163   $Text.1 = 'verbleibende Zeit'
164   $Time = playing time
165   $Time.Next.Timer.Event = $Plugin.Data[$Index.Timer.Next]
166   $Time.Next.Timer.Event = $Time.Next.Timer.Event - $Time
167   $Text.2 = format time: $Time.Next.Timer.Event
168   $Text.1 = create text for custom menu, left=$Text.1, right=$Text.2
169   add custom menu item to array $Menu: text=$Text.1 returnvalue=null
170   
171   
172   * sonstige menue punkte ... hier
173   
174   
175   * menue anzeigen ...
176   $Text.1 = $Plugin.Name
177   $Text.2 = sprintf: fmt='%s', [PLAYERSHIP], null, null, null, null
178   $Return = open custom menu: title=$Text.1 description=$Text.2 option array=$Menu
179   
180   
181   * menue handling ...
182   if $Return == -1 OR $Return == null
183   |return null
184   |
185   else if $Return == 'RENAME'
186   |$Text.1 = 'Neuer Name eingeben:'
187   |$Plugin.Name = [PLAYERSHIP] -> get user input: type=String, title=$Text.1
188   |if is datatype[ $Plugin.Name ] == DATATYPE_STRING
189   ||$Text.1 = $Plugin.Name
190   ||while get length of string $Text.1
191   |||$Text.2 = get substring of $Text.1 offset=0 length=1
192   |||skip if $Text.2 == ' '
193   ||||break
194   |||$Text.2 = get length of string $Text.1
195   |||dec $Text.2 = 
196   |||$Text.1 = get substring of $Text.1 offset=1 length=$Text.2
197   ||end
198   ||if get length of string $Text.1
199   |||$Plugin.Data[$Index.Name] = $Plugin.Name
200   |||al engine: set plugin $Plugin.ID description to $Plugin.Name
201   ||else
202   |||$Text.1 = 'AL Plugin Name muss erkennbar sein!'
203   |||display subtitle text: text=$Text.1 duration=5000 ms
204   ||end
205   |end
206   |
207   else if $Return == 'ON_OFF'
208   |if $Plugin.Data[$Index.State]
209   ||$Plugin.Data[$Index.State] = [FALSE]
210   ||$Text.2 = 'ausgeschaltet'
211   |else
212   ||$Plugin.Data[$Index.State] = [TRUE]
213   ||$Text.2 = 'eingeschaltet'
214   |end
215   |$Text.1 = $Plugin.Name + ' ' + $Text.2
216   |display subtitle text: text=$Text.1 duration=5000 ms
217   |
218   else if $Return == 'TIMER'
219   |$Text.1 = 'Timer in Sekunden eingeben:'
220   |$Plugin.Timer = [PLAYERSHIP] -> get user input: type=Number, title=$Text.1
221   |if is datatype[ $Plugin.Timer ] == DATATYPE_INT
222   ||if $Plugin.Timer >= 60
223   |||$Plugin.Data[$Index.Timer] = $Plugin.Timer
224   |||al engine: set plugin $Plugin.ID timer interval to $Plugin.Timer s
225   ||else
226   |||$Text.1 = 'Timer muss mindestens 60 Sekunden sein!'
227   |||display subtitle text: text=$Text.1 duration=5000 ms
228   ||end
229   |end
230   |
231   else if $Return == '... whatever'
232   * ... hier kann man das menue handling beliebig erweitern
233   |
234   |
235   end
236   
237   goto label Setup.Menu
238   
239   * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
240   
241   
242   
243   * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
244   
245   Init.Event:
246   
247   * ... zum einbinden von kommandos
248   
249   
250   
251   
252   
253   endsub
254   
255   * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
256   
257   
258   
259   * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
260   
261   Timer.Event:
262   
263   * ... sobald der timer abgelaufen ist, wird dies ausgefuehrt (wenn AL enabled)
264   
265   
266   
267   
268   
269   
270   endsub
271   
272   * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
273   
274   
275   return null
276   
=> das "gute" an der geschichte ist, dass man so alles via menü ändern kann & einstellungen "on-the-fly" übernommen werden, ggf reparaturen im update-abschnitt um z.B das array mit neuen daten zu erweitern ;)

=> auch kann man nachträglich n menüpunkt zum löschen des plugins einbauen

=> das datenarray kann ebenso später erweitert werden
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele
Saburac
Posts: 15
Joined: Thu, 11. May 06, 23:59
x3tc

Post by Saburac »

Dank Euch für die Antworten.

Habe die separaten gV verworfen und verwalte jetzt alle Daten in dem Plugin-Array.
Jetzt muss ich nur noch das Menü zum Laufen bekommen. Ach ja, und die Statistik.

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