Writing Script Objects

From The DarkMod Wiki
Revision as of 18:32, 6 November 2010 by Tels (talk | contribs) (add)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Introduction

A script object is an object that is written in the idTech4 scripting language, and an be attached to arbitrary entities. Each entity can have at most one script object.

An script object should have at least a definition, and one constructor. To prevent that inclusion of that script file defines the object twice, we also use "ifndef" and "define" to guard against this.

Here is an example:

#ifndef __NAME_HERE__
#define __NAME_HERE__

object the_script_object_name_here
{
    /**
    * Define a float variable that the script code can access. The "m_" prefix
    * will remind us that this is a member:
    **/
    float   m_updatePeriod;

    /**
    * Define the constructor, will be called automatically _once_:
    */
    void   init();

    /**
    * Optional: Define a routine that gets called when a savegame is loaded:
    */
    void   RestoreScriptObject();

    /**
    * Optional: Define a routine that can work periodically.
    */
    void   updateLoop();
};

// now define the routines and their code
void the_script_object_name_here::init()
{
    // print out that we are constructed for debuggin;
    sys.println ("the_script_object_name_here::init() called");

    // initialize our member from a spanwarg from the entity this
    // script object is attached to:
    m_updatePeriod = getFloatKey( "update_period" );

    // Done now. If you want to do some work be done periodically,
    // call it here once, and let it loop.
    updateLoop();
};

void the_script_object_name_here::RestoreScriptObject()
{
    // print out that we are constructed for debuggin;
    sys.println ("the_script_object_name_here::init() called");

    // We have to do nothing by default, everything is already restored
    // but if your script object plays some sounds, you might want to
    // restart them here.     
}

void the_script_object_name_here::RestoreScriptObject()
{
    // endless loop
    while (1)
    {

        // do something here

        // then wait the wanted time, and do it again:
        wait( m_updatePeriod );
    }
}

#endif // __NAME_HERE__

For a more complete example see script/tdm_location_settings.script.