Difference between revisions of "Using SDL States"

(conditional objects added)
m (Global Python Scripts: Add link to Global Python Scripts page.)
 
(7 intermediate revisions by 2 users not shown)
Line 1: Line 1:
If it is simply a state you want to save then you do not have to add anything in Blender. It is just Python and SDL. The SDL file for an on/off state would look something like this.
+
== Boolean SDL state ==
  
STATEDESC MyAge
+
If it is simply a state you want to save then you do not have to add anything in Blender. It is just Python and [[SDL|SDL (State Description Language)]]. The SDL file for an on/off state would look something like this.
{
+
 
 +
<pre>
 +
STATEDESC MyAge
 +
{
 
     VERSION 1  
 
     VERSION 1  
 
     VAR BOOL    MyState[1]  DEFAULT=0
 
     VAR BOOL    MyState[1]  DEFAULT=0
}
+
}
 +
</pre>
  
 
DEFAULT=0 will set the variable to 0 when the age is visited for the first time.  Note: "MyAge" should be changed to match the name of your age.  Also, the SDL file should be named MyAge.sdl and placed in the SDL folder; use PlasmaShop to create and edit SDL files.
 
DEFAULT=0 will set the variable to 0 when the age is visited for the first time.  Note: "MyAge" should be changed to match the name of your age.  Also, the SDL file should be named MyAge.sdl and placed in the SDL folder; use PlasmaShop to create and edit SDL files.
Line 38: Line 42:
  
  
== Conditional Objects ==
+
== Global Python Scripts ==
  
This is a special type of SDL which automatically shows or hides an object as your age loads. If the SDL state changes the visibility of the object will immediately conform to it. And the best thing is that you don't have to program anything but the SDL change.
+
Cyan has made [[Global Python Scripts]] for several frequently used SDL functions. The advantage of global scripts is that you do not have to write a new Python script for every new age. We can also make use of that advantage.
  
This is the AlcScript to make an object conditional.
+
And to make things even easier PyPRP has a few QuickScripts which are designed to call global Python scripts. See [[QuickScripts#SDL BoolShowHide|SDL BoolShowHide]], [[QuickScripts#SDL RandomBool|SDL RandomBool]] and [[QuickScripts#SDL IntActEnabler|SDL IntActEnabler]]. More SDL QuickScripts may be added in the future.
 
+
<pre>
+
MyObject:
+
    quickscript:
+
        sdl:
+
            type: boolshowhide
+
</pre>
+
 
+
Note that this will automatically create a reference to an SDL variable <object name>Vis. So for the above example your SDL file would look like this.
+
 
+
<pre>
+
#==============================================================
+
# READ: When modifying an SDL record, do *not* modify the
+
# existing record. You must copy and paste a new version
+
# below the current one and make your changes there.
+
#==============================================================
+
 
+
#
+
# State Description Language for MyAge
+
 
+
STATEDESC MyAge
+
{
+
VERSION 1
+
+
VAR BOOL    MyObjectVis[1]    DEFAULT=1 DEFAULTOPTION=VAULT
+
 
+
}
+
</pre>
+

Latest revision as of 23:59, 16 June 2018

Boolean SDL state

If it is simply a state you want to save then you do not have to add anything in Blender. It is just Python and SDL (State Description Language). The SDL file for an on/off state would look something like this.

STATEDESC MyAge
{
    VERSION 1 
    VAR BOOL    MyState[1]   DEFAULT=0
}

DEFAULT=0 will set the variable to 0 when the age is visited for the first time. Note: "MyAge" should be changed to match the name of your age. Also, the SDL file should be named MyAge.sdl and placed in the SDL folder; use PlasmaShop to create and edit SDL files.

Reading an SDL with Python:

           ageSDL = PtGetAgeSDL()
           getSDL = ageSDL['MyState'][0]

Changing an SDL with Python:

           ageSDL = PtGetAgeSDL()
           ageSDL['MyState'] = (1,)


To allow your Python object (or plModifier) to be notified upon any changes in the SDL, you'll need to first initialize the SDL variable within the OnServerInitComplete() method:

           sdl = PtGetAgeSDL()
           sdl.setFlags('MyState', 1, 1)
           sdl.sendToClients('MyState')
           sdl.setNotify(self.key, 'MyState', 0.0)

Then the plModifier's OnSDLNotify() method will be triggered when the variable changes. Here's some sample code to detect a change:

   def OnSDLNotify(self, VARname, SDLname, playerID, tag):
       if (SDLname != "MyAge"):
           print 'SDLname =',SDLname,', not MyAge'
           pass
       elif (VARname == "MyState"):
           ageSDL = PtGetAgeSDL()
           getSDL = ageSDL[VARname][0]


Global Python Scripts

Cyan has made Global Python Scripts for several frequently used SDL functions. The advantage of global scripts is that you do not have to write a new Python script for every new age. We can also make use of that advantage.

And to make things even easier PyPRP has a few QuickScripts which are designed to call global Python scripts. See SDL BoolShowHide, SDL RandomBool and SDL IntActEnabler. More SDL QuickScripts may be added in the future.