Hello fellow scirra members.
I am preparing for the alpha release of the 'S' plugin.
The purpose of this thread will be to explain what the S plugin actually is, and to serve as an on-going tutorial. The exact order of the tutorials hasn't been decided, so feel free to weigh in on what needs teaching, and I will try to plan out the next tutorial based on demand. This first tutorial will primarily explain the theory and purpose of S, and only briefly introduce some of the syntax. Future tutorials will give more concrete examples, and eventually walk through the creation of more complex projects. The plugin itself will not be released until the 2nd or 3rd tutorial, as it essentially useless without some background information.
For starters though, we will look into what the S plugin is, and what it can be used for.
click here to download the previous version of s (until I update the tutorials, use this for the everything before the level editor tutorial)
click here to get the newest version, use this for the level editor on. I know this is messy. I will update the earlier tutorials when I get a chance
extract the rar into your construct folder.
<img src="http://dl.getdropbox.com/u/1013446/s/s.png">
This symbol will be at the beginning of each tutorial in this thread so you can easily find them and go back to them.
S stands for superstructure, or systemplus. it is shortened to 's' to require the minimum amount of typing when invoking expressions. also, s happens to be the first letter in two of it's major functions.
We will first go over what a superstructure is.
A superstructure is a named container which can contain named arrays of 5 different types of data. Strings, Numbers, Objects, Object Types, and other superstructures.
<img src="http://dl.getdropbox.com/u/1013446/s/basictypes.png">
in s you can create variables of any of the following types:
- strings - store text, like names of characters or items, players, or dialogue.
- numbers - store floating point or integer values, like hitpoints, or x and y positions
- objects - store references to construct objects. a construct object would be like the player sprite in your game, or a text object on the top of the screen that displays the current score. You can use these references to gather information from objects, and to control objects. For instance, you can find out the x and y coordinate of an object, or pick an object so you can change it's position. This is only a reference, however, not the object itself, so more than one object variable can refer to the same object, and destroying an object variable or reassigning it to another object doesn't affect the object itself.
- objecttypes - stores a reference to construct object types. while an object variable refers to an actual object, the object type variable refers to the type of an object as distinct from an actual instance of that object. If you destroy a sprite at start of layout, even though there are no sprites you can create an object of type sprite. You can check if there were any collisions with an object of type sprite, even if there on are sprites on your layout. ObjectType variables can be used anyway you'd normally use a dropdown box to select a type in construct, like creating a new object, or checking for collisions.
with s you can create any number of named variables of any of these types. such as a number called "hitpoints", or a string called "name", an object reference called "currenttarget", or an objecttype reference called "enemyspecies"
remember that these are all variables, so any value, including the object and objecttype variables can be changed at any time.
most of us our familiar with the idea of a string or number variable and their various uses. So let's explore the possible uses of objects and objecttypes.
I will only give one possible scenario for each for now, but their possible uses are as diverse as strings and numbers, if not more so. One could create a "currenttarget" object variable that could be used to store the current target for an ai enemy for instance. the enemy could be made to chase this object, you could pick this particular object and check for collisions, you could change targets arbitrarily, or you could recall this object at any time, even if it is not in any particular pickable situation.
one example of a usage for an objtype variable is to store the type of a currently equipped throwable weapon.
one could make an objecttype variable "throwweapon"
when it was time to throw a grenade, a boomerang, a bomb, or a knife, you could use the same code to Create New Object, and just insert the variable type in place of a particular type. it wouldn't matter if they were all of the same type (like a sprite, or an xaudio2 object, or what behaviors they had applied to them, etc. You could use one single action to spawn whichever type was stored in an objecttype variable
there are many other scenarios where these new types of variable could be useful, but we'll move on to specific application after we've covered all of the basics.
next we will explore the concept of arrays:
in s, when you create a single variable, you are actually creating a container for that variable type.
The container consists of a name, a default value, the variable itself. for instance:
<img src="http://dl.getdropbox.com/u/1013446/s/singlestring.png">
so here we have a string container called "username" with a default value of "player", and the actual string value stored in the variable. However, each named container in 's' can contain any number of values referenced by numerical index:
<img src="http://dl.getdropbox.com/u/1013446/s/stringarray.png">
they can be accessed and treated as single values. if you specify no index, the first value is accessed. if you try to access an index greater than the size of the array, the default value is returned. Also if try to set the 30th value of your array, without having 1 through 29 added yet, 1 through 29 will be created and set to the default. Remember, it is perfectly acceptable to create a string container to hold a single value. the concept of an array only comes in if you need that container to hold more than one value.
You can create arrays of strings, numbers, objects, objecttypes, and supers.
Now to explain the super, or superstructure.
a superstructure is a data structure that can hold any number of any of these named array containers, including named containers for arrays of supers:
<img src="http://dl.getdropbox.com/u/1013446/s/super.png">
a super is designed to as a completely customizable conceptual object. You can organize data an objects in a meaningful way. The entire collection of containers and data structures you create is actually contained in one 'master' super.
for example:
one my conceive of something called a "party"(a super), which has a "name" (string), a "rating" (number), and contains an array of "party members" (array of supers). Each "party member" has "hitpoints"(number), a "name"(string), an "inventory"(array of object types),"armor"(super), and a "weapon"(super). Each "weapon" consists of "strength"(number), "name"(string),and a "sprite"(object).
S uses a special array notation to navigate and access your structures
it is necessary to understand this notation before moving on to actions, and expressions
{""}[/code:17pu5r54]
this is an empty address
[code:17pu5r54]{"party"}[/code:17pu5r54]
the address of the "party" super in the above example
[code:17pu5r54]{"party","name"}[/code:17pu5r54]
the address of the "name" string of the "party"
[code:17pu5r54]{"party","party member"}[/code:17pu5r54]
the address of the first "party member" in "party"
[code:17pu5r54]{"party","party member",0}[/code:17pu5r54]
this statement is equivalent to the statement above, any time you include a number in the array it refers to the index of the previous address component. This is a 0 index, so it begins on 0 instead of 1. 0 is assumed if an index is not provided, in this way, you can address singular variables the same as arrays (remember single variables are just arrays that contain only one member)
[code:17pu5r54]{"party","party member",3,"inventory",5}[/code:17pu5r54]
would refer to the 5th item in the "inventory" of the 3rd "party member" in "party"
In the next lesson, we will see an simple CAP example of how superstructures, and other arrays can be created and accessed. I will also release the plugin itself. Unfortunately I'm out of time for today, but tomorrow I will go over several examples of the applications of the superstructure system. Once the basic syntax and workflow are understood, it will be possible to easily create projects that would once have been extremely convoluted, and difficult to organize with traditional events and picking. A few simple examples would be the creation of a 3d object editor, or an AI that can prioritize tasks and targets.
I hope you all will forgive me for the mostly theoretical post. I had anticipated getting far enough to actually release the plugin itself. Unfortunately, I've run out of time and I must get to bed soon. Please bear with me long enough to see what this thing can do
see you tomorrow