---------------------------------------------
Hier mal ne kurze und grobe Beschreibung:
- AL Plugins werden über "init" Skripte mit Namen "!al.plugin.*" oder
"al.plugin.*" ins Spiel eingebunden (Theoretisch liese sich das aber
auch über andere beliebige Skripte erledigen). Diese Skripte werden bei
einem neuen Spiel oder beim Laden eines Savegames ausgeführt.
- Ein AL Plugin wird durch das Command "al plugin: register script"
registriert. Das Plugin wird dabei durch einen Skriptnamen
identifiziert, der Skriptname ist hier also die ID des Plugins.
Code: Select all
001 al engine: register script='al.control.pirat.tl.fill.ph'
002 al engine: register script='al.control.pirat.all.race.m'
003 al engine: register script='al.control.pirat.xenons'
004 al engine: register script='al.control.pirat.all.race.ts'
005 al engine: register script='al.control.pirat.sector.ap'
006 return null
Code: Select all
Script al.control.pirat.sector.ap
Version: 0
for Script Engine Version: 25
Arguments
1: plugin.ID , Var/String , 'plugin ID'
2: plugin.event , Var/String , 'plugin mode'
Source Text
001 $plugin.data = get global variable: name=$plugin.ID
002 $maxships = 2
003 if not $plugin.data
004 $plugin.data = array alloc: size=2
005 set global variable: name=$plugin.ID value=$plugin.data
006 $plugin.data[0] = 0
007 $temp = array alloc: size=$maxships
008 $plugin.data[1] = $temp
009 end
010
011 if $plugin.event == 'init' OR $plugin.event == 'reinit'
012 *$decr = sprintf: pageid=943 textid=1005, null, null, null, null, null
013 al engine: set plugin $plugin.ID description to 'my pirat script'
014 $interval = random value from 100 to 200 - 1
015 al engine: set plugin $plugin.ID timer interval to $interval s
016 return null
017 else if $plugin.event == 'start'
018 $plugin.data[0] = [TRUE]
019 else if $plugin.event == 'stop'
020 $plugin.data[0] = [FALSE]
021 else if $plugin.event == 'isenabled'
022 $on = $plugin.data[0]
023 return $on
024 else if $plugin.event == 'timer'
025 @ = [THIS] -> call script 'al.pirat.sector.ap' : plugin.data=$plugin.data maxships=$maxships Target Sector=LooManckStrats Vermächtnis
026 end
027 return null
Dafür wird einfach das registrierte Plugin-Skript mit Parametern aufgerufen:
<PluginID=PluginScriptName> <event>
Code: Select all
Script al.control.pirat.sector.ap
Version: 0
for Script Engine Version: 25
Arguments
1: plugin.ID , Var/String , 'plugin ID'
2: plugin.event , Var/String , 'plugin mode'
- Nach dem Ausführen der al.plugin.* werden die registrierten Plugins
einmal mit folgenden String-Parametern aufgerufen:
<PluginID=PluginScriptName> <init> bei neuem Spiel
<PluginID=PluginScriptName> <reinit> nach Save laden
Code: Select all
011 if $plugin.event == 'init' OR $plugin.event == 'reinit'
- Die AL Engine hält intern nur einen einzigen Statuswert pro Plugin.
Und das ist ein Timerinterval. Falls dieses Interval > 0 ist, wird nach
jedem Ablauf des Intervals das Plugin-Skript mit String-Parametern:
<PluginID=PluginScriptName> <timer>
aufgerufen. Das Timer-Interval kann durch das Command "al plugin: set
timer interval" gesetzt werden.
Code: Select all
014 $interval = random value from 100 to 200 - 1
015 al engine: set plugin $plugin.ID timer interval to $interval s
angegeben werden. Erscheint dann im Manage AL Plugin Menü.
Code: Select all
012 *$decr = sprintf: pageid=943 textid=1005, null, null, null, null, null
013 al engine: set plugin $plugin.ID description to 'my pirat script'
Event gesetzt.
- Die Events <start> und <stop> werden über das AL Menü ausgelöst.
Code: Select all
017 else if $plugin.event == 'start'
018 $plugin.data[0] = [TRUE]
019 else if $plugin.event == 'stop'
020 $plugin.data[0] = [FALSE]
gestoppt oder gestartet ist. Der <isenabled> Event muß TRUE (gestartet)
oder FALSE zurückgeben.
Code: Select all
021 else if $plugin.event == 'isenabled'
022 $on = $plugin.data[0]
023 return $on
sein, das pro Plugin eine globale Variable existiert, in der die
Statusinfos über ein Array gespeichert sind. Dieses Array kann z.b. so
aufgebaut sein:
0: Datenstruktur-Versionsinformation
1: Plugin State (enabled/disabled)
2: zusätzliche State Daten....
3: ...
Genaueres könnt ihr euch mal in den beigefügten AL Scripts ankucken.
Dadurch das die AL Engine nun das looping fürs Plugin übernimmt, kann
fast problemlos das Plugin "gepatcht" werden. Denn bei jedem neuen
TimerEvent wird die aktuellste Scriptversion verwendet. Das Plugin muß
dann natürlich sicherstellen, das es mit noch alten State-Daten umgehen
kann bzw. muß diese Updaten. Dafür kann man z.b. so eine
Datenstruktur-Versionsinformation im State-Array verwenden.
Ein normaler AL Plugin Arbeitsablauf sieht dann so aus:
1. AL Engine: al.plugin.test
2. al.plugin.test: register script=al.test
3. AL Engine: sende Event <init> (also rufe Skript al.test auf mit
Parametern: "al.test" "init"
4. al.test: Reaktion auf "init": setze Timerinterval und Beschreibung,
initialisiere State-Array und in globaler Variable (Name = PluginID =
PluginScriptName) festhalten.
5. AL Engine: wartet bis gesetztes Timerinterval abgelaufen ist und
sendet dann den Event <timer>.
6. al.test: erkennt <timer> Event und tut irgendwas
7. al erkennt nicht ob das script ausgeführt werden darf

8. weiter mit 5)
BalaGi, Kingdoms End, 28.03.2004