

GRAAL 2.3
=========


Yes, it's been a while, but just to show you I'm not completely dead here's
another GRAAL release. Another bunch of features making GRAAL games both
more fun to write and more fun to play!


As always, the reference information is available in graal.guide, but here's
a quick breakdown of the news...



Upgrading from 2.2
==================

Some big, but very-easy-to-implement changes.



CHAR: statement change
----------------------

Here's the only change you need to do right away:

CHAR: statements have acquired two new, mandatory parameters to match the
height and width of the images representing the respective characters
(as opposed to the estimated width and height of the characters themselves
- that information was already present). Read more in graal.guide.



Image-related statement and command changes
-------------------------------------------

A lot of the statements, commands and conditions that relate to images
have changed names, as have SBOB and RBOB references. This is to finally do
away with the most arcane part of GRAAL syntax, which makes everyone confuse
image numbers with bob numbers. The driver still accepts the old names, but
the syntax checker in the editor spots them and urges you to change them:

N_GLOBALBOBS:      is now   N_GLOBALIMGS:
N_SECTIONBOBS:     is now   N_SECTIONIMGS:
N_ROOMBOBS:        is now   N_ROOMIMGS:
BOBS:              is now   IMGS:
SECTIONBOBS:       is now   SECTIONIMGS:
ROOMBOBS:          is now   ROOMIMGS:

BOBS               is now   IMGS
CBOB               is now   CIMG
IFCBOB             is now   IFCIMG
PBOB               is now   PIMG

and the references

RBOB               is now   RIMG
SBOB               is now   SIMG


Note that all that has changed are the names - the syntax is still the same.

Since the driver still accepts the old names, you can make the changes
over time when you have to edit a script for some other reason anyway.



Pause length changes
--------------------

I have changed the way the pauses for SAY, RESP, THINK and TEXT are
calculated, to make the pauses more consistent between those commands
(because you sometimes use TEXT instead of SAY for character speech
and so forth). So the timing in your scenes may become slightly different.
Especially very short texts displayed with the TEXT and SAY commands are
now shown a little longer. (You shouldn't have to worry about changing
your scripts in most cases.)



GRAAL Manual
------------

The GRAAL manual is now delivered in HTML format, so you need a Web browser
to display it nicely formatted - Voyager, for example.




NEW FEATURES
============

Talkies!
--------

GRAAL is now capable of producing "talkies", that is, use spoken dialogue
instead of written - or a combination of both. The SPEECHMODE command
(or pressing the "A" key) decides which options are active.

Making characters talk is as easy as putting some audio file information
enclosed in angle brackets just before the text that is normally displayed
on screen. Like this:

SAY <mysound/D/D/D>This is the text

Now, if audio is ON and text is OFF, the sample file "mysound" will be
played instead of the text being shown.

"/D/D/D" are parameters allowing you to adjust channel assignments, 
frequency and pause length, should you not want the defaults (D).

This way of giving audio info works with every situation and command
which normally uses the text display routine in GRAAL to output text:
The LINE: statement and the RESP, SAY, THINK, and TEXT commands.

Samples can be IFF or RAW, and must be less than 65536 long.
(The sound handling of Amos Pro, the base language of GRAAL, is an awkward
business regardless of which Amos Pro commands or extensions one uses.
This is just me having to pass on bugs and limitations in the underlying
code on to you.)

I recommend you try recording no more than half a dozen or so lines first, 
and try them out in GRAAL to see that your sample format and recording
technique is compatible with GRAAL.

Also, I have not tested this concept on a full-blown adventure and can
only hope that it doesn't lead to long-term memory trashing. The concept
uses the same code as the sample-playing commands in GRAAL, so it should
be fairly safe and stable.

The only other thing to watch out for is that you don't create script lines
that are too long when adding audio info to your texts - you may
inadvertently "push" the ends of lines beyond the 255-character limit.

To avoid flooding the main directory with all these talkie files, they
all go into a subdirectory called /graalaudio. Note: The sound effects
used by SAMLOAD, SAM, and SOUND as well as tracker module files still
remain in the main directory!

Having all the dialogue sample files in a separate directory has another
benefit: Because you probably want to keep the sample file names
as short as possible, you don't have to add a type suffix - everything
in the /graalaudio drawer should be dialogue sound samples anyway!



Talkies and the Production Utilities
------------------------------------

