home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1993 #2
/
Image.iso
/
wp
/
orph162b.zip
/
MANUAL2.DOC
< prev
next >
Wrap
Text File
|
1993-07-07
|
109KB
|
2,823 lines
Orpheus User's Guide
* Part II *
THE ORPHEUS COMMAND LANGUAGE
Copyright 1993 Hyperion Softword
(Version 1.62)
1
---------------------------------------------------------------------------
T A B L E O F C O N T E N T S
---------------------------------------------------------------------------
Chapter 1 - Programming Hypertext ................................... 4
Init Cards ......................................................... 4
Action Cards ....................................................... 5
Graphic Cards ...................................................... 5
Orpheus Command Language ........................................... 6
Syntax ......................................................... 6
Flow Control ................................................... 7
Parameters ..................................................... 7
Variables ...................................................... 8
Testing Commands & Scripts ......................................... 8
Chapter 2 - Programming Command Reference ........................... 9
:[label] ........................................................... 9
Ansi ............................................................... 10
Gbox ............................................................... 10
Goto ............................................................... 12
Graphic ............................................................ 13
Gtext .............................................................. 15
Hide ............................................................... 17
Hotspot ............................................................ 18
Multiple copies of linkwords .................................... 20
Hotspots and the keyboard ....................................... 20
If ................................................................. 21
Jump ............................................................... 22
Jumplist ........................................................... 24
Load ............................................................... 26
New ............................................................. 26
Text ............................................................ 27
Form ............................................................ 28
Lookfor ............................................................ 29
Play ............................................................... 30
Quit ............................................................... 32
Run ................................................................ 33
Runbat ............................................................. 33
Set ................................................................ 34
Blink ........................................................... 34
Delay ........................................................... 34
Draw, Erase ..................................................... 35
Fadein, Fadeout ................................................. 35
Mode ............................................................ 36
Text ............................................................... 37
Trymode ............................................................ 41
Waitfor ............................................................ 42
2
Chapter 3 - Converting Old Commands ................................. 43
Versions Before 1.30: .............................................. 43
Graphic Commands ................................................ 43
Run Commands .................................................... 45
Random Commands ................................................. 45
Versions Before 1.50: .............................................. 46
Hotspot() ....................................................... 46
Jump(), Jumplist() .............................................. 46
Play() .......................................................... 46
Table 1 - Modes and Resolutions ..................................... 47
3
---------------------------------------------------------------------------
CHAPTER 1 - PROGRAMMING HYPERTEXT
---------------------------------------------------------------------------
Topics in this chapter: Init Cards
Action Cards
Graphic Cards
Orpheus Command Language
Syntax
Flow Control
Parameters
Variables
Testing Commands & Scripts
NOTE: Users who are upgrading from a version of Orpheus prior to
1.50, and who have used the earlier commands to display graphics or play
music, will need to update their work to the new language standard.
Please see Chapter 3, "Converting Old Commands".
If you wish to display graphics, play music, or launch external
programs, you will appreciate the power and flexibility of the Orpheus
Command Language. First released with Version 1.30 of Orpheus, OCL
provides the ability to write anything from a one-line jump command to a
miniature program complete with hardware tests, multiple branches, timed
pauses, even a slide show. Future releases will add more commands, with
the emphasis on multimedia and user interaction.
There are three types of link that lead to programmable cards: Init,
Action, and Graphic links. Only these cards are programmable, and
whatever you write on them will be *performed* rather than being displayed
as text when your work is viewed with the Orpheus Reader. Unlike normal
text cards, where only the top 24 or 25 lines will be seen in the Reader,
with programmable cards you can you use the entire workspace and be sure
that every line will be compiled into your finished work.
In this chapter we will explore the uses, syntax, and vocabulary of
the Orpheus Command Language. In the next chapter you will find a
thorough presentation of every command, together with extensive examples.
Init Cards
Inits are created by opening the Link Menu while in any text card
and selecting "Init". Only text cards can have Inits, and they may have
only one each. (Text cards include the Homecard and all cards attached
to Door, Note, or More links.) When you are in a card that has an Init,
you can jump to it (in OH.EXE) either by pressing <Alt-I> or by opening
the Link Menu and selecting "Edit Init".
4
When the Orpheus Reader loads a card that has an Init, it loads the
Init in the background and performs its commands before displaying the
Init's parent. For example, an Init off the Homecard might contain a
graphical book-cover: commands to display one or more graphics, or even a
choice of graphics or ansi graphics depending on the user's hardware.
Inits are processed every time the user enters a card that has one -- with
the sole exception of the Homecard, whose Init (if any) is only processed
once.
After the last command in an Init, control returns to its parent;
normally this means that the text card is displayed and the user regains
the ability to navigate. The exception is when the last command processed
is a jump() command, i.e. an instruction to go to a different card. In
that case the Reader loads the new card and displays that, unless it too
has an Init that must be processed first.
Aside from enabling you to do opening sequences, Inits are good places
to set variables and declare data automatically. (These aspects will
expand considerably as the language evolves.) Inits cannot contain links
to other cards, nor can a graphic displayed from an Init contain hotspots.
Action Cards
Action cards are created by opening an Action link on a word or phrase
in any text card. In OH.EXE you can jump to an Action card the same as
you would to any card that is accessed through a linkword.
In the Orpheus Reader, when the user clicks on an Action linkword the
Action card is loaded in the background and its commands are processed.
After the last command, control returns immediately to the parent card. If
a graphic or ansi graphic was displayed, or if an external program was
launched, the parent card is displayed afresh. The exception is if the
last command processed is a jump() command, i.e. an instruction to go to a
different card. In that case the Reader loads and displays the new card.
Action cards cannot contain links to other cards, nor can a graphic
displayed from an Action card contain hotspots.
Graphic Cards
Graphic cards are created by opening a Graphic link on a word or
phrase in any text card. You can jump to a Graphic card the same as you
would to any card that is accessed through a linkword. When you do so in
OH.EXE you go to the Graphic card itself, not to whatever you intend to
display with it. But when you jump to a Graphic in the Orpheus Reader you
really do jump to what is intended for display.
Like an Init or Action card, a Graphic card may contain anything from
a single command to a script of tests and branches that display a suitable
graphic or ansi graphic depending on the capabilities of the user's
5
hardware. A Graphic card may even contain a sequence of multiple graphics
separated by timed delays. Unlike Init and Action cards, when the last
command on a Graphic card is processed in the Reader, assuming that a
graphic or ansi graphic is onscreen, control remains in the Graphic card
the same as it would in a text card. That is, a pointer appears, the
user can open the menu or use the titlebar, and if the graphic has
hotspots he can navigate through them.
If you have selected "Graphic Titlebar" on the Project Menu, the
Orpheus Reader's titlebar will appear automatically atop the last graphic
or ansi graphic displayed from a Graphic card. If this option was not
selected, the titlebar only appears when the user moves the mouse pointer
to the top of the screen (or presses Esc if no mouse is installed).
Graphic cards may contain hotspots with links to other graphics or to
text cards, with just one restriction: the linkword in a hotspot()
command may receive a Door link or a Graphic link, but no other kind.
Graphic cards may not have Inits or More links. A jump() command in a
Graphic card will either be rejected by the compiler or ignored by the
Reader.
If by the last command in a Graphic card a graphic or ansi graphic is
NOT onscreen, the Orpheus Reader assumes that an error has occurred and
returns automatically to the parent card.
Orpheus Command Language
If you have ever written a batch file or used any other programming
language, you will soon recognize how to get things done in Orpheus
Command Language. Even if you have never programmed at all, you will find
it easy to accomplish what you need by using the examples given in the
next chapter.
SYNTAX
Here are the basic rules of OCL:
* Command lines: commands must begin at the leftmost column. The
examples in this manual are indented to enhance readability; in
Orpheus they would be ignored unless moved to the left of the
screen.
* Comment lines: lines beginning with a "/" or ";" are considered
to be comment lines and are ignored by the command processor (and
the compiler). Additionally, lines beginning with a space are
ignored unless they are carried-over data from a preceding command.
* Commands may be entered in any combination of upper and lower case.
To enhance readability, the examples in this manual use lowercase
for commands and uppercase for labels, but you do not have to do
the same. (Music strings however must be in uppercase.)
6
* Within a command line, spaces may be used for readability, but are
not required. The two examples below are equally valid:
set(fadein=tunnelin,fadeout=venetian,delay=1)
set ( fadein = tunnelin, fadeout = venetian, delay = 1 )
FLOW CONTROL
The sum of the commands in a programmable card is called a "script".
Sometimes a script may consist of a single command, such as "jump
(retrace)" in an Action card to return the reader to wherever he came
from. More often however you will write a sequence of commands that may
include various possible things that you would like to happen depending on
circumstances. The following example displays one of 3 possible screens
in a Graphic card; which screen is chosen depends on whether the user has
a VGA display, an EGA display, or neither.
trymode (19) // 1: Can we do VGA mode 19?
if (failed) goto NEXT // 2: If not go to line 5.
graphic (vga_pic.pcx, 19, full) // 3: Show fullscreen VGA graphic.
goto END // 4: Go to line 12.
:NEXT // 5: Label for goto command.
trymode (16) // 6: Can we do EGA mode 16?
if (failed) goto TEXT // 7: If not go to line 10.
graphic (ega_pic.pcx, 16, full) // 8: Show fullscreen EGA graphic.
goto END // 9: Go to line 12.
:TEXT // 10: Label for goto command.
ansi (ansi_pic.ans) // 11: Show an ansi graphic.
:END // 12: Label for goto command
This script uses two "if()" tests, three labels (":NEXT", ":TEXT", and
":END"), and four "goto" commands. Processing flows along one of three
possible paths depending on the user's hardware, with the result that in
just 12 simple lines we can ensure that if the user clicks on a certain
Graphic linkword he will actually see something. The next chapter tells
about other conditions you can test, and gives a full explanation of how
to use each of the commands illustrated here.
PARAMETERS
With the sole exception of "goto", all OCL commands must be followed by
parentheses, which usually enclose one or more parameters. The number and
order of parameters are specific to each command, so before you use a
command for the first time you should read its entry in the Programming
Command Reference (Chapter 2). In the following example, trymode() takes
a numeric parameter, if() takes a symbolic parameter (a keyword),
text() takes a string parameter, and quit() takes no parameter.
trymode (16) // 1: Can we do EGA mode 16?
if (okay) goto END // 2: If so, go to line 5.
text ("This book requires EGA graphics") // 3: Text box.
quit () // 4: Exit the Orpheus Reader.
:END // 5: Label for goto.
7
(This script is one that would go in an Init off the Homecard, in a book
with a large number of EGA graphics at critical locations. If the user
has an EGA-capable display he will proceed without even knowing that this
script was processed. If he has a CGA or monochrome display, he will see
a note box with the message in it, and when he presses a key the
program will harmlessly exit.)
VARIABLES
Variables are objects in memory that can hold values or other data.
Sometimes values are indicated with numbers, and sometimes they are
indicated symbolically using keywords. The trymode() command sets an
internal variable to either "failed" or "okay" depending on whether the
user's display can or cannot switch to the specified video mode. These
are symbolic values; in this case, the variable is unnamed. Most
variables however do have names, and the set() command lets us assign
values to them, either with a number or with a keyword.
set (fadein=venetian, fadeout=venetian, delay=1)
In this example, the first two variables are assigned the same symbolic
value, "venetian", which refers to a style of fading a graphic on or off
the screen. The third variable is assigned a number representing the
delay factor for this effect; if delay=0 the fade is rather fast, while if
delay=3 the fade is rather slow.
Testing Commands & Scripts
Most commands can be performed within OH.EXE as they would be in the
Orpheus Reader. Those that cannot are at least checked for errors, and a
report given accordingly. To test an individual command line, place the
cursor on that line (or on the line where it begins) and press <Alt-G>.
This is an easy way to see if you are specifying the right video mode for
a graphic() command, or to hear a performance of a music string. In the
case of a graphic() or ansi() command, once the image is displayed you
need only press a key to return to editing.
To test a complete script -- the entire sequence of commands in a
programmable card -- press <Alt-C> while in that card. This is the "Check
Card" command, which works quite differently when given from a normal text
card. Additionally, if you use <Alt-C> from an Action or Init card and
your script includes a command to display a graphic or ansi graphic, you
will notice that without a waitfor() command at the end your graphic
merely flashes onscreen and then disappears as the Edit window returns.
This is because, as I explained above, when the last command is processed
in an Action or Init card control returns immediately to the parent card.
In a Graphic card (which does NOT require a waitfor() line at the
end), pressing <Alt-C> gives you the additional ability to create
hotspots. This is explained under the hotspot() entry in the next
chapter.
8
---------------------------------------------------------------------------
CHAPTER 2 - PROGRAMMING COMMAND REFERENCE
---------------------------------------------------------------------------
Commands in this reference: :[label] Load
Ansi Lookfor
Gbox Netwk
Goto Play
Graphic Quit
Gtext Run
Hide Runbat
Hotspot Set
If Text
Jump Trymode
Jumplist Waitfor
This chapter provides extensive discussion of every command in the
Orpheus Command Language. For a general introduction to programming in
Orpheus, see Chapter 1.
:[label]
Lines beginning with ":" are considered label lines, with the word
immediately following being a label for use in flow control. As in DOS
batch files, labels are used with the goto command to control the flow
of processing. The following example checks for a monochrome display,
and if one is detected directs processing to the ":END" label, which in
this case is the end of the script. If a mono display is not detected,
processing continues to the next lines, which display a graphic and then
wait for the user to press a key.
if (mono) goto END
graphic(mypic.pcx, 5, full)
waitfor()
:END
Labels can be whatever you wish, but to avoid confusion you should
avoid using commands or keywords belonging to Orpheus Command Language.
A label is a single word, or multiple words joined by hyphen or
underscore, such as "first-part" or "has_vga". (By the way, in case
you are wondering: the label ":END" has no special meaning to
Orpheus. You could use ":grmpflstx" and it would have the same effect,
as long as your goto command was "goto grmpflstx". Also, if you
were to place the label ":END" in the middle of the script that would
=NOT= make it the end of the script.)
9
Ansi()
Display a text file containing ANSI escape sequences for color
effects. Takes one or two parameters, optionally a library specification
and necessarily the name of the file to display.
ansi(ansipic.ans)
ansi(lib=mylib.fgi, ansipic.ans)
Ansi files may be located in either of two locations, depending on whether
OH.EXE or the Orpheus Reader is looking for them. OH.EXE looks first
in the current directory, the one containing the Homecard. The Reader
looks first in whichever directory contains the rest of the book files
(normally the current directory unless specified on the command line).
If the ansi file is not found there, Orpheus then checks for an ORPHEUS
environment variable, and if one exists uses the directory specified
there. (See Appendix C, "Using the ORPHEUS Environment Variable".)
If a library file is used it must reside in the current directory, for
either program. For information on creating and managing library files
with FGILIB.EXE, see Chapter 7 in MANUAL1.DOC.
Gbox()
Draw a filled rectangle in the current graphic video mode. Requires
that a graphic video mode be already in effect on the user's display,
either as the result of a graphic() call or by using set() with the "mode"
keyword. Parameters: optional use of the keyword "text", and 5 numeric
parameters to specify the color, coordinates, and size of the rectangle.
Gbox() cannot be used in text modes.
COLOR
The first numeric parameter sets the color for the rectangle. Check the
table of Modes & Resolutions for the number of colors available in each
video mode. Since some PCX files reset the color palettes, you may get
different results using the same number in the same mode but in
association with different PCX files.
COORDINATES
The second numerical parameter gives the column of the upper left corner
of the box, with 0 as the left edge of the screen. The next parameter
gives the row of the upper left corner, with 0 as the top of the screen.
The next parameter gives the width of the box (from left to right), and
the last gives its height (from top to bottom). The smallest number
permitted for the height and width is 1, which has the effect of drawing
a thin line.
COORDINATE SYSTEMS - PIXELS OR CELLS
Coordinates may be given in either character cells or pixel counts. As
shown in the table of Modes & Resolutions, mode 16 (for example) has a
resolution of 640x350, with 80x25 character cells. In other words, the
10
screen in mode 16 has 640 pixels across by 350 pixels down, or 80 standard
characters across by 25 standard characters down. While counting in
pixels gives you more precision, in some situations you will find it more
convenient to count in character cells. If you use the keyword "text" as
the first parameter, all coordinates are read as character cells. If you
do NOT use the keyword "text", coordinates are read as pixel counts.
set(mode = 16)
gbox(text, 14, 9, 3, 61, 20)
gbox(text, 1, 12, 4, 55, 18)
gbox(15, 99, 58, 427, 235)
This example puts up an attractive white box framed with a narrow
blue border surrounded in turn by a wide yellow border. In actuality
there are 3 boxes created, one on top of the other. The first gbox()
command draws the large yellow box (color 14), using text coordinates.
The second gbox() command draws a smaller blue box (color 1) inside it,
again using text coordinates. Notice that the upper left corner of the
yellow box is at column 9, row 3, while the upper left corner of the
blue box is at column 12, row 4 -- below and to the right. Additionally,
while the yellow box is 61 columns wide and 20 rows deep, the blue box
is 55 columns wide and 18 rows deep, so it fits neatly inside. For the
white box (color 15) we want finer control in order to ensure that only
a thin border from the blue box is left showing. By NOT using the text
keyword we ensure that our coordinate parameters are read as pixels. With
a little experimentation we can get the desired effect, just by trying
some approximate numbers, pressing Alt-C to check the results, and making
adjustments accordingly. In this case the blue box is reduced to a border
of 2 or 3 pixels all around.
By specifying a depth or width of 1 or 2 pixels, gbox() can also
be used to draw a horizontal or vertical line. You can in fact build up
some very interesting displays, generally with better performance and
less disk-space than if you created them in a paint program and saved
them to a PCX file. Note however that if you wish to use gbox() and
then call graphic() to combine an image with a design onscreen, you
must use the command "set(fadein = off, fadeout = off)" to prevent
Orpheus from erasing the screen before displaying the graphic.
11
Goto
Direct command processing to the label following the goto command.
Goto may be used in two circumstances: on the same line as an if() test,
and on a line of its own.
trymode(18)
if (failed) goto DO_ANSI
graphic(big_pic.pcx, 18, full)
goto END
:DO_ANSI
ansi(ansipic.ans)
:END
This example checks whether the user's display can switch to mode 18,
a VGA mode. If it can't, the first goto directs the flow to the :DO_ANSI
label. If it can, a graphic is displayed and then the second goto
directs the flow to the :END label. Note that goto can direct the flow
to *any* label in the script, regardless of whether the line is above
or below the goto.
12
Graphic()
Display a graphic in one of the image file formats permitted in
Orpheus. Parameters: normally three for a full-screen graphic, otherwise
from three to five. Unless a library is used, the first parameter is the
filename, the second is the video mode in which to display it. If the
third parameter is the keyword "full", no further parameters are required.
If the third parameter is not "full", the third and fourth parameters give
the x-y coordinates (column-row in pixels) of the origin of the image,
while the fifth (required for SPR/PPR files only) gives the image width in
pixels. When a library used, place the library specification first,
followed by the other paramaters in the normal order.
In the following examples, an identical full-screen graphic is shown
in both PCX and SPR image file formats, using mode 13, which has a
resolution of 320 columns by 200 rows:
graphic(example1.pcx, 13, full)
graphic(example2.pcx, 13, 0, 0)
graphic(example3.spr, 13, full)
graphic(example4.spr, 13, 0, 199, 320)
Here are the first and last examples with the images stored in a library.
(To learn about creating and maintaining libraries with FGILIB.EXE, see
Chapter 7 in MANUAL1.DOC.)
graphic(lib=stuff.fgi, example1.pcx, 13, full)
graphic(lib=stuff.fgi, example4.spr, 13, 0, 199, 320)
PCX FILES
With PCX files an image is considered to originate at the upper left
corner. With a full-screen graphic this would be column 0, row 0, as
shown in example 2 above. We do not require the image width of a PCX
file, so there is no fifth parameter.
Let's suppose we have a PCX graphic that is half the size of the
screen in each dimension. Since our examples use mode 13 with a
resolution of 320 x 200, we'll say that our image is 160 pixels across
by 100 pixels down. To center this image we would use the following:
graphic(example5.pcx, 79, 49)
Where did these numbers come from? We take the horizontal resolution,
subtract the width of the image, divide by two, then subtract one:
320-160=160; 160/2=80; 80-1=79. We subtract 1 because screen coordinates
are always counted from 0; thus the leftmost pixel coordinate is 0 and
the rightmost pixel coordinate (in mode 13) is 319. The same procedure
works for the vertical dimension. Take the vertical resolution, subtract
the height of the image, divide by two, subtract one: 200-100=100;
100/2=50; 50-1=49.
13
You won't always know the dimensions of an image nor where you want to
show it onscreen. The best way to proceed is to try out different numbers
and use the <Alt-G> Go Command to view the results.
SPR/PPR FILES
SPR files are captured using the SNAPSHOT utility, which comes with
the registered version of Orpheus. PPR files are generated from SPR
files using a Fastgraph utility that compresses them. With SPR and PPR
files, an image is considered to originate at the LOWER left corner,
whereas with PCX files it originates at the upper left. In addition,
SPR/PPR files require that we give the image width. This accounts for
the numbers in example 4:
graphic(example4.spr, 13, 0, 199, 320)
Since this a full-screen graphic and the resolution is 320 x 200, the
horizontal component of the lower left corner is pixel column 0, but the
vertical component is 199 -- 1 less than the vertical resolution. The
width of the image is of course 320 pixels.
Let's suppose we have an SPR graphic that is half the size of the
screen in both dimensions, in other words 160 pixels across by 100 pixels
down. We'll center it just like we did with the half-size PCX graphic
above. To calculate the column coordinate we follow the same procedure:
horizontal resolution - width, divided by 2, minus 1, or: 320-160=160;
160/2=80; 80-1=79. For the row coordinate however we must proceed
differently because we're calculating the lower left corner rather than
the upper left corner. The procedure is: vertical resolution - height,
divided by 2, subtract that from the vertical resolution, minus 1, or:
200-100=100; 100/2=50; 200-50=150; 150-1=149. Our command to center the
image would thus be:
graphic(example6.spr, 13, 79, 149, 160)
Unless you stick to a single file type and a single video mode, you
will find it useful to consult a chart of the video modes and their
screen resolutions. You can find such a chart in online help, under
Programming Hypertext->Graphics->Modes & Resolutions.
14
Gtext()
Display text in the current graphic video mode. Requires that a
graphic video mode be already in effect on the user's display, either as
the result of a graphic() call or by using set() with the "mode" keyword.
Parameters: optional use of the keyword "text", 3 numeric parameters
giving the foreground color of the text and the coordinates at which to
display the first character, and one or more text strings enclosed in
quotation marks.
FONTS
Bitmapped fonts are not yet available (but soon will be); in their place
Orpheus displays the standard "system" characters that are built into
ROM.
COLOR
The first numerical parameter gives the foreground color in which text
will be displayed. For the most readable text you will often want to
create a consistent background color by preceding the gtext() call with
one to gbox(). Check the table of Modes & Resolutions for the number of
colors available in each video mode. Since some PCX files reset the color
palettes, you may get different results if you display text on a PCX
graphic.
COORDINATES
The second numerical parameter gives the column at which the first
character of the first string will be displayed, with 0 as the left edge
of the screen. The next parameter gives the row, with 0 as the top of the
screen. Multiple strings are left-justified with the first character
of the first string, and are displayed further down the screen according
to the calculated height of a character cell.
COORDINATE SYSTEMS - PIXELS OR CELLS
Coordinates may be given in either character cells or pixel counts. As
shown in the table of Modes & Resolutions, mode 16 for example has a
resolution of 640x350, with 80x25 character cells. In other words, the
screen in mode 16 has 640 pixels across by 350 pixels down, or 80 standard
characters across by 25 standard characters down. While counting in
pixels gives you far more precision, in some situations you will find it
more convenient to count in character cells. If you use the keyword
"text" as the first parameter, all coordinates will be read as character
cells. If you do NOT use the keyword "text", coordinates will be read
as pixel counts.
In the current version of Orpheus, since only ROM characters are
supported (and they can ONLY be displayed along cell coordinates),
even if you give pixel coordinates they will be converted to cell
coordinates. When bit-mapped fonts are available you will be able
to use pixel coordinates for finer positioning.
15
The following illustration continues from the example begun for
gbox().
set(fadein = off, fadeout = off, mode = 16)
gbox(text, 14, 9, 3, 61, 20) // yellow box
gbox(text, 1, 12, 4, 55, 18) // blue box inside it
gbox(15, 99, 58, 427, 234) // white box inside it
gbox(11, 99, 287, 427, 6) // bright cyan lines
gbox(11, 117, 278, 391, 5)
gbox(11, 135, 271, 355, 4)
gbox(11, 153, 266, 319, 3)
gbox(11, 170, 262, 285, 2)
gbox(11, 185, 259, 255, 1)
gtext(text, 5, 28, 8, "Greetings", " ", "from", " ",
"Rod Willmot and the animals", " ",
"at Hyperion Softword!")
gtext(text, 5, 32, 17, "1-819-566-6296")
set(fadeout = normal)
This example begins by turning off fades in case we decide to add an
on-disk image using graphic(). It then sets the video mode in preparation
for the calls to gbox() and gtext(). The first three gbox() commands
are taken from the example given above to illustrated gbox(); they set
up a large white box in the middle of the screen, nicely framed by
a thin blue border and a wider yellow border. The next 6 commands
draw a series of lines of decreasing thickness, from the bottom of the
white box toward the center; the effect is of receding perspective.
Finally we come to the gtext() commands, both of which use the "text"
keyword to let us use the coarser but easier cell coordinates. The
color used is 5, magenta. The first set of strings starts at column
28, row 5; blank lines are created by entering a string as " ", a
single space. Each additional string within the same command is
left-justified with the first string, which begins exactly at the
specified coordinates.
16
Hide()
The hide() command is for use in an Init card when you wish to conceal
links in its parent card. The command can be given either with no
parameters or with an indeterminate sequence of numeric parameters.
hide()
hide(0, 2, 5)
In the first example, ALL links in the parent card are concealed: if it
has a More link this fact will not be known by the reader, and if it has
any linkwords they will look like ordinary text -- and clicking on them
will have no effect. In the second example, the More link and the second
and fifth linkwords are concealed. To sum up: using hide() with no
parameters hides all links in the parent. Using "0" as a parameter hides
the More link; other numbers hide the equivalent linkwords as numbered
sequentially from top to bottom and from left to right down the screen.
The hide() command could be used in a network environment where not
all readers should have access to branches with sensitive material. In
a work with illustrations in VGA color, it could be used to prevent
users with mono displays from experiencing the frustration of clicking
on Graphic links and getting no response. Hide() will also add to the
repertoire of effects when the Orpheus Command Language extends to
interactive dialogs and author-created variables.
17
Hotspot()
The hotspot() command defines an area of a graphic or ansi screen that
is linked to another graphic or text card, much like a linkword in a text
card. Hotspots may only be created in Graphic cards, where they can be
associated either with true graphics (displayed in a graphic video mode)
or with ansi graphics (displayed in text mode). The hotspot() command
cannot be used in Action or Init cards. Hotspot data created for a true
graphic is NOT compatible with data created for an ansi graphic.
There are two parameters: a linkword, and a coded data string
enclosed in quotation marks. The first character of the string is "0"
if the hotspot is for a true graphic, "1" if it is for an ansi graphic.
hotspot( linkword , "0NLGOKLPKWQKXRKVSKUT\C")
The hotspot() command, including the coded data string, is entered
by Orpheus rather than being typed in by you. The procedure is as
follows: assuming you are in a Graphic card with a valid graphic() or
ansi() command, place the cursor on an empty line. Press <Alt-C> to
perform the entire script, even if it consists only of one graphic() or
ansi() command. Orpheus displays the graphic and waits for your input.
Press <H> to indicate that you wish to make a hotspot; Orpheus will beep
twice in acknowledgement. You can now draw the hotspot by pressing or
clicking the left mouse button. To erase an area, press or click the
right mouse button. (Neither drawing nor erasing actually alters your
original hotspot.) To cancel a partially-drawn hotspot and refresh the
screen, press <Esc>. To signal that you have finished the hotspot, press
<Enter>.
When you press <Enter> to finish a hotspot, Orpheus returns you to
the Graphic card where you will now see the new hotspot() command,
something like this (the # will be 0 for a true graphic, 1 for an ansi
screen):
hotspot( linkword , "#.......data string.........")
One final step is required to make the command complete: using the word
"linkword" or a word of your own to replace it, open a link on that word
(the first parameter in the hotspot() command) to create a new linked
card. Three link types are permitted: Doors, Graphics, and Crosslinks.
Until this step is done the command is not considered complete, nor will
Orpheus carry out an <Alt-C> command in that card. When it is complete,
press <Alt-C> and move the mouse pointer over the area where you drew
the hotspot; notice that the mouse pointer changes shape.
A hotspot can be small and simple, or large and complex; it can even
be scattered in several unconnected locations. The size and complexity
of the hotspot determines the length of the data string forming the
second parameter. If the data string is too long to fit on one line,
Orpheus will carry it over onto one or more subsequent lines. As in all
cases where data is carried over, each additional line must be padded
18
with one or more leading spaces. (Orpheus does this automatically, but
you should know the rule in case you rearrange things manually.)
A graphic may have as many hotspots as you can define within the
50-line workspace of a card. Additionally, just as you can use flow
control to provide alternate graphics for different hardware, you can
provide a different set of hotspots for each graphic -- or use the same
hotspots for all of them. In the first example below, we put up either
a VGA or an EGA graphic, using modes that have a resolution of 320 x 200.
We then install 2 hotspots which are applicable to both.
trymode(19)
if (failed) goto HAS_EGA
graphic(vga_pic.pcx, 19, full)
goto ADD_HOTSPOTS
:HAS_EGA
graphic(ega_pic.pcx, 13, full)
:ADD_HOTSPOTS
hotspot( link1 , "0.........data string.........")
hotspot( link2 , "0.........data string.........")
In the next example we will again use a VGA and an EGA graphic, but
one will use a resolution of 320 x 400 (mode 23), while the other will
use a resolution of 640 x 350 (mode 16). We'll suppose that the pictures
are sufficiently different that each requires its own set of hotspots.
(For safety's sake, you should never try to use a hotspot in two different
video modes.) In order to create the hotspots we must of course press
<Alt-C> to perform the entire script; this means that at some point we
must comment out all command lines that do not pertain to the graphic for
which we wish to create a hotspot.
/trymode(23)
/if (failed) goto HAS_EGA
/graphic(vga_pic.pcx, 23, full)
/hotspot( link1 , "0.........data string.........")
/hotspot( link2 , "0.........data string.........")
/goto END
/:HAS_EGA
graphic(ega_pic.pcx, 16, full)
hotspot( link1 , "0.........data string.........")
:END
In this example we have already completed our work for the VGA graphic,
and have temporarily commented out that section of the script using
a "/" character at the beginning of each line. This ensures that <Alt-C>
will only display the EGA graphic. The example shows one hotspot
completed, with an empty line left where we can create another. When work
is completed for both graphics we simply remove the comment characters to
return the commented-out lines to the script. To provide ansi graphics
for users with neither EGA nor VGA, we would comment out all of the
commands that use graphic modes, add our ansi() command to display an ansi
screen, then proceed as above to create hotspots in the ansi screen.
19
MULTIPLE COPIES OF LINKWORDS
If you use multiple sets of hotspots for alternate graphics, you will
probably want each set of hotspots to use the same links. Normally in
Orpheus it is not permitted to have more than one copy of a linkword; in
other words, you can copy the text as often as you like, but only one
instance of it can bear the embedded linking codes. This rule is ignored
for Graphic cards in order to allow multiple sets of hotspots to share
links. Note that to delete a linkword copy you must still use the
Unlink command on the Link Menu; if a copy is detected, the unlinking
procedure will only remove the linking codes from the linkword at the
cursor, and will not affect the linked card.
HOTSPOTS AND THE KEYBOARD
In the Orpheus Reader, the mouse interface for accessing hotspots is
similar to that in OH.EXE: wherever the pointer changes shape it is over
a hotspot. When the mouse is disabled or absent, however, a special
keyboard interface comes into play that handles hotspots in a manner
similar to the handling of linkwords. That is, much as the up/down arrow
keys move the selection bar from linkword to linkword, they move the
keyboard pointer from hotspot to hotspot; if there are no linkwords there
is no selection bar, and if there are no hotspots there is no keyboard
pointer. (This rule does NOT apply to the mouse pointer.)
If many of your users will be dependent on the keyboard interface,
you may want to consider the following information when drawing hotspots.
The keyboard pointer is always displayed in the uppermost, leftmost
location in a hotspot. This means that in a T-shaped hotspot it would
appear at the top left, while in an O-shaped hotspot it would appear at
the top center. In true graphics this can lead to effects that are either
peculiar or perfectly acceptable depending on how the hotspots are shaped.
In ansi graphics, on the other hand, IF your hotspots are formed in the
manner of linkwords, it can be a highly effective feature. An example
would be an ansi screen serving as a colorful menu, with each hotspot
underlying a word or phrase on a single line. Note that on ansi screens
the keyboard pointer is a bright (normally blinking) right arrow. For the
best effect, draw your ansi hotspots so that the first character is a
space rather than a letter; this way, the arrow will appear to the left of
the hotspot word instead of overwriting its first letter.
20
If()
The if() command lets you test a condition, and either direct control
to a specified label if the condition is true, or fall through to the
next line if the condition is false. If() commands must be followed on
the same line by a goto with a label.
if (okay) goto ALRIGHT
Only one parameter is permitted, from the following list:
okay
failed
mono
color
"Okay" and "failed" test an internal flag that is set by the trymode()
command (and in future by others). "Mono" tests whether the user has a
monochrome display running in mode 7. (A monochrome display refers to one
on which besides normal and blinking text we can use underline, bright,
and reverse video, but not shades.) "Color" tests whether the user has a
true color display, as distinct from a 1-color display capable of showing
16 shades. Other tests will be added in future.
21
Jump()
The jump() command tells the Orpheus Reader to navigate directly to
another card, which may be determined at random, by number, or by
circumstance. Jumping automatically terminates processing of the current
script; in other words, you cannot jump to another card and then carry
on to the next line of the script with the jump() command. Jump commands
cannot be simulated in OH.EXE.
Up to two parameters are permitted, of which the first must be from
the following list, while the second (if any) must be a card number as
explained on the next page.
[card number]
home
random
retrace
To force a jump to a particular card, navigate to that card in another
window and open the File Menu. To the right of the "Save As" command
you will see the hilited number of that card. Use this number as the
jump parameter:
jump(112) // if the card's number is 112
Such a command could theoretically be given in any programmable card, but
the logical place would be in an Action card, as a replacement for a
Crosslink. Whereas a Crosslink can have only one destination, an Action
card can contain a script that tests various things and conditionally
jumps to a choice of multiple destinations. (In future releases the
number of conditions to test will increase to give you considerable power
and flexibility in this regard.) Note that you should NEVER force a jump
to either an Init or an Action card.
To force a jump to Designated Home (or if none, the Homecard) use:
jump(home)
Random jumps are permitted if you have previously initialized random
jumps by using a jumplist() command together with the "random" parameter.
To force a jump to a card selected at random, use:
jump(random)
Finally, you can force a jump to the PREVIOUS card the reader visited:
jump(retrace)
As of version 1.60 this last capability is probably unnecessary, since the
normal method of backtracking (in the Reader) is simply to retrace with
either the <Left Arrow> or the right mouse button.
22
The optional second parameter is the number of the card from which
you wish to "pretend" to have jumped. Suppose for example that you have
a card that serves as a menu or table of contents, and that at the end
of each branch leading down from it you have a "Return to Menu" or some
such linkword, directing the reader back to the top. Your jump() command
might use "home" or the number of the menu card. Now, if the reader were
to return to the menu manually through a series of PgUp moves, on his
arrival at the menu card the linkword through which he originally descended
would be hilited, making it easy to select a different item from the menu.
But by using the jump() command you skip over the intervening cards, so
that Orpheus keeps hiliting the first linkword on the menu. Here's where
the second parameter comes in handy. At each location where you wish to
use jump(), go to the menu card (using a different Edit window) and find
the linkword leading to that location. Go through that linkword and open
the File Menu to find the card's number, and use that as your second
parameter. The effect will be the same as if the reader had come from the
card directly under the linkword instead of one far below.
jump(10, 12)
This example jumps to card 10, and pretends to have done so from card 12.
If card 10 has a linkword connected to card 12, that linkword will be
hilited as if the reader had just come from there.
23
Jumplist()
The jumplist() command sets up a list of cards to which the Orpheus
Reader can or cannot jump when given an appropriate jump() command as
described in the previous section. Currently such a list can only be
set up for the purpose of making random jumps; a future release will add
the ability to set up a list for a guided tour.
Two parameters are required, of which the first must for now be the
keyword "random". The second parameter may be "all", or either "include"
or "exclude" followed by a list of card numbers represented by their file
extensions. The example below initializes a random jumplist and tells
the Orpheus Reader that choices may be made from all of the cards in the
book. Note that this automatically excludes Init and Action cards.
jumplist(random, all)
The next example initializes a random jumplist that includes only the
cards listed by number. When the Reader encounters a jump(random)
command, it will select at random from that list. Note that the list must
not include Init or Action cards. (To find out the number of a particular
card, open the File Menu while in that card and note the hilited number
to the right of the "Save As" prompt.)
jumplist(random, include, 12, 43, 159,.........)
The final example initializes a random jumplist that includes all cards
EXCEPT those specified in the list. When the Reader encounters a
jump(random) command, it will select at random from all cards, rejecting
any choice that is on the exclude list; it will also reject any choice
that is an Init or Action card.
jumplist(random, exclude, 12, 76, 384,.........)
The list of card numbers must be constructed as shown, with each
number separated from the others by a comma; spaces are optional.
If the list carries over to one or more additional lines, each broken line
must end with a comma, and each additional line must begin with at least
one leading space. The list must be terminated by a closing parenthesis.
The normal place to declare a jumplist is in an Init card. You can
build the list either manually or automatically. Both procedures require
you to start with the Init card with the uncompleted jumplist() command
in one window, and then switch to another window to navigate to the
various cards that you intend to add to the jumplist. To do this
manually, open the File Menu when in such a card, get the card number
as shown to the right of the "Save As..." command, then switch to the
window with your Init card and add the number to the list.
The semi-automatic way to accomplish the same thing requires a couple
of setup steps but is then much faster. First, leave the Init card with
the uncompleted jumplist() command in one window, making sure that the
24
cursor is at the end of the line and in the position where the next
card number is to be inserted. The example below shows this with an
underscore representing the position of the cursor:
jumplist(random, include, _
Open the Tools Menu and select "Jumplist", then select "List Window" and
tell Orpheus which window contains the Init card with the jumplist. Now
switch to another window and navigate to whichever cards you wish to add
to the list. At each such card, press <Alt-F3>. If the procedure is
successful Orpheus will post a message saying "Added to list". Let us
suppose that the first card you add is numbered "15". The example
below shows the growing jumplist with the underscore representing the
new position of the cursor, which Orpheus has advanced in preparation
to receive the next number. Of course you will only see this if you
switch back to the window with the Init card.
jumplist(random, include, 15,_
Remember that to terminate the list and make the command complete, you
must remove the last comma if there is one, and add a closing parenthesis
as in the final example.
jumplist(random, include, 15,17,23,32,58,2,76)
25
Load()
The load() command is intended for use with "external objects", such
as uncompiled text files, forms, or other hypertext books. It takes at
least two parameters: a keyword to define the kind of object you wish to
load, and a filename. Use the "new" keyword to change to a different
compiled book; use "text" to load an external text file in the Reader's
version of the FileView window; use "form" to load a form file in the
Formfill window. Form files may also be stored in libaries, using the
FGILIB.EXE utility described in Chapter 7 of MANUAL1.DOC.
NEW
Load(new, ...) provides a way of jumping to other hypertext books created
with Orpheus. To use it, open an Action link and give the load() command
together with the "new" keyword and the name of the book to load:
load(new, filename.htx)
The keyword "new" tells Orpheus that you want to load a new book. For
a well-behaved application you might want to ensure that the user actually
has the desired book files. You can do this with the lookfor() command,
described below. When a load() command is successful, it performs certain
cleanup functions for whatever the user has just been reading, such as
saving bookmarks and notes. Then it fires up the new book, just as if the
user had loaded it manually. The transition is swift and seamless,
especially if both books were designed by the same person in the same
style. Though currently an Orpheus book is limited to 32,000 links,
with the load() command your work is infinitely extensible: any book
can contain links to hundreds or thousands of other books.
As of version 1.60, load() can also receive the number of a card:
load(new, filename.htx, 199)
This command would not only load the new book but would immediately go
to the specified card, provided it is either a text card or a graphic
card (associated with a Graphic link). Note that the number of a card
in compiled form is NOT the same as its number in uncompiled form. To
get a list of number equivalencies, open the Project List and select
"List Compiled Numbers". When you compile, the .DOC file produced for
that project will include a list of number pairs in the form xxx=yyy,
where xxx is a card's number before compiling, and yyy is the number
with which you can access it in the Reader.
Note that when load() is successful, the line with that command
becomes in effect the last line of the script. In other words, you
cannot follow it with a play() command, for example, and expect music
to play while the user starts reading the new book.
26
TEXT
Load(text, ...) tells the Orpheus Reader to load an external text file for
viewing in the Reader's version of FileView. To use it, open an Action
link and give the load() command together with the "text" keyword and the
name of the file to load. Notice that in the second example, the filespec
include a drive letter and path; you should only do this if your work will
be used on systems known to you.
load(text, filename.doc)
load(text, c:\biz\newinfo.txt)
Load() has the additional capability of placing the reader at a specific
line in a file. The following command would load MANUAL.DOC with line
235 at the top of the viewing window:
load(text, manual.doc, 235)
You can also specify a label instead of a number. The next command would
load the same file but with the line containing the label {New Listings}
at the top of the window. Note that in the script command the text of
the label must be in quotation marks, while in the *file* it must be
in curly braces, like so: {New Listings}.
load(text, manual.doc, "New Listings")
FileView will not display the curly braces, and in fact the entire label
can be hidden by placing it at the end of the line and inserting enough
spaces to push it offscreen to the right. (FileView does not wrap lines
that are longer than the screen.)
Why would you want to link to an uncompiled text file? It can give
your users convenient access to files that are frequently updated. Users
can edit such files themselves, using any editor or word processor capable
of saving files as plain text. They can even create additional links to
their own files using the simple hypertext capabilities of FileView, as
described in online help and below.
Provided the word "ORPHEUS" is found anywhere on the first line of a
file, FileView will interpret certain characters in the file as being
codes for embedded hypertext links. These characters are:
<angle brackets> around linkwords, [square brackets] around jump data,
and {curly braces} around labels. None of these characters will be
displayed, nor will anything in square brackets. The following examples
show what you can do:
<linkword>[#201] - jump to line 201
<linkword>[:Hotels] - jump to {Hotels} below
<linkword>[:^Hotels] - jump to {Hotels} ABOVE
<linkword>[manual.doc] - jump to MANUAL.DOC file
<linkword>[manual.doc #201] - jump to file, line 201
<linkword>[manual.doc :Hotels] - jump to file, line with {Hotels}
{Hotels} - a label
27
FORM
Load(form, ...) tells the Orpheus Reader to load an external form file
in the Formfill window. This is a variation of the FileView window
that is unique to the Reader: it allows the user to fill out an order
form or answer a questionnaire right onscreen, then print it out to the
printer or to a disk file. The original form is unchanged during this
process. Forms may also be stored in library files, as described at the
end of this section.
Like the external text files used with load(text, ...), form files can
be created with any text editor or word processor capable of saving files
as plain text. They can be any length and can contain any number of entry
fields. Form files use the same brackets and braces as do hypertexted
text files, but for different purposes: {curly braces} are used to create
a hilite ; <angle brackets> are used to denote an entry field; and
[square brackets] are reserved for future use. Finally, the _underscore_
character should be used to fill each empty field.
To create a form file, start by setting it up the way you want it to
look onscreen. (Remember, you must use an external editor or word
processor for this, not OH.EXE.) Draw your entry fields using
underscores, like this:
Name: ___________________________________________________
Address: ___________________________________________________
___________________________________________________
State: _____ Zip: ______ Country: _______________
Next, insert angle brackets around each entry field, like so:
Name: <___________________________________________________>
Address: <___________________________________________________>
<___________________________________________________>
State: <_____> Zip: <______> Country: <_______________>
The final step (this is optional) is to insert curly braces around any
text you wish to hilite:
{Name}: <___________________________________________________>
{Address}: <___________________________________________________>
<___________________________________________________>
State: <_____> Zip: <______> Country: <_______________>
What would this look like onscreen? First, you wouldn't see the brackets
and braces. The words "Name" and "Address" would be hilited (in the
color of Note links). And the empty fields would be displayed as strings
of dots -- NOT as strings of underscores. The user can move from field
to field using the Up/Down arrow keys, the Tab/Shift-Tab keys, or by
pressing Enter. The same keys also scroll the form if it is longer than
the screen. After a user fills in a field and moves on to another, the
data he entered in that field has the color of a Door link.
28
If you wish to use any of the reserved characters {}, <>, or []
literally, i.e. to be displayed as themselves instead of being interpreted
as field delimiters, precede each such character with a \ backslash.
(To use a \ literally you must do the same, \\.)
The following command in an Action card would load a form file
called ORDER.FRM:
load(form, order.frm)
Form files should ALWAYS be named with a ".FRM" extension to distinguish
them clearly from other files. If the user prints a form to a disk file,
that file will be named with a ".PRN" extension.
Finally, forms can be stored in libary files using the FGILIB.EXE
utility, described in Chapter 7 of MANUAL1.DOC. The following command
would load our form from within a libary named STUFF.FGI:
load(form, lib=stuff.fgi, order.frm)
Notice that unlike the ansi() and graphic() commands, where the library
specification comes first, with load() we give the libary specification
AFTER the keyword "form".
Lookfor()
The lookfor() command checks the user's disk for a file. It takes
a singe parameter, the file you wish to look for. If the file is found
the okay/failed flag is set to "okay"; if not it is set to "failed".
The following example combines lookfor() with load() in a realistic
setting:
lookfor(filename.htx)
if (failed) goto MESSAGE
load(new, filename.htx)
goto END
:MESSAGE
text(okay, "Unable to find FILENAME.HTX!")
:END
This script checks for the presence of the desired book and skips to
a text() command if the book cannot be found. Otherwise it loads the
book. Even though a successful load() command would immediately
abandon this script since it would no longer be present in memory,
we insert a "goto END" line after it for logical consistency.
29
Play()
The play() command performs 1-voice music on the PC's internal
speaker, temporarily suspending other processing until the music is
finished. There is 1 parameter, a music string composed of a sequence of
letters and numbers according to the convention described below. Letters
in the music string must be capitalized as shown in the examples. The
music string may include spaces for readability. A music string may carry
over onto one or more additional lines, provided that each broken line
ends with a comma and each additional line begins with one or more leading
spaces. The music string must be enclosed in quotation marks as if it
were text.
MUSIC SYNTAX
A to G Play the specified note in the current octave.
# Append to a note character (A to G) to make that
note sharp.
. Append to a note character or to a sharp (#) to
extend that note by half its length. Multiple
dots can be used, and each extends the note by
half as much as the previous dot.
Ln Set the length of notes and pauses. The value
of "n" is a number between 1 and 64, where 1
indicates a whole note, 2 a half note, 4 a quarter
note, and so on. The default is L4.
On Set the octave for subsequent notes. The value
of "n" may be a number from 0 to 6 to specify the
octave, or it can be a "+" or "-" character to
increment or decrement the current octave number.
The default is O4, which contains middle C.
P Pause (rest) for the duration specified by the
previous L command.
Sn Set the amount of silence between notes. The
value of "n" is a number from 0 to 2. If 0, each
note plays for the full period set by the previous
L command. If 1, each note plays for 7/8 of that
period. If 2, each note plays for 3/4 of that
period. These effects correspond to legato,
normal, and staccato playing styles. The default
is S1.
Tn Set the tempo of the music (the number of quarter
notes per minute). The value of "n" is a number
from 32 to 255. The default is T120.
30
Here are a few examples:
/ "Mary Had a Little Lamb"
play("T150 L8 EDCDEEE P DDD P EGG P EDCDEEE L16 P L8 EDDEDC")
/ Beethoven's Fifth:
play("T180 O2 L2 P L8 P GGG L2 D# L24 P L8 P FFF L2 D")
/ Simple scale up and down:
play("L4 C L8S2 DEFGAB S1L4 O+C O-L8S2 BAGFED L2 C")
/ Chromatic scale over two octaves, with the string carried
/ over onto a second line
play("L16 CC#DD#EFF#GG#AA#B O+ CC#DD#EFF#GG#AA#B O+ L4 C P,
L16 C O- BA#AG#GF#FED#DC#C O- BA#AG#GF#FED#DC# L4 C")
31
Quit()
The quit() command tells the Orpheus Reader to exit, the same as if
the user had pressed <Alt-X> except that no attempt is made to save
configuration, bookmark, or notepad files. There are no parameters.
An obvious use for quit() would be to prevent access to a work in which
high-quality graphics were REQUIRED, if the user's display was not capable
of displaying those graphics. For example, the following script would go
into an Init off the Homecard; after checking to see whether the user has
at least a VGA color display, it either flows through to the rest of the
book or displays a message and exits the program.
trymode(18)
if (okay) goto HAS_VGA
:EXIT
text("This book requires a VGA color display")
quit()
:HAS_VGA
if (color) goto READY
goto EXIT
:READY
Note how this script uses two different tests, either of which can
branch to the exit sequence. If the user does not have VGA, the script
flows through to the quit() command and we exit the program; if the user
has VGA but does not have color, the script backs up so that again we
flow into the quit() command and exit. The actual words used for the
labels can be anything you like, and do not have to capitalized; I use
uppercase labels for readability.
32
Run()
The run() command launches an external program having an extension of
either EXE or COM. There is a single parameter consisting of a command
line reproduced exactly as you would enter it at the DOS prompt. The
command line may include space-delimited parameters as you would enter
them at the DOS prompt. Since a ")" character is considered to terminate
the command line, the latter may not include parentheses. The run()
command must not be used to launch batch files, nor can it be used to
run an internal DOS command such as TYPE or COPY. (See runbat() below.)
/ launch LIST.COM to display README
run(list readme)
/ launch GIFSHOW.EXE to display a sequence of 3 pictures
run(gifshow jupiter.gif saturn.gif neptune.gif)
/ launch EDIT.EXE with no file specified
run(edit)
Runbat()
The runbat() command launches a batch file or runs an internal DOS
command such as TYPE or COPY. (Internal DOS commands are those for which
there is no separate program of the same name and with a COM or EXE
extension. External DOS commands are those which do refer to a separate
program, such as MORE.EXE.) There is a single parameter consisting of a
command line reproduced exactly as you would enter it at the DOS prompt.
Since a ")" character is considered to terminate the command line, the
latter may not include parentheses. If using runbat() to launch a batch
file, the batch file may include calls to internal and external DOS
commands as well as to other programs. Runbat() can also launch programs
having a COM or EXE extension, but it takes a little more memory than
run(), so it is better to use run() for such programs.
/ launch ORDER.BAT and specify a certain order form
runbat(order book1.frm)
/ tell DOS to print REGISTER.DOC on the printer (1)
runbat(copy register.doc prn)
/ tell DOS to print REGISTER.DOC on the printer (2)
/ note that this version requires the ">" symbol
runbat(type register.doc >prn)
Both run() and runbat() clear the screen to the normal DOS colors before
carrying out the requested action. What they do on return depends on
whether they were called from an Action card or a Graphic card. If called
from a Graphic card, assuming that a graphic or ansi screen was displayed,
both run() and runbat() attempt to restore whatever was onscreen before
the external program was called. In an Action card however this is not
done; the screen is not restored until control returns to the parent card.
33
Set()
The set() command enables you to assign a symbolic or numerical value
to a variable. Parameters consist of one or more "variable=value" phrases
and may be as numerous as can fit on one line. All variables have certain
default values that are discussed below; once you have assigned a value
to a variable it retains that value until you change it. Currently only
built-in variables may be set, but a future release will enable you to
create variables of your own. The following examples illustrate the use
of the set() command:
set(blink=off)
set(draw=1, erase=14)
set(fadein=tunnelin, fadeout=venetian, delay=1)
As you can see, some variables receive a numerical value, while others
receive a symbolic value represented by a keyword. The list below
explains what the variables mean and what values they can receive.
BLINK
Blink refers to the appearance of high-intensity background colors
when an ansi screen is displayed with the ansi() command. Normally, such
colors do NOT appear as high-intensity backgrounds but rather as areas
that blink. The ability to give the command "set(blink=off)" lets you
work with a more exciting color palette in your ansi screens. You can
even use a time delay to show an ansi screen that starts off with blinking
areas that suddenly stop and change color:
set(blink=on) // in case it was set to off earlier
ansi(mypic.ans) // display with blinking areas
waitfor(18) // pause 1 second
set(blink=off) // turn blink into bright backgrounds
ansi(mypic.ans) // refresh display
waitfor() // wait for keypress
Note that for this effect to work you MUST make the second ansi() call,
because Orpheus does not actually change blink when you give the set()
command, only when an ansi screen is displayed.
DELAY
Delay refers to the speed of certain special effects such as fadein and
fadeout, discussed below. The default value of delay is always 0, which
results in a reasonably fast effect. Some special effects are quicker
than others, and some are more attractive than others when slowed down.
Since the delay setting applies to BOTH fadein and fadeout (and later
perhaps to other variables) you may have to change it repeatedly if you
are combining special effects in a sequence. The first example below
sets delay to a very slow setting; the second returns it to normal:
set(delay=4)
/ .........
set(delay=0)
34
DRAW, ERASE
Draw and erase have to do with making hotspots in OH.EXE. They receive
numerical values from 0 to 15, representing color values from black to
white as shown in the chart below. Their default values are draw=15
(white), erase=0 (black). The following example sets draw to yellow,
erase to grey:
set(draw=14, erase=7)
You only need to change these variables if the colors of a particular
graphic made it difficult for you to distinguish between a hotspot in
progress and the original graphic. Finished hotspots do not in any way
alter the appearance of a graphic, and references to these variables are
not included in the compiled version of a book.
0 black 8 dark grey
1 blue 9 light blue
2 green 10 light green
3 cyan 11 light cyan
4 red 12 light red
5 magenta 13 light magenta
6 brown 14 yellow
7 grey 15 white
FADEIN, FADEOUT
Fadein and fadeout refer to the style with which a graphic is displayed
or erased. The following styles are available:
normal ........ the default: replace pixels at random
diagonal ...... splits the screen diagonally
wipe .......... wipes image on or off from left to right
split ......... splits the screen horizontally
unveil ........ like a curtain
venetian ...... like venetian blinds
tunnelin ...... tunnels from outside to center
tunnelout ..... tunnels from center to outside
check ......... checkerboard style
off ........... ** turn off fades for multiple graphics **
Fadein and fadeout are set individually, so you can have your graphics
fading in with one style and fading out with another; you can even have a
sequence of graphics in which the fade styles change with each graphic.
To make this work, bear in mind that a graphic does not fade out until it
is about to be replaced -- whether by another graphic, by an ansi screen,
or by a text card. The following sequence varies both the speed and the
style of fades:
set(fadein=tunnelin, fadeout=tunnelout, delay=1)
graphic(example1.pcx, 13, full)
waitfor()
35
set(fadein=diagonal, delay=0)
graphic(example2.pcx, 13, full)
waitfor()
set(fadein=wipe, fadeout=split)
graphic(example3.pcx, 13, full)
set(fadeout=venetian, delay=3)
waitfor()
The sequence begins by setting fadein, fadeout and delay for the first
graphic. Before moving on it changes the fadein style for the second
graphic. After displaying the second graphic it changes the fadeout style
for it as well as the fadein style for the third graphic. After that
graphic is displayed the fadeout style is changed again, and the delay
factor set slow to emphasize the quality of the chosen style. Note that
each graphic is separated by a waitfor() command to ensure that each one
stays onscreen until the user presses a key. (The last waitfor() command
would only be necessary in an Init or Action card.)
In the final example we turn fades OFF in order to allow multiple
graphics onscreen at the same time:
set(fadein = off, fadeout = off)
graphic(first.pcx, 18, 0, 0)
graphic(second.pcx, 18, 450, 0)
graphic(third.pcx, 18, 0, 390)
graphic(fourth.pcx, 18, 450, 390)
set(fadeout = normal)
MODE
Mode enables you to set the video mode independently of a call to
graphic(). It is intended for situations in which you wish to do
something that requires the prior establishment of a graphical video
mode. Specifically, the gbox() and gtext() commands do not include a
mode parameter, and so require that the video mode be changed before
they are called. In the following example we want to draw a white box
in the middle of the screen and then overlay a graphic inside it:
set(fadein = off, fadeout = off, mode = 13)
gbox(15, 99, 49, 120, 100)
graphic(portrait.pcx, 13, 107, 55)
set(fadeout = normal)
Turning off fades ensures that the graphic() call will not erase the
screen before displaying portrait.pcx. Since the box is drawn larger
than the graphic, which in turn is positioned so that its upper left
corner is below and to the right of the upper left corner of the box,
the final effect is of a white frame around the graphic. However, in
order to do this we had to set the video mode first, since gbox() requires
that a graphical video mode be in effect before it is called. Another way
to achieve the same effect would be to make the graphic() call first,
then draw the frame around it with four separate calls to gbox().
36
Text()
For use in Action cards, the text() command lets you display up to
23 lines of text in a temporary window, with optional parameters to
control appearance, screen position, and the length of time that the
window remains onscreen. If options are not specified, Orpheus uses
default behaviors such as calculating screen coordinates to center the
window. The window area is automatically sized to fit the longest line,
except when the "okay" keyword is used: this forces the window to
become a standard "Okay" box with the limitations discussed below.
The text() command is at once powerful, flexible, and easy to use.
It is ideal for situations where you want to display a small amount of
information that does not require a separate card (such as the definition
of a word), or where you want the temporary text to be shown side-by-side
with text on the parent card.
LINES OF TEXT
The text() command must receive at least one string parameter, meaning
a line of text enclosed in quotation marks. Anything enclosed in
quotation marks is interpreted as one line of text.
text("This is a one-line message")
This command displays the quoted text in a standard box, centered on
the screen. To display multiple lines of text, separate your parameters
with commas as you would with other commands. If there is not enough
room on a line, or if you wish to enter a multiline command so that it
will resemble what you intend to display, start each new parameter on
a separate line, being sure to indent each such additional line by at
least one leading space. The following examples have exactly the same
results:
text("This message", "will appear", "on three lines.")
text("This message",
"will appear",
"on three lines.")
In both versions, each intended line of text is enclosed in quotation
marks, with commas separating the parameters. In the second version the
two additional lines are indented so as to ensure that Orpheus doesn't
misinterpret them later as separate commands. Regardless of whether
the lines are entered as shown in the first version or in the second,
the result will show all three lines flush left in a centered box,
with two spaces on either side of the longest line:
+===================+
| This message |
| will appear |
| on three lines. |
+===================+
37
Individual text strings cannot be broken by a newline; in other words,
you CANNOT do this:
text("This broken line will
generate an error message")
To include a blank line in your text, enter the blank line as a space
enclosed in quotation marks, like so:
text("This message", "will appear", " ", "on four lines!")
+===================+
| This message |
| will appear |
| |
| on four lines! |
+===================+
SPECIAL CHARACTERS
Two characters must be given special handling if you wish to include
them in your lines of text. The " character normally means the
beginning or end of a text; to include it as a literal character, precede
it with a \ backslash. The backslash in turn normally means that the
next character is special, so to include it as a literal character,
precede it by another backslash. For example:
text("This \"message\"",
"gives the path",
"to C:\\ORPHEUS")
+===================+
| This "message" |
| gives the path |
| to C:\ORPHEUS. |
+===================+
COORDINATES
You can position the text window by specifying the screen coordinates of
the upper left corner of the box. Row 1 is at the top of the screen and
column 1 is at the far left. If two numbers are entered, the first is
the row, the second is the column. If only one number is entered it
represents the row; the box will be horizontally centered. You cannot
specify the column without giving a number for the row. If no numbers are
given the window is centered vertically and horizontally. For example:
text(1, "This will be centered at the top of the screen.")
text(1, 1, "This will be at the upper left corner.")
text("This will be centered vertically and horizontally.")
38
text(18, 40, "This will appear", "in the lower right.")
Whenever you use text() with coordinates, use the <Alt-G> command to
verify your parameters and see the results. (Place the cursor on the
line where the command begins, then press <Alt-G>.) If a row or column
parameter would result in the window being partially offscreen, Orpheus
will give an error message (and will not compile the command).
COLOR
The default colors of the text() window are those of the standard "Okay"
box. You have two other choices: by using the "color" keyword with
either the "help" or "text" keywords, you can use the current colors of
the Help dialog or simply the current text color. The real colors shown
will depend on the current settings when the user views your book.
text("This appears in the colors of the \"Okay\" box")
text(color = help, "This will look like the Help window")
text(color = text, "This will look like normal text")
Notice that the word "text" operates both as a command and as a keyword.
When you use text color, both the border and the text itself appear in
the same color. With the other settings, the border is usually a
different color.
FRAME
The default frame style of the window border is a double-line box. You
set your own style by using the "frame" keyword with a number from 0 to 6.
The numbers represent the styles presented in the Frame Dialog, which
you can view by opening the Project Menu and selecting "Frame".
text(frame = 1, "This appears in a single-line box")
text(frame = 0, "This appears in a box with no frame")
text(frame = 5, "This appears in a box with single lines",
"on the top and sides, and a double line",
"on the bottom")
TIMING
The default behavior of a text window is to remain onscreen until the
user presses a key or clicks the mouse. By using the "delay" keyword
with a number from 1 to 99, you can specify the number of seconds for
Orpheus to wait before clearing the screen automatically. If the user
presses a key before the time is up, Orpheus stops waiting. (Note that
setting "delay" inside a text() command does NOT affect the delay
setting for fade effects in graphic modes.)
text("This remains until the user presses a key")
text(delay = 5, "This remains for 5 seconds only")
39
Now let's see all of the text() parameters working together:
text(1, 50, color = help, frame = 6, delay = 30,
"This little message",
"stretches from the",
"top line down",
"along the right half",
"of the screen, and",
"has the colors of the",
"Help dialog.",
" ",
"It has 2 blank lines,",
"2 \"quotation\" marks,",
"and a \\backslash,",
"not to mention,",
"commas at the ends",
"of several lines.",
" ",
"The frame has single",
"lines at top and left,",
"double lines at bottom",
"and right. After 30",
"seconds it disappears")
THE "OKAY" KEYWORD
If you use the "okay" keyword as the first parameter in a text()
command, you are telling Orpheus to display your message in a standard
Okay box. This means that the dimensions, position, color, and frame
of the window are determined entirely by Orpheus, but the resulting
window has a hilited "Okay" prompt in the lower right window. No delay
is permitted: the user must press a key or click a mouse button.
Your message is limited to 7 lines, with a maximum line length of 57
characters. (The longest line is centered in the window, with any other
lines displayed flush left with it.)
+=============================================================+
| |
| This book requires an EGA graphics display. |
| Sorry about that!
| < Okay > |
+=============================================================+
40
Trymode()
The trymode() command provides a simple and precise way to determine
the capabilities of the user's video hardware. The single parameter is
the number of a video mode. Trymode() does not actually set the video
mode, but rather tests the user's video system to see if it is capable
of switching to that mode, and sets an internal flag accordingly. If
the display CAN switch to that mode the flag is set to "okay". If the
display CANNOT switch to that mode the flag is set to "failed".
trymode(16) // can we do EGA?
if (failed) goto END
graphic(ega_pic.pcx, 16, full)
:END
Use trymode() in terms of the particular graphics you wish to display.
The example above shows a script that might go in a Graphic card.
Presumably the author first wrote the graphic() command and experimented
with the mode parameter until he was sure that mode 16 was needed. As
shown by Table 1, "Modes and Resolutions" (at the end of this guide), mode
16 can be handled by EGA/VGA displays, but not by less advanced displays
such as the CGA. By controlling the program flow depending on the results
of the trymode() test, he can ensure that if the user's hardware cannot
display the graphic nothing bad will happen: the script will harmlessly
skip to the end.
41
Waitfor()
The waitfor() command enables you to insert a pause in a script.
The optional parameter is a number representing 18ths of a second. If
there is no parameter Orpheus waits until the user presses a key. If
a number is given Orpheus waits that number of 18ths of a second OR until
the user presses a key. In other words, waitfor() gives you an optionally
timed pause that can always be broken by a keypress.
/ wait indefinitely until keypress
waitfor()
/ wait 1 second (or until keypress)
waitfor(18)
/ wait 10 seconds (or until keypress)
waitfor(180)
If you display graphics or ansi files from Init or Action cards, you
will soon notice that you MUST place a waitfor() command at the end of
the script. Otherwise, control returns immediately to the parent card
and the image disappears a fraction of a second after it was displayed.
This is NOT the case with Graphic cards, where control remains with the
last-displayed image in the same manner as with a text card.
42
---------------------------------------------------------------------------
CHAPTER 3 - CONVERTING OLD COMMANDS
---------------------------------------------------------------------------
Versions Before 1.30: Graphic Commands
Run Commands
Random Commands
Versions Before 1.50: Hotspot()
Jump(), Jumplist()
Play()
ALL programming commands from versions prior to 1.30 must be
converted to the new standard, which is described in Chapter 1 and in the
Command Reference (Chapter 2). Commands no longer have to be entered in
capital letters. Most conversions concern commands that would have been
in Graphic cards. In addition, users of versions 1.30 to 1.41 will need
to update their use of hotspot(), jump(), jumplist(), and play().
Graphic Commands - Before 1.30
The commands FILEPATH=, RESOLUTION=, and MODE= are now combined into
the graphic() command. The following data in the old version:
FILEPATH=c:\art\bkcover.pcx
RESOLUTION=640x200
MODE=14
becomes this in the new version:
graphic(bkcover.pcx, 14, full)
There are three points to notice here. (1) Instead of specifying the
complete filepath you should give only the filename. Although you _can_
give a complete filepath, this would be compiled into the finished version
of your work and would be of no use to your readers.
(2) Instead of telling Orpheus what resolution to use, with the video mode
being an optional detail, you now specify only the video mode. The table
of Modes & Resolutions makes it easy to find an appropriate mode, and you
can test the results by placing the cursor on the line with the command
and pressing <Alt-G>.
(3) Until Version 1.30 you could ONLY display full-screen graphics. Now
you can display graphics that are smaller than the screen and place them
anywhere you want using parameters 3 to 5. To display a full-screen
graphic, just use the word "full" as in the example above. Read the entry
on graphic() in Chapter 2 to learn about displaying smaller graphics.
43
The commands HOTSPOT= and LINKWORD= are now combined into the
hotspot() command. This command takes the linkword as the first
parameter, with the hotspot data string as the second parameter. Note
that when you draw a hotspot on a graphic, Orpheus enters the hotspot()
command for you automatically along with the hotspot data, the same as it
did in previous versions. If you have existing hotspots you must delete
redraw them, but read the following if you also have associated linkwords
that you wish to keep.
Suppose you have a graphic of a Mississippi riverboat, showing a
gambler on whom you've made a hotspot. In the old commands you would
have something like:
HOTSPOT=5Q&6Q(7P*8P+9P+9[":O/;O0<N2=N2>U,?U#?Y(@[&■
LINKWORD=gambler
In the new version this must become:
hotspot( gambler, "0..........data string.........")
Before you can redraw the hotspot you will have to comment out any lines
containing commands that are no longer valid. Get your graphic() command
working first (you can test it individually with <Alt-G>), then comment
out all other lines by inserting a "/" at the far left. Now delete the
"HOTSPOT" line entirely, leaving the cursor on that empty line. You can
now press <Alt-C> and, if the graphic displays correctly, follow the
procedure for making a hotspot described in Chapter 2. Upon return from
the graphic you will see a line like the one above, but with the word
"linkword" as the first parameter. The final step is delete that word,
then mark the original linkword you wish to replace it with and MOVE it
into the new location. You can then remove the "LINKWORD" line.
NOTE: previous versions of Orpheus simply ignored hotspot commands
for which the linkword command did not actually have a linkword with a
completed link on it. As of Version 1.30, Orpheus considers this an
incomplete command and will not let you use the Alt-C command to perform
the script and create new hotspots. To bypass this without deleting
the command, comment it out by placing a ";" or "/" at the beginning of
the line.
Finally, the DRAW= and ERASE= commands (for adjusting the colors used
while drawing hotspots) have been changed into optional parameters of
the new set() command. Thus, if you used the following before:
DRAW=14 // draw in yellow
ERASE=1 // erase in blue
you would now use the following:
set(draw=14, erase=1)
44
Run Commands - Before 1.30
The RUN= and RUNBAT= commands now use parentheses in place of the "="
sign. If you have a line like:
RUN=print file.doc
you would convert it to:
run(print file.doc)
Random Commands - Before 1.30
The RANDOM= commands have been replaced by the more capable jump()
and jumplist() commands. When specific cards were listed we originally
used the 3-letter extension from the filename; as of 1.50 we get the
card number in decimal form by opening the File Menu while in that card,
and looking at the "Save As" line. The card number is hilited at the
right.
RANDOM=ALL // becomes:
jumplist(random, all)
RANDOM=INCLUDE,00B,01A,... // became until 1.50,
jumplist(random, include=00B,01A,...) // but is now:
jumplist(random, include, 12, 49, ...)
RANDOM=EXCLUDE,02Z,03G,... // became until 1.50,
jumplist(random, exclude=02Z,03G,...) // but is now:
jumplist(random, exclude, 72, 99,...)
RANDOM=JUMP becomes:
jump(random)
The jump() command in particular has far more useful purposes than the
above, as you can see in the discussion of it in Chapter 2, the
Programming Command Reference.
45
Hotspot() - Before 1.50
As noted above, from versions 1.30 to 1.41 the hotspot() command
took a data string enclosed in two copies of the block character, ascii
254. As of version 1.50 the data string is enclosed in quotation marks
like an ordinary text string, but has some other differences that are
equally important. First, the first character of the string is now either
"0" or "1" to mark a hotspot created for either a true graphic or an ansi
screen respectively. Second, the characters used in the string are drawn
from a higher range of ascii values, making old data strings completely
incompatible with version 1.50 and up. (The new standard is both more
coherent and more powerful, so this should be the last time you have to
convert your hotspots.)
To convert existing hotspot commands, you will have to redraw them
and let Orpheus insert the new data string. Assuming you have a command
a completed linkword that you wish to keep, comment out that line and
any others that are no longer valid, then insert a blank line or two
and proceed as described in chapter 2 for making a hotspot. You should
be able to redraw your hotspot without any difficulty. Upon return from
the graphic, delete the dummy word "linkword" and replace it with what
you really want by marking the original linkword and moving it into place.
Jump(), Jumplist() - Before 1.50
When specific cards were referred to, these commands previously
used the 3-letter extension from each card's filename. In the case of
jump() a colon was used to precede the 3-letter extension. The new
standard makes things simpler by using numbers in decimal, without some
of the trappings that used to be required. To find the number of a
card, navigate to that card and open the File Menu; the number will be
hilited on the "Save As" line.
OLD USAGE:
jumplist(random, include=00A, 01B, 0G9........)
jump(:00A)
NEW USAGE:
jumplist(random, include, 10, 42, 129..........)
jump(10)
As you can see, the new standard is simpler and more in tune with the
way other commands are given.
Play() - Before 1.50
The music string given in a play() command must now be enclosed in
quotation marks, as shown in Chapter 2.
46
---------------------------------------------------------------------------
TABLE 1 - MODES AND RESOLUTIONS
---------------------------------------------------------------------------
All of the listed video modes are graphic modes. The "Resolution"
column gives the number of pixels onscreen, with the first number being
the horizontal count (pixel columns), the second being the vertical count
(pixel rows). The "Text" column refers to the number of character cells
available when text is displayed using the built-in ROM characters (as
seen in text mode). The numbers are again given as columns x rows.
Where two numbers are given under "Colors", such as 16/64, the first
figure represents the number of colors that can be displayed at one time,
while the second figure represents the number of colors available to
choose from in that video mode. 256K means 262,144 possible colors.
Mode Resolution Text Colors Adapters
4 320x200 40x25 4 CGA/EGA/VGA/MCGA
5 320x200 40x25 4 CGA/EGA/VGA/MCGA
6 640x200 80x25 2/16 CGA/EGA/VGA/MCGA
9 320x200 40x25 16 Tandy,PCjr
12 320x200 40x25 2 HGC
13 320x200 40x25 16 EGA/VGA
14 640x200 80x25 16 EGA/VGA
15 640x350 80x25 2 EGA/VGA
16 640x350 80x25 16/64 EGA/VGA
17 640x480 80x30 2/256K VGA/MCGA
18 640x480 80x30 16/256K VGA
19 320x200 40x25 256/256K VGA/MCGA
20 320x200 40x25 256/256K VGA
21 320x400 40x50 256/256K VGA
22 320x240 40x30 256/256K VGA
23 320x480 40x60 256/256K VGA
46