PlotScripting Dictionary of Commands

This is a listing of all the plotscripting commands implemented as of August 03 2003.

In addition to reading this document, I also reccomend you check out Plotscripting Tutorial and the HamsterSpeak Specification


Commands by Category

Declarations
Wait Commands
Suspend and Resume
Moving Heros
Moving NPCs
Moving The Camera
Text Boxes
Triggering And Showing Stuff
Adding and Removing
Effects
Hero's Spells
Misc Functions
Tweaking Maps
Working with Tags
Working with Variables
Math, Comparison, and Logic Operators
Flow Control
Advanced Commands
Predefined Constants


Alphabetical Index

add hero (who)
advance text box
alter NPC (who,NPCstat,value)
autonumber
begin
camera follows hero (who)
camera follows NPC (who)
camera pixel X
camera pixel Y
can learn spell (hero,attack)
change NPC ID (reference,new ID)
check equipment (hero,slot)
check tag (tag)
create NPC (ID,X,Y,direction)
current map
current stat
days of play
decrement (variable,amount)
define constant (number,name)
define script (id,name,aruments)
delete hero (who)
delete item (item,number)
destroy NPC (reference)
dismount vehicle
equip where (hero,item)
fade screen in
fade screen out (red,green,blue)
fight formation (number)
find hero (who)
focus camera (x,y,speed)
for(counter,start,finish,step) do(commands)
force equip (hero,slot,item)
forget spell (hero,attack)
game over
get default weapon (hero)
get hero level (who)
get hero palette (who,type)
get hero picture (who,type)
get hero stat (who,stat,type)
get item (item,number)
get money (amount)
get NPC ID (reference)
global variable (id,name)
greyscale palette (first,last)
hero by rank (where)
hero by slot (where)
hero direction (who)
hero is walking (who)
hero pixel X (who)
hero pixel Y (who)
hero X (who)
hero Y (who)
hours of play
if(condition) then(commands) else(commands)
include, filename
increment (variable,amount)
inventory (item)
key is pressed (scancode)
knows spell (hero,attack)
leader
lock hero (who)
lose money (amount)
maximum stat
me
minutes of play
none
NPC at spot (x,y,number)
NPC copy count (ID)
NPC direction (who)
NPC is walking (who)
NPC pixel X (who)
NPC pixel Y (who)
NPC reference (ID,copy)
NPC X (who)
NPC Y (who)
number >> number
number >= number
number <> number
number << number
number <= number
loadtileset (set)
number * number
number + number
number -- number
number / number
number == number
number ^ power
number,mod,number
pan camera (direction,distance,pixelstep)
pay money (amount)
play song (song)
put camera (x,y)
put hero (who,x,y)
put npc (who,x,y)
random(lownumber, highnumber)
rank in caterpillar (who)
read color (index,element)
read global (id)
read map block (x,y)
read pass block (x,y)
read spell (hero,list,slot)
reset palette
resume box advance
resume caterpillar
resume hero walls
resume NPC walls
resume NPCs
resume obstruction
resume overlay
resume player
resume random enemys
return(value)
room in active party
script,name (statements)
set death script (id)
set default weapon (hero,item)
set hero direction (who,direction)
set hero frame (who,frame)
set hero palette (who,palette,type)
set hero picture (who,picture,type)
set hero position (who,X,Y)
set hero speed (who,speed)
set hero stat (who,stat,value,type)
set hero Z (who,Z)
set NPC direction (who,direction)
set NPC frame (who,frame)
set NPC position (who,X,Y)
set NPC speed (who,speed)
set tag (tag,value)
set variable (variable,value)
show backdrop (number)
show map
show no value
show text box (number)
show value (number)
stop song
suspend box advance
suspend caterpillar
suspend hero walls
suspend NPC walls
suspend NPCs
suspend obstruction
suspend overlay
suspend player
suspend random enemys
swap by name (name,name)
swap by position (position,position)
swap in hero (who)
swap out hero (who)
teach spell (hero,attack)
teleport to map (map,x,y)
tweak palette (red, green ,blue ,first,last)
unequip (hero,slot)
unlock hero (who)
update palette
use door (number)
Use NPC (who)
value,and,value
value,or,value
value,xor,value
variable (name)
wait (ticks)
wait for all
wait for camera
wait for hero (who)
wait for key (key)
wait for NPC (who)
wait for text box
walk hero (who,direction,distance)
walk hero to X (who,X)
walk hero to Y (who,Y)
walk NPC (who,direction,distance)
walk NPC to X (who,X)
walk NPC to Y (who,Y)
while(condition) do(commands)
write color (index,element,value)
write global (id,value)
write map block (x,y,value)
write pass block (x,y,value)
write spell (hero,list,slot,attack)


declarations

define script (id,name,aruments)
The define script command names a script, and associates it with an ID number. Every script must have a unique ID number for your game to call it directly (scripts that will only be called indirectly, by other scripts can use the special ID autonumber). The first argument is the ID number. It is a number between 1 and 16383. If you try to give two individual scripts the same ID number, your script file will not compile. The next argument is the name of the script. this is the same name that will used later in your script command. The third argument is the number of arguments that the script can accept. If it doesnt need any arguments (most scripts dont) then use none. If there are arguments, you then follow the argument count with default values for each argument.

 # example of a simple script definition
 define script (1,my first script,none)

 # example of a script definition with arguments. this script
 # has three arguments, all of which default to zero if they
 # are not specified
 define script (2,my fancy script,3,0,0,0)

script,name (statements)
script,name,argumentnames (statements)

the script command contains the actual source code of a plotscript. every script command must have a corresponding define script statement. Script starts with the keyword script, a comma, and then the name of the script. If there are any arguments to the script, you list their names separated by commas after the name of the script. Then comes the text of the script. It is usually enclosed in begin and end statements.

 # example of a simple script
 script,my first script,begin
   # commands go here
 end

 # example of a script with arguments
 script,my fancy script,fe,fi,fo,begin
   # commands go here,
   # and they can use the aruments fe, fi, and fo
   # that where passed to the script
 end

global variable (id,name)
Creates a global variable that can be used in any script. The first argument to the global variable declaration is a unique ID number. The second argument is the name of the variable. The ID number for a global variable is a number from 0 to 1024. Each global variable must have a unique number, but this number will not conflict with the ID numbers you use for scripts. It is allright to have a script and a global variable with the same ID number.
See also variable