The new audio capabilities is not handled the same way as ordinary files
as far as the production utilities are concerned:

GPRO:   /graalaudio files CAN be copied and compressed using GPRO (but you
        don't HAVE to, neither do they need to be in the diskinfo.graal
        file - you can copy the contents of the /graalaudio subdirectory
        to wherever you want manually).

        Just prefix the audio files with the graalaudio directory name in
        the diskinfo.graal entry. Like this:

        A graalaudio/samplefile

        will copy the file "samplefile" from development to test directory, 
        subdirectory "/graalaudio". Encryption will take place along the
        way (if compression/encryption is ON).

GDC:    Don't use GDC with audio adventures - designing an audio adventure
        to run off 880K floppies is plain silly anyway. Empty the GPRO test
        directory onto diskettes any way you like and write your own install
        routine to dump them onto hard disk. Or hey - make a CD!

GREP:   The report tool doesn't cross-reference /graalaudio files for the
        time being. This may change in the future.



Making the Demo Talk
--------------------

The demo has been updated to a "talkie" in the intro and room 1, if you
bother to download the audio files which are in a separate archive -
"graal2audio.lha". These files must be placed in a /graalaudio subdirectory
as described above.

If you don't install these files, the demo will still work fine - it just
acts like a normal adventure without audio.



MUSIC command
-------------

The MUSIC command can be used to turn music and sound effects on and off, 
just as pressing the "M" key does. Implemented to provide symmetry with
the SPEECHMODE command.



Speech (text display) styles
----------------------------

This is a VERY old request which I finally did something about. It means
all "speech" displayed during character dialogues, and also all text
displayed by the text message, can be shown in a number of different styles.

You can choose between semi-transparent or solid backgrounds and borders
in the colours of your choice, and the borders can be square or slightly
rounded (well, more a kind of "jagged corners" look, really).

You can even have a cartoon speech bubble! I have now switched to that
technique in "Olaf" for maximum clarity in the text displays. The little
arrow of the bubble automatically adapts itself so that it always points
to the characters' heads (well, the image hotspot, actually), which looks
really cool.

Style selection is done with the new SPEECH_LAYOUT: statement in
graal.main .

More styles may come in the future. Or not.



RESUME KEEP
-----------

MARK - RESUME is a very useful set of commands, enabling you to store
(MARK) a position, jump to anywhere else, do something, and then jump
back to whereever you were (RESUME). The annoying thing up to now was
the fact that EVERYTHING was restored by the RESUME, including object
and room data. (In fact, MARK and RESUME are essentially a quick way
to save and load games from within scripts.) This meant the concept
was mainly of use for screens like save/load/score/quit.

However, with RESUME KEEP, all changes made to object data, room data, 
and string variables between MARK and RESUME survives the RESUME. This
means there's a lot of new exciting possibilities here. How about:

* A room acting as a notebook - MARK, jump to the notebook, make entries, 
  RESUME KEEP back to the jump point.

* Other information sources: For example, newspapers where you want WHAT
  you read to influence what you can do in the game when finished reading, 

* or, for the sci-fi gumshoe, a pocket-size crime lab: What you analyze, 
  how you do it, and what you find out influences your line of questioning.

Well, you tell me. I'm just guessing.



IFNOTROOM
---------

Just another condition, the lack of which led to awkward coding at times...



PLAYMACRO
---------

This off-beat command allows you to start playing a previously recorded
macro from within a script! Why would you want to? Well, perhaps you'd like
to make a non-playable but self-playing demo version of your game.



Other Minor Changes
-------------------

Some of the old conditions and commands have had their capabilities
slightly upgraded, for example HOTSP. See graal.guide news for details.



Bug Fixes
=========

Some nasty bugs concerning saving and loading games with 3D-scaled characters
has been eliminated:

- When you saved a position with a scaled character, and loaded that position
  from a state where the 3D images had not yet been created by GRAAL (that is, 
  a non-3D room), the character would initially not show up after the load, 
  and then walk around full-sized...

- Sometimes an object which had been altered with a SHOW command would not
  re-appear using the correct (last specified) image after a LOAD or RESUME.


Scrolling of the dialogue area worked best with the (default) four lines
of dialogue displayed, and not at all with less. Should work OK now.


GRAAL previously accepted an (erroneous) empty hotspot
parameter in ...BOBS statements and commands. Now, you HAVE to put a 0
in there as stated in the docs.
