Introduction 	1 

Abs 	3 

Action 	3 

Adjustments 	4 

Button 	5 

Continue 	5 

Copy 	6 

Dec 	7 

DefCaveBlk 	7 

DefLandBlk 	8 

DefSpookBlk 	8 

DefWaterBlk 	9 

DefStat 	9 

DefPack 	10 

Display 	11 

DoText 	13 

Drop 	14 

Edit_Player 	15 

EndGame 	16 

Enter 	16 

Failure 	16 

Fight 	17 

Fighting 	17 

Find 	18 

For 	19 

Foreach 	20 

Frame 	21 

GetAction 	22 

GetNum 	23 

GetStr 	24 

Goto 	25 

Gosub 	26 

If 	27 

Inc 	28 

Join 	28 

Leave 	29 

LoadHint 	29 

LoadText 	30 

Locate 	30 

Min, Max 	31 

Move 	32 

Music 	33 

On x Goto, On x Gosub 	34 

Paint 	35 

Pause 	35 

Random 	36 

ReadText 	37 

Restart 	38 

Restore 	39 

Return 	39 

Save 	40 

SavePCX 	40 

Select 	41 

SetBody 	43 

SetBp 	44 

Sgn 	45 

SOUND 	45 

Stats 	46 

Stop 	47 

Success 	47 

System 	48 

Teleport 	49 

Vanish 	50 

Version 	51 

ViewFLI 	52 

ViewPCX 	53 

Voice 	54 

VPlay 	55 

Wait 	55 

While 	56 

Write[ln] 	57 



















D C  -  G A M E S 





Version 4.0







SCRIPT LANGUAGE REFERENCE GUIDE

























(c) DC Software, 1989-1995

7908 Kettlewood Court

Plano Tx 75025

(214) 491-1579Introduction

Purpose

This manual presents all of the language commands and functions
in alphabetical order and using a consistent presentation for
all of them.  It is not intended to teach you how to write a
script, but rather to describe in detail each and every command
and function in the language.

The Script Language User's Guide is a more general document that
tries to teach you how to write scripts.  That manual talks
about the different types of scripts, the reasons for writing
them, etc.  The examples in it include many different commands,
since they try to show how to do something rather than teach you
how many different things you can do with a single command.

The best way to use these manuals is to read the User's Guide
from begining to end, and consult the Reference Guide only when
you want to know more about a particular command or function.

If you are comfortable with programming languages, you can
probably read this manual from side to side and end up knowing a
lot about the script language itself, but you will not find out
here the how, when or why of writing scripts.

Sincerely,



David A. HernandezAbs

Syntax	ret-val = abs( expr );

Purpose	Returns the absolute value of the numeric expression.

Parameters	expr

Is an arithmetic expression.

Returns	The absolute value (positive number) of the expression.

Remarks	The absolute value of a number is the same number, but
always with a positive sign.  Thus, abs(-2) and abs(2) are both
2.

Example	! Check to see if there is a great disparity between the
character's 

! experience and the npc's experience.

if abs( player.exp - npc.exp ) > 3 then

    writeln( "Perhaps another time.." );

else

    join; ! NPC joins the party..

endif;

See Also	min, max, sign

Action

Syntax	ret-val = action;

Purpose	Find out what action invoked the script.

Returns	The numeric action code which is actually the number of
the entry point at which execution of the script will begin. 
See Entry Points in the User's Guide for more information on
these values.

Example	! The following code handles both LOOK and EXAMINE, but
EXAMINE

! prints more detail than LOOK.

:LOOKING

	writeln("You see a ", object.name, ".  Type ", object.type );

	if action = EXAMINE then

		writeln( ", Class ", object.class, ", Weight: ", object.weight
);

	endif;

	...

Adjustments

Syntax	ret-val = adjustments( expr1, ... );

Purpose	Compute the adjustments to character attributes
indicated by the given set of values.

Parameters	expr1, ...

Is one or more expressions separated by comma that result each
in a number between 0 and 255.

Returns	The sum of the adjustments computed for each value
independently.

Remarks	The adjustment is computed using the values in the
[ATTRIBUTE MODIFIERS] section of the DCCTOKEN.DAT file. The
default  values are:

	Value Range 		Effect 

0 	8 	Decrease by -1 point 

9 	15 	No change 

16 	18 	Increase by 1 point 

19 	20 	Increase by 2 points 

21 	30 	Increase by 3 points 

31 	40 	Increase by 4 points (and so on..) 



	During regular game play, a character's class determines such
factors as the weight it can carry, the type of weapons and/or
armor it can use, it's ability to strike moving targets, etc.

	In addition to the character class, it's standard attributes
(such as strength, aim, dexterity, iq, etc.) may increase or
decrease these factors.  For example, the stronger a character
is, the more weight it can carry.

Example	! An ELF has a 1 in 4 chance to detect a trap, adjusted
by it's dexterity and

! intelligence.  All others have a 1 in 2 chance adjusted by
dexterity.

if player.type = ELF then

	L28 = 4 + adjustments( player.dex, player.iq );

else

	L28 = 2 + adjustments( player.dex );

endif;

if random(L28) = 0 then ... trap activated ... else ... trap
found ... endif;

Button

Syntax	retval =  button;

Purpose	Find out which mouse button was pressed.

Remarks	When a mouse event is sent to the CONTROL script, the
button function tells you which button was pressed. 1 = Right
Button, 2 = Left Button, 3 = Middle Button.

See Also	keypress, pointx, pointy

Continue

Syntax	continue;

Purpose	Terminate execution of the current script.

Remarks	This command informs the game driver that while the
script has performed some actions, the DEFAULT action should
still be taken, if any.

Warning	Because the OBJECT script contains the default action
for objects, that script should never end with a continue. 
Doing so would indicate that default action is needed, which may
result in the object script being run twice for the same action.

See Also	stop, fight

Copy

Syntax	copy( source, destination [, count] );

Purpose	To create a copy of an object and place it in a given
location.

Parameters	source

The copy command can copy an object from curritem, object,
group.vehicle, npc.bp, npc.body, npc.weapon, npc.armor,
npc.shield, npc.ring, npc.amulet, npc.staff, player.bp,
player.body, player.weapon, player.armor, player.shield,
player.ring, player.amulet and player.staff.

	destination

The destination can be any of the above, except for the generic
locations curritem and object.

	count

This is the number of copies of the object that are placed at
the destination.  It is an expression that results in a value
between 1 and 255.  If omited, the default is the number of
copies in the source.

Remarks	The destination must be appropriate to the type of
object, for example, you can't move an object of type amulet to
player.shield.

	When an object is copied or moved to the generic destination
.body, it will be placed in the correct body section according
to the object's type.

	When the count is greater than one, copies are moved one by
one.  The character's load is checked before each move to verify
that the character can carry the object.  If the character's
maximum load is reached before all objects have been copied, the
failure variable is set to the actual number of copies moved.

Examples	! Copy 5 instances of an object from npc.bp to player.bp

copy( npc.bp, player.bp, 5 );

if failure then

  L6 = failure;

  writeln( player.name, " could only carry ", L6 );

  drop( npc.bp, - L6 ); ! Place the rest on the floor.. !

endif;

See Also	move, failure, drop

Dec

Syntax	dec( variable [, expr]  )

Parameters	variable	is any numeric variable or attribute that
can be modified from within a script.

	expr

is an optional expression that results in a number that will be
substracted from the variable.  If omited, the default is 1.