# any script can read and set the value of a global,
global variable(1,mini game score)

variable (name)
Creates a local variable that can only be used inside the script where it was created. The value of this variable is lost when the script ends. If you need a variable who's value persists between calls to a script, or that is automatically saved when the player saves their game, you will need to use a global variable instead.

define constant (number,name)
Creates a global constant. The first argument is the number that the constant will represent, and the second argument is the name of the constant. Use constants to replace commonly used numbers with friendly names. The following constants have been delacred for you in PLOTSRC.HSD

zero one two three four five six seven eight nine ten false true off on north east south west up down left right upkey downkey leftkey rightkey usekey cancelkey menukey anykey me none autonumber currentstat maximumstat north wall east wall south wall west wall vehicle A vehicle B harm tile overhead tile

include, filename
The include command inserts another text file into your script. It is followed by a single filename that tells what file will be included. Windows long filenames are not supported.

Every plotscript file should start with include, plotscr.hsd The PLOTSCR.HSD file contains definitions and constants for most of the other plotscripting commands.


Wait Commands

wait (ticks)
Makes the script wait for the specified number of ticks. I havent timed how many ticks there are in a second, but I would guess roughly 15. If you leave out the argument, it will wait for one tick.

wait for text box
makes the script wait until there is no text box displaying on the screen. Useful to know when to move on after using a show text box command

wait for hero (who)
Waits for the specified hero stop walking. Use the constant me to refer to the leader, or use numbers 0,1,2,3 to refer to a specific hero. If you leave out the argument, the first hero will be assumed.

wait for key (key)
Waits for the player to press a key. You can use the follwing constants: any key, up key, down key, left key, right key, use key, cancel key, or menu key. If you do not specify, then any key will be used.

wait for NPC (who)
Waits for the specified NPC to stop walking. The argument is the number of the NPC, 0 to 35. If more than one copy of the NPC exists on the map, it only checks the first one.

wait for camera
Waits for the camera to stop moving after a pan camera or focus camera command.

wait for all
Waits for any camera motion to stop, waits for all heros to stop walking, and if suspend NPCs is active, waits for all NPCs to stop walking.


Suspend and Resume

suspend player
Blocks the player from controlling the game, so the plotscript can have exclusive control. The one exception to this is text boxes. The player can advance text boxes no matter what.

resume player
Restores normal control after a suspend player command. This is very important. If you use suspend player, but forget resume player, the game will be stuck after the script ends.

suspend NPCs
Stops NPCs from walking around automatically. When Suspend NPCs is run, all NPCs stop in their tracks, ready for you to control them with the walk NPC command

resume NPCs
Restores automatic NPC movement after a suspend NPCs command

suspend obstruction
Allows heros to walk through NPCs, allows NPCs to walk through heros, and allows NPCs to walk through each other. Use resume obstruction to restore normal obstruction behavior.

resume obstruction
Restores normal obstruction after a suspend obstruction command

suspend hero walls
Allows heros to walk through walls. Use resume hero walls to restore normal wall behavior.

resume hero walls
Restores normal wall behavior after a suspend hero walls command

suspend NPC walls
Allows NPCs to walk through walls. Use resume NPC walls to restore normal wall behavior.

resume NPC walls
Restores normal wall behavior after a suspend NPC walls command.

suspend caterpillar
Stops your other heros from following the leader. This is useful when you want to control them individually with walk hero commands. In earlier versions this was misspelled as suspend catapillar. The old spelling still works for backwards compatability.

resume caterpillar
Reverses the suspend caterpillar command, and makes your other heors follow the leader as normal. In earlier versions this was misspelled as resume catapillar. The old spelling still works for backwards compatability.

suspend random enemys
Prevents enemies from attacking your party while walking over tiles that can normally spawn random battles. This is useful to prevent battles from interrupting a plotscript.

resume random enemys
Undoes the suspend random enemys and allows random battles to occur as normal.

suspend box advance
Prevents the player from advancing or clearing text boxes by pressing keys. While this is active, the only way to make a text box advance is with the advance text box command. Be very careful with this command, since you do not want to leave the player stuck on a text box forever

resume box advance
Undoes the suspend box advance and allows the player to advance and clear text boxes by pressing keys as normal.

suspend overlay
Prevents overhead tiles from being drawn over heros and NPCs

resume overlay
Causes overhead tiles to be drawn over heros and NPCs as normal


Moving Heros

walk hero (who,direction,distance)
Makes the specified hero move in the specified direction for the specified number of tiles. The first argument tells who to move. Use me or numbers 0-3. The second argument is the direction. Use the constants: north, south, east, west, up, down, left, or right. The third argument is the number of tiles to move. If you leave out the third argument, the hero will move one tile. walk hero is usually used with the wait for hero command. You should normally use the suspend player command before moving heros, and if you want to move heros other than the leader, you should use the suspend caterpillar command.

set hero direction (who,direction)
Makes the specified hero face in the specified direction. The following constants are avaialable for direction: north, south, east, west, up, down, left, or right.

set hero frame (who,frame)
Sets the walking frame of the specified hero to 0 or 1.

set hero position (who,X,Y)
Instantly moves the specified hero to an X,Y position on the map. The coordinates are in units of tiles. For pixel-positioning use the put hero command.

set hero Z (who,Z)
Sets the Z location of the specified hero. The Z location is the number of pixels above the tile they are standing on. Useful for scripts where you want a hero to jump or levitate.

walk hero to X (who,X)
Makes the specified hero walk to a given X coordinate on the map

walk hero to Y (who,Y)
Makes the specified hero walk to a given Y coordinate on the map

set hero speed (who,speed)
Changes the walking speed of the specified hero. If you do not specify a speed, the hero's speed will return to the default, 4. Be careful with using speeds that do not divide evenly into 20, because tiles are 20 pixels in size, and an irregular walking speed may cause your hero to become misaligned with the tiles.

use door (number)
instantly uses the numbered door, just as if you had stepped into it.

teleport to map (map,x,y)
An alternative to use door, teleport to map moves you to a given x,y position on the specified map without the need to create a door-link on the map. Teleport to map does not fade to black.

