2696 lines
74 KiB
Plaintext
2696 lines
74 KiB
Plaintext
|
Introduction 1
|
|||
|
|
|||
|
Preface 1
|
|||
|
|
|||
|
Document Organization 1
|
|||
|
|
|||
|
Conventions 2
|
|||
|
|
|||
|
Getting Help 2
|
|||
|
|
|||
|
Basic Information 3
|
|||
|
|
|||
|
What is a script? 3
|
|||
|
|
|||
|
What is a script used for? 3
|
|||
|
|
|||
|
Character scripts 3
|
|||
|
|
|||
|
Object scripts 4
|
|||
|
|
|||
|
World script. 5
|
|||
|
|
|||
|
Control script 5
|
|||
|
|
|||
|
Magic Spells 5
|
|||
|
|
|||
|
Game Initialization Script 6
|
|||
|
|
|||
|
Dead and Resurrection 6
|
|||
|
|
|||
|
Basic Script Elements 7
|
|||
|
|
|||
|
Keywords 7
|
|||
|
|
|||
|
Keywords Table 8
|
|||
|
|
|||
|
Comments 8
|
|||
|
|
|||
|
Numbers 9
|
|||
|
|
|||
|
Tokens 9
|
|||
|
|
|||
|
Variables 10
|
|||
|
|
|||
|
Generic Variables (Local and Global) 10
|
|||
|
|
|||
|
String Variables 10
|
|||
|
|
|||
|
World Variables and Attributes 11
|
|||
|
|
|||
|
Object Variables and Attributes 11
|
|||
|
|
|||
|
Character Variables and Attributes 13
|
|||
|
|
|||
|
Group Variables and Attributes 14
|
|||
|
|
|||
|
Types of Scripts 15
|
|||
|
|
|||
|
Introduction Script 15
|
|||
|
|
|||
|
Character Script 16
|
|||
|
|
|||
|
Object Script 17
|
|||
|
|
|||
|
World Script 18
|
|||
|
|
|||
|
Control Script 18
|
|||
|
|
|||
|
Resurrection Script 18
|
|||
|
|
|||
|
Writing Scripts 19
|
|||
|
|
|||
|
Script Files 19
|
|||
|
|
|||
|
Expressions and Assignments 20
|
|||
|
|
|||
|
Function Table 21
|
|||
|
|
|||
|
Statements 22
|
|||
|
|
|||
|
Conditional Statements 22
|
|||
|
|
|||
|
Flow Control Statements 23
|
|||
|
|
|||
|
Flow control using if 23
|
|||
|
|
|||
|
Flow control using on-goto 23
|
|||
|
|
|||
|
Loop Control Statements 24
|
|||
|
|
|||
|
The while statement 24
|
|||
|
|
|||
|
The for statement 24
|
|||
|
|
|||
|
The foreach statement 24
|
|||
|
|
|||
|
Object Manipulation Statements 25
|
|||
|
|
|||
|
Move and Copy 25
|
|||
|
|
|||
|
Drop 25
|
|||
|
|
|||
|
Output Statements 25
|
|||
|
|
|||
|
Write and Writeln 25
|
|||
|
|
|||
|
Display 26
|
|||
|
|
|||
|
Input Statements 26
|
|||
|
|
|||
|
Getstr and Getnum 26
|
|||
|
|
|||
|
Select 26
|
|||
|
|
|||
|
Going Places 26
|
|||
|
|
|||
|
Animation 27
|
|||
|
|
|||
|
Entering Doors 27
|
|||
|
|
|||
|
Teleportation 27
|
|||
|
|
|||
|
Advanced Topics 27
|
|||
|
|
|||
|
Entry Points 27
|
|||
|
|
|||
|
Calling A DOS program 28
|
|||
|
|
|||
|
Creating New Types and Classes 29
|
|||
|
|
|||
|
New Character Types 29
|
|||
|
|
|||
|
New Character Classes 29
|
|||
|
|
|||
|
New Object Types 30
|
|||
|
|
|||
|
New Object Classes 30
|
|||
|
|
|||
|
New Object Modifiers 31
|
|||
|
|
|||
|
New World Types 32
|
|||
|
|
|||
|
Shareware Opportunities 33
|
|||
|
|
|||
|
Extending the magic system 33
|
|||
|
|
|||
|
MS-DOS based extensions 33
|
|||
|
|
|||
|
Writing a whole new system 34
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
D C - G A M E S
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Version 4.0
|
|||
|
|
|||
|
|
|||
|
|
|||
|
SCRIPT LANGUAGE USER'S GUIDE
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
August 1995
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(c) DC Software, 1989-1995
|
|||
|
|
|||
|
7908 Kettlewood Court
|
|||
|
|
|||
|
Plano TX 75025
|
|||
|
|
|||
|
(214) 491-1579Introduction
|
|||
|
|
|||
|
Preface
|
|||
|
|
|||
|
One of the goals of the DCGAMES adventure and role-playing game
|
|||
|
building system is to provide an environment in which you can
|
|||
|
create adventure games without having to know anything about
|
|||
|
computer programming, and without having to maintain a zillion
|
|||
|
lists of cryptic numbers. If you want to draw a river, you just
|
|||
|
do it. If you want to create a dragon, just grab the right
|
|||
|
picture and do it. The idea is to have a large enough set of
|
|||
|
objects, characters, monsters and landscaping to allow you to
|
|||
|
concentrate on the story.
|
|||
|
|
|||
|
While this works fine most of the time, it is almost inevitable
|
|||
|
that there will be a few things you need to do that I didn't
|
|||
|
think of, or which need to work slightly different. You may
|
|||
|
need a new type of character or object, or some new magic
|
|||
|
spells. Maybe the wizards are too wimpy or elves and dwarfs
|
|||
|
should not exist in your adventure.
|
|||
|
|
|||
|
Most of the features in the DCGAMES system are handled by
|
|||
|
scripts. The script language is a simple yet powerful language
|
|||
|
that the game driver understands, and which control the behavior
|
|||
|
of most parts of the game system.
|
|||
|
|
|||
|
The scripts are created using a standard text editor, and can be
|
|||
|
as simple or complex as you need them to be. While you can
|
|||
|
write a complete game without writing a single line of script, a
|
|||
|
small effort on your part to learn how to write script will
|
|||
|
result in significantly better games, since you can fine-tune
|
|||
|
your creation to work exactly the way you want it to work.
|
|||
|
|
|||
|
Document Organization
|
|||
|
|
|||
|
This manual is organized in several sections. The first one is
|
|||
|
an introduction to the elements of the DCGAMES system. It
|
|||
|
explains each of the building blocks used to create an
|
|||
|
adventure, and how (and why) you would want to customize them.
|
|||
|
Everyone should read this section!
|
|||
|
|
|||
|
The second section is a Reference Manual, which is a list of the
|
|||
|
features of the script language in a logical order. You will
|
|||
|
need a printed copy of that section of the manual when you are
|
|||
|
actually writing a script.
|
|||
|
|
|||
|
Conventions
|
|||
|
|
|||
|
In this document, the following conventions are used:
|
|||
|
|
|||
|
UPPER-CASE-WORDS
|
|||
|
|
|||
|
represent tokens that have a specific value and are typed
|
|||
|
exactly as shown.
|
|||
|
|
|||
|
italic-words
|
|||
|
|
|||
|
are used when a new concept is being introduced, and the world
|
|||
|
in italics is the name of that concept. They are also used to
|
|||
|
indicate that you should be replace the word with an appropriate
|
|||
|
name or value.
|
|||
|
|
|||
|
bold-words
|
|||
|
|
|||
|
represent names or values that should be typed exactly as shown.
|
|||
|
|
|||
|
text1 | text2
|
|||
|
|
|||
|
items separated by a vertical bar (|) mean you get to choose one
|
|||
|
of them.
|
|||
|
|
|||
|
[text1 ]
|
|||
|
|
|||
|
items enclosed in square brackets are optional. If multiple
|
|||
|
items are listed, separated by a vertical bar, then you may
|
|||
|
choose one of them or none.
|
|||
|
|
|||
|
{ text1 | text2 }
|
|||
|
|
|||
|
items enclosed in curly braces are NOT optional. You must
|
|||
|
select one of the items listed.
|
|||
|
|
|||
|
...
|
|||
|
|
|||
|
three dots (ellipsis) indicate that the previous item can be
|
|||
|
repeated multiple times. If there is a limit to the number of
|
|||
|
times an item can be repeated, it will be indicated in a note
|
|||
|
near the area where the ellipsis were used.
|
|||
|
|
|||
|
Getting Help
|
|||
|
|
|||
|
Registered users of DCGAMES get free telephone assistance
|
|||
|
evenings and weekends. This assistance may range from
|
|||
|
explaining how a certain feature works to guidance in how to add
|
|||
|
a new feature. I might even write some specialized scripts for
|
|||
|
you (within reason).
|
|||
|
|
|||
|
Non-registered users are welcome to call also. I will try to
|
|||
|
answer questions over the phone, but please keep your questions
|
|||
|
simple and organized. If you feel you can't afford to pay for
|
|||
|
the game, I've been known to accept a smaller amount or even
|
|||
|
waive the fee in exchange for some serious feed back or some
|
|||
|
outstanding artwork or sound recordings that I may incorporate
|
|||
|
into the shareware product.Basic Information
|
|||
|
|
|||
|
Who should read this guide?
|
|||
|
|
|||
|
You need to read this guide if you are already familiar with the
|
|||
|
DCGAMES system and are ready to extend or modify the system to
|
|||
|
suit a particular game's requierments.
|
|||
|
|
|||
|
It is very important that you be familiar with the world builder
|
|||
|
program (DCWORLD) before you try to modify the scripts.
|
|||
|
|
|||
|
What is a script?
|
|||
|
|
|||
|
A script is a text file, created using a simple text editor (If
|
|||
|
you use a word processor, be sure to store the file in 'ASCII'
|
|||
|
or 'PLAIN TEXT' format).
|
|||
|
|
|||
|
The script file contains the instructions that tell the game
|
|||
|
driver (DCPLAY program) how to handle most aspects of the game.
|
|||
|
The system includes a large number of predefined scripts to
|
|||
|
handle objects, characters, worlds, etc. You can modify these
|
|||
|
scripts to meet your game's individual requirements, and you can
|
|||
|
write whole new scripts to extend the number of options you have.
|
|||
|
|
|||
|
The DCGAMES system includes a large set of predefined scripts
|
|||
|
which are used to handle your game. While these scripts are
|
|||
|
complete, you may want to modify them or write new scripts to
|
|||
|
handle your specific needs. The type of script you write depends
|
|||
|
on the aspect of the game that you want to control.
|
|||
|
|
|||
|
The script language was designed to be easy to learn and use.
|
|||
|
The documentation was written specifically for people that have
|
|||
|
no prior exposure to programming, and the predefined scripts
|
|||
|
have extensive annotations to help you understand them and learn
|
|||
|
from them.
|
|||
|
|
|||
|
A good thing to remember is that you cannot cause any damage
|
|||
|
through experimentation. The worst you can do is to make some
|
|||
|
changes to a script that prevent it from operating properly.
|
|||
|
All you have to do is retrieve a copy of the original script
|
|||
|
(which you saved before you modified the script, right? right!)
|
|||
|
or at worst, you can give me a call and I will help you fix it.
|
|||
|
Don't be afraid to try!
|
|||
|
|
|||
|
What types of scripts are there?
|
|||
|
|
|||
|
Every aspect of the game is controled by scripts to a large
|
|||
|
extent. These scripts call other scripts which in turn may call
|
|||
|
other scripts themselves.
|
|||
|
|
|||
|
Control scripts
|
|||
|
|
|||
|
The CONTROL script is called every time you click with the mouse
|
|||
|
or press a key on the keyboard. This script decides what action
|
|||
|
to take based on your input. Thus, while the default control
|
|||
|
script interprets the letter A to mean 'attack' and a click in
|
|||
|
the view area with the left mouse button to mean 'look-at', you
|
|||
|
can modify the complete interface to do whatever you want.
|
|||
|
|
|||
|
The control script is also called every 'minute' of game play.
|
|||
|
Using the world builder you can specify how time flows in your
|
|||
|
game (# of moves per minute, # of minutes per hours, # of hours
|
|||
|
per day, # of days per month, # of months per year, current
|
|||
|
date, etc.). The game driver then invokes the control script to
|
|||
|
keep track of time and allow it to take time dependent actions.
|
|||
|
|
|||
|
Game Initialization Script
|
|||
|
|
|||
|
When the game first starts, the INITGAME script will be invoked.
|
|||
|
This script is used to present the game's story. You can use
|
|||
|
voice, music, graphics, text, animation, etc.
|
|||
|
|
|||
|
Within this script you also have the chance to create and
|
|||
|
customize the player's character or even the whole party. The
|
|||
|
default character stored in record 0 of the statistics file
|
|||
|
(PLAYERS.DTA) will be used if you don't create one.
|
|||
|
|
|||
|
Dead and Resurrection
|
|||
|
|
|||
|
The RESURECT script is invoked whenever all members of the party
|
|||
|
die. In this script you have the chance to load a saved game,
|
|||
|
restart the game from the begining or even resurect the party
|
|||
|
members.
|
|||
|
|
|||
|
The default resurection script will restore the party members a
|
|||
|
limited number of times by comparing the number of times they
|
|||
|
have been resurected with the current experience level. It then
|
|||
|
transports the party to the place where the game started.
|
|||
|
|
|||
|
Remember that you can set the rules and do whatever you want.
|
|||
|
Some games I've seen will reduce an individual's experience as a
|
|||
|
penalty for resurection but leave them where they were. Others
|
|||
|
will teleport the party to a different location for resurection.
|
|||
|
|
|||
|
Character scripts.
|
|||
|
|
|||
|
When the control script determines that you want to interact
|
|||
|
with another character, it invokes the character's script to
|
|||
|
handle the interaction.
|
|||
|
|
|||
|
Every character in your game has a character type that
|
|||
|
determines it's behaviour. The list of character types is
|
|||
|
defined in the DCCTOKEN.DAT file and the behaviour is handled by
|
|||
|
a script with the same name as the character type.
|
|||
|
|
|||
|
DCGAMES includes a full set of character types with their
|
|||
|
respective scripts: Regular, Bartender, Beggar, Civilian,
|
|||
|
Guard, Healer, Merchant, Prisoner, Teller and Trainer.
|
|||
|
|
|||
|
The behavior of these character types is described in detail in
|
|||
|
the DCGAMES Player's Guide. One of the best ways to become
|
|||
|
quickly familiar with the script language is to compare the
|
|||
|
description of the character type as documented in the Player's
|
|||
|
Guide with the actual script that makes the character behave
|
|||
|
that way.
|
|||
|
|
|||
|
To create your own character types, you add the name of the
|
|||
|
character type to the list in DCCTOKEN.DAT and then create a
|
|||
|
script with that name to handle it's behaviour. If a name is
|
|||
|
longer than 8 characters, you use the first 8 characters for the
|
|||
|
script name.
|
|||
|
|
|||
|
Note: individual characters can have their own individual script
|
|||
|
to override some or all of the character's standard behaviour.
|
|||
|
When a character has it's own script, the driver allows the
|
|||
|
character's script to handle the behaviour and invokes the
|
|||
|
default script for the character's type only if the individual
|
|||
|
script does not handle a particular action.
|
|||
|
|
|||
|
Object scripts.
|
|||
|
|
|||
|
When the control script determines that you want to use an
|
|||
|
object in some way, it invokes the object's script to handle the
|
|||
|
action.
|
|||
|
|
|||
|
If the action is on an object you are carrying, the CURRITEM
|
|||
|
script is invoked. If the action is on an object you are not
|
|||
|
carrying, the OBJECT script is invoked.
|
|||
|
|
|||
|
These two scripts handle the standard behaviour for all of the
|
|||
|
object types defined in DCCTOKEN.DAT. You can add new types to
|
|||
|
the list and modify these scripts to handle actions on the new
|
|||
|
object types.
|
|||
|
|
|||
|
The default scritps handle Food, Weapon, Ammunition, Armor,
|
|||
|
Shield, Amulet, Ring, Potion, Scroll, Staff, Chest, Keys, Gems,
|
|||
|
Book, Gold Sack, Torch, Lantern, Rope, Hooks, Mirror, Sign,
|
|||
|
Vehicle, Thing, Door and Fence objects.
|
|||
|
|
|||
|
You can also override an object's default behaviour by providing
|
|||
|
a tailor-made script for that particular object. Any action
|
|||
|
that is not handled by your script will be handed over to the
|
|||
|
default script for handling.
|
|||
|
|
|||
|
You can alter the behavior of an object in several ways. You may
|
|||
|
modify the OBJECT.SCR to alter the way existing objects types
|
|||
|
work, or define new object types; You can also create a brand
|
|||
|
new script file to control the behavior of a specific object.
|
|||
|
|
|||
|
World scripts.
|
|||
|
|
|||
|
When the player enters or exists a world, the world's script is
|
|||
|
executed. The predefined script WORLDDEF.SCR is executed if you
|
|||
|
don't provide one of your own. The world's script can deny
|
|||
|
access to the world, or send the character to a different
|
|||
|
destination within the same world or in any other world.
|
|||
|
|
|||
|
The file DCCTOKEN.DAT contains a list of world types (Outdoors,
|
|||
|
City, Town, Dungeon, Hideout, House, Castle, Arena, Haunted and
|
|||
|
End-Game) which you can modify at will.
|
|||
|
|
|||
|
The world script handles entry and exit from each world, but
|
|||
|
other scripts are also involved. For example, the CONTROL
|
|||
|
script will generate random monsters only in OUTDOORS, DUNGEON
|
|||
|
and HAUNTED worlds. It also handles walking of the 'edge' of the
|
|||
|
world (if outdoors you wrap around to the other edge of the
|
|||
|
world, but in cities and towns you 'leave' the world).
|
|||
|
|
|||
|
Magic Spells
|
|||
|
|
|||
|
When you invoke magic by using an object, the OBJECT and
|
|||
|
CURRITEM scripts handle the action, but when a magic users
|
|||
|
'casts' a spell, no object is involved, so a separate script is
|
|||
|
used. The CASTING script handles the casting of magic spells.
|
|||
|
|
|||
|
For more information on magic, see the Player's Guide and the
|
|||
|
World Builder User's Guide.
|
|||
|
|
|||
|
Basic Script Elements
|
|||
|
|
|||
|
This section introduces the basic elements that form the script
|
|||
|
language. Just like in English you use words to build sentences,
|
|||
|
and those words are classified into verbs, adjectives, etc, so
|
|||
|
does the script language use a basic set of elements to build
|
|||
|
it's sentences.
|
|||
|
|
|||
|
The script language contains the following basic elements:
|
|||
|
Keywords, Tokens, Constants, Variables, Structures, Statements,
|
|||
|
Functions, Procedures, Comments. Let's look at each one in turn.
|
|||
|
|
|||
|
Keywords
|
|||
|
|
|||
|
A keyword is a word that has a special meaning in the script
|
|||
|
language. You cannot change the spelling or meaning of the
|
|||
|
keyword, because the game system has a specific meaning for it
|
|||
|
and depends on that meaning.
|
|||
|
|
|||
|
A primary keyword is equivalent to a verb in the English
|
|||
|
language. It indicates the action taking place. These keywords
|
|||
|
form the basis of the script language. For example, if, goto,
|
|||
|
write, etc.
|
|||
|
|
|||
|
A secondary keyword exists only to complement a primary keyword,
|
|||
|
and has no meaning by itself. For example, the if primary
|
|||
|
keyword has four secondary keywords associated with itself,
|
|||
|
namely: then, elsif, else and endif.
|
|||
|
|
|||
|
For example:
|
|||
|
|
|||
|
if player.name = "Henry" and fighting then
|
|||
|
|
|||
|
write("Go Away");
|
|||
|
|
|||
|
endif;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
In the above line, the if and write keywords are primary,while
|
|||
|
then, and endif are secondary because they have a meaning only
|
|||
|
in relation to the if keyword. (Note that and is also a
|
|||
|
secondary keyword, but has nothing to do with if I didn't
|
|||
|
highlight it).
|
|||
|
|
|||
|
A function keyword is used to examine or modify a system value.
|
|||
|
This is a value that has a meaning to the game system, but you
|
|||
|
can examine and sometimes modify it to change the way the system
|
|||
|
behaves.
|
|||
|
|
|||
|
For example, if the keyword fighting in the previous example has
|
|||
|
a TRUE value if the game system is currently in combat mode (a
|
|||
|
fight is taking place), so the script displays the words 'Go
|
|||
|
Away' if the current player's name is Henry and you are fighting.
|
|||
|
|
|||
|
Note that words such as player, npc, object, world,group, etc.,
|
|||
|
are called variables and their qualifiers (like player.name or
|
|||
|
world.landscape) are called attributes. These are covered
|
|||
|
elsewhere in this manual.
|
|||
|
|
|||
|
The section Writing Scripts in this manual introduces most of
|
|||
|
the keywords using simple examples. A detailed description of
|
|||
|
each keyword can be found in the Script Language Reference Guide.
|
|||
|
|
|||
|
List of Primary, Secondary and Function Keywords1
|
|||
|
|
|||
|
Comments
|
|||
|
|
|||
|
A comment is a sequence of characters beginning with the
|
|||
|
character '!'. The exclamation point tells the script language
|
|||
|
compiler that the text that follows is a comment and should be
|
|||
|
ignored. Comments are used to document your scripts so they are
|
|||
|
easier to understand.
|
|||
|
|
|||
|
For example:
|
|||
|
|
|||
|
! This is a comment
|
|||
|
|
|||
|
! This is also a comment! All of it..
|
|||
|
|
|||
|
!!! This is another comment.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Note that all text following first ! is part of the comment,
|
|||
|
including any other ! character.
|
|||
|
|
|||
|
Numbers
|
|||
|
|
|||
|
Numbers are very important in DCGAMES.
|
|||
|
|
|||
|
They are used extensively to identify the attributes of objects
|
|||
|
and characters. As a rule, numbers can be values between
|
|||
|
-2147483647 and 2147483647. While this is true for constants,
|
|||
|
when using numbers, you will usually have to restrict them to be
|
|||
|
within the range of values allowed for the purpose you are using
|
|||
|
the number for. For example, a ring object has an attribute
|
|||
|
called charges which holds the number of times the ring can be
|
|||
|
used. This attribute can have a value between 0 (no charges
|
|||
|
left) and 255. Trying to set the charges attribute to 500 will
|
|||
|
result in a warning message, and assign the maximum allowed
|
|||
|
value of 255. The range of values that an attribute can take are
|
|||
|
documented along with each attribute in the section entitled
|
|||
|
STRUCTURES further on in this chapter.
|
|||
|
|
|||
|
Tokens
|
|||
|
|
|||
|
When you write a script, you frequently need to examine and
|
|||
|
modify the attributes of objects and characters, or to perform
|
|||
|
different actions depending on the values of the same. While
|
|||
|
most of these attributes are numeric, you don't need to remember
|
|||
|
what each number means. Instead, tokens have been defined that
|
|||
|
represent the numeric values.
|
|||
|
|
|||
|
In this document, tokens are shown in UPPER CASE. Any name
|
|||
|
shown in upper case letters can be considered to be a token.
|
|||
|
|
|||
|
For example. The standard product includes a set of pre-defined
|
|||
|
object types such as FOOD, WEAPON, ARMOR, etc. The game uses a
|
|||
|
number to represent the object's type (0, 1, 2, 3, etc), but it
|
|||
|
would be difficult to remember that if you want to create a
|
|||
|
WEAPON, you need to set the object's type to 1. Thus, a token
|
|||
|
(namely WEAPON) can be used. A complete list of predefined
|
|||
|
tokens, their values and their usage can be found in the
|
|||
|
appendix.
|
|||
|
|
|||
|
If you modify or extend the set of pre-defined element types,
|
|||
|
you will also add new tokens to the file DCCTOKEN.DAT, which
|
|||
|
associates the token name with the actual value it is going to
|
|||
|
represent. Once the name has been added to the file, you no
|
|||
|
longer have to remember what value you were using for your new
|
|||
|
'type' or 'class' or whatever.
|
|||
|
|
|||
|
Variables
|
|||
|
|
|||
|
A variable is a name used to represent a value, just like a
|
|||
|
token, but the difference is that the variable holds a value,
|
|||
|
and the value can be modified. For example, an object could
|
|||
|
have a weight of 100, but you can change that value any time.
|
|||
|
|
|||
|
Variables are shown in bold letters in this document. A
|
|||
|
variable may have more than one value associated with it (for
|
|||
|
example, an object has a name, a value, a weight, etc.). The
|
|||
|
values associated with the variable are called the attributes of
|
|||
|
the variable.
|
|||
|
|
|||
|
The following paragraphs hold a complete list of all variables,
|
|||
|
their names, attributes, values and a brief description of the
|
|||
|
meaning of the associated value.
|
|||
|
|
|||
|
Generic Variables (Local and Global)
|
|||
|
|
|||
|
There are 2048 local variables, named L0 through L2047. They
|
|||
|
can hold values between -32768 and +32767. They are called
|
|||
|
local because they exist only during execution of the script.
|
|||
|
Once the script has been executed, any value you placed in them
|
|||
|
is lost.
|
|||
|
|
|||
|
Every time a script starts execution, it's local variables are
|
|||
|
initialized to zero. These variables are used mostly for
|
|||
|
control purposes and to hold intermediate values.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
There are 2048 global variables, named G0 through G2047. These
|
|||
|
variables can hold values between -32768 and +32767. They are
|
|||
|
called global because they exist for the entire duration of the
|
|||
|
game. If you set one of these variables to a certain value, it
|
|||
|
will retain that value until you change it again. These
|
|||
|
variables are used to hold values that are important throughout
|
|||
|
the life of the game. For example, you might use one of these
|
|||
|
variables to indicate that a certain action has taken place.
|
|||
|
Other scripts could then check the value of the variable and
|
|||
|
take different actions depending on whether the action has taken
|
|||
|
place or not.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
String Variables
|
|||
|
|
|||
|
There are 17 string variables, named S0 through S16. They are
|
|||
|
different from other variables in that they hold TEXT instead of
|
|||
|
numbers. They are also different in that they are used for some
|
|||
|
specific purposes, and so, are not "generic".
|
|||
|
|
|||
|
Variable S0 can contain up to 255 characters. While you can use
|
|||
|
it for any purpose, it is also used to store any text that the
|
|||
|
player types during conversations, as well as other values. The
|
|||
|
getstr() script function asks the user to type something, and
|
|||
|
stores that value in this variable (among other things).
|
|||
|
|
|||
|
Variables S1 through S16 can contain up to 64 characters. These
|
|||
|
variables hold the 16 lines of text associated with the current
|
|||
|
object or character. The loadtext() script function will load a
|
|||
|
given text record and place each of the lines in the
|
|||
|
corresponding variable.
|
|||
|
|
|||
|
Character Variables and Attributes
|
|||
|
|
|||
|
|
|||
|
|
|||
|
A character in the adventure can be a simple 'extra', with no
|
|||
|
other function than to flesh out a story, or it can be an
|
|||
|
integral part of it. Every character is controlled by a script,
|
|||
|
and the system includes a large number of predefined scripts to
|
|||
|
handle different types of characters. Amongst the different
|
|||
|
types of characters are: Regular, Bartender, Merchant, Civilian,
|
|||
|
Quester, Beggar, etc. Each of these character types has it's
|
|||
|
own script, and when you create a character, you will usually
|
|||
|
select one of these scripts to handle it's behavior. You may
|
|||
|
extend the functionality of each character type by modifying the
|
|||
|
scripts, or you can create brand new scripts to handle a brand
|
|||
|
new type of character. For those characters that are central to
|
|||
|
the story, you may even want to create a special script that
|
|||
|
handles their unique behavior.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
When referring to characters, you may talk about the player or
|
|||
|
the npc. In any interaction, the player is a member of the
|
|||
|
game player's party. The npc is the member with which the
|
|||
|
player is interacting.
|
|||
|
|
|||
|
Character Attributes Description
|
|||
|
|
|||
|
name Name of the character (15 characters max).
|
|||
|
|
|||
|
index* For players, the order in the party. For npcs their
|
|||
|
location in the list of npcs.
|
|||
|
|
|||
|
type Character Type: (0-255). See tokens in DCCTOKEN.DAT
|
|||
|
[Character Types]
|
|||
|
|
|||
|
class Character Class (0-255). See tokens in DCCTOKEN.DAT
|
|||
|
[Character Class]
|
|||
|
|
|||
|
block Tile # from the DCPEOPLE.nnn graphics blocks file used
|
|||
|
for this character
|
|||
|
|
|||
|
block2 Alternate Tile # used in some instances (under script
|
|||
|
control only)
|
|||
|
|
|||
|
picture Image file (0-999). If given, the file CPICTnnn.PCX
|
|||
|
contains the picture.
|
|||
|
|
|||
|
voice Voice file (0-999). If given, the file VOICEnnn.RSP
|
|||
|
contains the voices.
|
|||
|
|
|||
|
x Character's current horizontal location in the current world.
|
|||
|
|
|||
|
y Character's current vertical locatioin in the current world.
|
|||
|
|
|||
|
count For NPCs only, it's the # of npcs represented by the
|
|||
|
individual NPC.
|
|||
|
|
|||
|
script Optional SCRIPT for this character. Uses the character
|
|||
|
type as default.
|
|||
|
|
|||
|
text Optioinal text record (0-n).
|
|||
|
|
|||
|
load/mload Current/Maximum load (how much weight can be
|
|||
|
carried)
|
|||
|
|
|||
|
str/mstr Current/Normal strength
|
|||
|
|
|||
|
aim/maim Current/Normal aim
|
|||
|
|
|||
|
dex/mdex Current/Normal dexterity
|
|||
|
|
|||
|
spd/mspd Current/Normal speed
|
|||
|
|
|||
|
pwr/mpwr Current/Normal magical power points
|
|||
|
|
|||
|
hp/mhp Current/Normal Hit Points
|
|||
|
|
|||
|
iq/miq Current/Normal intelligence
|
|||
|
|
|||
|
ac/mac Current/Normal Armor Class
|
|||
|
|
|||
|
luk/mluk Current/Normal Luck
|
|||
|
|
|||
|
chr/mchr Current/Normal Charisma
|
|||
|
|
|||
|
exp Current experience points
|
|||
|
|
|||
|
level Current character level
|
|||
|
|
|||
|
poisoned Character is poisoned
|
|||
|
|
|||
|
scared Character is scared
|
|||
|
|
|||
|
paralyzed Character is paralyzed
|
|||
|
|
|||
|
confused Character is confused
|
|||
|
|
|||
|
invisible Character is invisible
|
|||
|
|
|||
|
energy Current energy level (From food. See group.energy for
|
|||
|
energy from sleep).
|
|||
|
|
|||
|
stats Character statistics record.
|
|||
|
|
|||
|
v0 - v7 Extra variables to be used for any purpose you need.
|
|||
|
|
|||
|
weapon Currently wielded weapon (if any)
|
|||
|
|
|||
|
armor Currently worn armor (if any)
|
|||
|
|
|||
|
shield Currently worn shield (if any)
|
|||
|
|
|||
|
ring Currently worn ring (if any)
|
|||
|
|
|||
|
amulet Currently worn amulet (if any)
|
|||
|
|
|||
|
staff Currently wielded staff (if any)
|
|||
|
|
|||
|
bp Currently selected backpack object (The backpack can hold
|
|||
|
16)
|
|||
|
|
|||
|
body Currently selected body object (if any, one of the
|
|||
|
following 6 objects).
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Object Variables and Attributes
|
|||
|
|
|||
|
|
|||
|
|
|||
|
An object is an item that can be manipulated in many different
|
|||
|
ways during game play. The object's TYPE and CLASS determine
|
|||
|
what can be done with the object.
|
|||
|
|
|||
|
Most of the behavior of objects is controlled from the
|
|||
|
predefined script OBJECT. This script can handle objects of
|
|||
|
type food, weapon, ammunition, shield, armor, ring, amulet,
|
|||
|
scroll, staff, chest, vehicles, etc.
|
|||
|
|
|||
|
Object Variables Description
|
|||
|
|
|||
|
player.weapon The weapon wielded by the current player (if
|
|||
|
any).
|
|||
|
|
|||
|
player.armor The armor worn by the current player (if any).
|
|||
|
|
|||
|
player.shield The shield being used by the current player (if
|
|||
|
any).
|
|||
|
|
|||
|
player.ring The ring being worn by the current player (if any).
|
|||
|
|
|||
|
player.amulet The amulet being worn by the current player (if
|
|||
|
any).
|
|||
|
|
|||
|
player.staff The staff being used by the current player (if
|
|||
|
any).
|
|||
|
|
|||
|
player.body The last selected body item (represents one of
|
|||
|
player.weapon, player.armor, player.shield, player.ring,
|
|||
|
player.amulet or player.staff.
|
|||
|
|
|||
|
player.bp The last selected backpack item for the current
|
|||
|
player. The backpack can hold up to 16 items, but only one of
|
|||
|
them is selected at a time.
|
|||
|
|
|||
|
npc.weapon The weapon wielded by the current npc (if any).
|
|||
|
|
|||
|
npc.armor The armor worn by the current npc (if any).
|
|||
|
|
|||
|
npc.shield The shield being used by the current npc (if any).
|
|||
|
|
|||
|
npc.ring The ring being worn by the current npc (if any).
|
|||
|
|
|||
|
npc.amulet The amulet being worn by the current npc (if any).
|
|||
|
|
|||
|
npc.staff The staff being used by the current npc (if any).
|
|||
|
|
|||
|
npc.body The last selected body item (represents one of
|
|||
|
npc.weapon, npc.armor, npc.shield, npc.ring, npc.amulet or
|
|||
|
npc.staff.
|
|||
|
|
|||
|
npc.bp The last selected backpack item for the current npc.
|
|||
|
The backpack can hold up to 16 items, but only one of them is
|
|||
|
selected at a time.
|
|||
|
|
|||
|
group.vehicle The vehicle the group is currently on (if any).
|
|||
|
|
|||
|
object The object represented by this variable is not being
|
|||
|
carried by anyone. It exists on it's own in the current world.
|
|||
|
|
|||
|
curritem The object represented by this variable is being
|
|||
|
carried by either the player or the npc character, either in the
|
|||
|
backpack or being worn. It is used when the exact location of
|
|||
|
the object is not important.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Each of the objects listed above has the following attributes
|
|||
|
associated with it. Thus, you can type: npc.weapon.name,
|
|||
|
player.bp.count, group.vehicle.type, curritem.class, etc.
|
|||
|
|
|||
|
Object Attributes Description
|
|||
|
|
|||
|
name Name of the object (15 characters max).
|
|||
|
|
|||
|
index* Current position of the object in it's place (world,
|
|||
|
backpack, etc.)
|
|||
|
|
|||
|
type Object Type (0-255). See DCCTOKEN.DAT section [OBJECT
|
|||
|
TYPES]
|
|||
|
|
|||
|
class Object Class (0-255). See DCCTOKEN.DAT sections [OBJECT
|
|||
|
CLASS: x, y]
|
|||
|
|
|||
|
block Tile # from file DCOBJECT.mde used to display the object.
|
|||
|
|
|||
|
picture Image file # (000-999). If given, file OPICTnnn.PCX
|
|||
|
contains the picture.
|
|||
|
|
|||
|
voice Vioce file # (000-999). Objects can have a sound file
|
|||
|
also VOICEnnn.RSC
|
|||
|
|
|||
|
weight Current weight of the object.
|
|||
|
|
|||
|
value Current value of the object in Silver Pieces (10sp =
|
|||
|
1gp).
|
|||
|
|
|||
|
x Object's horizontal location (when not being carried).
|
|||
|
|
|||
|
y Object's vertical location (when not being carried).
|
|||
|
|
|||
|
count Number of objects represented by this single instance.
|
|||
|
|
|||
|
script Optional script file. Uses OBJECT.SCR and CURRITEM.SCR
|
|||
|
by default.
|
|||
|
|
|||
|
text Object's text record (if any).
|
|||
|
|
|||
|
endgame For compatibility with DCGAMES 1.x/2.x.. 0=No, 1=on
|
|||
|
GET, 2=Give.
|
|||
|
|
|||
|
endtext Text block # to be displayed when the game ends due to
|
|||
|
'endgame'.
|
|||
|
|
|||
|
v0 - v7 Extra attributes, use for anything you want.
|
|||
|
|
|||
|
m0 - m4 Extra attributes, but you can have a token name
|
|||
|
associated with one of these. See file DCCTOKEN.DAT for more
|
|||
|
info.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
World Variables and Attributes
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Each world has a certain number of attributes which you can
|
|||
|
examine and in some cases modify. You can only access the
|
|||
|
attributes for the world you are currently in.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Attribute Description
|
|||
|
|
|||
|
name Name of the current world, text, 15 chars.
|
|||
|
|
|||
|
index* Current world number.
|
|||
|
|
|||
|
type World's type, 0 - 255. Tokens: OUTDOORS, CITY, TOWN,
|
|||
|
DUNGEON, HIDEOUT, HOUSE, CASTLE, ARENA and ENDGAME.
|
|||
|
|
|||
|
x* Horizontal size (width) of the current world
|
|||
|
|
|||
|
y* Vertical size (height) of the current world
|
|||
|
|
|||
|
block(x,y) Landscaping block # displayed at position x,y
|
|||
|
|
|||
|
density(x,y) Density of landscaping block at position x,y
|
|||
|
|
|||
|
level Minimum player level needed to enter this world.
|
|||
|
|
|||
|
landscape Landscaping file being used (0 to 9)
|
|||
|
|
|||
|
door the door through which you entered the current world.
|
|||
|
|
|||
|
doorx(door#) Horizontal location of the door in the current
|
|||
|
world.
|
|||
|
|
|||
|
doory(door#) Vertical location of the door in the current
|
|||
|
world.
|
|||
|
|
|||
|
destinationworld(door#) Destination world # .
|
|||
|
|
|||
|
destinationdoor(door#) Destination door in the destination
|
|||
|
world. (non-trap doors only)
|
|||
|
|
|||
|
destinationx(door#) Horizontal location in the destination
|
|||
|
world (trap doors only)
|
|||
|
|
|||
|
destinationy(door#) Vertical location in the destination world
|
|||
|
(trap doors only)
|
|||
|
|
|||
|
trapdoorswitch(door#) Is non-zero if the door is a TRAP
|
|||
|
(destinationx/y instead of destinationdoor).
|
|||
|
|
|||
|
entrytext(door#) Text block # displayed when the player enters
|
|||
|
the world through the door.
|
|||
|
|
|||
|
entrytextswitch(door#) If non-zero, the text is displayed only
|
|||
|
the first time the door is used.
|
|||
|
|
|||
|
exittext(door#) Text block # displayed when the player exits
|
|||
|
the world through the door
|
|||
|
|
|||
|
exittextswitch(door#) If non-zero, the text is displayed only
|
|||
|
the first time the door is used.
|
|||
|
|
|||
|
edgedoor The door through which the player exits the current
|
|||
|
world by walking 'of-the-edge' of the world, or casting the
|
|||
|
standard 'exit' spell.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Group Variables and Attributes
|
|||
|
|
|||
|
Durng game play, your group can contain anywhere from 1 to 6
|
|||
|
characters.
|
|||
|
|
|||
|
Group Attributes Description
|
|||
|
|
|||
|
size* Current number of characters in the group.
|
|||
|
|
|||
|
current Currently selected 'spokesbeing' for the group (0-5).
|
|||
|
|
|||
|
gold Amount of gold being carried (given in silver pieces, 10sp
|
|||
|
= 1gp).
|
|||
|
|
|||
|
food The total amount of normal (non-magical) food being
|
|||
|
carried by the party.
|
|||
|
|
|||
|
energy The group's energy, which is replenished with sleep.
|
|||
|
|
|||
|
dead_count Number of times that everyone in the group has died
|
|||
|
(and thus, how many times they have been resurrected).
|
|||
|
|
|||
|
x Current horizontal location in the current world.
|
|||
|
|
|||
|
y Current vertical location in the current world.
|
|||
|
|
|||
|
moves Total number of moves since the game started.
|
|||
|
|
|||
|
block Tile # from DCSYSTEM.mde (type 'SYS_PARTY') to represent
|
|||
|
the party during normal game play.
|
|||
|
|
|||
|
vehicle Current vehicle (if any). If the group is riding a
|
|||
|
vehicle, the vehicle's graphics block is displayed instead of
|
|||
|
the group's regular block.
|
|||
|
|
|||
|
Types of Scripts
|
|||
|
|
|||
|
This section talks about the different TYPES of scripts you may
|
|||
|
want to write, and tries to point out WHY you would want to
|
|||
|
write that kind of script, instead of HOW. The actual script
|
|||
|
language is presented in the section Script Language Programming
|
|||
|
Guide later in this manual.
|
|||
|
|
|||
|
Introduction Script
|
|||
|
|
|||
|
The introduction script (INITGAME.SCR) is a script that is
|
|||
|
executed only the first time you start playing. Like most games,
|
|||
|
you must start of by telling the game player what the story is
|
|||
|
about, give some background information, set the mood for the
|
|||
|
game.
|
|||
|
|
|||
|
Before this script is invoked, a group with a single player is
|
|||
|
created, taking the attributes from record 0 of the statistics
|
|||
|
file (PLAYERS.DTA) as created using the DCWORLD program.
|
|||
|
|
|||
|
The INITGAME script is free to modify the default character, as
|
|||
|
well as add other characters to the group at this time. It can
|
|||
|
also invoke the edit_character function to allow the player to
|
|||
|
select a name, character type, character block and starting
|
|||
|
attributes.
|
|||
|
|
|||
|
You can also modify the group's starting position by seting the
|
|||
|
X and Y attributes of the group variable, or by using the
|
|||
|
teleport or enter commands.
|
|||
|
|
|||
|
A typical introductory script would look like this:
|
|||
|
|
|||
|
!
|
|||
|
|
|||
|
! FILE : initgame.scr
|
|||
|
|
|||
|
!
|
|||
|
|
|||
|
|
|||
|
|
|||
|
readtext( "intro.txt" ); ! Read some text
|
|||
|
|
|||
|
viewpcx ( "intro2" ); ! Show a nice picture
|
|||
|
|
|||
|
music ( "intro2" ); ! Play background music
|
|||
|
|
|||
|
wait ( 120 ); ! Wait until music ends or <SPACE> is
|
|||
|
pressed
|
|||
|
|
|||
|
|
|||
|
|
|||
|
!
|
|||
|
|
|||
|
! Now, create the player's character by using 'edit_player'
|
|||
|
|
|||
|
!
|
|||
|
|
|||
|
edit_player( 1,
|
|||
|
|
|||
|
30, ! points to distribute
|
|||
|
|
|||
|
9, ! Minimum start attribute value is 9
|
|||
|
|
|||
|
25, ! Maximum start attribute value is 25
|
|||
|
|
|||
|
1, ! Allow name to be changed
|
|||
|
|
|||
|
0, ! Don't allow character class to be changed
|
|||
|
|
|||
|
1 ! Allow character image to be changed
|
|||
|
|
|||
|
); ! Allow all stats to be changed (strenght,
|
|||
|
dexterity, etc.)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CONTINUE; ! Continue with normal character creation
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Note that the READTEXT command has some voice, music and
|
|||
|
graphics capabilities also. The 'intro.txt' file does not
|
|||
|
necessarily display a single page of text.
|
|||
|
|
|||
|
Character Script
|
|||
|
|
|||
|
Every character in the game has a script to control it's
|
|||
|
behavior, except for monsters (type HOSTILE), whose behavior
|
|||
|
consists of chasing the player and fighting.
|
|||
|
|
|||
|
The world builder assumes that the first 8 characters of the
|
|||
|
character TYPE can be used as the name of the character's
|
|||
|
script. Thus a BARTENDER's script is BARTENDE.SCR, and a
|
|||
|
BEGGAR's script is BEGGAR.SCR.
|
|||
|
|
|||
|
The system provides 11 predefined character scripts, each of
|
|||
|
which has a unique function. A full explanation of each
|
|||
|
character 'type' as implemented by the scripts can be found in
|
|||
|
the DCGAMES User's Guide.
|
|||
|
|
|||
|
Usually, a character script handles conversation. When the
|
|||
|
player 'talks' to a character, the character takes control of
|
|||
|
the conversation by means of the script. A merchant, for
|
|||
|
example, asks if you wish to buy or sell something, while a
|
|||
|
healer asks if you need to be cured, healed, etc.
|
|||
|
|
|||
|
Special characters may have their own unique script, as is the
|
|||
|
case of JIMMY in the example adventure. That script does a bit
|
|||
|
of animation when the character is asked to join the adventurer,
|
|||
|
and handles special needs of that character.
|
|||
|
|
|||
|
You should print out the character scripts and compare each of
|
|||
|
them with the description of the character type as given in the
|
|||
|
User's Guide. You will then understand how the given script
|
|||
|
implements the behavior.
|
|||
|
|
|||
|
There are three ways of working with character scripts. You can
|
|||
|
modify the default scripts to alter the behavior of existing
|
|||
|
character types, you can create a brand new character type, with
|
|||
|
it's own script, or you can create a unique script for a unique
|
|||
|
character.
|
|||
|
|
|||
|
Object Script
|
|||
|
|
|||
|
Unlike characters, objects are not requried to have a script
|
|||
|
associated with them. If they do have one associated, it is
|
|||
|
invoked first to allow it to handle the interaction. If the
|
|||
|
script does not handle the interaction, or it does handle it but
|
|||
|
ends with CONTINUE instead of STOP, or there is no script at
|
|||
|
all, the system invokes one of the default object handling
|
|||
|
scripts: OBJECT.SCR is invoked for objects laying around while
|
|||
|
CURRITEM.SCR is invoked for objects being carried by the player
|
|||
|
or npc.
|
|||
|
|
|||
|
Every time you create a new object type or even a new class
|
|||
|
within an object type, you will need to modify the OBJECT and
|
|||
|
CURRITEM scripts to handle the new object. For example, mirrors
|
|||
|
currently don't do anything. If you wanted to have a mirror
|
|||
|
that shows you an area around you, you could create mirror
|
|||
|
classes. Class 0 would be a normal mirror, while class 1 would
|
|||
|
invoke a 'view' spell. You can then modify the two scripts to
|
|||
|
check the class attribute for mirrors and behave accordingly.
|
|||
|
|
|||
|
Note: Since version 4.0 allows one script to call another, this
|
|||
|
description is not entirely correct. The CONTROL script calls
|
|||
|
the OBJECT or CURRITEM scripts as needed, and these scripts may
|
|||
|
call others, like the CASTING script or the DESCOBJ script.
|
|||
|
|
|||
|
Now, if you need to have a given object behave differently, you
|
|||
|
need to write a separate script for it. The script does not
|
|||
|
need to handle all actions on that object, just the ones that
|
|||
|
are different. For example: You want to create a magic ring,
|
|||
|
but this ring can cast more than one spell. You could write a
|
|||
|
special script that has an entry point for the @WEAR action (see
|
|||
|
the programming guide section at the end of this document).
|
|||
|
|
|||
|
When the character wears the ring, your script might display the
|
|||
|
image of a genie, and ask the player what spell is desired. The
|
|||
|
script would then perform the appropriate spell.
|
|||
|
|
|||
|
Remember that if a script does not have an entry point for a
|
|||
|
given action, then a default action is taken. In this case, the
|
|||
|
default action is to call the CURRITEM script. Thus, all
|
|||
|
actions would be handled by the CURRITEM script except for WEAR.
|
|||
|
|
|||
|
Remember also that if your script ends with CONTINUE instead of
|
|||
|
STOP, the default action is taken anyway, so your script doesn't
|
|||
|
really have to handle the situation. For example, your 'ring'
|
|||
|
may have a 'random' effect (i.e. you never know what is going to
|
|||
|
happen when you wear it). To do this, your script would just
|
|||
|
set the ring's class (which determines it's magical effect) and
|
|||
|
terminate with CONTINUE. The default action would be taken, and
|
|||
|
the CURRITEM script would handle the actual magical effect!World Script
|
|||
|
|
|||
|
World scripts are executed whenever you ENTER or EXIT the world.
|
|||
|
The default world script, WORLDDEF.SCR, is invoked if your
|
|||
|
world does not have it's own script. The world type and other
|
|||
|
attributes configured using DCWORLD allow the WORLDDEF script to
|
|||
|
handle most normal situations.
|
|||
|
|
|||
|
World scripts can be very powerful tools to introduce some
|
|||
|
amount of 'sequencing' into the game. From within a script you
|
|||
|
can change landscaping, doors, etc. You can also examine and
|
|||
|
change every single object and character in that world. You
|
|||
|
could have a character that exists only after you have performed
|
|||
|
a certain action. The world script could check to see if you
|
|||
|
have performed that action every time you enter the world, and
|
|||
|
create the character only when you have done so.
|
|||
|
|
|||
|
You can even re-route the player to a different destination
|
|||
|
within the same world, or in a totally different one.
|
|||
|
|
|||
|
See the comments in the WORLDDEF script for a detailed
|
|||
|
discussion of entering and exiting worlds.
|
|||
|
|
|||
|
Control Script
|
|||
|
|
|||
|
The control script is the most sensitive script of all. It is
|
|||
|
called under different circumstances and it invokes most of the
|
|||
|
other scripts itself as needed.
|
|||
|
|
|||
|
This script is invoked:
|
|||
|
|
|||
|
Every 'minute' of game play (as defined in the MovesPerMinute
|
|||
|
control variable) to keep track of time and handle healing,
|
|||
|
getting tired, resting, the appearance of random monsters, etc.
|
|||
|
|
|||
|
Every time you press a key or click with the mouse to handle the
|
|||
|
interaction between the player and the game system.
|
|||
|
|
|||
|
Once for every player during a fight, to handle a player's TURN.
|
|||
|
|
|||
|
Once for every monster during a fight, to handle the monster's
|
|||
|
TURN.
|
|||
|
|
|||
|
Note: Version 3.x had entry points in the control script for
|
|||
|
handling a player leaving the party, winning a fight (for
|
|||
|
experience and random treasure), etc. These entrypoints are no
|
|||
|
longer needed because version 4.0 is more fully under script
|
|||
|
control, so these events happen in their appropriate places
|
|||
|
without special "hooks".
|
|||
|
|
|||
|
Resurrection Script
|
|||
|
|
|||
|
The resurrection script (RESURECT.SCR) is called whenever all
|
|||
|
members of the playing party die. From this script you have the
|
|||
|
option to give the player a second chance. Once again, you have
|
|||
|
complete control over the situation. You can terminate the
|
|||
|
game, give the player the option to restart, restore or quit, or
|
|||
|
just restore the player's hit points and continue the game. You
|
|||
|
can also transport the party to another location, and perform
|
|||
|
some cleanup activities.
|
|||
|
|
|||
|
Writing Scripts
|
|||
|
|
|||
|
Script Files
|
|||
|
|
|||
|
A script can be written using any regular text editor or word
|
|||
|
processor. If you use a word processor, you should save the
|
|||
|
script in ASCII or TEXT format (with no special controls like
|
|||
|
fonts or page formatting). The script file name should have an
|
|||
|
extension of .SCR, to indicate it contains a script.
|
|||
|
|
|||
|
Once the script has been saved, you will use the script compiler
|
|||
|
to translate the script from human readable form (text) into a
|
|||
|
compact code that the game driver understands. The translated
|
|||
|
code is written into a file with the same name as the original
|
|||
|
file, but with extension of .SCO (for SCript Object).
|
|||
|
|
|||
|
For example:
|
|||
|
|
|||
|
C:\DCGAME> edit myscript.scr
|
|||
|
|
|||
|
... you create the script using some editor ...
|
|||
|
|
|||
|
C:\DCGAME> dir myscript.*
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Volume in drive C is MYVOLUME
|
|||
|
|
|||
|
Directory of C:\DCGGAME
|
|||
|
|
|||
|
|
|||
|
|
|||
|
MYSCRIPT SCR 1208 10-29-92 1:25p
|
|||
|
|
|||
|
1 file(s) 1208 bytes
|
|||
|
|
|||
|
6920192 bytes free
|
|||
|
|
|||
|
|
|||
|
|
|||
|
C:\DCGAME> dcc myscript
|
|||
|
|
|||
|
DCGAMES Script Compiler Version 4.0, August 1995
|
|||
|
|
|||
|
Copyright (c) 1992 DC Software, 7908 Kettlewood Court, Plano TX
|
|||
|
75025
|
|||
|
|
|||
|
Compiling Script <myscript.SCR>
|
|||
|
|
|||
|
Code Size = 179
|
|||
|
|
|||
|
Data Size = 367
|
|||
|
|
|||
|
Labels = 25
|
|||
|
|
|||
|
Compilation successful
|
|||
|
|
|||
|
|
|||
|
|
|||
|
C:\DCGAME> dir myscript.*
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Volume in drive C is MYVOLUME
|
|||
|
|
|||
|
Directory of C:\DCGGAME
|
|||
|
|
|||
|
|
|||
|
|
|||
|
MYSCRIPT SCO 604 10-29-92 1:28p
|
|||
|
|
|||
|
MYSCRIPT SCR 1208 10-29-92 1:25p
|
|||
|
|
|||
|
1 file(s) 1208 bytes
|
|||
|
|
|||
|
6920192 bytes free
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The script MYSCRIPT is now ready to be used in your adventure.
|
|||
|
Now, every script must be translated in the above manner
|
|||
|
whenever you modify it, or the changes will not be seen by the
|
|||
|
game driver. The game driver uses the .SCO file only.
|
|||
|
|
|||
|
To compile ALL the scripts in your current directory, type:
|
|||
|
|
|||
|
C:\DCGAME> for %i in (*.scr) do dcc %i
|
|||
|
|
|||
|
If you are familiar with any programming language at all, the
|
|||
|
script language will be quite easy to learn, but even if you
|
|||
|
have never learned any programming language, you should be able
|
|||
|
to learn how to write scripts without to much trouble.
|
|||
|
|
|||
|
To assist you, the following section sections try to present the
|
|||
|
script language in easy incremental steps, so you may learn at
|
|||
|
your own pace.
|
|||
|
|
|||
|
If you get hopelessly lost, give me a call and I will try to
|
|||
|
assist over the phone, but please give it your best shot and try
|
|||
|
to have specific questions written down when you call. It will
|
|||
|
help keep the phone call as short as possible.
|
|||
|
|
|||
|
I urge you to annotate this document wherever you see think
|
|||
|
something being presented poorly, in the wrong order, or just
|
|||
|
plain wrong. This section is the most important one because it
|
|||
|
is the one that enables YOU to write your games. Send me a copy
|
|||
|
of the pages on which you have made notes and I will gladly
|
|||
|
correct the problem and send you back a new copy with
|
|||
|
corrections as soon as they are made.
|
|||
|
|
|||
|
Expressions and Assignments
|
|||
|
|
|||
|
An expression is a list of one or more symbols that represent a
|
|||
|
single value. The symbols may be variables, attributes,
|
|||
|
constants, functions or operands. We already know what
|
|||
|
variables, attributes and constants are. An operand is a symbol
|
|||
|
that tells the computer that an operation should take place.
|
|||
|
For example, in the expression 3 * 5 + 2, the * operand tells
|
|||
|
the computer to multiply the constants 3 and 5, and the symbol +
|
|||
|
tells the computer to add two values together..
|
|||
|
|
|||
|
In DCGAMES there are 3 types of expressions, arithmetic,
|
|||
|
relational.
|
|||
|
|
|||
|
An arithmetic expression is one which takes numeric values (from
|
|||
|
variables, attributes, constant or functions) and performs an
|
|||
|
arithmetic operation on them. The arithmetic operands are: *,
|
|||
|
/, +, - and % (this last representing a modulo operation, or the
|
|||
|
'remainder' portion of an integer division).
|
|||
|
|
|||
|
A relational expression is one which compares two numerical
|
|||
|
expressions and results in a logical value (to be specific, a
|
|||
|
relational expression will always result in either a zero or a
|
|||
|
one).
|
|||
|
|
|||
|
A logical value is either zero (meaning FALSE) or non-zero
|
|||
|
meaning true.
|
|||
|
|
|||
|
Expressions are used in many places, but the most common use of
|
|||
|
expressions is on the right side of an assignment statement.
|
|||
|
The second most common use for expressions is as part of a flow
|
|||
|
control statement, such as if or on, which are examined a bit
|
|||
|
later.
|
|||
|
|
|||
|
Note that the function keywords listedat the begining of this
|
|||
|
document can be used almost anywhere that you can use an
|
|||
|
expresion. A function has a value which is replaced in the
|
|||
|
position that you use the function itself. It also may have
|
|||
|
parameters that change the value of the function itself.
|
|||
|
|
|||
|
For example, the function abs( - 3 ) has a value of 3, while the
|
|||
|
function max(-5,7,2) has a value of 7.
|
|||
|
|
|||
|
This table presents a more detailed description of the
|
|||
|
functions, but a detailed explanation of each of them is found
|
|||
|
in the Script Language Reference Manual.
|
|||
|
|
|||
|
Function Table
|
|||
|
|
|||
|
Function Description
|
|||
|
|
|||
|
General General purpose functions
|
|||
|
|
|||
|
abs(expr) Returns the value of the expression without a sign
|
|||
|
(removes negative signs)
|
|||
|
|
|||
|
adjustments(expr,...) Returns the sum of the attribute
|
|||
|
adjustments indicated by the expressions
|
|||
|
|
|||
|
find(where,what,type) Find an object or character
|
|||
|
|
|||
|
getnum(str,low,high) Display a message and get a value between
|
|||
|
low and high from the player.
|
|||
|
|
|||
|
getstr(str,...) Get a string from the player and return the
|
|||
|
index of the matching one.
|
|||
|
|
|||
|
locate(what) Locate an object or npc character by allowing the
|
|||
|
player to point to it.
|
|||
|
|
|||
|
Time Related Used to control time during game play
|
|||
|
|
|||
|
MovesPerMinute Number of moves that can be made in one minute
|
|||
|
of game play.
|
|||
|
|
|||
|
MinutesInAnHour Number of minutes in one hour of game play.
|
|||
|
|
|||
|
HoursInADay Number of hours in a day of game play.
|
|||
|
|
|||
|
DaysInAMonth Number of days in a month of game play.
|
|||
|
|
|||
|
MonthsInAYear Number of months in a year of game play.
|
|||
|
|
|||
|
Year The current year.
|
|||
|
|
|||
|
Month The current month of the current year.
|
|||
|
|
|||
|
Day The current day of the current month.
|
|||
|
|
|||
|
Hour The current hour of the current day.
|
|||
|
|
|||
|
Minute The current minute of the current hour.
|
|||
|
|
|||
|
SunRise The hour of the day at which the sun rises
|
|||
|
|
|||
|
SunSet The hour of the day at which the sun sets
|
|||
|
|
|||
|
Monster Related Used to create random monsters
|
|||
|
|
|||
|
DefStat(0-2) Backpacks that contain likely treasure (usually
|
|||
|
Potions, Rings and Staffs).
|
|||
|
|
|||
|
DefPack(0-3) The statistics records for SMALL, MEDIUM, LARGE
|
|||
|
and PIRATE monsters.
|
|||
|
|
|||
|
DefLandBlk(0-4) Graphics blocks for land based monsters
|
|||
|
(ordered, 0=Easy,4=Very Hard)
|
|||
|
|
|||
|
DefCaveBlk(0-4) Graphics blocks for cave dwelling monsters
|
|||
|
(ordered)
|
|||
|
|
|||
|
DefWaterBlk(0-4) Graphics blocks for water dwelling monsters.
|
|||
|
(ordered, 4=Pirate Ship)
|
|||
|
|
|||
|
DefSpookBlk(0-4) Graphics blocks of skeletons, ghosts, etc.
|
|||
|
(ordered)
|
|||
|
|
|||
|
expr represents any expression that results in a numeric value
|
|||
|
|
|||
|
... means that any number of the preceding may be listed,
|
|||
|
separated by commas (up to 255 maximum)
|
|||
|
|
|||
|
The numeric range (0-N) means that a value in the given range
|
|||
|
must be provided when referring to this variable
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Examples:
|
|||
|
|
|||
|
! Increase a player's current level
|
|||
|
|
|||
|
player.level = player.level + 1;
|
|||
|
|
|||
|
! same as "inc(player.level);"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
! When selling an object, increase the group's gold by half the
|
|||
|
value of the object.
|
|||
|
|
|||
|
group.gold = group.gold - player.bp.value / 2;
|
|||
|
|
|||
|
! same as "dec( group.gold,player.bp.value/2);"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
! Compute the amount of damage done by a weapon, taking into
|
|||
|
account the wielder's
|
|||
|
|
|||
|
! strength (assumes this is not a missile weapon), where
|
|||
|
strength is not important.
|
|||
|
|
|||
|
L25 = npc.weapon.damage + adjustments(npc.str);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
! NOTE: Since relational expressions return 0 if false and 1 if
|
|||
|
true, the following
|
|||
|
|
|||
|
! expression returns a value between 0 and 7, which is the
|
|||
|
number of attributes
|
|||
|
|
|||
|
! of the current npc that exceed 25 points.
|
|||
|
|
|||
|
L7 = npc.str > 25 + npc.aim > 25 + npc.dex > 25 + npc.spd > 25 +
|
|||
|
|
|||
|
npc.pwr > 25 + npc.iq > 25 + npc.chr > 25 + npc.luk > 25;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
! Change the character's name to "Henry"
|
|||
|
|
|||
|
player.name = "Henry";
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Please note that the last assignment statement assigns a string
|
|||
|
value to the name attribute. The name and script attributes may
|
|||
|
only hold string values.
|
|||
|
|
|||
|
Statements
|
|||
|
|
|||
|
Just like the English language, the script language uses words
|
|||
|
and symbols to build sentences or statements which tell the game
|
|||
|
driver what to do. A statement is a complete sequence of words
|
|||
|
and symbols that tell the game driver how to perform a single
|
|||
|
given action.
|
|||
|
|
|||
|
A complex statement consists of a one or more statements that
|
|||
|
are grouped together in some fashion to create a more complex
|
|||
|
one. You are already acquainted with the assignment statement,
|
|||
|
now let's look at some other ones, grouped by their nature or
|
|||
|
intended usage.
|
|||
|
|
|||
|
Conditional Statements
|
|||
|
|
|||
|
In most cases, rather than just assign values to variables, what
|
|||
|
you want to do is take different action depending on certain
|
|||
|
conditions:
|
|||
|
|
|||
|
! Compute the amount of damage done by a weapon, taking into
|
|||
|
account the wielder's
|
|||
|
|
|||
|
! strength IF the weapon is a contact weapon (i.e. not a missile
|
|||
|
weapon).
|
|||
|
|
|||
|
if npc.weapon.class = BLUNT or npc.weapon.class = EDGED then
|
|||
|
|
|||
|
L25 = npc.weapon.damage + adjustments(npc.str);
|
|||
|
|
|||
|
else
|
|||
|
|
|||
|
L25 = npc.weapon.damage; ! No adjustment for strength
|
|||
|
|
|||
|
endif;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
! The above might also be accomplished as follows
|
|||
|
|
|||
|
L25 = npc.weapon.damage;
|
|||
|
|
|||
|
if npc.weapon.class = BLUNT or npc.weapon.class = EDGED then
|
|||
|
|
|||
|
L25 = L25 + adjustments(npc.str);
|
|||
|
|
|||
|
endif;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
! Now, the following statement displays the current health
|
|||
|
status of a player
|
|||
|
|
|||
|
if player.hp = 0 then
|
|||
|
|
|||
|
writeln( player.name, " is dead!" );
|
|||
|
|
|||
|
elsif player.hp = 1 then
|
|||
|
|
|||
|
writeln( player.name, " is unconscious" );
|
|||
|
|
|||
|
elsif player.hp < player.mhp
|
|||
|
|
|||
|
writeln( player.name, " is hurt, but still able to function" );
|
|||
|
|
|||
|
else
|
|||
|
|
|||
|
writeln( player.name, " is healthy" );
|
|||
|
|
|||
|
endif;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Flow Control Statements
|
|||
|
|
|||
|
Sometimes, the if statement can result in long and difficult to
|
|||
|
read statements. In some cases, it is more appropriate to use
|
|||
|
one of the various forms of the goto or gosub statements to
|
|||
|
accomplish the same goal.
|
|||
|
|
|||
|
In order to use these statements, you must first declare one or
|
|||
|
more labels to which the flow of the execution may be
|
|||
|
transferred. The following examples are equivalent.
|
|||
|
|
|||
|
Flow control using if
|
|||
|
|
|||
|
:AGAIN
|
|||
|
|
|||
|
L3 = getstr( "Sell", "Buy", "Talk" );
|
|||
|
|
|||
|
if L3 = 0 then
|
|||
|
|
|||
|
! script for selling goes here
|
|||
|
|
|||
|
elsif L3 = 1 then
|
|||
|
|
|||
|
! script for buying goes here
|
|||
|
|
|||
|
elsif L3 = 2 then
|
|||
|
|
|||
|
! script for talking goes here
|
|||
|
|
|||
|
else
|
|||
|
|
|||
|
writeln( "What did you say?" );
|
|||
|
|
|||
|
endif;
|
|||
|
|
|||
|
goto AGAIN; ! do it again and again, forever.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Flow control using on-goto
|
|||
|
|
|||
|
:AGAIN
|
|||
|
|
|||
|
L3 = getstr( "Sell", "Buy", "Talk" );
|
|||
|
|
|||
|
on L3 goto XSELL, XBUY, XTALK;
|
|||
|
|
|||
|
writeln( "What did you say?" );
|
|||
|
|
|||
|
goto AGAIN;
|
|||
|
|
|||
|
:XSELL
|
|||
|
|
|||
|
! script for selling goes here
|
|||
|
|
|||
|
goto AGAIN;
|
|||
|
|
|||
|
:XBUY
|
|||
|
|
|||
|
! script for buying goes here
|
|||
|
|
|||
|
goto AGAIN;
|
|||
|
|
|||
|
:XTALK
|
|||
|
|
|||
|
! script for talking goes here
|
|||
|
|
|||
|
goto AGAIN;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
When a script is large, a single if statement may be several
|
|||
|
pages long. It is easy to loose track of what you were trying
|
|||
|
to accomplish. The on-goto statement has the advantage of
|
|||
|
breaking the logic into separate sections, each self contained
|
|||
|
and self explanatory. A more complete analysis of the goto,
|
|||
|
gosub, on-goto and on-gosub statements can be found in the
|
|||
|
reference guide.
|
|||
|
|
|||
|
Loop Control Statements
|
|||
|
|
|||
|
Whenever you need to perform the same operation multiple times,
|
|||
|
a loop statement may come in handy. The following code shows a
|
|||
|
player giving a copy of everything in his/her backpack to the
|
|||
|
npc character:
|
|||
|
|
|||
|
L6 = 0; ! Start with the first backpack object;
|
|||
|
|
|||
|
:DOIT
|
|||
|
|
|||
|
setbp(player.bp, L6); ! Select the Nth backpack object
|
|||
|
|
|||
|
if player.bp.count then ! If count non-zero, there is an object
|
|||
|
|
|||
|
copy(player.bp,npc); ! Give a copy of the object
|
|||
|
|
|||
|
endif;
|
|||
|
|
|||
|
inc( L6 ); ! Same as L6 = L6 + 1;
|
|||
|
|
|||
|
if L6 < 16 goto DOIT; ! Repeat 16 times
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The above code uses the goto statement to create a loop that
|
|||
|
examines the 16 backpack locations for an object and then copies
|
|||
|
the objects (if they exist) to the npc.
|
|||
|
|
|||
|
The while statement
|
|||
|
|
|||
|
The while statement simplifies loops by providing an easy way of
|
|||
|
defining a loop without having to declare a label or writing an
|
|||
|
IF statement. Note that the test for L6 < 16 is made before the
|
|||
|
statements inside the loop are executed.
|
|||
|
|
|||
|
L6 = 0;
|
|||
|
|
|||
|
while L6 < 16 do
|
|||
|
|
|||
|
setbp( player.bp, L6 );
|
|||
|
|
|||
|
if player.bp.count then
|
|||
|
|
|||
|
copy( player.bp, npc );
|
|||
|
|
|||
|
endif;
|
|||
|
|
|||
|
inc( L6 );
|
|||
|
|
|||
|
endwhile;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The for statement
|
|||
|
|
|||
|
The for statement simplifies the loop even more by allowing you
|
|||
|
to specify both the initial value, the final value and the
|
|||
|
amount by which the control variable (L6) is to be incremented
|
|||
|
(or decremented). Thus, the loop becomes:
|
|||
|
|
|||
|
for L6 = 0 to 15 do
|
|||
|
|
|||
|
setbp( player.bp, L6 );
|
|||
|
|
|||
|
if player.bp.count then
|
|||
|
|
|||
|
copy( player.bp, npc );
|
|||
|
|
|||
|
endif;
|
|||
|
|
|||
|
endfor;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The foreach statement
|
|||
|
|
|||
|
To top it of, the foreach statement allows you to select in
|
|||
|
sequence every element of a group. In this case, the group is
|
|||
|
the set of objects in the backpack. The foreach loop is
|
|||
|
executed once for each element in the player's backpack. Empty
|
|||
|
slots are not even selected, so no test is needed.
|
|||
|
|
|||
|
Note that if the backpack has NO elements, then the statements
|
|||
|
inside the loop not executed. This is the best way of examining
|
|||
|
all the elements of a group.
|
|||
|
|
|||
|
foreach player.bp do
|
|||
|
|
|||
|
copy( player.bp, npc );
|
|||
|
|
|||
|
endfor;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The foreach statement can select: a) All the characters in the
|
|||
|
player's group, b) All the objects in a character's backpack, c)
|
|||
|
All the objects a character is wearing, d) All the character's
|
|||
|
in the current world (but not in the player's group) and e) All
|
|||
|
the objects in the current world (but not in anyone's backpack).
|
|||
|
|
|||
|
Object Manipulation Statements
|
|||
|
|
|||
|
As you saw in the examples above, sometimes you want to move or
|
|||
|
copy objects from one place to another.
|
|||
|
|
|||
|
Move and Copy
|
|||
|
|
|||
|
When you move an object, it is removed from it's current place
|
|||
|
and inserted in the destination, as long as the destination has
|
|||
|
enough room for it. If there is not enough room or the
|
|||
|
destination character cannot carry the object, the object is not
|
|||
|
moved.
|
|||
|
|
|||
|
The copy statement works the same way, but does not delete the
|
|||
|
object from the source, thus making a copy instead of moving the
|
|||
|
object.
|
|||
|
|
|||
|
In both cases, you can specify how many objects you want to
|
|||
|
move. The command will move as many as the destination can
|
|||
|
possibly hold. If you specify that you want to move or copy
|
|||
|
more objects than are available in the source, additional
|
|||
|
objects are created.
|
|||
|
|
|||
|
Drop
|
|||
|
|
|||
|
When you drop an object, it is added to the list of objects in
|
|||
|
the world that you are in. The object will remain where you put
|
|||
|
it. There are no temporary objects in DCGAMES.
|
|||
|
|
|||
|
Output Statements
|
|||
|
|
|||
|
Write and Writeln
|
|||
|
|
|||
|
When you want to display a value, you have several ways of doing
|
|||
|
it. The most simple one is the write or writeln statement.
|
|||
|
With this statement you can display all attributes and variables
|
|||
|
as well as text.
|
|||
|
|
|||
|
The following example displays the time of day in the text
|
|||
|
window (assuming that the day has an even number of hours).
|
|||
|
|
|||
|
if hour < HoursInADay / 2 + 1 then
|
|||
|
|
|||
|
writeln( "The time is ", Hour, ":", Minute, "am" );
|
|||
|
|
|||
|
else
|
|||
|
|
|||
|
L7 = Hour - HoursInADay / 2;
|
|||
|
|
|||
|
writeln( "The time is ", L7, ":", Minute, "pm" );
|
|||
|
|
|||
|
endif;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Display
|
|||
|
|
|||
|
The display statement will show a list of items in the menu
|
|||
|
window, with or without numbers or values associated with it.
|
|||
|
It is useful when you need to show a list of items but are not
|
|||
|
requesting user input. The many forms of the display statement
|
|||
|
are documented in the reference guide.
|
|||
|
|
|||
|
Input Statements
|
|||
|
|
|||
|
Frequently, when you display something you are asking the player
|
|||
|
for directions; During a conversation, you ask the player what
|
|||
|
they want to talk about; A merchant might display a list of
|
|||
|
items and ask which you want to buy.
|
|||
|
|
|||
|
Getstr and Getnum
|
|||
|
|
|||
|
The getstr and getnum functions both return a number. The
|
|||
|
getstr function asks the user to type a string and searches the
|
|||
|
list of strings you provided. If a match is found, the command
|
|||
|
returns the index of the matching string (i.e. which one
|
|||
|
matched). If no match is found, the function returns a -1. In
|
|||
|
any case, the string is stored in the string variable s0.
|
|||
|
|
|||
|
The getnum function displays a string and asks the user to enter
|
|||
|
a value in a given range. Only values in the range are allowed.
|
|||
|
If the user presses Esc instead of typing a number, the
|
|||
|
function returns -1.
|
|||
|
|
|||
|
Select
|
|||
|
|
|||
|
The select function displays a menu identical to the one
|
|||
|
displayed by display, but allows the user to select one of the
|
|||
|
entries by using the arrow keys. This function is used
|
|||
|
extensively, and you should study it with care in the reference
|
|||
|
guide.
|
|||
|
|
|||
|
Going Places
|
|||
|
|
|||
|
There are several ways in which characters and objects may move
|
|||
|
under script control.
|
|||
|
|
|||
|
Animation
|
|||
|
|
|||
|
All characters and any object that is not being carried by a
|
|||
|
character has a location within the world reflected by the x and
|
|||
|
y attributes of that character or object. From a script you may
|
|||
|
modify these attributes and effectively move the characters or
|
|||
|
objects within the limits of the world they are in. You can
|
|||
|
also change the block attribute to provide some additional
|
|||
|
visual feed back (as long as the character is on screen).
|
|||
|
|
|||
|
A small example of animation is presented in the JIMMY.SCR file
|
|||
|
in the example game. When asked to join the party, Jimmy will
|
|||
|
walk over to his chest and retrieve his weapons, armor and
|
|||
|
money. He will then walk back towards the player and join the
|
|||
|
party.
|
|||
|
|
|||
|
Automatic animation WILL be eventually handled by the system, so
|
|||
|
don't go writing animation routines for every character in your
|
|||
|
game. This kind of animation should be used in specific
|
|||
|
instances where you want things to happen that the user must not
|
|||
|
be able to prevent or should not have to do him/herself.
|
|||
|
|
|||
|
Entering Doors
|
|||
|
|
|||
|
The player's party may move from one location to another in
|
|||
|
several ways. The simplest one is to use the Enter command to
|
|||
|
enter a door. The party will be transferred to the world and
|
|||
|
destination that the door leads to.
|
|||
|
|
|||
|
NOTE: The party will NOT be transferred to the new location
|
|||
|
until the script finishes execution.
|
|||
|
|
|||
|
Teleportation
|
|||
|
|
|||
|
If you wish to transfer the player to a specific world, you may
|
|||
|
use the Teleport command. This command allows you to specify a
|
|||
|
destination world (by number) as well as either a door in the
|
|||
|
destination world through which you wish to enter, or the actual
|
|||
|
x and y location at which the party should appear. Thus, a door
|
|||
|
need not be present in the destination world.
|
|||
|
|
|||
|
Advanced Topics
|
|||
|
|
|||
|
Entry Points
|
|||
|
|
|||
|
Whenever a script is invoked, execution of the script will begin
|
|||
|
at a special label which is called an Entry Point. The entry
|
|||
|
points are labels of the form :@# where # is a number between 0
|
|||
|
and 20, but, to make life easier, the labels have specific names
|
|||
|
associated with them, which make it easier to remember them.
|
|||
|
The entry points and the names associated with them are
|
|||
|
different for each type of script, and are shown below: You
|
|||
|
should use the name form of the entry points unless you have a
|
|||
|
very good reason for using the numbers.
|
|||
|
|
|||
|
For Character Scripts
|
|||
|
|
|||
|
@TALK (0) - Talk to the character
|
|||
|
|
|||
|
@DROP (2) - Character is being asked to leave the party
|
|||
|
|
|||
|
@CAST (11) - Character will try to cast a given spell.
|
|||
|
|
|||
|
For Object Scripts
|
|||
|
|
|||
|
@TALK (0) - Talk to an object.
|
|||
|
|
|||
|
@GET (1) - Move an object into the player's backpack.
|
|||
|
|
|||
|
@DROP (2) - Drop an object being carried.
|
|||
|
|
|||
|
@WEAR (3) - Wear an object.
|
|||
|
|
|||
|
@REMOVE (4) - Remove an object being worn.
|
|||
|
|
|||
|
@LOOK (5) - Look at an object.
|
|||
|
|
|||
|
@EXAMINE (6) - Examine an object carefully.
|
|||
|
|
|||
|
@INVOKE (7) - Invoke the magic in a magical object (ring,
|
|||
|
amulet, etc)
|
|||
|
|
|||
|
@USE (9) - Use a generic object for whatever purpose it is
|
|||
|
intended.
|
|||
|
|
|||
|
@EXIT (10) - The player's party wants to get out of a vehicle.
|
|||
|
|
|||
|
For World Scripts
|
|||
|
|
|||
|
@ENTER (9) - The player's party is entering the current world
|
|||
|
|
|||
|
@EXIT (10) - The player's party is leaving the current world
|
|||
|
|
|||
|
For Control Scripts
|
|||
|
|
|||
|
n/a (0) - Time Control Entry Point.
|
|||
|
|
|||
|
n/a (1) - Party wants to rest for the night.
|
|||
|
|
|||
|
n/a (2) - A member of the party wants to leave the group.
|
|||
|
|
|||
|
For Magic Spells
|
|||
|
|
|||
|
@CAST (11) - A magic user has casts a spell.
|
|||
|
|
|||
|
For Game Initialization
|
|||
|
|
|||
|
n/a (0) - Invoked at game initialization
|
|||
|
|
|||
|
For Dead and Resurrection
|
|||
|
|
|||
|
n/a (0) - Invoked when everyone in the party dies.
|
|||
|
|
|||
|
Calling A DOS program
|
|||
|
|
|||
|
From within a script, you may execute a DOS program by using the
|
|||
|
system command. This command works exactly like the writeln
|
|||
|
command, except that instead of sending a line of text to the
|
|||
|
text window, the text is formed into an MS-DOS command and
|
|||
|
executed. When the command ends execution, the MS-DOS error
|
|||
|
level is stored in the failure variable. A value of 0 usually
|
|||
|
indicates success.
|
|||
|
|
|||
|
See the reference guide entry for additional information.
|
|||
|
|
|||
|
Creating New Types and Classes
|
|||
|
|
|||
|
When the current types and classes of characters, objects or
|
|||
|
worlds is not enough, you may create your own types and classes
|
|||
|
as needed. The procedure for doing this is highlighted here,
|
|||
|
the assumption is made that you have read the manuals and are
|
|||
|
familiar with the script language before you attempt to add a
|
|||
|
new type or class.
|
|||
|
|
|||
|
New Character Types
|
|||
|
|
|||
|
To create a new character type, you should edit the file
|
|||
|
DCCTOKEN.DAT, look for the section [CHARACTER TYPES and add an
|
|||
|
entry after the last character type in the file:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
[CHARACTER TYPES]
|
|||
|
|
|||
|
REGULAR 0 ! REGULAR.SCR - Will join the party if asked
|
|||
|
to..
|
|||
|
|
|||
|
HOSTILE 1 ! HOSTILE.SCR - Will attack on sight and
|
|||
|
follow you..
|
|||
|
|
|||
|
MERCHANT 2 ! MERCHANT.SCR - Buys and Sells stuff..
|
|||
|
|
|||
|
BARTENDER 3 ! BARTENDE.SCR - Sells beer. Good source of
|
|||
|
information.
|
|||
|
|
|||
|
HEALER 4 ! HEALER.SCR - Cure, Heal, Resurrect, Remove
|
|||
|
Curse,..
|
|||
|
|
|||
|
CIVILIAN 5 ! CIVILIAN.SCR - Will talk, but won't join..
|
|||
|
|
|||
|
TELLER 6 ! TELLER.SCR - Fortune Teller or Oracle
|
|||
|
type..
|
|||
|
|
|||
|
QUESTER 7 ! QUESTER.SCR - Asks you to find an object or
|
|||
|
person.
|
|||
|
|
|||
|
BEGGAR 8 ! BEGGAR.SCR - Want's money. Might give you
|
|||
|
a tip.
|
|||
|
|
|||
|
TRAINER 9 ! TRAINER.SCR - Will train someone
|
|||
|
(STR,DEX,AIM,IQ)
|
|||
|
|
|||
|
GUARD 10 ! GUARD.SCR - Blocks your way unless given
|
|||
|
the password.
|
|||
|
|
|||
|
PRISONER 11 ! PRISONER.SCR - Will join your party
|
|||
|
temporarily (to escape).
|
|||
|
|
|||
|
LAWYER 12
|
|||
|
|
|||
|
In the above segment, the new character type LAWYER has number
|
|||
|
12 assigned to it (the next available number). You may now
|
|||
|
write a script file called LAWYER.SCR to handle the default
|
|||
|
behaviour of lawyers.
|
|||
|
|
|||
|
New Character Classes
|
|||
|
|
|||
|
Character classes in the current implementation apply only to
|
|||
|
characters that join the party. The class of the character is
|
|||
|
used to determine what kind of weapons and armor they can use,
|
|||
|
what kind of magic they have, how fast they recover, etc.
|
|||
|
|
|||
|
To create a new character class, just edit the DCCTOKEN.DAT file
|
|||
|
and add the new class to the [CHARACTER CLASSES] section:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
[CHARACTER CLASSES]
|
|||
|
|
|||
|
HUMAN 0 ! standard stuff, no power
|
|||
|
|
|||
|
ELF 1 ! fast, magical power, not strong
|
|||
|
|
|||
|
DWARF 2 ! slow, STRONG, no magic, no missiles or
|
|||
|
shields
|
|||
|
|
|||
|
WIZARD 3 ! slow, lot's of magic, not strong
|
|||
|
|
|||
|
ARCHER 4 ! fast, no magic, + on missile weapons
|
|||
|
|
|||
|
FIGHTER 5 ! fast, strong, no magic of any kind
|
|||
|
|
|||
|
THIEF 6
|
|||
|
|
|||
|
|
|||
|
|
|||
|
In the above segment, the new character class THIEF has a number
|
|||
|
6 (next available one).
|
|||
|
|
|||
|
The DCBLOCK, DCWORLD, DCPLAY and DCREPORT programs will now
|
|||
|
recognize thieves as a valid character type.
|
|||
|
|
|||
|
You may also want to modify the OBJECT and CASTING scripts to
|
|||
|
give a thief certain advantages when dealing with traps, and to
|
|||
|
enable or restrict the kinds of weapons, magic, etc, that the
|
|||
|
character can handle.
|
|||
|
|
|||
|
New Object Types
|
|||
|
|
|||
|
Creating a new object type is again started by adding the new
|
|||
|
type to the DCCTOKEN.DAT file. The section [OBJECT TYPES]
|
|||
|
contains the names and numbers for all object types.
|
|||
|
|
|||
|
Unlike characters, a single script handles all object types and
|
|||
|
classes. The OBJECT script should be extended to handle the new
|
|||
|
object type for all it's entry points.
|
|||
|
|
|||
|
The object types Food, Weapon, Armor, Shield, Amulet, Ring and
|
|||
|
Staff have special treatment because they can be worn by the
|
|||
|
characters. The Vehicle object type also has special handling
|
|||
|
because it can be used for transportation. Other than these
|
|||
|
special handling, you can modify the OBJECT script file as much
|
|||
|
as you want.
|
|||
|
|
|||
|
New Object Classes
|
|||
|
|
|||
|
An object class is also represented by a section in the
|
|||
|
DCCTOKEN.DAT file. It is different from other sections in that
|
|||
|
multiple object types may have the same class (for example:
|
|||
|
rings, amulets, food, potions and gems all have the same class
|
|||
|
set).
|
|||
|
|
|||
|
If your new object is going to have the same set of class items
|
|||
|
that already exists for another type, just add the name to the
|
|||
|
list, for example:
|
|||
|
|
|||
|
!
|
|||
|
|
|||
|
! Magical Effects, Type 1
|
|||
|
|
|||
|
!
|
|||
|
|
|||
|
[OBJECT CLASS: FOOD, POTION, RING, AMULET, GEMS, WIDGET]
|
|||
|
|
|||
|
NONE 0 ! No magical effect
|
|||
|
|
|||
|
CURE 1 ! Remove POISON
|
|||
|
|
|||
|
HEAL 2 ! Restore some HP
|
|||
|
|
|||
|
POISON 3 ! (Trap) POISON drinker
|
|||
|
|
|||
|
RESTORE 4 ! Restore ALL HP
|
|||
|
|
|||
|
PLUS_STR 5 ! Increase STRENGTH
|
|||
|
|
|||
|
PLUS_DEX 6 ! Increase DEXTERITY
|
|||
|
|
|||
|
PLUS_SPD 7 ! Increase SPEED
|
|||
|
|
|||
|
PLUS_AIM 8 ! Increase AIM
|
|||
|
|
|||
|
PLUS_AC 9 ! Increase AC
|
|||
|
|
|||
|
PLUS_HP 10 ! Increase HP
|
|||
|
|
|||
|
PLUS_IQ 11 ! Increase IQ
|
|||
|
|
|||
|
PLUS_PWR 12 ! Increase POWER
|
|||
|
|
|||
|
Here, we have added the new object type WIDGET to the set of
|
|||
|
objects that have personal magic.
|
|||
|
|
|||
|
You still have to modify the OBJECT script to handle the
|
|||
|
object's class. For example,
|
|||
|
|
|||
|
|
|||
|
|
|||
|
on object.type goto
|
|||
|
|
|||
|
USE_FOOD, USE_WEAPON, USE_AMMO, USE_ARMOR,
|
|||
|
USE_SHIELD,
|
|||
|
|
|||
|
USE_AMULET, USE_RING, USE_POTION, USE_SCROLL,
|
|||
|
USE_STAFF,
|
|||
|
|
|||
|
USE_CHEST, USE_KEYS, USE_GEMS, USE_BOOK,
|
|||
|
USE_GOLDSACK,
|
|||
|
|
|||
|
USE_TORCH, USE_LANTERN, USE_ROPE, USE_HOOKS,
|
|||
|
USE_MIRROR,
|
|||
|
|
|||
|
USE_SIGN, USE_VEHICLE, USE_WIDGET;
|
|||
|
|
|||
|
.
|
|||
|
|
|||
|
.
|
|||
|
|
|||
|
.
|
|||
|
|
|||
|
:USE_AMULET
|
|||
|
|
|||
|
:USE_RING
|
|||
|
|
|||
|
:USE_ARMOR
|
|||
|
|
|||
|
:USE_WEAPON
|
|||
|
|
|||
|
:USE_SHIELD
|
|||
|
|
|||
|
:USE_STAFF
|
|||
|
|
|||
|
writeln( "You must first 'get' it, then 'wear' or 'wield'
|
|||
|
it.." );
|
|||
|
|
|||
|
STOP;
|
|||
|
|
|||
|
:USE_WIDGET
|
|||
|
|
|||
|
writeln( "If you want to use it, you must first 'get' it.."
|
|||
|
);
|
|||
|
|
|||
|
STOP;
|
|||
|
|
|||
|
.
|
|||
|
|
|||
|
.
|
|||
|
|
|||
|
Here, we have decided that a WIDGET must be in the player's
|
|||
|
backpack before it can be used.
|
|||
|
|
|||
|
If your new object is different from all other objects, you can
|
|||
|
create a brand new section for it's classes in the DCCTOKEN.DAT
|
|||
|
file:
|
|||
|
|
|||
|
!
|
|||
|
|
|||
|
! My WIDGET object classes
|
|||
|
|
|||
|
!
|
|||
|
|
|||
|
[OBJECT CLASS: widget]
|
|||
|
|
|||
|
ROUND 0 ! A round widget
|
|||
|
|
|||
|
SQUARE 1 ! A square widget
|
|||
|
|
|||
|
OVAL 2 ! An oval widget
|
|||
|
|
|||
|
At this point, you may create graphics blocks with type widget
|
|||
|
and class round, square or oval. You may also write script code
|
|||
|
like this:
|
|||
|
|
|||
|
if object.type = widget then
|
|||
|
|
|||
|
on object.class goto XROUND, XSQUARE, XOVAL;
|
|||
|
|
|||
|
writeln( "Unknown widget class.." );
|
|||
|
|
|||
|
stop;
|
|||
|
|
|||
|
endif;
|
|||
|
|
|||
|
:XROUND ! Handle a round widget
|
|||
|
|
|||
|
....
|
|||
|
|
|||
|
STOP;
|
|||
|
|
|||
|
:XSQUARE ! Handle a square widget
|
|||
|
|
|||
|
....
|
|||
|
|
|||
|
STOP;
|
|||
|
|
|||
|
:XOVAL ! Handle an oval widget
|
|||
|
|
|||
|
....
|
|||
|
|
|||
|
STOP;
|
|||
|
|
|||
|
New Object Modifiers
|
|||
|
|
|||
|
Each object has 5 attributes that can be used to implement it's
|
|||
|
differences from other objects. These attributes have names m0
|
|||
|
through m4, but the object modifiers section in the DCCTOKEN.DAT
|
|||
|
file allows you to call them by other names.
|
|||
|
|
|||
|
When you create a new object type and/or class, you may want to
|
|||
|
create new names for those fields that you might use to
|
|||
|
differentiate between them For example:
|
|||
|
|
|||
|
[OBJECT MODIFIERS]
|
|||
|
|
|||
|
|
|||
|
|
|||
|
! Object Type: FOOD
|
|||
|
|
|||
|
! 0 Is not used
|
|||
|
|
|||
|
UNITS 1 ! If magical, how many units are affected
|
|||
|
|
|||
|
PERMANENT 2 ! If magical, how long does effect last? (0=one
|
|||
|
day, 1=permanent)
|
|||
|
|
|||
|
! 3 Is not used
|
|||
|
|
|||
|
! 4 Is not used
|
|||
|
|
|||
|
|
|||
|
|
|||
|
! Object Type: WEAPON
|
|||
|
|
|||
|
HANDS 0 ! # of hands needed to use the weapon
|
|||
|
|
|||
|
RANGE 1 ! Range of this weapon
|
|||
|
|
|||
|
DAMAGE 2 ! Damage done when using this weapon.
|
|||
|
|
|||
|
AMMONEEDED 3 ! Type of ammunition needed (See AMMOTYPE below..)
|
|||
|
|
|||
|
! 4 Is not used
|
|||
|
|
|||
|
|
|||
|
|
|||
|
! Object Type: WIDGET
|
|||
|
|
|||
|
SIDES 0 ! # of sides that the widget has
|
|||
|
|
|||
|
RANGE 1 ! Range of this widget
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Note that if you want to use a token that already has a value
|
|||
|
assigned, like range in the example, which has a value 1
|
|||
|
assigned for weapons, you MUST use the same value for the token.
|
|||
|
Tokens are replaced by their numeric value during compilation,
|
|||
|
so the following two lines are equivalent:
|
|||
|
|
|||
|
if object.hands = 7 then ...
|
|||
|
|
|||
|
if object.sides = 7 then ...
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Both lines are comparing the m0 modifier of the object with the
|
|||
|
value 7. The type of the object is not checked to see that the
|
|||
|
token you are using belongs to the object's type.
|
|||
|
|
|||
|
New World Types
|
|||
|
|
|||
|
Perhaps the easiest to create would be a new world type. Again,
|
|||
|
just add the entry to the DCCTOKEN.DAT file, section world
|
|||
|
types, and then edit the WORLDDEF script file to handle the new
|
|||
|
world type.
|
|||
|
|
|||
|
Note that many of the currently defined world types have no
|
|||
|
actual differences between them. For example, Cities, Towns,
|
|||
|
Hideouts, Houses and Castles are all the same.. You can change
|
|||
|
that by modifying the appropriate scripts.
|
|||
|
|
|||
|
For example: If you want to make opening a locked chest a crime
|
|||
|
in Castles and Houses, you can add a check in the OBJECT script
|
|||
|
to verify the type of world you are in when the character tries
|
|||
|
to break a lock.
|
|||
|
|
|||
|
Shareware Opportunities
|
|||
|
|
|||
|
While most users will use the script language to make small
|
|||
|
changes to the game system, with a few customized scripts to
|
|||
|
handle special characters or objects, the true power of scripts
|
|||
|
lies in the ability to completely change the way everything
|
|||
|
works. Here are a few example of some more complex projects
|
|||
|
that you may want to attempt once you are comfortable writing
|
|||
|
scripts:
|
|||
|
|
|||
|
Extending the magic system
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The current magic system allows a character to cast a spell if
|
|||
|
it has the required number of power points. There is no
|
|||
|
requirement to learn the spells, or to be at a certain level
|
|||
|
before you can cast it. You can change the OBJECT and CASTING
|
|||
|
scripts to handle a magic book, which can be either a class of
|
|||
|
book (currently, books don't have classes) or a whole new type
|
|||
|
of object (Magic Book).
|
|||
|
|
|||
|
You can also change the scripts to handle a lot more spells (up
|
|||
|
to 255 of each type), or add a level requirement for each spell.
|
|||
|
|
|||
|
MS-DOS based extensions
|
|||
|
|
|||
|
The system command allows you to run DOS programs from within a
|
|||
|
script. The following DOS programs could be called from a
|
|||
|
script to extend the functionality of the system. Writing these
|
|||
|
extensions requires knowledge about internal structures of the
|
|||
|
game files, which I will be glad to provide on a case by case
|
|||
|
basis.
|
|||
|
|
|||
|
Save/Restore/Restart
|
|||
|
|
|||
|
Replace the prompts that perform this function with a window
|
|||
|
that shows saved games along with comments and let's you choose
|
|||
|
which one you want to restore, or lets you specify which slot
|
|||
|
you want to save in, and what comment you want to associate with
|
|||
|
the saved game.
|
|||
|
|
|||
|
Character Editor
|
|||
|
|
|||
|
Allows you to examine/modify (i.e. cheat) the PARTY file.
|
|||
|
|
|||
|
Arcade/Casino extensions
|
|||
|
|
|||
|
A completely separate sub-game that is executed when you enter a
|
|||
|
world. For example, when you enter a casino, you can run a DOS
|
|||
|
game that allows the user to play poker or some other games in
|
|||
|
order to make money. The program may read the PARTY file to get
|
|||
|
the names of the characters and the amount of gold they have.
|
|||
|
It would update the gold amount when the characters leave the
|
|||
|
casino.
|
|||
|
|
|||
|
Stand Alone Utilities
|
|||
|
|
|||
|
A nice utility would be one that can take the game and create
|
|||
|
PCX graphics files for each world, optionally including the
|
|||
|
objects and characters that appear in it. The PCX file can then
|
|||
|
be scaled and manipulated by other utilities to print maps or
|
|||
|
include the graphics in documentation.
|
|||
|
|
|||
|
Writing a whole new system
|
|||
|
|
|||
|
It is perfectly feasible to take the rules, character types,
|
|||
|
magic system, etc of game systems such as Dungeons and Dragonstm
|
|||
|
or Man, Myth and Magictm and write them as scripts. You would
|
|||
|
have to throw away all of the current scripts and write them
|
|||
|
from scratch, but it's perfectly feasible. Of course, these
|
|||
|
systems are copyrighted by their respective publishers, so it
|
|||
|
wouldn't be possible to distribute such a system as shareware (I
|
|||
|
think, but I'm not a copyright expert).
|
|||
|
|
|||
|
Primary Keywords
|
|||
|
|
|||
|
continue
|
|||
|
|
|||
|
copy
|
|||
|
|
|||
|
dec
|
|||
|
|
|||
|
display
|
|||
|
|
|||
|
drop
|
|||
|
|
|||
|
endgame
|
|||
|
|
|||
|
enter
|
|||
|
|
|||
|
fight
|
|||
|
|
|||
|
find
|
|||
|
|
|||
|
for
|
|||
|
|
|||
|
foreach
|
|||
|
|
|||
|
frame
|
|||
|
|
|||
|
getaction1
|
|||
|
|
|||
|
getnum
|
|||
|
|
|||
|
getstr
|
|||
|
|
|||
|
goto
|
|||
|
|
|||
|
gosub
|
|||
|
|
|||
|
if
|
|||
|
|
|||
|
inc
|
|||
|
|
|||
|
join
|
|||
|
|
|||
|
leave
|
|||
|
|
|||
|
loadhint
|
|||
|
|
|||
|
loadtext
|
|||
|
|
|||
|
locate
|
|||
|
|
|||
|
move
|
|||
|
|
|||
|
on
|
|||
|
|
|||
|
paint
|
|||
|
|
|||
|
pause
|
|||
|
|
|||
|
readtext
|
|||
|
|
|||
|
restart
|
|||
|
|
|||
|
restore
|
|||
|
|
|||
|
return
|
|||
|
|
|||
|
runscript1
|
|||
|
|
|||
|
save
|
|||
|
|
|||
|
savepcx1
|
|||
|
|
|||
|
select
|
|||
|
|
|||
|
setbody
|
|||
|
|
|||
|
setbp
|
|||
|
|
|||
|
stats
|
|||
|
|
|||
|
stop
|
|||
|
|
|||
|
teleport
|
|||
|
|
|||
|
vanish
|
|||
|
|
|||
|
viewfli1
|
|||
|
|
|||
|
viewpcx
|
|||
|
|
|||
|
voice
|
|||
|
|
|||
|
vplay
|
|||
|
|
|||
|
wait
|
|||
|
|
|||
|
while
|
|||
|
|
|||
|
write
|
|||
|
|
|||
|
writeln
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Secondary Keywords
|
|||
|
|
|||
|
if
|
|||
|
|
|||
|
- then, elsif, else, endif
|
|||
|
|
|||
|
expression
|
|||
|
|
|||
|
- and, or, xor, not
|
|||
|
|
|||
|
for
|
|||
|
|
|||
|
- to, by, do, endfor
|
|||
|
|
|||
|
foreach
|
|||
|
|
|||
|
- do, endfor
|
|||
|
|
|||
|
while
|
|||
|
|
|||
|
- endwhile
|
|||
|
|
|||
|
select, display
|
|||
|
|
|||
|
- matching
|
|||
|
|
|||
|
paint
|
|||
|
|
|||
|
- screen, window
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Function Keywords
|
|||
|
|
|||
|
abs
|
|||
|
|
|||
|
action
|
|||
|
|
|||
|
adjustments
|
|||
|
|
|||
|
Day
|
|||
|
|
|||
|
DaysInAMonth
|
|||
|
|
|||
|
DefCaveBlk
|
|||
|
|
|||
|
DefLandBlk
|
|||
|
|
|||
|
DefPack
|
|||
|
|
|||
|
DefSpookBlk
|
|||
|
|
|||
|
DefStat
|
|||
|
|
|||
|
DefWaterBlk
|
|||
|
|
|||
|
fighting
|
|||
|
|
|||
|
failure
|
|||
|
|
|||
|
Hour
|
|||
|
|
|||
|
HoursInADay
|
|||
|
|
|||
|
keypress1
|
|||
|
|
|||
|
max
|
|||
|
|
|||
|
min
|
|||
|
|
|||
|
Minute
|
|||
|
|
|||
|
MinutesInAnHour
|
|||
|
|
|||
|
Month
|
|||
|
|
|||
|
MonthsInAYear
|
|||
|
|
|||
|
MovesPerMinute
|
|||
|
|
|||
|
pointx1
|
|||
|
|
|||
|
pointy1
|
|||
|
|
|||
|
random
|
|||
|
|
|||
|
success
|
|||
|
|
|||
|
SunSet
|
|||
|
|
|||
|
SunRise
|
|||
|
|
|||
|
version
|
|||
|
|
|||
|
Year
|
|||
|
|
|||
|
1 Keywords marked with a (1) are new in version 4.0 of DCGAMES!
|
|||
|
|
|||
|
|