Remarks	The decrement command will substract the amount
indicated (1 if none is given) from the variable or attribute
specified.  If the expression is negative, then the double
substraction results in an addition.

Example	! An NPC strikes the player

dec( player.hp, npc.weapon.damage );

DefCaveBlk

Syntax	ret-val = DefCaveBlk( which );

Purpose	Returns a graphics block number for cave and dungeon
monsters. (Class CAVE_MONSTER)

Parameters	which

Identifies which of the five graphics blocks for random monsters
you want.  The value must be between 0 and 4, with 0 being the
smallest monster and 4 being the toughest.

Returns	ret-val

Is a graphics block record number (between 0 and 255) to be used
for random monsters that are found in caves or dungeons.

Remarks	The DCWORLD parameter configuration screen is used to
set the graphics blocks that will be used to generate random
monsters.

See Also	DefLandBlk, DefWaterBlk, DefSpookBlk, DefStat, DefPack

DefLandBlk

Syntax	ret-val = DefLandBlk( which );

Purpose	Returns a graphics block number for outdoor, land based
monsters. (Class LAND_MONSTER).

Parameters	which

Identifies which of the five graphics blocks for random monsters
you want.  The value must be between 0 and 4, with 0 being the
smallest monster and 4 being the toughest.

Returns	ret-val

Is a graphics block record number (between 0 and 255) to be used
for random monsters that are land based.

Remarks	The DCWORLD parameter configuration screen is used to
set the graphics blocks that will be used to generate random
monsters.

See Also	DefCaveBlk, DefWaterBlk, DefSpookBlk, DefStat, DefPack

DefSpookBlk

Syntax	ret-val = DefSpookBlk( which );

Purpose	Returns a graphics block number for monsters that you
might find in places like hounted houses or cementeries (Class
SPOOK_MONSTER).

Parameters	which

Identifies which of the five graphics blocks for random monsters
you want.  The value must be between 0 and 4, with 0 being the
smallest monster and 4 being the toughest.

Returns	ret-val

Is a graphics block record number (between 0 and 255) to be used
for random monsters of this type..

Remarks	The DCWORLD parameter configuration screen is used to
set the graphics blocks that will be used to generate random
monsters.

See Also	DefLandBlk, DefCaveBlk, DefWaterBlk, DefStat, DefPack

DefWaterBlk

Syntax	ret-val = DefWaterBlk( which );

Purpose	Returns a graphics block number for aquatic monsters
(monsters that swim, class WATER_MONSTER).

Parameters	which

Identifies which of the five graphics blocks for random monsters
you want.  The value must be between 0 and 4, with 0 being the
smallest monster and 3 being the toughest.  Number 4 is used to
represent a Pirate's Ship, which requires special handling to
make sure a pirate's ship doesn't appear on a small pond of
water in the middle of town!

Returns	ret-val

Is a graphics block record number (between 0 and 255) to be used
for random monsters that are land based.

Remarks	The DCWORLD parameter configuration screen is used to
set the graphics blocks that will be used to generate random
monsters.

See Also	DefLandBlk, DefCaveBlk, DefSpookBlk, DefStat, DefPack

DefStat

Syntax	ret-val = DefStat( which );

Purpose	Returns an index into the statistics file (PLAYER.DTA)
which holds the statistics that will be used for small, medium,
large and pirate monsters.

Parameters	which

Is the size of the character you are creating.  0=Small,
1=Medium and 2=Large, 3=Pirates.

Returns	ret-val

Is the statistics record number (npc.stats) which holds the
generic statistics for the size of character you indicated.

Remarks	The DCWORLD parameter configuration screen is used to
set the 4 values that will be used as statistics records for
random monsters.

See Also	DefLandBlk, DefCaveBlk, DefSpookBlk, DefPack

DefPack

Syntax	ret-val = DefPack( which );

Purpose	Returns an index into the statistics file (PLAYER.DTA)
which holds the statistics record whose backpack contains the
items that will be used to generate random treasure.

Parameters	which

Is which of the 3 backpacks should be used (0, 1 or 2).

Returns	ret-val

Is the statistics record number (npc.stats) whose backpack
contains items to be used for random treasure.

Remarks	The DCWORLD parameter configuration screen is used to
select the statistics records to be used.  The statistics screen
is used to modify the records themselves.  The default records
contain Potions, Rings & Amulets, and Magic Staffs respectively.

See Also	DefLandBlk, DefCaveBlk, DefSpookBlk, DefStat



Display

Syntax	display ( group );1

display [$[2]] ( {player|npc}  [, {matching|type}] );2

display [$[2]] ( {player.body|npc.body} );3

display [$] (  string [, value] [, string ... ] );4

Purpose	Display a list of characters, items, etc, on the menu
area.

Parameters	group, player, npc, player.body and npc.body

Identify what you want to display in the menu area.

	matching

Used to indicate that only items that match the items of the
type carried by the current npc should be displayed.  (Used by
merchants)

	type	

is a number between 0 and 255 (tokens may be used). 

	string

is a text string enclosed in quotes.

	value

is either a number (constant or token) or a single variable or
attribute whose value is numeric.  No arithmetic expressions are
permited.

Remarks	The display command is a powerful tool to display a list
of values in the menu area of the screen.  If a $ is specified,
then values will be displayed as gold or silver pieces (1gp =
10sp).  The 2 following the $ 

indicates that the values should be divided by 2 before being
displayed.



1) Displays the current members of the playing party

2) Displays the contents of a character's backpack. If matching
is specified, it indicates that only items that match the types
of items in the current npc's  backpack should be displayed. If
type is provided, only items of the specified type are displayed.

3) Displays the set of items being worn by a character (weapon,
armor, shield, amulet, ring and staff).

4) Displays a list of strings with or without values associated
with it.

Examples	! Display the current members

display( group );



! Display the current player's inventory

display( player );



! Display a merchant's inventory (with prices)

display$( npc );



! Display the player's items that the merchant might want to
buy..

display$2( player, matching );



! Display a list of items and a price (numbers in silver pieces)

display$( "Magic Ring", 300, "Short Sword", 150, "Banana", 1 );



! Display a list with numbers (not $)

display( "Age", 27, "Strength", npc.str, "Max Weight",
npc.mload);

See Also	select

DoText

Syntax	ret-val = dotext( str-val );

Purpose	To perform keyword analysis compatible with pervious
prior versions of the DCGAMES system.

Parameters	str-val

Is either a word surrounded by double quotes (string constant),
or the string variable S0.

Returns	ret-val

Returns the index of the keyword in the text record (1-16) if
found, 0 if not found.

Remarks	This compares the keyword str-val against the first 8
characters of the string variables S1 through S16.  If a match
is found, then the text found in the variable that had the
matching keyword (minus the keyword) is displayed on the screen
and the number (1-16) of the string that had the match is
returned.  Otherwise, a 0 is returned and no message is
displayed.

	If a SoundBlaster card is present, and the current character or
object being processed has a voice file associated with it
(voice attribute), then the voice file (VOICE###.VFL, where ###
is the value of the voice attribute), is searched for the same
keyword, and if present, the corresponding recorded voice is
played.

	If the voice file is not present or the keyword is not found in
the voice file, but the SBTALKER text-to-speach translator is
present (memory resident), then the text that followed the
keyword will be spoken in addition to being displayed.	

Example	! Talk to the player..

:TALKHERE

L9 = getstr( "Hello", "King", "Queen", "Treasure", "Key", "Door"
);

if NOT dotext( s0 ) then   ! The text record didn't handle the
keyword..

    on L9 gosub XHELLO, XKING, XQUEEN, XGOLD, XKEY, XDOOR;