dismount vehicle
Makes you dismount whatever vehicle you are riding. If you are not riding a vehicle, nothing will happen.

hero is walking (who)
Returns true if the specified hero (by position in the caterpillar) is currently walking. Returns false if the hero is standing still

put hero (who,x,y)
Moves a hero to a precise location on the map. The first argument is the hero's position in the walkabout party. The second and third arguments are the X,Y pixel position relative to the top left corner of the map. Be aware that using this command can mis-align your hero with the tile-grid, preventing it from walking normally. To position the hero by tile, use the set hero position command.


Moving NPCs

NPC reference (ID,copy)
What is an NPC reference? A reference is a number that uniquely identifies an NPC on a map. You can use an NPC reference to specify which NPC you are controlling in most NPC-related commands. The first argument to NPC reference is the ID number of the NPC you want to work with. The ID is the same number that appears in CUSTOM.EXE when you are editing NPCs or placing NPCs on the map. The second argument is optional. It specifies which copy of the NPC you want, in case there are more than one on the map. If you dont specify which copy you want, you will just get a reference to the first NPC on the map with the right ID. If you plan on using the same NPC reference many times in a script you can store it in a variable. If the NPC with the ID you asked for (or the NPC copy you asked for with ID you asked for) is not found on the map then NPC reference will return false (zero)

include,plotscr.hsd
define script(1,ref example,none)

#---NPC reference example---

script,ref example,begin

  variable(Fred)

  # find the first copy of NPC 10,
  # and store the reference in a variable
  set variable(Fred,NPC reference(10,0))

  # now we can manipulate that NPC with the variable
  walk NPC     (Fred,south,3)
  wait for NPC (Fred)

  # make the NPC spin!
  set NPC direction (Fred,east)  
  wait(2)
  set NPC direction (Fred,north)  
  wait(2)
  set NPC direction (Fred,west)  
  wait(2)
  set NPC direction (Fred,south)  
  wait(2)

end

See also NPC at spot and create NPC

NPC at spot (x,y,number)
This command returns a reference to the NPC at the given X and Y coordinate on the map. The optional third argument lets you choose which NPC to reference in case there is more than one NPC standing on that same spot. For more info about NPC references see NPC reference

walk NPC (who,direction,distance)
Makes the specified NPC move in the specified direction for the specified number of tiles. The first argument tells who to move. You can use an NPC reference or the NPC's ID number. The second argument is the direction. Use the constants: north, south, east, west, up, down, left, or right. The third argument is the number of tiles to move. If you leave out the third argument, the NPC will move one tile. walk NPC is usually used with the wait for NPC command. You should normally use the suspend NPCs command before moving NPCs to prevent their automatic movements from interfering with your scripted movements.

set NPC direction (who,direction)
Makes the specified NPC face in the specified direction. The following constants are avaialable for direction: north, south, east, west, up, down, left, or right. You can use either an NPC reference or the NPC's ID number to specify which NPC will turn.

set NPC frame (who,frame)
Sets the walking frame of the specified NPC to 0 or 1. You can use either an NPC reference or the NPC's ID number to specify which NPC will change.

set NPC position (who,X,Y)
Instantly moves the specified NPC to an X,Y position on the map. The coordinates are in units of tiles. You can use either an NPC reference or the NPC's ID number to specify which NPC will be moved.

walk NPC to X (who,X)
Makes the specified NPC walk to a given X coordinate on the map. You can use either an NPC reference or the NPC's ID number to specify which NPC will move.

walk NPC to Y (who,Y)
Makes the specified NPC walk to a given Y coordinate on the map. You can use either an NPC reference or the NPC's ID number to specify which NPC will move.

set NPC speed (who,speed)
Changes the walking speed of the specified NPC. If you do not specify a speed, the NPC's speed will return to the default, 4. Be careful with using speeds that do not divide evenly into 20, because tiles are 20 pixels in size, and an irregular walking speed may cause the NPC to become misaligned with the tiles.
Normally you would only give an NPC ID number to set NPC speed, but if you want to use an NPC reference it will still work. Just remember that set NPC speed changes every copy of the NPC on the map, not just the specific one you referenced.

NPC is walking (who)
Returns true if the specified NPC is currently walking. Returns false if the NPC is standing still. You can use either an NPC reference or the NPC's ID number to specify which NPC will be checked.

get NPC ID (reference)
This command is the opposite of NPC reference. If you give get NPC ID a reference to an NPC it will return the NPC's ID. This can be useful if you need to do an alter NPC or a set NPC speed on an NPC that you are working with by reference (remembering that those commands change every copy of an NPC on the map)

NPC copy count (ID)
This command tells you how many copys of a particular NPC ID exist on the map. This can be very useful if you want apply the same action to each copy of an NPC on the map. Here is an example

include,plotscr.hsd
define script(1,every NPC example,none)

#---NPC copy count example---

script,every NPC example,begin

  variable(loop,guard count,current guard)

  # the guard is NPC 10, and there are many copies of him on the map  
  set variable(guard count,NPC copy count(10))

  # this loop repeats once for each copy of NPC 10
  for(loop,0,guard count) do,begin

    set variable(current guard,NPC reference(10,loop))
    walk NPC(current guard,south,4)
    # if we added a "wait for NPC(current guard)" right here
    # then the guards would walk one t a time

  end

  # but we want them to all walk at the same time,
  # so we just wait here
  wait for all

end

change NPC ID (reference,new ID)
This command takes an NPC reference and lets you change the ID number of the NPC it points to. This means that the NPC will now use a different picture, an different palette, a different walking speed, an different text box, everything. This change is not permanent. It only lasts until the next time a map gets loaded.

create NPC (ID,X,Y,direction)
This command will magically create a new copy of an NPC with the given ID number. You can specify an X and Y position where it will be created, and optionally a direction too (if you leave out the direction, the new NPC will be facing south). create NPC returns an NPC reference that you can use to refer to the new NPC in other commands like walk NPC. If the new NPC cannot be created (there is a maximum of 300 total NPC copies in memory at a time) then create NPC will return false (zero). The new NPC is not permanent. It only lasts until a new map is loaded.

destroy NPC (reference)
This command will erase the specified NPC. You can use either an NPC reference or the NPC's ID number. The deletion is not permanent. Unless this is an NPC that you created with create NPC, the NPC will be back again next time the map gets loaded. If you need to permanently remove an NPC, use tags.

