OpenSpace
Persistent Real-Time Strategy Space Game
Hosted by SourceForge
openspace project page

Scripts
All objects will consist of an object description to define its shape and features, and default functions written in a scripting language. The player is able to modify or add new strategic functions to any object to make it 'smarter'. Ships can be made to react to changes from other ships. If you have ships in a formation and one is destroyed then the remaining ships can change formation or compensate for the missing ship. If sensors pick up a ship at warp then SDF generators can activate and knock it out of warp. Ships can be dispatched to destroy detected ships. Shipyards can keep building new ships if you have the resources or they can only build each time a ship is lost.

The scripting language will be very easy to use and anyone should be able to learn it rather quickly.

Scripts can be downloaded from the internet and loaded into the client. Players can also pass scripts to each other in the game.

The following basic language commands, object functions and events are NOT complete lists. If you have ideas for more commands/functions then please email me.

Basic Language Commands

DEFINE function_name (parameters...) (statement) create function. only used in the script editor or in imported scripts. can not be used in functions or on the command line.
WHEN event (object.function p... ) when object receives event process function.
ORDER (object.function p...) set primary task for object, returns to this function after being interrupted by events.
HALT object remove an object's primary task. not sure if this is needed.
GVAR variable create a variable global to all functions. can not be used inside functions.
SET variable (statement) assign value returned from statement to variable

Function Control Commands

LVAR variable create a variable local to the function
WAITUNTIL event pause function until object receives event
IF (condition) (statement1) (statement2) if condition is true then process statement1 otherwise process statement2
DOWHILE (statement) (condition) process statement once, repeat while condition is true
WHILE (condition) (statement) process statement while condition is true
REPEAT used inside a function, processes function again
WHEN object event function when object received event process function
WAIT seconds suspend function for seconds

Math Functions

RANDOM return a random number
ADD var/num var/num ... add multiple variables or numbers and return the result
SUB var/num var2/num2 subtract var2/num2 from var/num and return result
MUL var/num var/num ... multiply multiple variables or numbers and return result
DIV var/num var2/num2 divide var/num by var2/num2 and return result
NEG num return two's complement of number
ABS num return absolute value of number

Object Functions: all objects

SELFDESTRUCT detonates the object and inflicts damage on any objects within the blast radius.
GIVE resources give resources to the ship currently docked with. destination ship will only take what it can hold, if resources exceeds this then they will remain in the source ship. if zero then it will fill the object up.
DISTRESS send a distress call to all players within range of ship. other players can have triggers to respond to distress calls and help out. helping players in distress is a good way to make allies.
MESSAGE player/group/allies "message" send a message to the player, another player, a group of players or allies.
NEAR distance object returns true if the object is less than distance away.
DISTANCE object returns the distance to object.
SCAN on/off enable/disable active sensors. gives away position when on.

Object Functions: all mobile objects

TURN relative_degrees turn the object relative to its current heading. consumes fuel while turning.
SETHEADING absolute_degrees turn the object to the absolute heading. consumes fuel while turning.
SETDEST x y set destination coordinates.
SETDISTANCE distance set distance before STOP command is issued. the object will not stop instantaneously so distance needs to account for decceleration. if zero then object will not stop until ordered.
SETVELOCITY velocity set velocity of object. object will begin moving and will consume fuel until velocity is reached.
GOTO x y velocity sets velocity and calculates distance to x,y. consumes fuel until velocity is reached.
STOP slow object to a complete stop. object will consume fuel while stopping. if object runs out of fuel it will be unable to stop.
SCOUT fly around and scan region.
FOLLOW object follow an object.
PATROL velocity point1 point2 ... patrol from current position to each point and back to current position. will attack any enemy ships if encountered and if the current object has weapons.
KAMIKAZE object move toward another object while increasing velocity and self destruct on collision.
DOCK object dock with another object.
FUELFOR velocity distance returns the amount of resources it takes to travel the distance.
FUELTO velocity returns the amount of resources it takes to go from current velocity to new velocity.
REFUEL get resources from docked object.

Object Functions: wormhole generators

ACTIVATE_WM opens wormhole and pushes docked object into it.

Object Functions: all objects with weapons

ATTACK object weapon level fires weapon at object. level is the strength of the weapon damage. If a MOVE order is given after an attack order then the ship will continue to attack while moving.
BLINDSHOT coordinates weapon level fires weapons at coordinates. same as ATTACK but useful for attacking cloaked objects.
STANDDOWN cancels an attack order.
GAURD stays at a stop unless an enemy ship is visible on short-range sensors.
HOLD will not move from current position. will return fire if attacked.
LAUNCH type coordinates must have a warp launcher, launch a probe/mine/etc to the given coordinates.

Object Functions: all objects with replicators

BUILD type build type of object. each object has a list of types it can build.
REPAIR object must have repair capabilities, begin repairs on object.

Object Functions: all mining objects

MINE object mine resources from another object.

Object Functions: all objects with tractor beam emitters

GRAB object grab object to hold in place or tow. the size of the object determines the power needed by the emitter. if the ship is not able to supply this power then the emitters will shutdown. to tow another ship there must be anough power for the engines and the emitters.

Object Functions: all objects with life support

COMMAND transfer command. if the command object is destroyed the player can no longer issue commands and the ships will carry on with current orders until destroyed. the player must start over if the command object is lost. objects must be docked.

Events

enemy_seen enemy is within sensor range of current object
attacked current object is attacked, does not send event if attacked by owner. object ID of attacking ship is sent with this event. object can return fire, send a distress signal, order other ships to attack, etc..
arrived current object has arrived at destination point. MOVE will wait on this event so it knows when to continue processing a function.
distress received by all objects in range. object ID is sent with this event.
dock_complete current object has completed dock with the other object. DOCK waits on this event before function continues.
docked current object has been docked by another ship.
out_of_fuel current object has run out of resources. send order to tanker or a ship in the area.

~ precedes current object variables
# precedes function parameter names
. variables in other objects can be accessed by placing a . between the object name and variable

Example Code

	DEFINE tanker_run1
	(warp_factor pick_up_point warpgate1 warpgate2 drop_off_point)
	(
		// tanker will pickup resources and take them to a
		// shipyard via a warpgate
		(DOCK #pick_up_point)
		(REFUEL)
		(DOCK #warpgate1)

		// fill up warp gate
		(GIVE (FUELTO #warp_factor #warpgate1.dest))

		// activate warp gate
		(WARP #warp_factor)
		(DOCK #drop_off_point)
		(GIVE (SUB ~fuel (ADD (FUELTO 0 #warpgate2)
				      (FUELTO #warp_factor #warpgate2.dest)
				      (FUELTO 0 #pick_up_point)
				 )))
		(DOCK #warpgate2)

		// fill up warp gate
		(GIVE (FUELTO #warp_factor #warpgate1.dest))

		// activate warp gate
		(WARP #warp_factor)
		REPEAT
	)