endif;

if S0 <> "Bye" goto TALKHERE;

stop;

See Also	voice, vplay, write, writeln

Drop

Syntax	drop( item [, howmany [, x [, y]]]  );

Purpose	Get rid of an item that a character is carrying or
riding.

Parameters	item

Is the item to be dropped, which must be one of: group.vehicle,
curritem, player.bp, player.body, player.weapon, player.armor,
player.shield, player.ring, player.amulet, player.staff, npc.bp,
npc.body, etc.

	howmany

Is the number of items to be dropped.  0 means all. A negative
means that the objects are not to be removed, but rather
duplicated. The default value is 1.

	x, y

Is the location in the world where the object will be placed. 
The default values are the current player's location.

Remarks	The item will be added to the world's list of objects
with a count attribute as indicated by the howmany parameter.

	If the howmany parameter is 0, the current count attribute of
the item being dropped is used.

	If the howmany parameter is negative,  it indicates that a copy
should be made of the items.  The originals are left intact.

	If the absolute value of the howmany parameter is greater than
the count attribute of the item, then howmany is used.  (i.e.,
you end up with more copies than you had!).

Examples	! The following are all equivalent

drop( curritem );	! If the current item is the current backpack
item

drop( player.bp );

drop( player.bp, 1 );

drop( player.bp, 1, player.x, player.y );



! If the npc has a weapon, drop it one square to the right of
the player

if npc.weapon.count then

  drop( npc.weapon, npc.count, player.x+1, player.y );

endif;

Edit_Player

Syntax	edit_player( which [, points, min, max, [flags, ...]]  );

Purpose	Allow access to the player editing screen from the
scripts.

Parameters	which

Indicates which party member is to be edited.  The value is in
the range 1 to 6.

	points

You may specify the number of points that the player may
allocate to the different attributes.  Default is 25.

	min

The player may not set any attribute below this threshold.
Default 9.

	max

The player may not set any attribute above this threshold.
Default 20.

	flags

Edit flags. A 1  allows editing of that field, a 0 does not.
Default is 1. The list of flags is shown in the example.

Remarks	Usually called from the INITGAME script during game
initialization to allow the player to configure his/her
character.  See that script for an extended example.

Example	! Allow player to customize his character within the
limits:

setplayer(1);

player.class = ELF;  ! Fixed class

player.mstr = 12;      ! Fix Strength

edit_player( 1,	! Main Character

	25,		! Distribute 30 points

	8,		! Don't allow a value lower than 8

	25,		! Don;t allow a value higher than 25

	1,		! Allow edit "NAME"

	0,		! Don't allow edit of character class

	1,		! Allow player to select a tile (graphics block)

	0		! Don't allow edit of the first attribute (Strength)

	);		! Allow edit of all other attributes

	

EndGame

Syntax	endgame;

Purpose	Terminate the game.  You have either won or lost, but
you cannot continue.

Remarks	The game displays the copyright screen and returns the
user to DOS.  The assumption is that an appropriate ending
scenario has been executed by the script.

Enter

Syntax	enter( door# );

Purpose	Send the playing party through a specific door, wherever
it might lead.

Parameters	door#

A numeric expression that indicates which door should in the
current world you want to take.

Remarks	The transfer through the door does not take place until
after the script ends execution. You still need to use the stop
or continue option to end the script.

Failure

Syntax	ret-val = failure;

Purpose	To find out if the last major operation failed.

Returns	ret-val

The returns will be non-zero (TRUE) if the last major operation
failed to complete successfuly.

Example	! A merchant sells an item to a player..

writeln( "Here is your ", npc.bp.name );

copy( npc.bp, player.bp );

if failure then

    writeln( "The ", npc.bp.name, " is placed on the floor.." );

    drop( npc.bp );

endif;

See Also 	success

Fight

Syntax	fight;

Purpose	Go into fighting mode against the currently selected npc
character.

Remarks	The type of the npc does not have to be HOSTILE. The
fight may be against any character of any type.

	The script is immediatly ended and the fight starts right away.
 No stop or continue command is needed.

Warning	Do not use fight after you have done enter.  The fight
takes place before the transfer is made, but the scripts that
execute during and immediately after the fight may get confused.
 The desired behaviour for this situation is yet to be
determined..

See Also	fighting

Fighting

Syntax	ret-val = fighting;

Purpose	To find out if the script is executing during a fight.

Returns	ret-val

A non-zero value (TRUE) is returned when a fight is taking place.

Remarks	Your script may behave differently depending on whether
you are in a fight or not.  For example, certain spells may not
work during a fight.

	During a fight, the party and the npc are separated into their
respective individuals, and all other characters are removed
from the screen.

	The party may not leave the area during a fight, but pressing
the ESC key will exit fighting mode and allow the party to
attempt to out-run the enemy.

See Also	fight

Find

Syntax	retval = find( where [, what [, type]] );

Purpose	Find an object or character.

Parameters	where

Identifies where you want to search for the object.  It can be
one of group, object, npc, player, npc.bp, player.bp, npc.body
or player.body.

	what

Is the name of the item or person you are looking for.  It must
either be a string constant ("like this") or a string attribute
of a character or object.

	type

If present, it indicates that the item must not only have the
given name, but must also have the given type attribute.  The
value is either a numeric constant, a numeric token or the type
attribute of a character or object.

Returns	The index attribute of the item (starts with 0), or
negative if the item was not found.

Remarks	When group is searched, what is a character name, and
success indicates that the character is a member of the group.

	When object is searched, the current world is searched for an
object with the given name (and type, if given).

	When npc is searched, the current world is searched for an
object with the given name (and type, if given).

	When player is given, the backpacks of every player in the
current group is searched for the given object.  The value
returned is the index of the player carrying the object, not the
index of the object in the backpack.

	When npc.bp or player.bp is specified, the backpack of the
character is searched for the given object.

	When npc.body or player.body is specified, the items currently
worn by the character are searched (weapon, armor, shield, ring,
amulet and staff).

For

Syntax	for localvar = expr1 to expr2 [by value] do statements;
endfor;

Purpose	Execute a set of statements a given number of times.

Parameters	localvar

Is a local variable which will be used to hold the loop's
current value.

	expr1

Is the initial value that will be assigned to the local variable.

	expr2

Is an expression against which the local variable is compared to
determine if the statements should be executed or if the loop
has ended.

	value

Is a numeric constant (may be negative) which is added to the
local variable at the end of every iteration (after the
statements are executed).

Remarks	Expr1 is evaluated once, at the begining of the loop,
but expr2 is evaluated every time after the value has been added
to localvar. The statements between the do and endfor keywords
will be executed again and again until local variable's value
becomes greater (or less if the value is negative) than expr2.

Examples	! Search the npc's backpack for an object (could use
find instead!).

for L0 = 0 to 15 do

    setbp( npc, L0 );

    if npc.bp.count > 0 and npc.bp.name = "The Thing" then

       writeln( "I found it!" );

    endif;

endfor;

if L0 = 16 then writeln( "Didn't find it!" ); endif;

See Also	foreach, find



Foreach

Syntax	foreach item do statements; endfor;

Purpose	Allow you to process all players, npcs or objects, in
order.

Parameters	item

Is one of player, npc or object.

Remarks	If the item is player, then the player variable will be
set to each of the members of the group, consecutively.

	If the item is npc,  then the npc variable will be set to every