put npc (who,x,y)
Moves an NPC to a precise location on the map. The first argument is and NPC Reference or an NPC ID number. The second and third arguments are the X,Y pixel position relative to the top left corner of the map. Be aware that using this command can mis-align your NPC with the tile-grid, preventing it from walking normally. To position the NPC by tile, use the set NPC position command.


Moving the Camera

camera follows hero (who)
Normally, the camera follows your leader. With this command, you can make the camera follow any hero you want. If you leave out the argument, the camera will follow your leader as normal.

camera follows NPC (who)
With this command, you can make the camera follow an NPC instead of the hero. If more than one copy of the specified NPC exists, the camera will follow the first one. To revert the camera to normal, use camera follows hero.

pan camera (direction,distance,pixelstep)
This command causes the camera to stop following your leader and pan in the specified direction. For direction, you can use the constants: north, south, east, west, up, down, left, or right. The distance is the number of tiles you want the camera to move before it stops. You can also specify the number of pixels you want the camera to move for each tick. if you leave the last argument out, the camera will move by 2 pixels per tick. This command is normally used with wait for camera. To revert the camera to normal, use camera follows hero.

focus camera (x,y,speed)
This command causes the camera to focus itself on the specified X,Y coordinates of the map. These coordinates are in units of tiles. The third argument, the speed, tells how fast the camera will pan. If you do not specify a speed, the camera will pan 2 pixels per tick. This command is normally used with wait for camera. To revert the camera to normal, use camera follows hero.

put camera (x,y)
This command causes the top left corner of the camera to instantly jump to the specified X,Y pixel coordinates of the map. These coordinates are in units of pixels, not tiles. To position the camera by tiles, just multiply the tile position by 20. To revert the camera to normal, use camera follows hero.


Text Boxes

show text box (number)
Displays the numbered text box, just as if you had talked to an NPC. The text box will not actually pop up until the next wait command. This command is most often used with the wait for text box command.

advance text box
Advances a text box just as if the player had pressed a key. For use while suspend box advance is active.


Triggering and Showing Stuff

fight formation (number)
Starts a battle with the numbered enemy formation. This command returns false if you lost or ran from battle, or true if you won.

Use NPC (who)
Remotely trigger an NPC. You can use either an NPC reference or an NPC ID number. Whatever actions are associated with triggering that NPC will be taken, text box, script, vehicle, item, whatever.

game over
Resets the game and returns you to the title screen. This command is most useful for after-you-win-the-game type scripts, and for death-scripts that are triggered when you lose in battle.

show value (number)
Displays the number in the bottom left corner of the screen. Useful for count-down timers, and for debugging complicated scripts.

show no value
Gets rid of the number in the bottom left corner of the screen after a show value command.

show backdrop (number)
displays the specified full screen backdrop on the screen. This allows you to show full screen pictures without attaching them to text boxes. You can also do some simple animation effects by calling show backdrop many times with wait commands in between.

show map
shows the map again after a show backdrop command


Adding and Removing

get money (amount)
Adds the specified amount to your party's money

lose money (amount)
Subtracts the specified amount from your party's money.

pay money (amount)
A function that checks to see if you have enough money to pay the amount specified. If you do, it subtracts it, and returns true. If you do not have enough, it subtracts nothing, but returns false. Intended for use in if statements.

add hero (who)
Puts the named hero in your party. If there is no room, the hero will be added to your reserve. Use the constants defined in your HSI file. They are in the form of hero:name

delete hero (who)
Removes the named hero from your party. If you have more than one copy of the hero in your party, only the first one will be deleted. Use the constants defined in your HSI file. They are in the form of hero:name

swap in hero (who)
Moves the named hero in your from your reserves to your active party. If there is no room in your active party, the hero will not be moved. Use the constants defined in your HSI file. They are in the form of hero:name

swap out hero (who)
Moves the named hero from your active party into your reserve. Use the constants defined in your HSI file. They are in the form of hero:name

lock hero (who)
Locking a hero prevents the player from moving the hero on the party menu. Locked heros in the active party cannot be moved into the reserve, and locked heros in the reserve are completely hidden. Also prevents a hero from being moved by swap in hero or swap out hero. Use the constants defined in your HSI file. They are in the form of hero:name

unlock hero (who)
Reverses lock hero (who), and makes it possible to move a hero in and out of the active party again. Use the constants defined in your HSI file. They are in the form of hero:name

swap by name (name,name)
Swaps two named heros in your party no matter what position they are in. Use the names defined in your HSI file in the form hero:name

swap by position (position,position)
Swaps two heros in your party based on their positions in the party

get item (item,number)
Adds the specified number of the specified item to your inventory. If you do not specify a number, only one will be added. You can refer to the item by number, or you can use the constants defined in your HSI file, which are in the form of item:name

delete item (item,number)
Removes the specified number of the specified item from your inventory. If you do not specify a number, only one will be removed. You can refer to the item by number, or you can use the constants defined in your HSI file, which are in the form of item:name

unequip (hero,slot)
Removes the item that the specified hero has equipped in the specified slot. The first argument is the position of the hero in your party, 0-3 for the active party, 4-40 for the reserve. (use find hero if you want to refer to the hero by name). The second argument is the slot to unequip. Use the number 1-5 or the names slot:weapon, slot:armor, etc.

force equip (hero,slot,item)
Forces a hero to equip an item, even if it is not normally equipable. The first argument is the position of the hero in your party, 0-3 for the active party, 4-40 for the reserve. (use find hero if you want to refer to the hero by name). The second argument is the slot to equip. Use the number 1-5 or the names slot:weapon, slot:armor, etc. The third argument is the item to equip. you can use the item's number or the item:name constants from your .HSI file.

equip where (hero,item)
Returns the number of the slot that a hero can equip an item in, or false if the hero cannot equip it. The first argument is the position of the hero in your party, 0-3 for the active party, 4-40 for the reserve. (use find hero if you want to refer to the hero by name). The second argument is the item to check the equipability of. you can use the item's number or the item:name constants from your .HSI file.

