Script Object

From DF21 Wiki
Revision as of 23:54, 25 September 2025 by Jerethk (talk | contribs) (Enums)

The Script Object API enables manipulation of objects via ForceScript.

Naming of objects

TFE introduces the ability to name objects, so that they can be referenced by the scripting system. Names may be up to 32 characters and are case insensitive like sector names.

Objects are named in the .O file as shown here:

/* 006 SEWERBUG.WAX  */
CLASS: SPRITE  DATA:  3 X: 232.00 Y: 0.00  Z: 264.00 PCH: 0.00  YAW: 0.00  ROL: 0.00  DIFF: 1
 SEQ
  LOGIC:     SEWER1
  NAME: sewer-creature2
 SEQEND

/* 007 REMOTE.WAX    */
CLASS: SPRITE  DATA:  2 X: 280.00 Y: 0.00  Z: 232.00 PCH: 0.00  YAW: 0.00  ROL: 0.00  DIFF: 1
 SEQ
  LOGIC:     REMOTE
  NAME: cool-remote
 SEQEND

/* 008 MOUSEBOT.3DO  */
CLASS: 3D      DATA:  2 X: 256.00 Y: 0.00  Z: 232.00 PCH: 0.00  YAW: 0.00  ROL: 0.00  DIFF: 1
 SEQ
  LOGIC:     MOUSEBOT
  NAME: mouse4
 SEQEND

Getting objects by name

To get objects by their name, use the methods in the Level Script API.

  • getObject
  • getObjectsByName

Once an object has been gotten by name, the script can do things with it.

Example:

Object mb1 = level.getObject("mousebot1");

if (mb1.exists())
{
    // Get the mousebot's position and move it eastwards by 20 units
    float3 pos = mb1.position;
    mb1.position = { pos.x + 20, pos.y, pos.z };
}

Enums

Projectile enum

PROJ_PUNCH
PROJ_PISTOL_BOLT
PROJ_RIFLE_BOLT
PROJ_THERMAL_DET
PROJ_REPEATER
PROJ_PLASMA
PROJ_MORTAR
PROJ_LAND_MINE
PROJ_LAND_MINE_PROX
PROJ_LAND_MINE_PLACED
PROJ_CONCUSSION
PROJ_CANNON
PROJ_MISSILE
PROJ_TURRET_BOLT
PROJ_REMOTE_BOLT
PROJ_EXP_BARREL
PROJ_HOMING_MISSILE
PROJ_PROBE_PROJ
PROJ_BOBAFETT_BALL

LogicSound enum

SND_ALERT
SND_PAIN
SND_DIE
SND_ATTACK1
SND_ATTACK2

Object Properties

sector

  • Get only
  • Gets the object's current sector (Sector)
  • Usage example: Sector troopSector = my_trooper.sector

position

  • Get or set
  • Gets or sets the object's position (float3)
  • Usage example: move the object to coordinates x20, y80, z-350
myObj.position = {20, 80, -350};

yaw

  • Get or set
  • Gets or sets the object's yaw (float)
  • Usage example: myObj.yaw = 120.0;

radius

  • Get or set
  • Gets or sets the object's radius / world width (float)
  • Usage example: myObj.radius = 1.5;

worldWidth

  • Get or set
  • Gets or sets the object's radius / world width (float)
  • Usage example: myObj.worldWidth = 1.5; // this is the same as radius

height

  • Get or set
  • Gets or sets the object's height / world height (float)
  • Usage example: myObj.height = 9.5;

worldHeight

  • Get or set
  • Gets or sets the object's height / world height (float)
  • Usage example: myObj.worldHeight = 9.5; // this is the same as height

Object Methods

exists()

  • Returns true if the object exists, otherwise returns false
  • Usage example:
Object trooper = level.getObject("stormtrooper3");

if (trooper.exists())
{
   ...
   ...
}

Note: Scripting functions will internally do an exists check before being executed. Therefore it is not necessary for you to check that an object exists in ForceScript before calling methods on it. If you try to manipulate an object (eg. set its position) that doesn't exist, nothing will happen. If you get a property from a non-existent object, a default value will be returned (usually zero).

The exists() function in ForceScript enables you to check for an object's existence so that you can make your script logic conditional on an object's existence. For example, you may want your script to do something only if a certain enemy has been killed, or a certain item has been collected.

isPlayer()

  • returns true if the object is the player, otherwise returns false

matchPosition(Object)

  • moves the object to the same position as another object
  • usage example:
Object target = level.getObject("spirit7");
Object ds = level.getObject("deathstar_plans");

// move the death star plans to the same position as the spirit marker
ds.matchPosition(target);

matchPosition(string)

  • moves the object to the same position as another object by name
  • usage example:
// does the same as the above example, but uses the object's name
ds.matchPosition("spirit7");

delete()

  • Removes the object from the level
  • usage example: ewok2.delete();

addLogic(string)

  • Adds a logic to the object. Works with scenery, enemy logics, and pickup items. (Still to do: enable adding a custom logic.)
  • usage example:
// turn the table into scenery so it becomes breakable
table.addLogic("scenery");

// add Nava card logic to the object so it can now be picked up
navcard.addLogic("nava");

// add commando logic
com5.addLogic("commando");

setCamera()

  • Set the camera (EYE) to the object
  • Usage example:
Object cutsceneCam = level.getObject("camera9");
cutsceneCam.setCamera();

sendMessage(MessageType)

  • Sends a message to the object
  • Parameter: MessageType enum
  • Valid MessageTypes that can be sent to objects
    • WAKEUP - if the object has an AI logic, this message will change it from idle state to alerted state (does not work on bosses)
    • CRUSH - if the object has an AI logic, instantly kills it (does not work on bosses)

Usage example

// Alerts the gamorrean guard
Object gamor = level.getObject("gamguard");
gamor.sendMessage(WAKEUP);