character in the current world, consecutively. Warning: when you
are fighting, the list of npcs refers to the monsters you are
fighting. Other npcs are not available.

	If the item is object, then the object variable will be set to
each of the objects in the current world, consecutively.

Examples	! Drop the weapons carried by every member of the group

foreach player do

   if player.weapon.count then

        drop( player.weapon );

   endif;

endif;

	! Check to see if there is a character named 'Morris' in this
world.

! (Could have used the find command)

foreach npc do

    if npc.name = "Morris" then

       writeln( "Found Him!" );

    endif;

endfor;

	! Find out if there is any object at a specific location in the
world

foreach object do

    if object.x = 30 and object.y = 23 then

        writeln("Object ", object.name, " is on the hot spot.."
);

    endif;

endfor;

Frame

Syntax	frame( x, y, block# );

Purpose	Display a system graphics block over the current
graphics block at the x and y location within the current world.

Parameters	x

Is the horizontal position for the frame.  May be an expression.

	y

Is the vertical position for the frame. May be an expression.

	block#

Is the graphics block record number from the system graphics
file which contains the frame you wish to display.

Remarks	If the x, y position is not on the screen, the frame is
not shown.

	The frame is X-ORed (over-imposed) on top of the graphics at
the given location.  To remove the frame, you re-display the
frame at the same location.

Example	! Draw a SPLAT type frame on top of the group to
indicate they have

! been hit by something (i.e. the members suffered some damage)

frame( group.x, group.y, SYS_SPLAT );

wait(1);

frame( group.x, group.y, SYS_SPLAT );

	! Draw a bullet being shot from the current player to an npc.

! (This algorithm doesn't really work very well.  It is just an
example)

if player.x < npc.x then L0 = 1; else L0 = -1; endif;

if player.y < npc.y then L1 = 1; else L1 = -1; endif;

for L3 = player.x to npc.x by L0 do

    for L4 = player.y to npc.y by L1 do

        frame( L3, L4, SYS_BULLET );

        wait(1);

        frame(L3, L4, SYS_BULLET );

    endfor;

endfor;

GetAction

Syntax	retval = getaction;

Purpose	Allows the player to point with the mouse cursor and
click at something, or to type a character on the keyboard.

Returns	retval

Contains the value of the key pressed or mouse event. In the
control script, the keypress variable contains the current
action, so see that script to figure out how to interpret the
retval information.

See Also	keypress, pointx, pointy, button

GetNum

Syntax	retval = getnum( string [, low [, high] ] );

Purpose	This function displays a message and asks the user to
enter a numeric value between low and high inclusive.  The value
that the user types is returned as the function's value.

Parameters	string

Is a string to be displayed in the text area of the game screen,
before the user is asked to enter a number.

	low

Is the minimum allowed value.  It may be an expression.  The
default is 0.

	high

Is the maximum allowed value.  It may be an expression. The
default value is 32767.

Returns	This function returns a number between low and high as
typed by the game player, or -1 if the game player pressed the
ESCape key.

Remarks	The low value is returned if you press the ENTER key.

	The value -1 is returned if you press the ESC (escape) key.

Example	! Drop some (or all) of a certain object

L6 = getnum( "Drop how many", 0, player.bp.count );

if L6 > 0 then

    drop( player.bp.count, L6 );

endif;



GetStr

Syntax	retval = getstr( "string" ,... );

Purpose	Asks the user to type in something (a word), then
compares the keyword entered with the list of strings and
returns the numeric index of the string that matches (if any).

Parameters	"string ",...

Is a list of up to 255 keywords.

Returns	The getstr command will compare the keyword typed by the
player to the list of words provided as parameters and return
the position of the word in the list (if found).

Remarks	You can list up to 255 strings may be listed.

	Only the first 8 characters of the string are compared.

	The comparison is case insensitive (i.e. "Hello" is equal to
"HELLO").

	If you press the ESCape key, the value returned is -1.

	If the word is not found, the value returned is -2 and the word
is left in the string variable s0.

Examples	! Everyone died, so...

writeln( "What do you want to do (Restore, Restart, Quit)" );

L3 = getstr( "Restore", "Restart", "Quit");

on L3 goto :my_restore, :my_restart, :my_quit;

if L3 = -2 then writeln( "I don't know what you mean by ", s0 );

stop;

	:my_quit

	endgame;

	:my_restore

	...

	:my_restart

	...

See Also 	select, on x goto

Goto

Syntax	goto LABEL;

Purpose	Within the script, transfer the execution to the
indicated label.

Remarks	The LABEL must be defined elsewhere in the script as
follows

		:LABEL

	Execution of the script continues on the first statement after
the indicated label.

Example	! Transfer execution 

goto SKIP;

writeln( "You should NOT see this line" );

	:SKIP

writeln( "You should see this one instead" );

See Also	on x goto, if expr goto, gosub, on x gosub and if expr
gosub

Gosub

Syntax	gosub LABEL;

Purpose	Within the script, transfer the execution to the
indicated label.

Remarks	The LABEL must be defined elsewhere in the script as
follows

		:LABEL

	Execution of the script continues on the first statement after
the indicated label.

	When the return statement is found, execution returns to the
first statement after the gosub statement.

	This statement is used to perform a series of statements at
many different points within the same script.

Example	! Transfer execution 

gosub SKIP;

writeln( "You should see this message SECOND" );

stop;



:SKIP

writeln( "You should see this message FIRST!" );

return;

writeln( "You should NOT see this message at all" );

See Also	return, on x gosub and if expr gosub

If

Syntax	if expr1 then statements1;

[elsif expr2 then statements2; ...]

[else statements3;]

endif;

	or

	if expr1 goto label;

	or

	if expr1 gosub label;

Purpose	Execute a group of statements only if the expresion expr
is true.

Parameters	expr1, expr2, ...

These are logical expressions which evaluate to a True or False
value.  True is any non-zero value.  False is zero.

	statements1, statements2, ...

These are the statements to be executed the related expression
is true.

	statments3

These are the statements to be executed if NONE of the given
expressions are true (i.e. they are all false).

Remarks	In the second and third form, the goto or gosub are
executed only if the expression expr1 evaluates to a non-zero
value.

Examples	! Drop the current player's weapon

if player.weapon.count > 0 then

    drop( player.weapon );

else

    writeln( "You are not wielding a weapon" );

endif;

Inc

Syntax	inc( variable [, expr]  )

Parameters	variable	is any numeric variable or attribute that
can be modified from within a script.

	expr

is an optional expression that results in a number that will be
added to the variable.  If omited, the default is 1.

Remarks	The increment command will add the amount indicated (1
if none is given) to the variable or attribute specified.  If
the expression is negative, the effect will be to decrement the
value.

Example	! An player drinked some healing potion, so restore some
points..

inc( player.hp, curritem.units );

Join

Syntax	join;

Purpose	Cause the npc character to join the current party.

Remarks	The current npc is removed from the world in which it
exists and added to the player's party.

	The npc variable is cleared (i.e. no npc is selected any
longer).

	The party can hold a maximum of 6 players. If the party is
full, the npc will NOT join the party.

Leave

Syntax	leave( whom );

Purpose	Cause a player to leave the party.

Remarks	The player with index whom in the group will leave the
party.

	Note that the main player (index 0 is not allowed to leave the
party.

	Note also that the player's script is NOT invoked to give it a
chance to refuse to leave.  This is in contrast to the game
driver's V)acate command (player pressed letter V), which
invokes the player's script, and if the script either does not
handle the action, or terminates with continue, then invokes the
CONTROL script which in turn executes the a leave command.

Example	! When the party enters the King's Castle, if the king
is a member of the

! party it means that the King has been rescued and now should
leave the

! party and go sit with the queen..

if world.name = "King's Castle" then

   L0 = find( group, "The King" );

   if L0 > 0 then                                   ! Found the
king

       writeln( "The king leaves you and heads for the throne
room.." );

       L1 = find( npc, "The Queen" );   ! Find out where the
Queen is

       npc.index = L1;                           ! Select her as
current npc.

       leave( L0, npc.x+1, npc.y );        ! Place the king next
to the queen. 

   endif;

endif;

LoadHint

Syntax	loadhint;

Purpose	Load a one-line 'hint' from the hint file (HINT.DTA).

Remarks	Hints are placed in the HINT.DTA file using the DCWORLD
game builder.

	The hint is selected at random and placed in variable S0.

Example	! Display a hint

loadhint;

writeln( "The beggar gives you a hint:", S0 );

LoadText

Syntax	loadtext( text-record-# );

Purpose	To load a text record (16 lines of text) from the
TEXT.DTA file into the 16 string variables S1 through S16.

Remarks	The text-record-# is an expression that evaluates to a
number between 0 and the number of text records in the TEXT.DTA
file (minus one).

	The given record is loaded into the S1 through S16 (not S0).

See Also	dotext

Locate

Syntax	ret-val = locate [ ( object | npc [, x, y  ] ) ] ;

Purpose	If no X,Y is given, the player is asked to point on the
screen using the keyboard or the mouse. If an object or npc is
found at that location, it becomes the current object or npc
respectively.

Returns	ret-val

The distance from the object or npc found (largest of x or y
distance).

Remarks	If the first parameter is omited, the player is allowed
to point to either an object or a character.  If it is given,
then the player must point to an object or an npc depending on
the parameter that was specified.

	When you specify the X/Y location, that location is verified
immediatly, and the user is NOT asked to point at all. See the
code in the CONTROL script for handling movement and checking
for guards!.

Examples	! Attack someone

writeln( "Attack who?" );

L2 = locate(npc);

if L2 < 0 then stop; ! No one

if L2 > 2 then  writeln( "You must get closer.." );

! goto attack_code;

	! Check before you move to the right..

if locate(npc,player.x + 1, player.y) then

  writeln( "Can't go there!" );..

Min, Max

Syntax	ret-val = min( expr  [, expr ...] );  or

ret-val = max( expr [, expr ...] );

Purpose	To obtain the smallest (or largest) of a set of values.

Parameters	expr

Two or more arithmetic expressions separated by commas.  A
maximum of 255 expressions are allowed.

Examples	! Look for the object with the highest weight in the
player's backpack

L0 = -1;

foreach player.bp do

    L0 = max( L0, player.bp.weight );

endfor;

if L0 > 0 then

  writeln( "The heavyest object has a weight of  ", L0, "lbs" );

endif;

Move

Syntax	move( source, destination [, count] );

Purpose	To create a copy of an object and place it in a given
location.

Parameters	source

The move command can move an object from curritem, object,
group.vehicle, npc.bp, npc.body, npc.weapon, npc.armor,
npc.shield, npc.ring, npc.amulet, npc.staff, player.bp,
player.body, player.weapon, player.armor, player.shield,
player.ring, player.amulet and player.staff.

	destination

The destination can be any of the above, except for the generic
locations curritem and object.

	count

This is the number of copies of the object to be moved.  It must
be a value between 1 and the actual number of copies (.count
attribute).

Remarks	The destination must be appropriate to the type of
object, for example, you can't move an object of type amulet to
player.shield.

	When an object is copied or moved to the generic destination
.body, it will be placed in the correct body section according
to the object's type.

	If there is no space to put the object in the destination, the
operation fails, and the number of objects that were actually
moved is stored in the failure variable.

	  The backpack can hold 16 items.  Each body part can hold only
one item.

See Also	copy, drop, vanish, failure

Music

Syntax	music( filename | stop );

Purpose	Starts playing a CMF music

Parameters	filename

The name of the music file. May include a DOS path and be up to
64 chars in length.

	stop

If you use the stop keyword instead of a file name, any music
currently playing is stopped.

Remarks	The filename must be a string constant (surrounded by
double quotes).

	You must have a Sound Blaster compatible card to play music. If
none is present the command is ignored.

Examples	! Play some music and wait until either the music ends, 

! the player presses a key or 2 minutes have elapsed.

music( "Intro.cmf" );

wait( 180 );

	! Play some music in the background, display a picture and then 

! Wait for 2 minutes or until the player presses a key, even if
the 

! music ends.

music( "c:/game/sound/mymusic.cmf");

pause( 180 );

	! Play some music while talking to a character..

music( "healer.cmf" );

... do stuff here ...

:XSTOP

    writeln( "Y'all come back, now!" );

    music( stop );

    stop;

See Also	wait, pause

On x Goto, On x Gosub

Syntax	on expr {goto|gosub} label0, label1, label2, ... labeln;

Purpose	To support the transfer of control to one of a set of
labels depending on the value of an expression.

Parameters	expr

This expression evaluates to a number between 0 and n.

	label0, label1, ..

These are the labels that have been declared elsewhere in the
script to receive control of execution.

Remarks	The difference between goto and gosub is that the return
statement will return execution to the statement following the
on statement..

	If the expression has a negative value or a value greater than
n, no transfer takes place, and execution continues on the
statement following the on statement.

Example	! Talk to the player..

:TALKHERE

L9 = getstr( "Hello", "King", "Queen", "Treasure", "Key", "Door"
);

loadtext( player.text );

if NOT dotext( s0 ) then   ! The text record didn't handle the
keyword..

    on L9 gosub XHELLO, XKING, XQUEEN, XGOLD, XKEY, XDOOR;

endif;

if S0 <> "Bye" goto TALKHERE;

stop;

See Also 	goto, gosub, if x goto, if x gosub, return

Paint

Syntax	paint( { screen | window } );

Purpose	To re-paint either the entire screen or just the game
playing window because the script has performed some actions
that have probably erased all or part of the window.

Remarks	This statement is useful when you move the player of the
screen by modifying it's x and y attributes.

	It is also a good idea after running a DOS program, or after
you display a PCX graphics file on the screen.

See Also	viewpcx

Pause

Syntax	pause( time );

Purpose	Pauses script execution until the user presses the space
key or the specified time has elapsed.

Parameters	time

This parameter is optional.  It specifies a limit on the time
that the command will wait.  (In seconds).  Any numeric
expression that results in a number between 0 and 32000 seconds.
 A value of 0 means that no time limit is present.  The user
MUST press a key to continue. Note that pause(0); can also be
written pause;.

Remarks	Used to wait for the user to read something on the
screen or to see a graphics file that is being displayed, 

Examples	! Display a character's picture, then wait for 2
minutes or until the

! player presses a key

if player.picture > 0 then

   viewpcx( player );

   pause(120);

   paint(screen);

endif;

See Also	wait

Random

Syntax	ret-val = random( expr );

Purpose	Return a random number between 0 and expr-1.

Parameters	expr

Is an arithmetic expression that results in a positive number
larger than 1.

Returns	ret-val

Is a value between 0 and expr-1.

Remarks	The expr is value is the number of alternatives you want
to consider.

Example	! 3 out of every 10 times, write a message

if random( 10 ) < 3 then ! 0,1 and 2

   writeln( "We have a winner!" );

endif;

	! generate a monster of random size

on random(5) gosub XTINY, XSMALL, XMEDIUM, XLARGE, XHUGE;

...

	! Once out of every 7 times..

if random(7) = 0 then ! or 1 or 2 or .. 6, but just one of them !

    gosub DOSOMETHING;

endif;

ReadText

Syntax	readtext( block# [, line#] );	or

readtext( "filename" );

Purpose	To read and display some text on the screen

Parameters	block#

Is the record number from the TEXT.DTA file.

	line#

Is the line number within the block (1 to 16) or 0 (default)
which means that the entire text record should be displayed.

	filename

Is the name of a text file to be read and displayed.

Remarks	If block# is given, the record is read into variables S1
through S16.

	If line# is non zero, only that line is displayed.

	The entire lines are displayed, the lines are not expected to
contain keywords of any kind (unlike dotext)

	If a filename is provided, the screen is cleared and the text
is displayed in full screen (but still graphics) mode.  The
paint command should be used to re-paint the screen after the
text has been read.  Also, the pause command may be used before
the paint command to give a chance to the player to read the
last page.

	The text file may contain some control commands that start with
the % sign as follows:

	%MUSIC musicfile.cmf

Plays the CMF format file musicfile in the background (The
SoundBlaster SBFMDRV.COM must be memory resident).

	%VIEWPCX pcxfile.pcx

Show the PCX graphics file on the screen in the resolution and
with the pallete closest to the one specified in the PCX file
that is available in the computer.

	%VPLAY vocfile.voc

Plays the VOC format file on the foreground if a SoundBlaster
card is present.

	%READ textfile

The DOS text file is read through the SoundBlaster
text-to-speach driver (SBTALKER) if installed.

	%PAGE

Say "press <SPACE> to continue" and clear the screen when the
player does press the space bar.

	%WAIT time

Wait a maximum of time seconds or until all music and/or voice
has finished playing.  If the time expires before the music or
voice is over, the music or voice is stopped.  Also, if the user
presses SPACE while waiting, the voice and music are stoped and
the wait expires.

Restart

Syntax	restart;

Purpose	Restart the game from the begining, but does not re-run
the introduction or cause the player to have to re-create
his/her character.

Remarks	From the DOS prompt, you can re-start the game by typing:

		C:\games> del sav*.*

	If you also want to re-create the playing party, type also:

		C:\games> del party.dta

Restore

Syntax	restore( slot# );

Purpose	Restores the game to a previously saved possition.

Parameters	slot#

The # of the saved game, which may be in the range 1 through 999.

Remarks	The restore command works by first deleting all files
with name SAV*.000 from the current directory, and then copying
all files of name SAV*.### (the saved game) to files names
SAV*.000.

	The current game is held in slot # 0.  Every time you transfer
from one world to another, the current game is saved to slot 0. 
This means that if your game is interrupted for any reason (for
example, you accidentaly press Ctrl-Alt-Del), your game state is
restored to the time at which you entered the current world.

See Also	save, restart

Return

Syntax	return;

Purpose	Returns execution control to the instruction following
the last gosub that was executed.

Remarks	To write a subroutine, you declare a label (which will
be used by the gosub statement to invoke it), followed by some
script statements, followed by the return statement.

Example	! Subroutine to move one step to the right.

MOVERIGHT:

if group.x < world.x-1 and world.density <= VERY_ROUGH then

    inc(group.x);

endif;

return;

Save

Syntax	save( slot# );

Purpose	Saves the current game in the given slot.

Parameters	slot#

The slot to be used to save the game.  May be in the range 1
through 999.

Remarks	The save command works by first saving to slot 0 and
then copying all files with name SAV*.000 to files of name
SAV*.###.

	The current game is held in slot # 0.  Every time you transfer
from one world to another, the current game is saved to slot 0. 
This means that if your game is interrupted for any reason (for
example, you accidentaly press Ctrl-Alt-Del), your game state is
restored to the time at which you last entered the current world.

See Also	restore, restart

SavePCX

Syntax	savepcx( "fname.pcx" );

Purpose	Saves the screen as a PCX format graphics file to the
given filename.

Parameters	"fname.pcx"

A string constant containing a valid DOS filename.

Remarks	The system does not check to make sure the filename is a
valid DOS filename, nor does it add the .PCX extension if it is
not provided.

	If the file already exists, it is overwritten.

Example	! Save the current screen

savepcx( "scrndump.pcx" ); 

See Also	viewpcx

Select

Syntax	retval = select ( group );1

retval = select [$[2]] ( {player|npc}  [, {matching|type}] );2

retval = select [$[2]] ( {player.body|npc.body} );3

retval = select [$] (  string [, value] [, string ... ] );4

Purpose	Display a list of characters, items, etc, on the menu
area, and then allow the player to select one of the displayed
items. The item selected becomes the current generic item of the
appropriate type.

Parameters	group, player, npc, player.body and npc.body

Tells the select command what you want to select from.

	matching

Used to indicate that only items that match the items of the
type carried by the current npc should be displayed.

	type

is a number or token with a value between 0 and 255.

	string

is a text string enclosed in quotes.

	value

is either a number (constant or token) or a single variable or
attribute whose value is numeric.  No arithmetic expressions are
permited.

Returns	The number that returns is the index to the selected
item.  

Remarks	If a $ is specified, then values will be displayed as
gold or silver pieces (1gp = 10sp).  The 2 following the $
indicates that the values should be divided by 2 before being
displayed.



1) Select a member of the playing party.  The selected member
(if any) becomes the current player.



2) Select one of the items in the character's backpack. If
matching is specified, only items that match the type of items
in the current npc's backpack will be displayed. If type is
provided, only items of the specified type are displayed.  The
selected item becomes the character's current .bp item.



3) Select one of the items being worn by the current character.
The item selected becomes the current player.body item.  If the
character is not wearing any items (weapon, armor, shield, ring,
amulet or staff), no menu is displayed and the function return a
-1.



4) Displays a menu with the options listed (strings), and allows
the player to select one of them. It returns the index to the
selected one.  The first item is 0.

	If no item is selected (player pressed <ESC> key) the function
returns -1.

	If the list is empty (no item is being carried in the backpack
or being worn), the function also returns -1.

Examples	! Select the current spokes-person...

L3 = select( group );

	! Show list of potions being carried and give it to the npc

L8 = display( player, POTION );

If L8 >= 0 then 

  move( player.bp, npc );

endif;

	! A merchant offers to sell something.

L39 = select$( npc );

if L39 >= 0 then

    if group.gold >= npc.bp.value then

        writeln( "Sold ", npc.bp.count, " ", npc.bp.name );

        copy( npc.bp, player );

        if failure then

            writeln( "I'll just put it here on the floor.." );

            drop( npc.bp );

        endif;

        dec( group.gold, npc.bp.value );

    else

        writeln( "You don't have enough money!" );

    endif;

else

    writeln( "Ok.." );

endif;

	! Display the player's items that the merchant might want to
buy.

L39 = select$2( player, matching );

if L39 >= 0 then

    writleln( "Here is ", $player.bp.value," for your
",player.bp.name);

    inc( group.gold, player.bp.value / 2 );

    move( player.bp, npc );

endif;

	! Give the player a choice and take the appropriate action..

:XAGAIN

on select("Yes", "No","Maybe") goto XYES, XNO, XMAYBE;

goto XNONE;

:XYES

    writeln( "Good stuff..." );

    goto SOMEWHERE;

:XNO

    writeln("Too bad..." );

    goto SOMEWHERE;

:MAYBE

    writeln( "Will you make up your mind?" );

    goto XAGAIN;

:SOMEWHERE

    ! Now do something else..

See Also	display

SetBody

Syntax	setbody( which, type );

Purpose	Select the worn item represented by the generic variable
player.body or npc.body.

Parameters	which

Is one of the npc or player attributes .body, .weapon, .armor,
.shield, .ring, .amulet or .staff.

	type

Is an expression that evaluates to one of the six relevant types
(represented by tokens WEAPON, ARMOR, SHIELD, RING, AMULET or
STAFF).  Any other value is invalid.

Remarks	When specifying npc.body or player.body, the type is
required.

	When specifying npc.weapon, npc.armor, etc, the type is
invalid, since it is implied by the attribute itself.

SetBp

Syntax	setbp( which, expr );

Purpose	Select the backpack item represented by the generic
variable player.bp or npc.bp.

Parameters	which

Is one of npc.bp or player.bp, to identify which backpack you
want to set.

	expr

Is an expression resulting in a number between 0 and 15, which
indicates the position within the backpack that is to be
represented by the generic variable.

Remarks	The backpack position may be empty (i.e. not contain a
valid item).

	You can tell if an item is present by testing the count
attribute.  A value of zero always implies that the item does
not exist.

Sgn

Syntax	ret-val = sgn( expr  );

Purpose	To determine whether an expression is negative, positive
or zero.

Parameters	expr

A single expression whose numeric value may be negative,
positive or exactly zero.

Returns	Returns -1 (minus one) if the expression is negative, +1
(plus one) if the expression is positive and 0 (zero) if the
expression is exactly zero.

Remarks	This function may be useful when it is not important to
know the magnitude of the difference between two values, but
just whether one of them is greater than the other.

Examples	! The character is about to hit the npc.  The npc has a
1 in 4 chance of

! blocking the attack (25%), but it may be modified to 1 in 3 if
the npc has

! a higher dexterity than the player, or to 1 in 5 if the player
has the better

! dexterity.

L7 = 4 + sgn( player.dex - npc.dex );

	! Another version of the above computes an adjustment based on
the

! player's AND npc's dexterity using the adjustments function,
and adds

! or substracts the adjustment based on who is better.  This
means that

! A high player dexterity OR a low npc dexterity will decrease
the ability

! of the npc to block the attack.

L7 = 4 + sgn(player.dex-npc.dex) *
adjustments(player.dex,npc.dex);

Sound

Syntax	sound = boolean-value

if sound then ...

Purpose	If this variable has a non-zero value, sounds are
enabled. It is enabled by default, unless you use the -S run
time argument. You can change the value any time you want to
enable/disable sound.

Remarks	If you don't have a sound card, sound can still be
played through the PC speaker if you convert the voices using
the VOC2PWM and PACK utility.

Example	sound = not sound; ! Turn sound on and off	

Stats

Syntax	stats; or stats ( [ player|npc, ] who );

Purpose	Tells the system to display character statistics in the
menu area, if they are not currently being displayed.

Parameters	player|npc

Specifies whether you want to display a player's statistics or
an NPCs statistics. Note: During a fight, the npcs are the
monsters you are fighting with. The default is player.

	who

Is the index of the player (or npc) whose statistics you want to
display. If you want to display stats on the current player use
group.current or player.index (same thing) or use npc.index for
the current npc.

Remarks	Statistics are displayed more or less automaticly, but
during the execution of a script, you can use the menu area for
other things. If you want to restore the statistics at any time,
you may use the stats function.

	If you omit the parameter (stats;), the group summary
statistics are displayed.

	If you specify a who of -1, the system will re-display the
statistics we were already showing.  This is useful when the
menu area has been used for something else, like the display
command.

Example	! Refresh the statistics area

stats(-1);

	! Display the current player's detailed statistics

stats( group.current );Stop

Syntax	stop;

Purpose	Terminates execution of the script.

Remarks	Indicates that the script has performed all required
actions.

See Also	continue, fight

Success

Syntax	ret-val = success;

Purpose	To find out if the last major operation was successful.

Returns	ret-val

The returns will be non-zero (TRUE) if the last major operation
completed successfuly.

Example	! A merchant sells an item to a player..

writeln( "Here is your ", npc.bp.name );

copy( npc.bp, player.bp );

if success then

    writeln( "Sold!" );

else

    writeln( "The ", npc.bp.name, " is placed on the floor.." );

    drop( npc.bp );

endif;

See Also	failure

System

Syntax	system( argument1 [ , argument2 ... ] );

Purpose	Execute a DOS command.

Parameters	argumentN

Is a a string constant, variable or attribute, or a numeric
constant, token, variable or attribute.  No expressions are
allowed.

Remarks	The system command will create a single string by
concatenating the values of the arguments in very much the same
way that the writeln command does.  The resulting string is
assumed to be a DOS command that needs to be executed.

	If the numeric attributes type or class are displayed, the
associated string listed in the token file (DCCTOKEN.DAT) is
used, instead of the numeric value.

	If a numeric argument is preceeded by a $ sign, the value is
represented in gold or silver pieces.

	The failure will be set to the value returned by the DOS
command.  The value can be tested for non-zero (i.e. just a
failure) or for it's numeric value, which can have any meaning
that the DOS command chose to give that value.

Examples	! Assuming you have a CASINO game that receives as
parameters the 

! name of the player and the amount of money to start with:

system( "CASINO ", player.name, " ", group.gold / 10 );

group.gold = failure * 10; ! Earnings stored in the return value

	! The following examples are for save/restore using a DOS
program..

save(0);				! Save current game 

system(  "MYSAVE SAVE" );	! Store it somewhere 

! or:

system( "MYSAVE RESTORE" );! Retrieve a saved game to slot 0

restore(0);				! Cause the system to re-load slot 0.

! or:

group.current = 0;

inc( player.v7 );

save(0);

system( "pkzip.exe ", player.v7, " SAV*.000 " );

Teleport

Syntax	teleport( dest_world [, dest_door] );

teleport( dest_world, dest_x, dest_y );

Purpose	When the current script finishes execution, the party
will be transfered to the given world at the location indicated
by the given door.

Parameters	dest_world

Is the index number of the destination world (0-999)

	dest_door

Is the door in the destination world, over which the party will
be placed.  The default is door 0.

	dest_x, dest_y

The coordinates in the destination world at which the party will
be placed (No door is needed).

Remarks	Unlike the enter command, no door leading from the
current world to the destination world is used.  The transfer is
made directly to the world and location indicated.

Examples	! Transfer the party to one of 3 worlds at random

L3 = random(3);

if L3 = 0 then

    teleport( 38 );  ! Teleport to world 38, door 0

elsif L3 = 1 then

    teleport( 5, random(2) ); ! Teleport to world 5, door 0 or 1
(random)

else

    teleport( 43, 25, 32 );      ! Teleport to world 43,
location X=25, Y=32

endif;

See Also	enter

Vanish

Syntax	vanish( object );

Purpose	Destroy an object

Parameters	object

Is the object to be destroyed. It can be any of the following:
player.bp, player.body, player.weapon, player.shield,
player.armor, player.ring, player.amulet, player.staff, npc.bp,
npc.body, npc.weapon, npc.shield, npc.armor, npc.ring,
npc.amulet, npc.staff, object, curritem or group.vehicle.

Remarks	The object is removed and will no longer be available
anywhere.

	This is exactly equivalent to setting the count attribute of
the object to 0, which in effect means that the object is no
longer there.

Example	! 

! Destroy a staff after it has no charges left..

if staff.charges > 1 then

    dec( staff.charges );

else

    writeln( "The ", staff.name, " flashes and disappears.." );

    vanish( staff );

    ! Note that staff.count = 0 has the same effect !

endif;

   

See Also	drop, move, copy

Version

Syntax	ret-val = version;

Purpose	Determine the current version of the DCGAMES software
being used to run the adventure.

Returns	The version of the game driver in use.

Remarks	The version number is in the hundreds.  Version 3.00 is
returned as 300 (three hundred).  Version 3.01 would be returned
as 301 (three hundred and one). The current version as of August
1995 is 4.00 (or 400).

Example	if version < 400 then

   writeln( "ACK! You are using an old (incompatibile) driver!!"
);

   stop;

endif;

ViewFLI

Syntax	viewfli( "filename.fli" [, framedelay] ); 

Purpose	Play a FLI (or FLC) animation on the screen

Parameters	"filename.fli"

Is a quoted string which contains name of the FLI or FLC file to
be played. The filename is used exactly as given. (i.e. an
extension of .FLI or .FLC is NOT automaticly added).

	framedelay

Allows you to override the delay between frames when playing
back the flic.  It is specified in units which occur 18.2 times
per second, so if you want to delay 2 seconds between each
frame, the framedelay would be specified as 36 (closest number
to 36.4). If not specified, the system plays the FLI according
to the information in the file itself.

Remarks	This routine only works in 256 color modes. Thus, if you
are running in VHI resolution (a 16 color mode), the system will
try to play it in VLO mode.

	If the movie fits within the world window, it will be played in
that area.  If it doesn't, but it fits within the screen, the
screen will be cleared to play it.

	The system will re-build call PAINT(WINDOW) or PAINT(SCREEN) as
needed before returning to the script.

See Also	viewpcx

ViewPCX

Syntax	viewpcx( character ); or

viewpcx( object ); or

viewpcx( world ); or

viewpcx( "filename.pcx" );

Purpose	Display a PCX graphics file on the screen

Parameters	character

If you specify player or npc, the characters picture attribute
will be used to create a filename of the form CPICT###.PCX,
where ### is the numeric value of the picture attribute.

	object

If you specify an object (object, curritem, player.bp, etc..)
then the object's picture attribute will be used to create a
filename of the form OPICT###.PCX, where ### is the numeric
value of the picture attribute.

	world

If you specify world, the index attribute of the world (i.e the
world's number) will be used to create a filename of the form
WORLD###.PCX, where ### is the world's index value.

	"filename.pcx"

Is a quoted string which contains a valid DOS filename. The
filename is used exactly as given. (i.e. an extension of .PCX is
NOT automaticly added).

Remarks	Warning: After the image is displayed, control returns
to the script leaving the image displayed on the screen. It is
up to the script writter to decide when the screen should be
re-freshed by calling the PAINT function.

	Note also that you can call PAINT(WINDOW) or PAINT(SCREEN)
depending on whether the image you displayed fits within the
world view window or whether the whole screen is required.

See Also	paint

Voice

Syntax	voice( "keyword" , rsc );

Purpose	Play back a voice recording.

Parameters	keyword

The keyword is a one 1 to 8 character word that identifies the
voice recording stored in a voice resource file.

	rsc

Is the number of the voice resource file (VOICEnnn.RSC) that
contains the voice you want to play. The value must be in the
range 0 to 999 with two exceptions: A value of 1000 indicates
that the system sounds file DCSOUNDS.RSC should be used; and a
value of -1 is ignored and no sound is played.  This parameter
is no longer optional! 

Remarks	Previous versions of DCGAMES (3.x) would use the
npc.voice attribute as the default voice, but that is no longer
supported because you can now do a lot more interaction between
npcs and players.

	Since a -1 is allowed and indicates that no sound should be
played, you don't have to check the npc.voice or player.voice
attribute when you invoke voice. If none is given, nothing
happens!

Examples	! The character tried to open a chest and it was
trapped..

if rand(3) = 0 then ! Trap

    voice( "Explode", 1000 );  ! System Sound !

    writeln( "Argh..." );

endif;

	! Talking to a character

:XTALK

  L0 = getstr( "Hello", "Bye", "Job", "Name", ... );

  if L0 >= 0 then 

     voice( s0, npc.voice );

     on L0 goto XHELLO, XBYE, XJOB, XNAME,...;

  endif;

  writeln( "Beg Pardon?" );

  goto :XTALK

See Also	dotext, vplay, music

VPlay

Syntax	vplay( "voicefile.voc" );

Purpose	Play back a voice recording file.

Parameters	voicefile.voc

The file voicefile.voc is loaded and played through the
SoundBlastertm if it is present.

Remarks	Only the SoundBlaster series of audio cards is supported
at this time.

	The file must be stored in the .VOC format, must be shorter
than 64K and must fit in available memory.

See Also	dotext, voice, music

Wait

Syntax	wait( time );

Purpose	Wait until all voice and music has finished playing, or
time seconds have passed.

Parameters	time

The maximum number of seconds to wait.  May be in the range 0 to
32000.

Remarks	A time of 0 indicates that there is no time limit.  If
no music is present, this is equivalent to pause(0); The wait
ends when either no more voice or music is playing, the user
pressed the SPACE bar or the specified time has elapsed.

	If the time limit is reached or the player presses a key, the
music and voice still playing is stoped.

Example	! Play some Background music

music( "overture.cmf" );	! Start playing music

viewpcx( "map.pcx" );	! Display a picture on the screen

wait(0);			! Wait until the music ends or SPACE bar

paint( SCREEN );		! re-paint the screen.

See Also	pause, music, voice, vplay, viewpcx, dotext, paint

While

Syntax	while expr do statements; endwhile;

Purpose	Execute a set of statements as long as the expression is
non-zero

Parameters	expr

Is a logical expression which results in a numeric value.

Remarks	The expression expr is evaluated and the statements are
executed until the expression results in a value of zero.

Examples	! Ask a question, demand an answer.

writeln( "Do you agree? (Yes/No)" );

L3 = getstr( "yes", "no" );

while L3 < 0 do

    writeln( "You must say  Yes or No" );

    L3 = getstr( "yes", "no" );

endwhile;

Write[ln]

Syntax	write( argument [ , argument ... ] );

writeln[( argument [, argument] )];

Purpose	Display a line of text on the text area of the screen.

Parameters	argument

Is a a string constant, variable or attribute, or a numeric
constant, token, variable or attribute.  No expressions are
allowed.

Remarks	The write command is used to indicate that subsequent
write or writeln commands will continue writing on the same line
as this one, unless the line is full.

	The writeln command indicates that subsequent write or writeln
commands will start writing on a new line.

	If the numeric attributes type or class are displayed, the
associated string listed in the token file (DCCTOKEN.DAT) is
displayed, instead of the numeric value.

	If a numeric argument is preceeded by a $ sign, it is displayed
in gold/silver pieces.

Examples	! The following command

writeln( "Sold ",  L7,  " ", npc.bp.name, " at ", $npc.bp.value
);

! might display

    Sold 5 Pumkin Pies for 3gp

! if npc.bp.name = "Pumkin Pies" and npc.bp.value = 30

	! The following command

write( "You see a ", object.name, " (", object.type, ")" );

if object.type = WEAPON and object.hands = 2 then

   writeln( " (Two-Handed) " );

else

   writeln; ! End the line..

endif;

! might display

    You see a Rusty Knife (Weapon)