check equipment (hero,slot)
Returns the number of the item that the specified hero has equipped in the specified slot, or -1 if there is nothing equipped there. The first argument is the position of the hero in your party, 0-3 for the active party, 4-40 for the reserve. (use find hero if you want to refer to the hero by name). The second argument is the slot to unequip. Use the number 1-5 or the names slot:weapon, slot:armor, etc.

get default weapon (hero)
Returns the number of the item that the specified hero uses as a default weapon when no other weapon is equipped. The argument is the position of the hero in your party, 0-3 for the active party, 4-40 for the reserve. (use find hero if you want to refer to the hero by name).

set default weapon (hero,item)
Changes the item that the specified hero uses as a default weapon when no other weapon is equipped. The first argument is the position of the hero in your party, 0-3 for the active party, 4-40 for the reserve. (use find hero if you want to refer to the hero by name). The second argument is the item to use as the new default weapon. you can use the item's number or the item:name constants from your .HSI file.


Effects

play song (song)
Plays the specified song. Use the constants defined in your HSI file. They appear in the form of song:name

stop song
Stops whatever music is currently playing.

set victory music
Changes the after-battle victory music to the specified song. Use the constants defined in your HSI file. They appear in the form of song:name

fade screen out (red,green,blue)
Fades the screen to a solid color. If you do not specify any arguments, the screen will fade to black. The red, gree, blue values are numbers from 0 to 63 that tell how bright that particular color should be. (63,0,0) would be blood red. (40,0,40) would be purple. (63,63,63) would be bright white. The screen will remain faded out until you run fade screen in, fight a battle, or use a door.

fade screen in
Fades the screen back to normal after a fade screen out command, or applys the changes made with other palette commands such as greyscale palette, tweak palette, reset palette, and write color.

update palette
Instantly returns from fade screen out, and applys changes made by other palette command such as greyscale palette, tweak palette, reset palette, and write color.

greyscale palette (first,last)
converts a section of the master palette from color to greyscale. The two arguments determine what range of colors will be affected. If called with no arguments, the entire palette is affected. Changes do not take effect until you call update palette or fade screen in. Changes to the master palette last as long as you are playing, but are not stored in saved-games. If you need to make master-palette changes persist in saved-games you will have to use the on-load plotscript trigger.

tweak palette (red, green ,blue ,first,last)
Color-Adjusts a section of the master palette. The first three arguments are the changes to make to the red, green, and blue values of each palette color. For example, tweak palette (20,-30,0) would redden everything, and drop out most of the green. The last two arguments determine what range of colors will be affected. If they are left out, the entire palette is affected. Changes do not take effect until you call update palette or fade screen in. Changes to the master palette last as long as you are playing, but are not stored in saved-games. If you need to make master-palette changes persist in saved-games you will have to use the on-load plotscript trigger.

reset palette
Releoads the default palette, undoing any changes you have made with other palette-altering commands such as tweak palette or greyscalepalette Changes do not take effect until you call update palette or fade screen in

read color (index,element)
Returns a color value from the master palette. The first argument is the index in the palette to read from, 0 to 255. The second argument is the color value to read, red, green, or blue. You can use 0,1, and 2, or you can use the predefined constants color:red, color:green, and color:blue. The counterpart to this is write color

write color (index,element,value)
Writes a color value into the master palette. The first argument is the index in the palette to write to, 0 to 255. The second argument is the color value to write, red, green, or blue. You can use 0,1, and 2, or you can use the predefined constants color:red, color:green, and color:blue. The third argument is the color value to write. It can be in the range of 0 to 63. Changes do not take effect until you call update palette or fade screen in The counterpart to this is read color. Changes to the master palette last as long as you are playing, but are not stored in saved-games. If you need to make master-palette changes persist in saved-games you will have to use the on-load plotscript trigger.


Hero's Spells

teach spell (hero,attack)
Tries to teach a hero a spell. The first argument is the hero's position in the party (as returned by find hero). The second argument is the attack to learn. You can use the names defined in your .HSI file in the form atk:attackname (You may also use the attack's ID number. This is the number you see in the attack editor + 1)
If the hero is capable of learning the spell, teach spell will return true, or if the hero cannot learn the spell it will return false. Note that this only works when a spell is set to "learned from item". it will not work for spells learned based on level.

forget spell (hero,attack)
Causes a hero to forget a spell. The first argument is the hero's position in the party (as returned by find hero). The second argument is the attack to forget. You can use the names defined in your .HSI file in the form atk:attackname (You may also use the attack's ID number. This is the number you see in the attack editor + 1)
If the hero does not know the spell, nothing happens.

read spell (hero,list,slot)
Returns the ID number of a chosen spell slot, or 0 (false) if there is no spell in that slot. The first argument is the hero's position in the party (as returned by find hero). The second argument is the number of the spell list to check. This is a value from 0 to 3. The third argument is the slot to check. This is a number from 0 to 23. Spell slots are numbered in rows, so the first row is 0,1,2 the second row is 3,4,5, and so-on.

write spell (hero,list,slot,attack)
Forces a hero to learn a particular spell. The first argument is the hero's position in the party (as returned by find hero). The second argument is the spell list to put the spell in. This is a number from 0 to 3. The third argument is the slot to put the spell in. This is a number from 0 to 23. Spell slots are numbered in rows, so the first row is 0,1,2 the second row is 3,4,5, and so-on. The last argument is the attack to put in the spell list. You can use the names defined in your .HSI file in the form atk:attackname (You may also use the attack's ID number. This is the number you see in the attack editor + 1)
You can also erase a spell by writing 0 or none as the attack ID.
Note that this command will overwrite and replace any spell that is already in that slot. If you overwrite a slot that can normally learn another spell, you will never learn that other spell (unless you first erase the spell you wrote there)

knows spell (hero,attack)
Checks to see if a hero already knows a spell. The first argument is the hero's position in the party (as returned by find hero). The second argument is the attack to check for. You can use the names defined in your .HSI file in the form atk:attackname (You may also use the attack's ID number. This is the number you see in the attack editor + 1)
If the hero knows the spell, knows spell will return true. If the hero does not know the spell, it will return false

can learn spell (hero,attack)
Checks to see if a hero is capable of learning a spell from an item or from the teach spell command. The first argument is the hero's position in the party (as returned by find hero). The second argument is the attack to check for. You can use the names defined in your .HSI file in the form atk:attackname (You may also use the attack's ID number. This is the number you see in the attack editor + 1)
If the hero can learn the spell, can learn spell will return true. If the hero cannot learn the spell (or learns it from levelups), it will return false


Misc Functions

random(lownumber, highnumber)
Returns a random number in the range of the two numbers. The returned value will be greater than or equal to the first number, and less than or equal to the second number

inventory (item)
Returns a count of how many of the specified item are in your inventory. If you do not have the item, it returns zero or false. You can refer to the item by number, or you can use the constants defined in your HSI file, which are in the form of item:name

leader
Returns the hero number of the current leader.

hero X (who)
returns the specified hero's X position in tiles.

hero Y (who)
returns the specified hero's Y position in tiles.

NPC X (who)
returns the specified NPC's X position in tiles.

NPC Y (who)
returns the specified NPC's Y position in tiles.

hero direction (who)
returns the specified hero's direction.

NPC direction (who)
returns the specified NPC's direction.

room in active party
A function that returns the number of available spaces in your active party. It will return zero or false if there is no room.

current map
returns the number of the current map.

days of play
returns the number of days that the game has been played

hours of play
returns the number of hours that the game has been played, 0 to 23

minutes of play
returns the number of minutes that the game has been played, 0 to 59

key is pressed (scancode)
Returns true if the keyboard key with the specified scancode is being pressed, or false if it is not. The argument is a scancode, NOT the upkey, downkey, etc used with wait for key. I have provided an extra include file, SCANCODE.HSI that you can use to define friendly names for all the scancodes. 00
01 ESC
02 1
03 2
04 3
05 4
06 5
07 6
08 7
09 8
10 9
11 0
12 - _
13 = +
14 BACKSPACE
15 TAB
16 Q
17 W
18 E
19 R
20 T
21 Y
22 U
23 I
24 O
25 P
26 [ {
27 ] }
28 ENTER
29 CTRL
30 A
31 S
32 D
33 F
34 G
35 H
36 J
37 K
38 L
39 ; :
40 " '
41 ` ~
42 LEFT SHIFT
43 \ |
44 Z
45 X
46 C
47 V
48 B
49 N
50 M
51 , <
52 . >
53 / ?
54 RIGHT SHIFT
55 PRINT SCREEN *
56 ALT
57 SPACE
58 CAPSLOCK
59 F1
60 F2
61 F3
62 F4
63 F5
64 F6
65 F7
66 F8
67 F9
68 F10
69 NUMLOCK
70 SCROLL LOCK
71 HOME 7
72 UP 8
73 PAGEUP 9
74 KEYPAD -
75 LEFT 4
76 KEYPAD 5
77 RIGHT 6
78 KEYPAD +
79 END 1
80 DOWN 2
81 PAGEDOWN 3
82 INSERT 0
83 DEL .
84
85
86
87 F11
88 F12
89
90
91 L WIN LOGO
92 R WIN LOGO
93 CONTEXT

hero pixel X (who)
Returns the hero's X position on the map in pixels. To find the hero's position in tiles, use the hero X function instead.

hero pixel Y (who)
Returns the hero's Y position on the map in pixels. To find the hero's position in tiles, use the hero Y function instead.

NPC pixel X (who)
Returns the NPC's X position on the map in pixels. The argument is an NPC reference or an NPC ID number. To find the NPC's position in tiles, use the NPC X function instead.

NPC pixel Y (who)
Returns the NPC's Y position on the map in pixels. The argument is an NPC reference or an NPC ID number. To find the NPC's position in tiles, use the NPC Y function instead.

camera pixel X
Returns the X position of the top left corner of the screen in pixels.

camera pixel Y
Returns the Y position of the top left corner of the screen in pixels.

pick hero
Pops up a hero-picker box that lets you choose one of the heros in your active party. The return value is the position in the party of the hero you picked.

rename hero(who)
Pops up a name-editing box that allows you to change a hero's name. The argument is the hero's ID number, or name in the format hero:name

rename hero by slot(who)
Pops up a name-editing box that allows you to change a hero's name. The argument is the hero's position in the party as returned by find hero


Tweaking Maps

read map block (x,y)
Returns the value of a map tile on the current map at the specified X,Y position. Normal map tiles return values from 0-159, animating maptiles from set 1 return 160-207 and animating maptiles from set 2 return 208-255.

write map block (x,y,value)
Writes a new tile to the specified X,Y position on the current map. This change will only persist until you leave the map or fight a battle.

read pass block (x,y)
Returns the value of a passability (wallmap) tile on the current map at the specified X,Y position. The return value will be from 0 to 255 and consists of eight flag bits.

  bit 1   = north wall
  bit 2   = east wall
  bit 4   = south wall
  bit 8   = west wall
  bit 16  = vehicle A
  bit 32  = vehicle B
  bit 64  = harm tile
  bit 128 = overhead tile
to check the value of a specific bit, use the and operator. For example:
  variable (pass)
  set variable(pass,read pass block(hero X(me),hero Y(me)))
  if (pass,and,harm tile) then begin
    # this checks if the hero is standing
    # on a harm tile
  end

write pass block (x,y,value)
Writes a new passability (wallmap) information to the specified X,Y position on the current map. This change will only persist until you leave the map or fight a battle. The value is a number from from 0 to 255 that consists of eight flag bits.

  bit 1   = north wall
  bit 2   = east wall
  bit 4   = south wall
  bit 8   = west wall
  bit 16  = vehicle A
  bit 32  = vehicle B
  bit 64  = harm tile
  bit 128 = overhead tile
You can add the constants together. For example:
  variable (pass)
  set variable(pass,northwall+southwall+eastwall+westwall)
  write pass block(15,3,pass)
  # this makes the fifteenth tile in the third column
  # impassable on all directions

load tileset (set)
Loads a different tileset for the currently displaying map. The argument is the ID number of the tileset to load. To restore the map's default tileset, use load tileset with no arguments.


Working with Tags

set tag (tag,value)
Sets the value of a tag. The available constants are: off, on, true, or false. You can specify the number of the tag, or you can use the constants in your HSI file. These constants are in the form of tag:name.

check tag (tag)
A function that checks the value of a tag, and returns true if the tag is turned on, and false if the tag is turned off. It can be used in if and while statements You can specify the number of the tag, or you can use the constants in your HSI file. These constants are in the form of tag:name.


Working with Variables

set variable (variable,value)
This command assigns a new value to a variable. If you do not specify the new value, the variable will be reset to zero. This command works exactly the same for global and local variables.
If you prefer, you can also set variables by writing variable:=value

increment (variable,amount)
This command adds an amount to the current value of a variable. If you do not specify the amount, then the variable will be incremented by one. This command works exactly the same for global and local variables.

decrement (variable,amount)
This command subtracts an amount from the current value of a variable. If you do not specify the amount, then the variable will be decremented by one. This command works exactly the same for global and local variables.


Math, Comparison, and Logic Operators

Pre-December 1999 versions of HamsterSpeak used a different syntax for math. For more information, see the HamsterSpeak Specification

number + number
Adds two values together and returns the result. This can also be written as number,add,number

number -- number
Subtracts the second number from the first number and returns the result. It is neccisary to use the double minus so that HSPEAK.EXE can tell the difference between subtraction, and a minus sign that indicates a negative number. You can also write number,subtract,number

number * number
Multiplies two values together and returns the result. This can also be written as number,multiply,number

number / number
Divides the second number into the first number and returns the result. The result will be rounded to the nearest integer. This can also be written as number,divide,number

number,mod,number
Divides the second number into the first number and returns the remainder.

number ^ power
Raises a number to a power and returns the result. Normally you will only be raising things to a power of 2. Raising to very large powers will most certainly produce an overflow error. This can also be written as number,exponent,power

number == number
Checks to see if the two numbers are equal. If they are equal it returns true, otherwise it returns false. This can also be written as number,equal,number

number <> number
Checks to see if the two numbers are not equal. If they are not equal it returns true. If they are equal it returns false. This can also be written as number,not equal,number

number << number
Checks to see if the first number is less than the second number. If it is, it returns true, otherwise it returns false. This can also be written as number,less than,number

number >> number
Checks to see if the first number is greater than the second number. If it is, it returns true, otherwise it returns false. This can also be written as number,greater than,number

number <= number
Checks to see if the first number is less than or equal to the second number. If it is, it returns true, otherwise it returns false. This can also be written as number,less than or equal to,number

number >= number
Checks to see if the first number is greater than or equal to the second number. If it is, it returns true, otherwise it returns false. This can also be written as number,greater than or equal to,number

value,and,value
Returns true if both of the values are true (non-zero). If either of them is false, and returns false.

value,or,value
Returns true if at least one of the values are true (non-zero). Only if both of them are false does or return false.

value,xor,value
Returns true if one, but not both of the values are true (non-zero). If both of them are true, or both of them are false, xor returns false.


Flow Control

begin
 # other commands
end

begin is a synonym for ( and end is a synonym for ). Parenthesis are normally used for bracketing things that all fit on the same line, and begin/end statements are often used to enclose very long things such as whole scripts or long flow control blocks that take up several lines. For example, the following two blocks of code are identical;

 if (check tag(2)) do (show text box (5),wait for text box)
 
 if (check tag(2)) do
 begin
   show text box (5)
   wait for text box
 end

if(condition) then(commands) else(commands)
The if statement checks the value of its condition, and if the value is true, it runs the commands in the then block. If the value is false, it runs the commands in its else block. The conditional is usually an equality operator such as == or <>, or it is a check tag command. The else is optional as long as you have a then, and the then is optional as long as you have an else. There are some examples of if statements in the HamsterSpeak Specification, and in WANDERP.HSS

while(condition) do(commands)
The while command checks the value of its condition, and if the value is true it runs the commands in the do block. It keeps checking the conditional and runs the do block over and over again until the conditional returns false. The conditional is usually an equality operator such as == or <>, or it is a check tag command.

for(counter,start,finish,step) do(commands)
The for command runs the commands in the do block a specified number of times. The first argument to for is the counter. It must be a variable. The next two arguments are the starting value and the finishing value. For example, if you use a start value of 1 and a finish value of 10 then the do block will run 10 times. The first time the do block runs, the counter will be 1, then it will be 2, then 3 and so on until it reaches 10, the finish value. The fourth argument of for is optional. It is the step by which the counter will change each loop. If you use a step of 2 then the counter will count 1,3,5,7,9. If you switch the start and finish values and use a step of -1 then the counter will go backwards. If you use 0 as the step, the counter will never change, so the do block will repeat forever. There are examples of for commands in WANDERP.HSS

return(value)
Sets the value to be returned by the script. This is only useful when the script has been called as a function from another script. It is irrelevant to scripts called directly from your RPG. This command does NOT cause the script to terminate, it just sets the return value. If return() is used more than once in the same script, only the last one executed matters


Advanced Commands

set hero picture (who,picture,type)
Permanently changes a hero's picture. The first argument is the heros position in the party as returned by find hero. The second argument is the index number of the picture to use, and the last argument is a constant inside battle or outside battle, which determines if you are changing the heros battle picture or their walkabout picture. If the last argument is left out, outside battle is assumed.

set hero palette (who,palette,type)
Permanently changes a hero's 16-color palette. The first argument is the heros position in the party as returned by find hero. The second argument is the index number of the 16-color palette to use, and the last argument is a constant inside battle or outside battle, which determines if you are changing the heros battle palette or their walkabout palette. If the last argument is left out, outside battle is assumed.

get hero picture (who,type)
A function that returns the index number of a hero's picture. The first argument is the heros position in the party as returned by find hero. The second argument is a constant inside battle or outside battle, which determines if you are checking the heros battle picture or their walkabout picture. If the second argument is left out, outside battle is assumed.

get hero palette (who,type)
A function that returns the index number of a hero's 16-color palette. The first argument is the heros position in the party as returned by find hero. The second argument is a constant inside battle or outside battle, which determines if you are checking the heros battle palette or their walkabout palette. If the second argument is left out, outside battle is assumed.

alter NPC (who,NPCstat,value)
Changes the stats of an NPC. Constants for this command have been included in PLOTSCR.HSD. Alter NPC can be used for many purposes.


A good way to make use of Alter NPC is to wrap it in your own script. For example:
# Example AlterNPC wrapper for changing NPC appearance
Define Script (autonumber,change NPC,3,0,0,0)

script,change NPC,who,picture,palette,begin
  Alter NPC(who,NPCstat:picture,picture)
  Alter NPC(who,NPCstat:palette,palette)
end

Normally you would only give an NPC ID number to alter NPC, but if you want to use an NPC reference it will still work. Just remember that alter NPC changes every copy of the NPC on the map, not just the specific one you referenced.

set death script (id)
Changes the script that is run when you die in battle. The argument is the script's ID number, NOT the script's name. Calling set death script with no argument disables the death script.

get death script
Returns the ID number of script that is run when you die in battle.

set load script (id)
Changes the script that is run when you load a saved game. The argument is the script's ID number, NOT the script's name. Calling set load script with no argument disables the load script.

get load script
Returns the ID number of script that is run when you load a saved game.

find hero (who)
Searches through your party to see if the specified hero is there, and returns the position where the hero was found, or -1 if the hero was not found. Use the names defined in your HSI file in the format hero:name. Not only does this tell you if a hero is in your party, but you can also use it to tell whether or not the hero is in your active party. find hero will return 0,1,2 or 3 if the hero is in the active party, but it will return a number 4 or higher if the hero is in the reserve. See also rank in caterpillar

hero by slot (where)
This command is the reverse of find hero. Given a position in your party, it will tell you which hero is in that slot, or -1 if no hero is in that slot. The number returned can be compared with the names defined in your HSI file in the format hero:name.

rank in caterpillar (who)
Searches through your active party to see if the specified hero is there, and returns the position int the walkabout caterpillar where the hero was found, or -1 if the hero was not found. Use the names defined in your HSI file in the format hero:name. This is particularaly useful if you need to use a command like walk hero but you are not sure which position the hero is in. See also find hero

hero by rank (where)
This command is the reverse of rank in caterpillar. Given a position in your walkabout party, it will tell you which hero is in that position, or -1 if no hero is in that position. The number returned can be compared with the names defined in your HSI file in the format hero:name.

get hero stat (who,stat,type)
A function that returns one of a hero's stats. The first argument is the position of the hero you want to check in your party as as returned by find hero. The second argument is the name of the stat that you want to check. The names of the stats are also define in your HSI file in the form stat:name. The third argument is either current stat or maximum stat. If you leave the last argument blank, current stat will be assumed.

set hero stat (who,stat,value,type)
A command that changes one of a hero's stats. The first argument is the position of the hero you want to change in your party as returned by find hero. The second argument is the name of the stat that you want to change. The names of the stats are also define in your HSI file in the form stat:name. The third argument is the new value of the stat. The last argument is either current stat or maximum stat. If you leave the last argument blank, current stat will be assumed.

get hero level (who)
A function that returns a hero's current level. The argument is the position of the hero you want to check in your party as as returned by find hero. The return value with be your current level, from 0 to 99

read global (id)
A function that returns the value of a global variable using its ID number instead of its name. Why would you want to do a silly thing like that? Because it allows you to simulate simple fake arrays, in the old C-pointer style. See also write global

write global (id,value)
A function that writes a value into a global variable using its ID number instead of its name. Why would you want to do a silly thing like that? Because it allows you to simulate simple fake arrays, in the old C-pointer style. See also read global

set battle wait mode (state)
Set whether or not battles pause on spell and item menus. If the argument is OFF then enemies continue to attack while menus are up, if the argument is ON then enemies wait while menus are up.

set caterpillar mode (state)
Sets whether or not to display the whole party in "caterpillar" style. If the argument is OFF then only the leader will be displayed. If the argument is ON then the whole party will be displayed. (do not confuse this with the suspend caterpillar and resume caterpillar commands, which only apply when caterpillar mode is ON)

set no HP level up restore (state)
Sets whether or not a hero regains full HP after a levelup. If the argument is OFF then HP is restored on a levelup. If the argument is ON then the hero's HP is not restored on a levelup.

set no MP level up restore (state)
Sets whether or not a hero regains full MP after a levelup. If the argument is OFF then MP is restored on a levelup. If the argument is ON then the hero's MP is not restored on a levelup.

set inn no revive mode (state)
Sets whether or not inns restore dead heros to life. If the argument is OFF then dead heros are restored by inns. If the argument is ON then dead heros remain dead in inns.

set full hero swap mode (state)
Sets whether or not you can swap heros in and out of your active party from the menu. If the argument is OFF then the "Order" menu will be available. If the argument is ON then the "Team" menu will be available.

hide battle ready meter (state)
Sets whether or not the ready meter appears in battle. If the argument is OFF then the ready meter appears. If the argument is ON then the ready meter will be hidden.

hide battle health meter (state)
Sets whether or not the health meter appears in battle. If the argument is OFF then the health meter appears. If the argument is ON then the health meter will be hidden.

set debug keys disable (state)
Sets whether or not the debugging keys are allowed. If the argument is OFF then debugging keys are allowed. If the argument is ON then debugging keys are disabled.


Predefined Commands

numeric constants
zero, one, two, three, four, five, six, seven, eight, nine, ten

PLOTSCR.HSD defines constants for the numbers from 0 to 10. you can use these constants to make your scripts look friendly :)

boolean constants
true, false, ON, OFF

PLOTSCR.HSD defines constants for true and false, and for ON and OFF. These are useful for checking and setting the values of tags.

direction constants
north, south, east, west
up, down, right, left

PLOTSCR.HSD defines constants each of the four directions. These constants are useful for commands such as walk hero and walk NPC, which take a direction as an argument.

keyboard constants
upkey, downkey, leftkey, rightkey
usekey, cancelkey, menukey, anykey

PLOTSCR.HSD defines constants that correspond to each of the usable keys (or joystick buttons) that the player can press while playing. These are useful with the wait for key command

me
me is a constant that can be used to refer to the first hero in your party (hero zero) in any command that takes a hero number as an argument.

none
none is a constant that means the same as zero. It is normally used in define script commands for scripts that do not have any arguments

autonumber
autonumber is a constant that is used as the ID number in define script commands for scripts that do not need to be called directly from toe OHRRPGCE. Autonumber scripts are only called from within other scripts.

current stat
a constant for use with the get hero stat and set hero stat commands.

maximum stat
a constant for use with the get hero stat and set hero stat commands.