Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
S C I C H A N G E S & U P D A T E S
in reverse chronological order
The following is a list of changes made to system modules since 2/2/92,
the date of the documentation given to Larry Scott by Brian K. Hughes.
8/23/93 Brian K. Hughes
Added the fileCopy subfunction to the FileIO call.
8/16/93 Brian K. Hughes
Added the Reproducible field for SFTracs and eliminated far text.
6/18/93 Brian K. Hughes
Cleared the oneOnly, killed, and caller properties in the sayFormat
method. Failure to do this resulted in the caller not being cleared
when a new Cue was made, hence all Cues created by the Messager from
the sayFormat method had the same caller as the last one Created by
the say method.
6/9/93 Brian K. Hughes
Added the RemapToGray and RemapToPctGray functions to the ColorRemap
6/1/93 Brian K. Hughes
Adjusted the output of some of the fields so that the SFTracs program
will recognize them. Also added a Reproducible field for SFTracs.
5/13/93 Brian K. Hughes
Added Martin's ColorRemap calls.
3/2/93 Brian K. Hughes
Added subfunction entries for (DoAudio Queue) and (DoSync QueueSync).
2/26/93 Mark Wilden
A rename method was added to class File to allow renaming of files. A
new kernel entry for (FileIO fileRename) was also added.
*2/19/93 Brian K. Hughes
If the event is claimed after going to the iconbar, we return out of User
doit: with a TRUE value.
We no longer look at events in the handleEvent method if the user cannot
control. Ego's script will still get events first, however.
In the MessageObj's showSelf method, the talker (whoSays) is first checked
for a value of -1, indicating a "comment" talker. In this case, the caller
is cued immediately and no other action is taken.
Also, if the message is not found we no longer exit the game.
Added explicit return values to the handleEvent method, since the calling
object is expecing them (q.v. 1/11/93, GAME.SC).
When changing the directory, the size of the input field adjusts to the
size of the current directory plus enough space for "\MMMMMMMM". This
both A) fixes a bug where the directory name was too long and the extra text
trashed memory, and B) allows the user to change the directory down to
further levels.
Also, all usages of Print are now clones, which avoids changing Print's
default font that the game may have set.
The position of the text for viewInPrint talkers was adjusted by the width
of the icon to prevent the text from showing over the icon.
The dispose method of class Script now resets the seconds, cycles, and ticks
properties to 0.
1/27/93 Brian K. Hughes
The mute method of Sound was using mMUTE as the command to MidiSend, whereas
the command is actually mCONTROLLER with a parameter of mMUTE.
1/22/93 Brian K. Hughes
Added define for module QSOUND back. It was removed because it was thought
to be obsolete. Since then a genuine need has arisen for it.
The default value for the modNum property of InvItem has been changed from
0 to -1. This makes InvItems more consistent with Feature and makes it
possible to use module 0 for the messages. The module will be changed to
the current room if the value is -1.
The play method used to call the init method unconditionally, which added
the sound to the sounds list and inited the C sound object. Due to time
issues, the init is now called only if the sound is not already on the
sounds list.
1/22/93 Brian K. Hughes [Tester]
Setting an actor's step size now calls his setStep method instead of just
setting the individual properties. This eliminates the bug wherein pressing
escape would set the step size to -1, because the setStep method treats a -1
as a "no op".
1/22/93 Brian K. Hughes
Removed the cdAudio global. Instead, the expression (& msgType CD_MSG)
is used.
The gameTime is reset in the Narrator's init to compensate for times when
disk access eats some of the talker's ticks, making it dispose too soon.
[Robert W. Lindsley]
The wait cursor is displayed if the user does not have a mouse
or if the message is a non-modeless CD message. The game's volume is also
saved and lowered during CD messages.
Kernel entry #135 was added for SetQuitStr. This call takes a near string
as its only parameter, and displays this string on the screen when the
interpreter exits.
1/20/93 Brian K. Hughes
Claimed the event if the OK button was selected.
1/11/93 Brian K. Hughes
Messager's sayNext method return 0 in the accumulator if the message was
not CD_MSG. This caused Region's doVerb to return 0, which left the event
unclaimed, which caused a fall-through default message to be displayed
immediately after a room's message. Region's doVerb now returns an explicit
value instead of relying on Messager's return value.
1/8/93 Brian K. Hughes
Code in Dialog's handleEvent method to convert direction events (as would
be produced by the joystick) to keyDown/Arrow events had been erroneously
removed. Joysticks in dialogs work correctly now.
1/7/93 Robert W. Lindsley
Changed the ScaleTo class to be real-time.
12/30/92 Brian K. Hughes
Messager and Narrator classes are now fully audio-compatable. Messager
makes use of the new (Message MsgKey) kernel call, which retrieves the
current message pointers from the kernel and stores them into an array,
which Messager allocates off heap. The array is then passed to Narrator's
startAudio method, via the say method. This gives the audial talkers the
information they need for mouth syncs and such, without requiring special
calls for audio messages. The message file is used as an index for audio,
in that only after the message has been found does the code ask for the
current pointers.
Narrator's startAudio method now accepts as its only parameter the address
of the message key array (still allocated off heap).
Added an entry for the (Message MsgKey) call.
12/18/92 Brian K. Hughes
If sortedFeatures was FALSE, the event never got sent to addToPics.
The approachObj bit in ego's state property is now set TRUE in his init.
This way, ego will always try to approach objects by default.
12/8/92 Brian K. Hughes
The (User input?) was deleted from the list of conditions by which pMouse
would get an event. This means that the cursor may be moved with the
arrow keys during handsOff. This was important for being able to use the
interactive text.
The check for the existence of an iconbar and whether the curIcon was the
walk icon was removed from PseudoMouse's handleEvent. If the event was
a walk, User handles it appropriately before pMouse ever gets a shot. In
addition, this bug would not allow the cursor to be moved using the arrow
keys if it was the walk cursor (see above change to USER.SC).
Added an setOnMeCheck method that will set the onMeCheck property correctly,
according to identifying type. The syntax is:
(obj setOnMeCheck: type args)
where 'type' is one of ftrDefault (onMe if in nsRect), ftrPolygon (onMe if
in polygon), or ftrControl (onMe if on control color). 'args' will be the
object ID of a polygon for ftrPolygon type, and multiple control color
defines for ftrControl type. ftrDefault type takes no other arguments.
In addition to setting the onMeCheck property, setOnMeCheck also manages
the onMeIsControl bit in the state property. This bit eliminates the bug
caused when a bit map of controls is the same as the address of an object
or $6789 (ftrDefault).
The onMe method was rearranged slightly to better evaluate the three types
of checks, and the onMeIsControl bit was checked for ftrControl type.
Also, a new state bit, approachObj, is checked to see if ego should approach
objects. If the bit is not set, ego will not approach, regardless of the
objects' approachVerbs.
Added defines for ftrPolygon and ftrControl, and state bit defines for
onMeIsControl and approachObj.
12/7/92 Brian K. Hughes
The ignoreBlocks method attempted to delete items from the blocks list
without first checking to ensure that the blocks global points to an
object. Hence, invoking ignoreBlocks without having invoked observeBlocks
would result in a PMachine NAO $0.
The call to GetCWD in Game's play method has been removed. The interpreter
now fills in the curSaveDir buffer with the default directory, which may
not necessary be the current working directory.
12/1/92 Brian K. Hughes
Removed MapKeyToDir in DText handleEvent (not needed). Also, made event
global instead of local to check the rectangles.
Clones of Print are now stored in temps so that the &rest won't screw up
the stack.
11/10/92 Brian K. Hughes
Called super's handleEvent from DText handleEvent to insure that the return
value gets set just as it would if DText had no handleEvent. Also reset
the event type to nullEvt and claimed to FALSE so that the dialog will not
go away if the event is within a rectangle.
All procedures (Prints, Printf, GetInput) now clone Print instead of using
the class.
11/6/92 Brian K. Hughes, Robert W. Lindsley, Mark Wilden
Class Game's doit: method now disposes of a modelessDialog if it runs
out of time. This allows modelessDialogs to time out the same way modal
dialogs do.
Class Game's replay: method now sets the wait cursor only if user can't
input AND user can't control.
Added support for interactive text in DText class. This required adding a
handleEvent method that checks to see if the event is within any rectangles
created in the text. If so, the doit method of a global piece of code
(pointed to by the textCode global) is called and passed the rectangle
number (0 relative). If there is no code, DText will ignore the rectangles.
Added the textCode global, which points to a piece of code to handle
interactive text response.
11/5/92 Brian K. Hughes
A bug in the way in which the array was being accessed in the setSize
method was fixed.
If the client's loop was fixed, the doit: method of GradualLooper was
bailing out before it's caller was set, preventing the caller from being
11/2/92 Mark Wilden
The writeString method now returns TRUE if no error condition exists,
and FALSE if an error occured during file (or printer) access.
10/29/92 Brian K. Hughes
A bug was fixed whereby the select: method of the Inventory's okButton
was getting called twice. This meant that the user had to click twice
on the button to get out of inventory.
10/28/92 Brian K. Hughes (from Bob Fischbach)
Added passing &rest to handsOffCode and handsOnCode.
10/27/92 Robert W. Lindsley
If the user does not have a mouse, the cursor is changed to the INVIS_CURSOR
when displaying a help message. The cursor is returned to normal upon
dispose of the message.
No-click help is unaffected.
10/26/92 Brian K. Hughes (from Cynthia Hardin)
A small fix was made to the inRect: method that made the bottom and right
of the rectangle inclusive. If the point in question is on the bottom or
right edge, it will now return TRUE (in the rectangle).
The talkerList property was removed, and instead of creating a dynamic
Set to hold the talkers' ID's an instance of Set is now used. This allows
us to override the Set's dispose method to pass along Messager's dispose-
WhenDone property.
If the Messager's disposeWhenDone is TRUE, the talkers will be "put to bed"
after a sequence of messages is complete. If FALSE, they will stay on the
screen. This can be useful when a sequence must be performed manually via
a script, but you do not want the talkers to go away (flash) between
10/26/92 Brian K. Hughes
Added Tutorial class. Tutorial is a kind of Script that is meant to
be put on the game. It allows the programmer to specify icon items that
the user is required to select for the script to continue. There are three
methods that the programmer will use:
changeState: used as in a normal script
waitFor: used to specify which icon item is the 'trigger'
report: used to display messages in the 'wrong' case
As long as the user does the actions specified by the Tutorial, the Tutorial
will cue right along, just as a normal script would. If the user makes a
wrong choice, the Tutorial can be made to display negative reinforcement
messages. The main advantage of the Tutorial class is that it uses the
existing IconBar and Inventory.
Here is a sample Tutorial:
(instance rm100Help of Tutorial
(method (report objOrVerb)
(++ numTries) <- a property!
(switchto state
(switch numTries
(1 (messager say: HELP NULL NOT_WALK 1)
(2 (messager say: HELP NULL NOT_WALK 2)
(else (messager say: HELP NULL NOT_WALK 3)
; We will get handed either the incorrect object or
; the incorrect verb
(if (IsObject objOrVerb)
(switch numTries
(1 (messager say: HELP NULL NOT_EGO 1)
(2 (messager say: HELP NULL NOT_EGO 2)
(else (messager say: HELP NULL NOT_EGO 3)
(switch numTries
(1 (messager say: HELP NULL NOT_DO 1)
(2 (messager say: HELP NULL NOT_DO 2)
(else (messager say: HELP NULL NOT_DO 3)
(method (changeState newState &tmp [str 50])
(switchto (= state newState)
(self waitFor:
(theIconBar at: walkIcon) NULL {Click on the walk icon}
(Message MsgGet HELP NULL PROMPT 1 @str)
(self waitFor: ego DO @str)
10/23/92 Brian K. Hughes
Code was added both in Dialog and DItem to make the highlighting feature
follow the mouse. This prevents the problem caused when a user moves
the highlight to a control using the keys, them moves the mouse over a
second control and presses ENTER. Under the old system, the first
control would be selected, but now the highlight will follow the mouse
to the second control and it will be selected by pressing ENTER.
RangeOsc class. Syntax is:
(prop setCycle: RangeOsc howMany firstCel lastCel caller)
Additional information is listed at the top of the file.
Added handsOffCode and handsOnCode properties and handsOff and handsOn
methods to class Game. The methods simply alter user control and, in
the case of handsOff, kill ego's mover. The methods are setup to check
the properties first and, if the property holds an address to an object,
call that object's doit: method instead of the default functionality.
For example, a specific room might require that some icons be disabled
on handsOff. An instance of code in that room could be attached to the
Game's handsOffCode property, and that code will get it's doit: called
instead of the default handsOff method's code.
10/20/92 Brian K. Hughes
For whatever reason, this file was not included in the system when it
was upgraded in February '92. In addition to the original RegionPath
class, the ability to reverse the motion through the points was added
by Randy MacNeill.
10/16/92 Brian K. Hughes
A new method, setName, and a new property, state, was added to Feature
class. The setName method can be used to change the name of the feature,
dynamically allocating space for it off the heap. A new bit, dynamicName,
is set in the state property to indicate dynamic name allocation. The
dispose method checks this bit to determine if the name needs to be de-
The Feature Writer takes advantage of this new naming ability to allow
users to create features, attach message parameters to them, and have
them remain active in the game after the Feature Writer has been disposed.
10/14/92 Brian K. Hughes
The hide method now checks to ensure that the helpIconItem is an
object before trying to turn off its translator bit. This prevents
PMachine NAO's in games that do not have help icons in their iconbars.
10/7/92 Brian K. Hughes
The conditional compile directives were changed to follow the new
format (i.e. #ifdef instead of IF).
The random loop in MouthSync's doit: method to cover for a sync cel
that was invalid has been removed. We can assume that the sync will
give MouthSync a valid cel number, so there is no need to check for
range violation and generate a random number, which process involved
several additional messages and a kernel call.
10/6/92 Brian K. Hughes
Entries were added for two new kernel calls, ShowMovie (#133) and
SetVideoMode (#134).
The ESC key now produces the same result as clicking the mouse on
the OK button.
9/23/92 Brian K. Hughes
The iconbar did not transfer the message property of the curIcon (or
curInvIcon) to the event properly if the event was a keyDown/ENTER.
Changed references to the Sounds list (from change of 9/16/92) to refer
to the sounds global instead.
In addition to checking the noStepScale bit in the scaleSignal, Actor's doit
now also checks to see that the actor is scaling before trying to adjust its
Added full audio support for talkers.
Also added the ability to control the length of time a talker talks by
modifying the value of the textSpeed global. This global can be linked to
a slider to let the user control the talker time.
The oneOnly property now gets set to TRUE in the sayFormat method, which
will prevent the messager from calling the sayNext method after the message
is done.
The array property is checked in the init method now, and if it is non-zero
the flags will not reallocate new space. Similarly, the array property is
reset to 0 in the dispose method.
The nsTop property of IconItem, which defaults to -1, is now set to 0 in the
drawInvWindow method of Inventory, just prior to determining its final
position. This prevents the top row of pixels in the IconItem's cel from
being overwritten by the window itself.
9/16/92 Brian K. Hughes
The Sounds list was misspelled several places, leading to confusion
between it and the Sound class.
9/10/92 Brian K. Hughes
Game's doit: method now exits early if a fastCast exists after the call
to Animate. This would indicate that a talker has been initiated from
someone's doit, and that next cycle the game will lock itself into the
fastCast processing loop. Exiting the doit method early prevents the
user from getting a doit, which can lead to unexpected results if there
is an event waiting in the queue.
The Messager now passes messager parameters to Talker, which will use them
ONLY if the message has an audio component. This allows the talker to pass
the parameters along to the DoAudio call. For non-audio talkers, the extra
parameters are ignored.
Note: This does not enable you to use the talker independent of Messager.
Print's font now defaults to the userFont for each item that uses a font.
This prevents having to specify (Print font: userFont) in the game's init
Also removed some debug code from addTitle.
A complete list of resource type defines was added, using a new naming
convention. Resource type defines will now be prefixed with 'RES_' to
differentiate them from other defines. The original list has been left
in for backward compatability, but will be removed shortly.
Various small changes, mostly by Dan Carver.
Largest change (and most significant) is that the syncs are now identified
by standard message parameters instead of message number.
9/2/92 Brian K. Hughes
Modified all the code that sets the scaleSignal to make sure it ORs the
appropriate information into the existing scaleSignal, instead of just
assigning the property to the new value. This insures that any other bits
set in the scaleSignal (like noStepScale) will be preserved.
The doit method of game is now exited if there is a fastCast after the call
to Animate.
This fixes a very obscure bug, in which a call to Messager say:
originated from the doit of a cast member. After the call to Animate, there
will be a fastCast (because the talker created it), yet the game's doit: is
still not done with the current cycle. At the end of the cycle the doit
method of User is called, which polls for a new event. If there is an event
waiting, new processes with new messages may be spawned even though there is
a fastCast waiting.
This fix is obsolete as soon as the new versions of Talker and Messager (no
fastCast!) are checked in.
8/31/92 Brian K. Hughes
Moved the (avoider doit:) code outside the cond in which the (mover doit:)
code resides in Actor. The actor's avoider now gets a shot regardless of
whether or not the actor has a mover.
A new scaleSignal bit, noStepScale, was added. If this bit is on, the actor
will not recalculate its stepSize each doit.
Added the define for noStepScale and the define for the FLAGS module.
The mute method of Sound was changed to allow a single channel to be muted.
In addition, the same code (MidiSend) is now used in a loop to mute all
channels, allowing us to remove the MuteSound procedure from MIDI.S. The
format for the mute method is now:
(sound mute: trueOrFalse [channel])
If 'channel' is not specified, the mute/unmute operation will be applied to
all channels.
8/25/92 Brian K. Hughes
In Messager's sayFormat method, &rest was not being passed to the
FindFormatLen procedure and Format kernel call, thus only the first argument
passed was being formatted into the control string.
8/21/92 Brian K. Hughes
The EventHandler class was checking for (event claimed?) instead of
(evtClone claimed?) as one of the conditions for dropping out of the loop.
Also, made sure to dispose of cloned event before returning.
Made sure blocker has a mover property before trying to access it. This bug
caused PAvoider to PMachine if the object blocking ego was not an Actor or
subclass of Actor.
8/21/92 Brian K. Hughes
Made the handleEvent method actually claim the event instead of just return
a TRUE if the event should be claimed. (Reverse of change made 7/31/92)
8/21/92 Brian K. Hughes
References to currentPalette, an obsolete global, have been removed.
8/20/92 Brian K. Hughes
The iconbar now references the loop used for the current inventory item with
no modifiers. The code used to always add 1 to the loop number because it
assumed a specific order to loops in the inventory view.
The gameTime global variable is now updated inside the iconbar's doit loop.
This ensures that talkers and other real-time objects launched from the
iconbar (or subclass) will set their timings correctly.
A bug was fixed wherein if the iconbar's curInvIcon is 0 the iconbar will
not try to reference its type or message.
8/19/92 Brian K. Hughes
Removed subtitleLang and parseLang properties and setSpeed, checkAni, and
setFeatures methods from Game. Also removed locales list and RoomControls.
Also, the code throughout the module has been straightened up, made more
consistent in form, and comments added or updated.
Made the EventHandler class clone its event before sending it to its
elements. This avoids the problem of one of the elements executing a
((user curEvent?) new:) and wiping out the EventHandler's event.
A reference to egoBlindSpot, an obsolete global, has been removed.
References to currentPalette, an obsolete global, have been removed.
Removed palette property and isExtra method from View, and findPosn method
from Actor. Also removed the call to SetNowSeen in Prop's doit.
Removed obsolete module defines, including: AVOIDER, SORTCOPY, TEXTRA,
Also removed obsolete global variables, including: speed, showStyle, locales,
aniThreshold, sortedFeatures, egoBlindSpot, demoDialogTime, currentPalette,
and theMenuBar.
Also set the default for msgType to be TEXT_MSG.
8/18/92 Brian K. Hughes
Door now uses module pointed to by modNum property instead of DOOR define.
If modNum property is -1 (default), it is set to curRoomNum.
8/17/92 Brian K. Hughes
Replaced setting the title property in Print directly with invocations of
the addTitle method. Doing otherwise will cause an error because Print
assumes that the title property contains a pointer to allocated heap.
The ability to pass message parameters directly to a talker has been
removed. The code was built originally to provide some measure of backward
compatability, which is no longer necessary. The say: method of Narrator
and Talker now takes a single argument, which will be a buffer (for text
messages) and probably an audio number for audio messages.
As above, all code that passed message parameters to a talker was removed.
Also, error messages were made more clear and the findTalker method now
returns the narrator by default, after displaying a warning message.
8/14/92 Brian K. Hughes
The oldIconBarState was not being set in the sayFormat method, as in the say
8/14/92 Brian K. Hughes
Code was added to the hide method to turn off the TRANSLATOR bit in the
helpIconItem's signal. This fixes a bug wherein the helpIconItem was still
active when entering the iconbar if it was not used before exiting the last
time. This only happened if the NOCLICKHELP bit was not set in the iconbar.
8/12/92 Brian K. Hughes
A new procedure, FindFormatLen, was added. Given a control string and its
parameters, FindFormatLen will return the number of bytes that the formatted
string will require (at maximum).
The addTextF method of Print was modified to make use of this procedure.
The addition of this procedure means that it is no longer required to pass
a pre-defined buffer to either Printf or addTextF.
8/12/92 Brian K. Hughes
The sayFormat method was altered to make use of the new FindFormatLen
procedure, instead of repeating the same code.
8/12/92 Brian K. Hughes
Code was added for speech support. First, User checks for the existence of
a speechHandler, and if so lets it handle the event. Otherwise, the event
is processed according to its type and message.
Also, a check for (user canControl) was removed from the cond for direction
events; if user can't control, only ego needs to know. This bug made it
impossible to move the cursor using the keyboard if the user did not have
control, even if it was not a walk cursor.
8/12/92 Brian K. Hughes
The findIcon method only checked as many elements of the IconBar as the
number of parameters you passed. It now checks all elements of the list.
8/12/92 Brian K. Hughes (from Chad Bye)
Obsolete kernel functions were commented out. These include Parse, Said,
SetSynonym, ShowObjs, and StrSplit.
New kernel functions were added, including: AssertPalette, TextColors,
TextFonts, Record, and PlayBack.
8/12/92 Brian K. Hughes
If there are no obstacles in the current room, then the avoider's client's
mover would have no obstacles. This condition was not handled in PAvoider's
doit. The code now creates a list for the mover's obstacles if there is
none and places the new polygon into it. The first doit cycle wherein the
PAvoider's client is > 20 pixels away from the blocker, the list is disposed
to prevent frags.
8/12/92 Brian K. Hughes (from Martin Peters)
The initial value of cycleCnt for cyclers was changed from
(- gameTime cycleSpeed) to gameTime. This forces the cycler to wait for
a time equal to the client's cycleSpeed before cycling the first time.
This bug caused the first cel of an animation loop to be skipped over
very fast.
8/12/92 Brian K. Hughes
A call to the obsolete kernel call SetSynonyms was removed.
8/11/92 Brian K. Hughes
The 3-character QA initials field was changed to an 8-character login name.
This is to facilitate the new bug reporting system from Dynamix.
8/11/92 Brian K. Hughes
The name property had been redefined and set to 0, which caused instances
of the File class to become invisible in the object list. This property
definition was removed, allowing the name to default to the class name.
8/10/92 Brian K. Hughes
Added an addTitle method, which takes the following forms:
(Print addTitle: @buffer)
(Print addTitle: noun verb case sequence module)
8/10/92 Brian K. Hughes
Window title can now be expressed as message parameters, as well as a
literal string. DialogEditor now writes title to SCI file.
8/10/92 Brian K. Hughes
A new class, ScaleTo, has been added to the system. ScaleTo scales its
client from its current size to the specified size over a period of time.
Usage of the ScaleTo class is:
(object setScale: ScaleTo newSize [caller])
8/10/92 Brian K. Hughes
Checks were added to ensure that theIconBar points to an object before
making references to it.
8/10/92 Brian K. Hughes
Code in the doit method that killed the client's mover was removed. This
code was not necessary for StopWalk to work correctly, and in fact made it
impossible to have a StopWalk cycler and Follow/PFollow mover on an actor
at the same time.
8/10/92 Brian K. Hughes
The ability to say a range of sequences has been added to the say method.
The parameter format for the say method is now:
(messager say: noun [verb [case [sequence [caller [module]]]]])
(messager say: noun [verb [case [fromSequence toSequence [caller [module]]]]])
(messager say: NEXT [caller])
A frag caused by not deallocating heap space in sayFormat was fixed.
8/07/92 Brian K. Hughes
The PolygonEditor now handles editing polygons on the altPolyList. They
are read into the editor as normal polygons, but a new property called
srcList will be set to indicate that the polygons come from the altPolyList.
The polygons can be distinguished by different colored lines in the control
screen, but as yet they are the same color on the visual screen. This is
due to the fact that different palettes yield unpredictable colors.
8/07/92 Brian K. Hughes
The init methods of the PChase and PFollow classes was modified to call the
super's with variable parameters, depending on the number of parameters
passed to the init. This allows the re-initing of the mover done at each
node and when step size changes to still use the existing path without
adjustements. The most common manifestation of this bug was the tendency
for the chasing actor to cut through polygons.
8/03/92 Brian K. Hughes
The cueVal property of Narrator was never being reset to 0, causing a talker
that had been cancelled with the right mouse (or ESC) to continue to display
only the first message in a series. The cueVal is now reset to NULL in the
Narrator's dispose.
8/03/92 Brian K. Hughes
A new class, Cue, was created for the purposes of delayed cuing. Global 18,
cuees, may be used as a pointer to a set that contains Cue clones. At the
beginning of each Game doit and IconBar doit cycle, the list is checked and
a doit: message is sent to each of its members. The doit: of Cue simply
cues the cuee, with a register and cuer as arguments.
This system allows Messager to cue its client after the stack has returned.
The problem was that Messager could cue a script, which could call Messager
again, without allowing the original talker to dispose correctly.
7/31/92 Brian K. Hughes
ACTOR.SC (from Dave Artis)
Changes were made to the order and nature of the step size calculations in
Actor's doit: method. These changes help reduce integer overflow problems
and keep the actor from spinning or "getting stuck" at very small sizes.
A temporary variable was added to the handleEvent methods to hold the return
value. Simply returning (event claimed?) is no longer reliable, since the
events used in the IconBar, GameControls, and Inventory are no longer
clones. This new variable ensures a proper return value from the handle-
Event method regardless of the current condition of uEvt.
7/28/92 Brian K. Hughes
If no argument is passed to a feature's facingMe: method, the actor to face
is assumed to be ego. The method will now return TRUE if this is the case
AND ego is not in the cast. This prevents bugs caused by ego trying to face
even though he's not in the cast.
7/27/92 Brian K. Hughes
The new: method of uEvt (in USER.SC) was overridden to simply poll for a new
event record, not actually create a clone. The IconBar class and its sub-
classes were modified to use ((user curEvent?) new:) instead of (Event new:).
This reduces the liklihood of errors caused by the constant creation and
destruction of dynamic events. In addition, (user curEvent?) now always
points to the current event.
7/24/92 Brian K. Hughes
The old RandCycle class from RANDCYC.SC was replaced with the RTRandCycle
class from TALKER.SC. This brings RandCycle up to real-time. In addition,
a new property called "reset" has been added to RandCycle which, if true,
will set the client's cel to 0 upon init and cycleDone. Talkers use this
feature. The parameter list for RandCycle is now:
(prop setCycle: RandCycle timeToCycle [caller [resetOrNot]])
7/24/92 Brian K. Hughes (from Kevin Ray/Oliver Brelsford)
Overrode the facingMe method to always return TRUE. This prevents ego from
turning around when the player clicks on him in an attempt to face himself.
7/23/92 Brian K. Hughes
The Ego class was split out of USER.SC into its own module, EGO.SC. In
addition, the setSpeed of Ego was moved into the Actor class.
7/22/92 Brian K. Hughes
In Game's replay method, the style used to redraw the pic is changed to
PLAIN if it was originally one of the scrolling styles, or if it contained
either HMIRROR or VMIRROR. Since the default style for a room is -1, this
change prevents mirrored pictures from drawing unmirrored and scrolling
pictures from scrolling in from nowhere.
7/21/92 Brian K. Hughes
A change that was forgotten in the work done on 7/08/92. The IconBar now
sets the cursor to ARROW_CURSOR before calling the doit, not normalCursor.
7/20/92 Brian K. Hughes
A new method, sayFormat, was added to Messager. The sayFormat method
takes the following syntax:
(messager sayFormat: talkerDefine @controlString formatParams [caller])
It will format the string into a buffer of the appropriate size, then pass
the string to the talker. The say: method of Narrator was modified to
handle a single argument (a string pointer). Typical uses would be:
(messager sayFormat: GATE_GUARD {How are you, %s?} @egoName self)
(messager sayFormat: SALESMAN {That will be %d dollars for the %s.}
(theItem cost?)
(theItem name?)
Note that the talker define is required, since the messager will not be
getting the message from a message file. The (Message MsgGet) kernel call
will return the talker number.
7/20/92 Brian K. Hughes
Removed the one-cycle delay before disposing; messager used to put
itself on theDoits list, then dispose next cycle. Messager now just
disposes directly, when necessary.
Also code added 4/08/92 (q.v.) to ignore messages whose talkers are -1
will be checked in now.
7/10/92 Brian K. Hughes
In the init method, properties are set only if arguments are passed.
This prevents properties from getting set to the next available garbage
on the stack when the Path is inited with no arguments (such as from
Actor's setStep method).
7/09/92 Brian K. Hughes
The advanceCurIcon method was removed, allowing the IconBar's default
method to be used. The method was over-ridden to allow the user to select
the help icon by cycling through the icons. The removal was done in order
to make the IconBar and its subclasses consistent.
A new global, altPolyList (95), was defined to hold a pointer to a list of
alternate polygons. PolyPath was modified to check this list in addition
to the room's obstacles list. The function of PolyPath is now:
1) Generate an optimized path, using the room's obstacles list
2) Get the next target point in the path
3) Generate an unoptimized path to this point, using the altPolyList
4) If the returned end point is not the same as the point from step 2,
the original path is blocked by an alt poly; therefore, insert
an end-of-path marker ($7777) at this point
5) If not end-of-path, go to step 2
This change allows us to have a second list of polygons without requiring
that they be merged into the room's obstacles list. Alt polys are highly
useful with Doors (see below).
This is a new class. It is based on similar Door classes by Al Lowe and
the Iceman group.
By default, Doors create a alt polygon around them to keep actors from
walking through them. When the door opens, the alt poly is taken off the
altPolyList, allowing free passage. When the door closes, it puts its alt
poly back on the altPolyList. This has two major advantages:
1) There is no way an actor can be "chicken-walked" around a door's
control color block by being repositioned inside the room's poly
2) Since control color blocks are eliminated, room's polygons can be made
much closer to diagonally positioned doors
Door doco is forthcoming.
Code was added to hide the cursor (set to INVIS_CURSOR) when a talker comes
up, but only if the player has no mouse. This prevents the wait cursor (or
similarly-large cursor-like object) from hiding the text.
Also, the time that a talker's mouth moves was lengthened by 33%.
7/08/92 Brian K. Hughes
The code in the replay method of Game that sets the cursor was expanded to
allow for a handsOff condition. This ensures that the wait cursor will be
displayed if restoring a game that was saved during handsOff.
Code was added to the save & restore methods of Game that will check for to
see if the current save directory is valid, and if not ask for a new path.
The code will loop until a valid path is entered.
In the handleEvent method, if we determine we will not approach the feature,
we now call facingMe before calling the changeState method of CueObj. This
allows ego to face the object before we invoke the doVerb.
The facingMe method now skips the actual facing code (in the notFacing
method) if the sightAngle is equal to the feature default ($6789).
Removed obsolete references to helpStr, replacing them with the equivelant
checks using helpVerb. Also, used Print with a set width and font instead
of the previous Format/Prints usage.
Upon exiting the iconbar code, the cursor is now set to the waitCursor if
the player does not have input and control.
When checking for a keyDown in the dispatchEvent method, the code was still
using the old (icon select:) methodology instead of the new
(if (icon select:) (icon doit:)) methodology.
The Print statement that displays the help message was made better looking.
Optimized use of event's properties by using temp variables.
Reformatted the Print displays so that they are better spaced.
Added an optional fourth parameter to the GetInput procedure that specifies
a font other than the default SYSFONT.
SAVE.SC (changes by Gary Kamigawachi)
All text now resides in the message file. Dialogs pull messages for text,
button text, titles, etc.
Oddly enough, when the client begins to walk and is using a single view for
both walking and stop loops, there was no code to set his loop correctly for
walking. It was left up to the setHeading/setDirection code to handle this,
which caused occasional "pirouetting".
Checks were added to ensure that the player has control (user canControl:)
before processing direction events, and that the player has input (user
canInput:) before processing keyDown and mouseDown events. These checks
had gotten deleted erroneously during the first revision of User.
7/08/92 Brian K. Hughes
The enum PALVARYNEWTIME was added to the PalVary entry.
7/02/92 Brian K. Hughes
Fixed a bug in the match code of Prop setScale. The new (clone) scaler
was being improperly created, resulting in various errors.
Also, moved code that set the actors step sizes (Actor doit:) to before
the mover's re-init. This ensures that the InitBresen code will have
the proper step size values to work with. The mover is now only re-inited
if it decends from MoveTo or PolyPath.
6/05/92 Brian K. Hughes
Adjusted positions of yes/no buttons in the dialog for confirming the
deletion of a save game.
6/04/92 Brian K. Hughes
Escape key now produces a -1, not 0. Changed the code in SRDialog to
look for the right return value.
6/04/92 Brian K. Hughes
Added Mark Hood's fix for addToObstaclesCode for addToPics. A logic error
caused addToPics to never create polygons around themselves.
Moved buttons in error dialogs down so it doesn't appear over the text.
In class Region method dispose, there is code to check for a timer
attached to the region and dispose of it. Since Timer dispose: doesn't
remove it from the timers list, the timer's delete: method is now
called as well.
5/28/92 Brian K. Hughes
Added new kernel call ResCheck, which will allow the programmer to
verify the existence of a resource without loading it.
Added a fifth function to PalVary, PALVARYTARGET, which allows the
programmer to insert a custom color into the target palette. More doco
is forthcoming in the systems group report.
5/28/92 Brian K. Hughes
Conditioned whether pMouse gets dirStop events by whether the event
type is a keyDown. This fixed a bug wherein the joystick never produced
dirStop events, making it impossible to stop the cursor with the joystick.
5/28/92 Brian K. Hughes
In the noClickHelp method, the temporary event was not being disposed if
the noClickHelp was terminated by clicking on the help icon again. If it
was terminated in any other way, the dispatchEvent method will dispose the
event, as before.
5/11/92 Brian K. Hughes
isMemberOf now returns TRUE if the object in question is an instance
of or the actual class being compared. This fixed the bug in IconBar
wherein IconBar was mysteriously not a member of IconBar.
5/11/92 Brian K. Hughes
Prints with no active items will now return FALSE if the ESCAPE key was
pressed and TRUE if the ENTER key was pressed.
5/09/92 Brian K. Hughes
Made sure the current directory shows up in the edit box when asking
for a new save game directory. This got deleted in the conversion to
the new Print object.
5/06/92 Brian K. Hughes
Removed the kludge for testing whether or not to localize the event in
the noClickHelp method (q.v. 2/26/92). The isMemberOf method of Object
is functioning normally now (see below) so the kludge is not necessary.
5/06/92 Brian K. Hughes
Changed the isMemberOf method of class Object to also return TRUE if
the object tested is equal to the class tested against. For example,
(IconBar isMemberOf: IconBar) will return TRUE.
4/30/92 Brian K. Hughes
Added a (super doit:) in StopWalk doit so that an actor who is stopped
and has a separate stopped view will still cycle. If you don't want
the actor to cycle, you can reduce each of the stopped loops to one cel.
Having an entire stopped loop of cels can be useful in situations such
as ego standing holding a moving animal.
4/30/92 Brian K. Hughes
Added two properties, panelObj and panelSelector, to class Game. Also
added some code in the doit method of Game that checks the panelObj
property and, if set, sends a 'panelSelector' message to panelObj. This
change allows a major heap-saving feature, which is that the control
panel can now be contained in an external module, called in when it is
used, and unloaded from memory BEFORE the user's action takes place.
For example, in Laura Bow II the control panel requires about 1300 bytes
of heap. If the save button is pressed, the panelObj and panelSelector
properties of Game are set to theGame and #save, respectively, and the
control panel is unloaded from memory, regaining the 1300 bytes. At the
beginning of the next doit, the panelObj and panelSelector properties are
evaluated and the save dialog is brought up, which requires about 1600
bytes of heap. The result is that saving the game requires only 1600
bytes maximum instead of 2900 bytes.
The game's panelObj and panelSelector properties are now set in the
ControlIcon's doit method.
4/30/92 Brian K. Hughes
Fixed bug in addIcon whereby parameters were being used even if no values
were passed.
4/30/92 Brian K. Hughes
The step size calculations in Actor's doit method for scaling actors has
been readjusted. The old calculation rounded off, while the new calculation
rounds to the nearest integer. This creates a much more realistic look for
a scaling actor.
4/23/92 Brian K. Hughes
Changed default modNum in Feature and Region from 0 to -1 to allow use
of message file number 0 as an object's default.
4/19/92 Brian K. Hughes
Made sure to turn off the viewAdded bit of an addToPic's signal when it
is deleted from the addToPics list. This way, if the view is still in
memory when it is used again, it won't automatically assume it is intended
to be an addToPic again.
Added a parameter to Actor's setStep method, leaveOriginal. If a TRUE value
is passed in this parameter, the origStep property of Actor will NOT be
updated to the new xStep and yStep values. So far, this is used only in
Actor's doit method for scaling.
4/16/92 Brian K. Hughes
Removed references to PicView.
4/16/92 Brian K. Hughes
Since talkers' Prints are modeless, we can't dispose of the window clone
created in the talker's display method immediately after the Print.
Instead, the Print's cue method (which gets invoked from its dialog's
dispose) gets rid of any windows that are connected to Print.
4/15/92 Brian K. Hughes (from Bob Fischbach/Hugh Diedrichs)
Removed code that checked for a non-zero fifth parameter to Messager
say (the module number), and just checked for a fifth parameter. This
allows you to send 0 as a legal module number.
4/14/92 Brian K. Hughes
Changed the select method of ControlItem to a doit, which gets called
from the dispatchEvent method of IconBar (or subclass thereof). This
allows the select to determine actions to be taken, then the actions
to actually happen near the end of the dispatchEvent method, allowing
the IconBar (or subclass) to be disposed first. For example, the save
icon in the control panel will now allow the control panel to be disposed
before the save code is brought in, reducing the amount of heap required
to nearly 1/2.
4/13/92 Brian K. Hughes
Made sure to set the port back after a modal print.
4/11/92 Brian K. Hughes
Reset the window property back to 0 when disposing. This prevents the
Print class from trying to pass it along to the dialog again next time.
4/11/92 Brian K. Hughes
Removed the restriction that colors wouldn't be set for custom windows.
The only danger in this is that completely custom windows (those that
draw their own background rectangles) won't change color automatically
to match the text background.
4/09/92 Brian K. Hughes
Added a method, initialize, which performs the appropriate feature
initializer code. The init method now invokes this method before dealing
with adding the feature to the cast or features list. This way, a view
may have the appropriate feature initializer code done without having to
call the init and add it to a list (useful for views that will become
addToPics, see below).
Removed PicView class. The view class now assumes all functionality of
the PicView class. Views may be added to the pic with the addToPic method
(as before), but now the view itself is put onto the addToPics list, not
the features list (see below).
To make a view add itself to the pic automatically upon init, set the
"viewAdded" bit in the view's signal, or invoke the addToPic method
instead of the init.
Added the addToPics list to those considered by OnMeAndLowY during the
sorted features process.
The members of the addToPics list now get deleted on a room change, as
well as disposed.
4/08/92 Brian K. Hughes
Check the message size to see if the message is actually in the message
file, and if not don't try to allocate heap. This prevents a "zero
heap allocation request" error.
4/08/92 Brian K. Hughes
Messager now ignores a message if the return value from the findTalker
method is -1. This value can be used to indicate a talker that is used
purely for comments in the message file, talkers that perform some other
action besides displaying a message, et al.
4/08/92 Brian K. Hughes (from Dave Artis/Oliver Brelsford)
Reorganized calculations in init and doit to optimize for speed, while
still attempting to retain some of the efficiency. The doit method
was modified to make sure the calculations were done even if ego is
out of range. Also, the doit is invoked from the init so that the
correct parameters are set initially.
4/08/92 Brian K. Hughes
Solidified parameters passed to View and Prop's setScale method and
added new functionality. The possible forms of setScale are:
setScale: (no args) - sets scaleSignal to scalable only
setScale: 0 - turns off all scaling
setScale: n - sets auto-scaling based on vanishingY
and ego's size of 100% at y = 'n'
setScale: obj - sets scaler object (with optional params)
setScale: MATCH obj - matches scaling of 'obj'
4/06/92 Brian K. Hughes
Replaced define RFEATURE with GCONTROL (978). RFeature and RPicView
classes are obsolete. GameControls has been split out of SLIDICON and
put into GCONTROL.
Also, the define NEXT (used with messager) was changed from 0 to -1 so
it would not conflict with ALL.
4/06/92 Brian K. Hughes
In noClickHelp, if the item under the mouse does not have a helpVerb,
it will not try to print a help string.
4/05/92 Brian K. Hughes (from Hugh Diedrichs)
Set the event's message to (| userEvent helpEvent) in IconBar's doit.
This allows the normal help to work correctly, as well as the no-click
4/05/92 Brian K. Hughes (from Hugh Diedrichs)
Used the kernel call DrawPic when erasing lines at the end of the session
instead of the room's drawPic method, and added code to redraw overlays
and addToPics.
4/03/92 Brian K. Hughes
Move the invocation of (scaler doit:) in Actor's doit method to after
the invocation of (mover doit:). This prevents ego from "jumping" or
vibrating when he walks and scales.
4/03/92 Brian K. Hughes
Adjusted the positions of the YES and NO buttons on the save game delete
confirmation Print.
4/02/92 Brian K. Hughes
Added color & back properties to Narrator. These properties are used
with a clone of the game's systemWindow for displaying talker messages.
Note that custom windows (those of type $80) will NOT display the talker's
4/02/92 Brian K. Hughes
The while loop in the doit method now checks that the state is IB_ACTIVE
first, before generating an event. This ensures that, should the state
be changed during the process which forces us out of the while loop, we
don't get a dynamic event hanging around.
4/01/92 Brian K. Hughes
Altered the addText and addButton methods to make use of the new MsgSize
kernel call (see below). This eliminates the need for the 1000-byte
temporary buffers allocated off heap.
4/01/92 Mark Wilden
Added Message MsgSize function. It is used like this:
(= msgSize (Message MsgSize module noun verb case sequence))
and returns the size of the buffer needed to hold the message including
the trailing null. Therefore, a blank message will return 1. If the
message is not found, the function returns 0. Stage directions, which
are normally stripped out when a message is retrieved, are included in
the length.
4/01/92 Brian K. Hughes
The set60ths method has been changed to setTicks and the real-time
calculation in this method has been changed to the correct algorithm.
In addition, the parameters for this method have been reversed to make
them more intuitive. The format is:
(myTimer setTicks: tickValue who2Cue)
The ticks will now compensate for tickOffset, set when restoring a game.
3/31/92 Brian K. Hughes
In the showSelf method of Print, made the dialog center itself un-
conditionally. Then set the x and/or y according to the x and y properties
of Print. This insures that if you pass -1 for either coordinate, that
coordinate will remain the value produced by centering the window.
3/30/92 Brian K. Hughes (from Robert Lindsley)
If a dialog had the time property set, the check method was disposing
of the dialog but not breaking out of the while loop in the doit method.
Check method now just returns TRUE if the dialog is out of time, and
lets Print dispose of the dialog normally.
3/30/92 Brian K. Hughes
Made sure to reset the scaler property to 0 in Prop's setScale method,
in case we replace a scaler object with simply y-coordinate scaling.
3/27/92 Brian K. Hughes
The setStep method was not setting the xStep and yStep properties if
the actor wasn't scaling. If the actor is scaling, the setStep method
only sets the origStep property (a packed word: $xxyy), but doesn't set
the xStep and yStep because actor's doit does that for us (if scaling).
3/27/92 Brian K. Hughes
Made sure to dispose of a Prop's scaler in the setScale method, even if
we're not attaching a new one. Also, set scaler property to 0 when
disposing the scaler in Prop's delete.
3/27/92 Brian K. Hughes
Changed the setScale method of Prop to clone the scaler class passed
and pass the rest of the parameters to the scaler's init method. This
was patterned after the setMotion method.
3/26/92 Brian K. Hughes
Changed the vanishingY property of class Game from -30000 to 0, which
works better for scaling.
3/25/92 Brian K. Hughes (from Randy Mac Neill)
Code was added to the advanceCurIcon method of Inventory to set the
curIcon's signal to TRANSLATOR or (~ TRANSLATOR), as required by whether
the curIcon is the helpIconItem or not.
3/25/92 Brian K. Hughes
The cond in the noClickHelp of IconBar was replaced with code that
unconditionally disposes a modeless dialog (if any), then displays the
new help string. This fixed several bugs with displaying the help.
3/25/92 Brian K. Hughes
Added a clause to the cond in Inventory's doit method that checks the
fastCast and passes the event to the list if it exists. This way, talkers
that display messages as a result of actions taken on an inventory item
will get events instead of the normal Inventory doit (which highlights
items & such).
3/25/92 Brian K. Hughes
Added code in Prop's delete method to dispose of the scaler object (if
any) attached to the Prop (or Actor...).
3/19/92 Brian K. Hughes
The addButton: method was altered to allow the font to be passed to
the new button.
3/17/92 Brian K. Hughes
The showSelf: method of Print has been changed to use the window property
of Print for the dialog window. If the window property is NULL, the
systemWindow global will be used.
3/16/92 Brian K. Hughes
Added an error message in the setScale method of Prop in case the Y
value passed is less than the curRoom's vanishingY. This caused problems
because of the resulting negative numbers.
In the setStep method of Actor the actor's mover is re-inited if it is a
member of Motion now, not MoveTo. Since a class is not a member of itself,
this bug caused MoveTos attached to a scaling actor never to be re-inited.
3/16/92 Brian K. Hughes
Added (self doit:) to the init method. This makes certain that the StopWalk
gets a chance to change the actor's view/loop before the actor animates
once. This bug was noticable in the way actors would be initially drawn
in mid-stride, then change to a standing view one cycle afterwards.
3/13/92 Brian K. Hughes
Changed the approachVerbs method to reset the _approachVerbs property to
0 if either no args are passed or the first arg is NULL.
3/11/92 Brian K. Hughes
Had to save the caller into a temp and do the (super dispose:) before cueing
the caller. This prevents starting another Conversation process before the
super disposes.
3/10/92 Brian K. Hughes
Added an optional parameter to the dispose method of DText and DButton. If
TRUE, it will be assumed that the text property is a pointer to a near
string, and not a memory pointer to allocated heap.
3/10/92 Brian K. Hughes
Dialogs were converted to use Print.
3/09/92 Brian K. Hughes
Made sure to reset x & y to -1 and modeless to FALSE.
3/09/92 Brian K. Hughes
Made sure that the setStep method allows for -1 in either parameter, which
keeps the original value.
3/07/92 Brian K. Hughes
Added Print to the prints list only if it is modal. Modeless prints do
not want to go on the list because the list gets first shot at events, and
modeless dialogs are usually handled by other objects who should get the
events instead.
3/07/92 Brian K. Hughes
Made sure all Prints done from Talker & Narrator's display methods are
modeless. This insures that events will get passed to the talker through
either the fastCast (if talker is not modeless) or the mouse/keyDownHandler
(if the talker is modeless).
3/05/92 Brian K. Hughes
Adjusted all the print buttons & such to be more pleasing to the eye.
3/04/92 Brian K. Hughes
Fixed Prints and Printf procedures to not use a clone of Print. Sending
a message to (Print new:) was invalidating &rest.
Made first property of Print able to contain an object ID or an object
number ('n'th item in the dialog).
Reset the mode, font, width, caller, title, first, and saveCursor properties
in the dispose method so that they have the right values next time.
Added saveCursor property - if set TRUE, Print will change cursor to an
arrow cursor then restore it to the iconbar's current icon's cursor.
Set the width property to 0 to default. This fixes the bug with TextSize
not recognizing newlines & such.
3/03/92 Brian K. Hughes
Removed the 'vm' designation from all scaling defines. Also renamed the
'vm_signal' of actor to 'scaleSignal'.
3/03/92 Brian K. Hughes
Changed Print procedure to Prints (print string) and added simple Printf
procedure, both of which use Print. Renamed PrintObj to Print (including
module & define). As things stand now:
PrintObj -> Print = New class
Print -> Prints = Procedure to display near strings
Printf -> Printf = Procedure to format & display near strings
3/03/92 Brian K. Hughes
Doit method now calls doit method of each dialog item (for cycling icons &
such). Also, renamed format method to addTextF. Method now adds text auto-
matically after formatting.
3/03/92 Brian K. Hughes (from Randy MacNeill)
Added a dispose after printing the error message if the talker can't be
found in findTalker. This allows the messager to be disposed cleanly and
won't leave it's Set hanging around.
3/03/92 Brian K. Hughes
Was referencing a parameter not declared in the parameter list in Talker's
display method.
3/03/92 Brian K. Hughes (from Kevin Ray)
Had to reanimate the cast in the hideCast method so that their new z values
will be applied.
3/03/92 Brian K. Hughes
Changed GetInput to use PrintObj.
3/03/92 Brian K. Hughes
Made sure that x and y parameters were set to 0 if not passed to addEdit.
3/02/92 Brian K. Hughes
Changed origXStep and origYStep to just origStep, which is packed. The
setStep method will pack the property with the values passed, and the doit
method will unpack them for the scaling computations. Also changed the
setScale method of Prop to take four additional parameters: frontSize,
backSize, frontY, and backY. Now a scaler can be set with:
(theActor setScale: Scaler frontSize backSize frontY backY)
The setScale method will attach a clone of the scaler object specified to
the scaler property of actor.
3/02/92 Brian K. Hughes
[ Multiple Files ]
Converted use of Print, PrintD, Printf to PrintObj.
2/27/92 Brian K. Hughes
Changed default view property in class View to -1. This way, if the
programmer forgets to set the view he or she will receive an error
"View 65535 not found" instead of trying to load view 0. CD guys say this
will solve lots of interruptions due to resource loading.
2/27/92 Brian K. Hughes
Did away with the newCursor temp var in the handleEvent method and just set
the cursor to the curIcon's cursor, regardless of whether it or the
curInvItem has changed. This way, if the cursor property of the curIcon is
changed, it will be reflected immediately.
2/27/92 Brian K. Hughes
1) Fixed bug in turning off the scaling (in setScale method). Changed
OR-ing signal with (~ vmAutoScale) to AND-ing.
2) Moved the (mover doit:) code in actor's doit method to above the scaling
code. Doing the scaling first sometimes caused PMachine errors.
3) Added origXStep and origYStep properties so that the scaling always has a
good set from which to calculate the new values.
4) The setScale method no longer takes a multiplier to be applied to the
maxScale property. The argument now represents the y coordinate at which
the view is 100% of its normal size. The maxScale is now calculated,
based on a ratio of this y coordinate to the vanishingY of the room.
5) Changed the minimum xStep that can be calculated (in the setStep method)
from 2 to 1.
2/27/92 Brian K. Hughes
Bug in MessageObj showSelf. If the sequence of a MessageObj is 0
(indicating that we want all sequences) the Message kernel call should look
for sequence 1 for purposes of determining if the messages exist or not.
2/27/92 Brian K. Hughes
Changed the name of the polygons file from polygons.999 to 999.pol (where
'999' represents the picture number).
2/26/92 Brian K. Hughes
Replaced all references to the helpStr property of invItems with code to get
the message from a message file.
2/26/92 Brian K. Hughes
1) Had to save the cursor and signal of the current icon item before calling
the item's select method cuz during the select process the item might be
disposed. For example, the save button in game controls disposes of the
game controls list in it's select method. After that, the save icon is
disposed out of memory, so the iconbar's dispatchEvent method can't
reference it anymore.
2) Added noun, modNum, and helpVerb properties to IconItem and changed the
noClickHelp method to get messages from a message file instead of
printing a help string. The helpStr property has been removed.
3) Fixed bug at top of while loop in the noClickHelp method. It appears
that a class is NOT a member of itself. Hence, IconBar was NOT a member
of IconBar, which caused the event to be localized. This resulted in
A) the event not registering as on an icon if it was within the top 10
pixels on the screen, and B) the text box would flash quickly if the
event was within 10 pixels below the bottom of the icon.
2/26/92 Brian K. Hughes
Added (= window 0) to the hide method of GameControls. In case a control
item hides the game controls, this will ensure that the window does not try
to dispose again when the game controls are hidden later in the doit method.
2/26/92 Brian K. Hughes
Instead of reanimating the oldCast in the drawInset method, we reanimate the
oldCast in the doit method every cycle, unless hideTheCast is TRUE. Slows
insets a bit but it's the only way to insure that the images of the old cast
don't get wiped out by text boxes & such.
2/26/92 Brian K. Hughes (from Jack Magn‚)
The MergeAPoly procedure has been replaced by a MergePoly kernel call.
2/25/92 Brian K. Hughes
Moved the super dispose in Talker to below the call to hide. This ensures
that the talker is fully hidden before the caller gets cued, preventing the
"overlapping" of talkers and confusion of underbits.
2/25/92 Brian K. Hughes
Commented the code that uses the selector dialog item to pick approach
verbs. Since selector items can't read from a file and VERBS.SH is game-
specific, the selector can't adjust itself from game to game.
When DSelector (or a similar class) can read from a text file, this code
will be reinstated.
2/25/92 Brian K. Hughes
In the handleEvent method, if the event is a direction event be sure to
check if there IS an iconbar before sending messages to it.
2/25/92 Brian K. Hughes
Removed code that disposed of the temp variable 'event' at the end of the
doit method. The dispatchEvent method already disposes of it and clones
that were created in the process of the doit method may end up at the same
2/24/92 Brian K. Hughes
Removed code that saved the old value of useSortedFeatures (can't think why
it was put in and it caused a bug!) and re-animated the old cast when an
inset gets drawn initially. Since insets normally invalidate the picture
we don't want to accidentally obliterate any old cast members on the screen
unless the programmer has indicated to do so by settting hideTheCast TRUE.
2/24/92 Brian K. Hughes
Made sure to check user controls before passing a walk event to ego
(original functionality that was accidentally removed).
2/24/92 Brian K. Hughes
Removed explicit Load of CURSOR in save & restore methods. Can't load
cursor resources anymore with the new color cursors.
2/24/92 Brian K. Hughes
Added a showTitle property (boolean) which, if TRUE, will cause the object's
name to be displayed in a title box.
2/18/92 Brian K. Hughes
The oldIconBarState property was getting set even if we were invoked without
being previously disposed. This meant that the oldIconBarState could be set
to a DISABLED state if the previous message was interrupted by a new
message. To prevent this the oldIconBarState is set only if it is 0.
2/15/92 Brian K. Hughes
Updated code using the verbs. Also added code to support approach distance
and a few other options, such as letting the approachX and approachY default
to the x and y of the object, etc.
2/14/92 Brian K. Hughes
Made sure the fastCast gets disposed of properly if the conversation is
killed (pressed ESC or right-mouse) or if we were displaying one message of
a sequence only.
2/14/92 Brian K. Hughes
Fixed bug wherein the talker's mouth would keep cycling if you click away
the message sooner than the talker expected. If the talker isn't the one
talking (ticks are -1) then the handleEvent returns FALSE so the next talker
gets a shot at the event. Also, check to see if the event is claimed (by
previous member of fastCast list), instead of passing the event to the
2/13/92 Brian K. Hughes
Fixed bug in call to Message in InvItem's doVerb method. Call was passing
NULL for sequence instead of 1. (Note that messager will allow a NULL
sequence but not the Message kernel call.)
2/13/92 Brian K. Hughes
Made Blink run on real time (it was cycle-based before, which didn't work
well) and added a property to Talker called blinkSpeed, which is the number
of ticks that will be used as the basis for the Blink cycler. The actual
delay between blinks is a random range from (.5 * blinkSpeed) to
(1.5 * blinkSpeed).
2/12/92 Brian K. Hughes
Class Collection now has a new method, called isDuplicate, which determines
if an object is already in the list. Each of the add methods (add,
addToFront, addToEnd, addAfter) invokes this method and only performs the
add if the method returns NULL. For Collection and List, this method simply
returns FALSE, since we always want to add, but for class Set, this method
returns FALSE only if the set does not already contain the object. Hence,
class Set now functions correctly for all the add methods.
2/12/92 Brian K. Hughes
Made sure each member of the talkerList gets its caller set to 0 before
being disposed, then dispose with TRUE rather than the talker's
disposeWhenDone property. Also, made sure we weren't sending bogus
parameters to the talker's say method from the sayNext method. If the
sayNext is invoked from our cue method (at the end of a message), we have
no parameters to pass.
2/12/92 Brian K. Hughes
A line of code that was added to IconBar's handleEvent that returned FALSE
if user can't control, was removed again. This was done originally to
prevent the ability to middle-click (swap icon) if user can't control. That
check has been moved into the code for the middle click.
2/10/92 Brian K. Hughes
Checked to see if, when the client is within distance and waiting, the angle
has changed before trying to set a new angle. This prevents constantly
setting the client's heading and invoking the looper every cycle, even if
the client is just standing there.
2/10/92 Brian K. Hughes
Added a style property which determines how the picture will be drawn (if
a picture is used).
2/10/92 Brian K. Hughes
Made ESC return 0 from a dialog with no active items, and any other key
returns TRUE. That way we can tell (if we want to) whether the ESC was
2/10/92 Brian K. Hughes
Removed text and put into message files (where applicable) and converted
some far text used in Format statements to near text.
2/07/92 Brian K. Hughes
Several changes:
1) Added a true Blink class for the eyes
2) Gave the fastCast a name so it can be inspected easily in the debugger
3) Narrator's startText method now returns the length of the string
(useful for Talker's startText method)
4) Set a talker's ticks property to -1 if he is done talking, but did not
pull them from the fastCast or theDoits list. This way they still
cycle the eyes even when they're not talking.
5) Made sure the mouth and eyes get set back to cel 0 in the dispose
2/06/92 Brian K. Hughes
Added global textSpeed (94) which talkers will use to determine the length
of time their text should remain on screen. Has no function in CD audio.
Note: This global can easily be set by a text speed slider.
2/06/92 Brian K. Hughes
New class. Scales its client according to a pair of y values and a pair of
percentage multipliers for those y values.
2/06/92 Brian K. Hughes
Changed SetCursor kernel calls to invocations of theGame's setCursor. Also
set the cursor to ARROW_CURSOR explicitly.
2/06/92 Brian K. Hughes
Was setting a temp variable, theVerb, in the approachVerbs method of class
Feature which was unnecessary.
2/04/92 Brian K. Hughes
Added method setSpeed to ego, which sets ego's moveSpeed & cycleSpeed.
2/04/92 Brian K. Hughes
Move second setCursor call in Game's play method out of the complex message.
The system global normalCursor was getting evaluated before the message
began, making it impossible to initialize it to a value other than
ARROW_CURSOR in the game's init method. This explains why games would get
an arrow cursor as soon as the player gets control.
Removed egoMoveSpeed property of class Game.
2/04/92 Brian K. Hughes
Disposing our Set full of talkers on first doit following the end of the
last message, not the second doit.
2/04/92 Brian K. Hughes
On recommendation of myself and Mark Hood, backward compatibility is not
being preserved. To that effect, the lookStr and description properties
have been removed from class Feature. In addition, all references to the
invItem parameter of the doVerb method have been removed. Also, the invItem
property of CueObj has been removed.
2/04/92 Brian K. Hughes
The approachVerbs method only functions now if there is approachCode AND at
least one argument.
2/04/92 Brian K. Hughes
Made sure the walkHandler is handled correctly.
2/04/92 Brian K. Hughes
Print now returns 0 if cleared with the ESC key.
2/03/92 Brian K. Hughes
The modNum property of class Region is now set to the current room if 0.
2/03/92 Brian K. Hughes
Added a setScale method to View class. If FALSE is passed the scaling is
disabled for that object. If a positive value is passed it is used as the
multiplier for the maxScale property. Also added a setScale method to Prop
class that will take a scaler object as a parameter.
7/12/91 Chad Bye
Palette cycling now supports multiple ranges and multiple speeds.
The third argument is now how many system ticks to wait between
each palette shift. The sign of the third argument still indicates
which direction to cycle. You can (and should) pass all ranges in a
single call to Palette.
(Palette PALCycle start1 end1 numticks1 start2 end2 numticks2 ...)
7/11/91 Mark Wilden
There is a new resource type for messages. Messages are the analog
in non-CD games of the CD resources, sync and audio. You will need
a messages= line in your WHERE file to find them. You'll use the
ME program to create them. You'll use a new kernel call
(GetMessage moduleNum talkerNum msgNum @buffer)
to access them.
7/10/91 Chad Bye
Added picture mirroring as another option for DrawPic's showStyle.
Options such as mirroring or blackout should be ORed with the
(curRoom drawPic: pic (| IRISIN HMIRROR BLACKOUT))
You can also now save the current palette and restore it later.
The kernel call Palette now has functions PALSave and PALRestore.
(= savePalette (Palette PALSave))
(Palette PALRestore savePalette)
PALSave allocates memory to copy the palette into, and PALRestore
disposes this memory. Every time a palette is saved, it must
either be restored later or disposed using
(Memory MDisposePtr savePalette).
6/13/91 Pablo Ghenis
Subj: Hunk reporting and requirements
Configuration files are now case-insensitive.
All configuration files (where, resource.cfg, etc.) must now
include a line of the form:
minHunk = nk
where n is a number between 1 and 1024. This specifies the
minimum amount of hunk (in kilobytes) required to run the game.
If your minHunk number is too large you will get a "not enough
memory" warning, if it is too small then any machine will appear
to have enough, and some will crash "out of hunk".
To help you determine the correct minHunk, there is a new SCI
command line switch "U", which by default will create or append
to a file called hunk.use to report hunk usage throughout the
game as you play it. The report will include ONLY rooms where
hunk usage EXCEEDS the specified minHunk value, so if this never
happens then nothing will be reported. This is required for all
shipping versions (otherwise they might crash on a machine that
barely meets the minHunk requirement.) If you want the report to
go to a different file you can specify a file name immediately
after the "U", eclosed in double quotes. The "u" switch has been
enhanced to work the same way. This option is especially useful
when running on read-only media such as CD.
G:> scidh -dvu"c:\myres.use"U"c:\myhunk.use" c:\mywhere
The recommended procedure is to start with minHunk = 1k and play
the game, going straight to the rooms that use the most hunk,
then exit. Near the bottom of hunk.use look for the last line
that ends in "NEW MAX!", it contains a better value for minHunk.
Replace minHunk in your configuration file with this value,
delete hunk.use to get a fresh start and run again, until you end
up with no hunk.use file after running the game.
6/5/91 Eric Hart
No one should be using the playBed or changeState methods of
Sound any longer. The information needed for 'playBed:' is
now contained in the sound files, so simply 'play:' will
suffice for every sound. changeState: is no longer needed,
because there are three new methods to change the state of
a sound object:
setVol: newvol
setPri: newpri
setLoop: newloop
No one should be setting the volume, priority, or loop
properties directly any longer, but rather you should go
through these methods. (thus, there is no need to call a
changeState method after you modify these properties)
Another big change is the addition of priority information
to sound files. Sounds will now automatically set their
own priorities, so no application should be setting them
manually. In the rare cases that this default must be changed,
priority may be overrided by programmers using the setPri:
method. This will lock the sound object to the specified
priority, regardless of the settings in the sound files, until
the fixed priority is released by saying (sound setPri: -1).
In a case where the sound file contains no priority information,
the current value of the priority property will be used to
play the sound regardless whether the priority is fixed or not.
Sounds may also now be muted using the mute: method which
takes a true or false value. Mute: acts just like pause:,
however the sound will continue to be parsed inaudibly until
the sound is unmuted by a (sound mute: FALSE). So unlike
pause, the sound will continue where it should be, not where
it left off.
Also a new controller define has been added to,
cMUTE. This provides for muting individual channels of a
sound. We used to simply set the volume of channels that
we didn't want to play to 0 by using code like:
(sound send: 3 cVOLUME 0)
But now we may mute them by using:
(sound send: 3 cMUTE TRUE) (or false to unMute)
The advantage of this over using the cVOLUME way is that
the musician may change the volume mix of his sound without
the application programmer having to change code, and the
channels and voices used by the channel being muted will be
freed up for other simultaneous sounds to use.
Existing code which uses the playBed and changeState methods,
and that manually sets priority will still work for now, but
after the products ship that need this compatibility (like
KQ5 cd and Jones cd), these methods will be removed.
More detailed information on these new methods may be found
in the comments in on s:
3/27/91 Mark Wilden
Backquote key brings up debug, in addition to the regular
New diagnostic resource cursors, selected by -cXX command line
option, where XX represents the type of cursor.
This is a decimal bitmapped number where the bits are as follows:
Bit 0: Change cursor to disk on disk reads
Bit 1: Move cursor to left on disk reads
Bit 2: Change cursor to chip icon on ARM read/writes
Bit 4: Move cursor up/down on ARM read/writes
If you don't specify a -c command line option, there is no cursor
diagnostics (thus not interfering with the game's cursor). If
you specify -c with no number following, the cursor will be as it
was formerly (under -d): changing based on disk and ARM access.
3/27/91 Mark Wilden
FileSelector added readFiles: method, which must be called separately
from init: (which is called at every arrow key!). Added sort property
which, if true, sorts the list.
12/06/90 Mark Hood & Mark Wilden
VIEW.999 is displayed at startup, if it exists.
11/30/90 Mark Wilden
DrawStatus can now take two optional arguments: foreground and background
color, which default to the usual black on white. Note that these colors
are indexes into the palette, so vRED is unlikely to be actually red (it
will select the 4th element of the current palette).
10/23/90 Mark Wilden
FileSet was changed to FileSelector. FileSet used to create an array
of file names for use in a DSelector. This function is now integrated
into a selector. The file was renamed from FILESET.SC to
10/11/90 Mark H.
A new function selector has been added to MemoryInfo.
it is TotalHunk and returns the maximum hunk space that was allocated
by sci at startup on a particular machine and configuration. This is to
give application programmers the ability to write conditional code based on
the size of a certain machine (memory). It is called as: (for example)
(Printf "Total Hunk = %d" (MemoryInfo TotalHunk))
and returns the toal hunk in paragraphs. (1 paragraph = 16 bytes).
10/10/90 Mark H.
The MoveCycle class now respects client cycleSpeed.
10/09/90 Mark H.
The class PCycle has been added to the system to do palette cycling of
Props. It tries to take the place of having many different palette
cyclers by watching the parameter list. If one number is passed it
acts like a CycleTo cycling from the current palette to the passed palette:
(aProp setCycle:PCycle 5) cycles from current palette to palette 5.
If two numbers are passed it cycles through the range specified
in the proper direction (i.e. first number to second):
(aProp setCycle:PCycle 5 2) cycles from palette 5 to palette 2
If three numbers are passed it cycles through this range a number of times:
(aProp setCycle:PCycle 5 2 4) cycles from palette 5 to palette 2,
4 times.
Of course, a caller can be added to any of the above conventions,
to cue, as any decent Cycler should.
10/01/90 Mark H.
The kernel call Lock has been added to lock and unlock resources.
This is to allow the application programmer to decide which
resources should locked or unlocked. Lock takes three parameters--
Resource type... VOCAB SCRIPT SOUND VIEW etc.
Resource ID... number of resource 999 002 etc.
Lock or UnLock... TRUE or FALSE to Lock or Unlock.
Be carefull!!! If you lock a resource yourself, it'll be in hunk forever,
unless you unlock it yourself. Two new functions selectors
have been added to the Memory kernel call. They are MReadWord
and MWriteWord for referencing and dereferencing addresses. Again,
more power, but more responsibility. You are now free to mess up heap
and hunk as much as you wish.
09/25/90 Mark H.
Added Oscillate cycler that will cycle a Props cels forward and
then back a given number of times. Changed MoveCyc to take a local array
address instead of a bunch of points so that it can handle more points
and save wods 'o heap. Removed Features default description and changed
handleEvent method to return FALSE if there is no description. Moved WordAt
procedure from PolyPath to since it has been used a lot recently...
it will, however be migrated to the kernel shortly. Added Erics changes to
sound that should fix the restore problem. Changed Grooper to not dispose
oldMover if it is also clients mover. Added global useObstacles that can
determine whether or not Ego will use a PolyPath if obstacles are present...
same for an Actors setDirection.
09/21/90 Mark H.
DPath now does an extra doit when reiniting itself to eliminate the
pause at the end of each node. Stop updated actors will no longer pop
through modeless dialogs when changing their update status. Resource
purging now uses a prioritized purging scheme based on resource type
instead of just least recently used. This helps to reduce disk thrashing
when nearing the edge of Hunk space. To go along with this change,
VOCAB and TEXT type resources are now unlocked. You may notice now that
a Load will happen when typing a Said or printing text. If you are completely
finished with a view in a Room you should use an explicit (UnLoad VIEW xxx)
since VIEW resource type is one of the last to go otherwise.
09/06/90 Mark H.
Actors delete method was changed to ensure that if a View is addToPic'd
it will be placed on the features list instead of disposed so that all
of your handleEvent/doVerb 's will work.
09/05/90 Mark H.
A caller property has been added to theDialog class. This has made
it possible to allow the Print procedure to take an optional parameter
after the #dispose: that is who to cue upon disposal of the modelessDialog.
The most useful example of this would probably be written as follows:
(instance foo of Script
(method (changeState newState)
(switch (= state newState)
(Print "This is a 5 second modeless dialog"
(Print "I got cued by the dialog itself.")
); changeState
Remember that the dispose method of Dialog has been rewritten
to cue caller if present, so other applications may be possible.
08/30/90 Mark H.
The kernel call Sort has been added to speed up sorted features,
however it has been written to be a general purpose sort and thus
is available for your everyday sorting needs. .
It is used as follows:
(Sort unSortedList sortedList scoringCode)
where the unSortedList is the list to be sorted, sortedList is an
uninstantiated (empty) list where the sorted list is to be placed
by the kernel call, and scoringCode is a piece of code that determines
the criteria for the sort. The scoringCode's doit should return a
number for each object that would determine its relative place in the
list. For example if you wished to sort the cast by their height on
the screen (their y property) the code would look like this:
(instance sortedList of List)
(instance yScoreCode of Code
(method (doit theObj)
(return (theObj y?))
(Sort cast sortedList yScoreCode)
and sortedList would now contain the cast sorted by their y properties.
The Sort algorithm is a simple modified bubble sort. Since most of our
applications will have less than a hundred elements this should be
close to optimum.
BE SURE TO DISPOSE OF THE sortedList!!!! If you do not, you will
definitely get hard to trace memory frags.
08/21/90 Mark H.
Actors setDirection method has been changed to allow ego to turn
if an arrow key was hit and he is up against an obstacle. Previously
he would ignore the key completely.
08/14/90 Mark H.
Polygons are here! The Polygon class was added to the system to
support Larry's Polygon based avoider. The Polygons are created
either manually or with Chad Bye's new Polygon Editor, and added
to the obstacle list via the Rooms addObstacle method. The mover
PolyPath is where the actual avoider stuff is hidden. It works
just like a MoveTo only it will find its way around any polygon
in the obstacle list. AddToPics will automatically add a suitable
Polygon to the obstacle list when the (addToPics doit:) is called
if the addToPics ignrAct bit is not set. The Polygons have also
found use in Features onMe method. To do this, redefine the Features
onMe method to check if a click was in a surrogate Polygon. The kernel
call AvoidPath will check if a given x,y is in a polygon if only these
three parameters are passed.
(local polyPts = [10 20 50 30 50 100 20 100 5 50])
(instance myPoly of Polygon)
(myPoly points:@polyPts, size:5)
(instance fooFeat of Feature
(method (onMe theObj)
(return (AvoidPath (theObj x?)(theObj y?) myPoly))
If this starts to get used alot, let me know and I'll automate the
process a little better. i.e. a polygon property of Feature.
Also, the scads of includes that used to slow down your compiles
in are now in-line with a few exceptions. The following
files are NOT included automatically now , and if you're using any
of the classes or procedures in their corresponding .sc files, you will
now need to explicitly include them. A small price to pay for the speed
up in my opinion.
The .sh file that will need to be manually included are: ;; if you're using the Cat class ;; if you're using the Demo Demon ;; if you're using the NameFind procedure ;; if you're using the Count procedure ;; if you're using the lastlink procedure ;; if you're using the gotosaid mechanisms
There were also minor changes to Views (a real isNotHidden method)
and the Grooper. Unfortunately, this means that a rebuild is necessary
if you use the Grooper.
Also, new tools thanks to Doug Oldfield and Mark Wilden and Chad Bye.
Doug has made two new cyclers that are in the system for your use.
MoveCycle which repositions the client for each cel. (This seems to be
the way alot of artists are doing things these days!) This saves the
need for a Script that just positions and sets a cel in every state
(Hand carved animation). Also RandCycle that just picks cels at random
for a specified number of times, or forever. This is useful for mouth
animation while talking. Mark Wildon has created a Dialog building tool
that can really simplify 90 percent of your everyday dialog needs. It
is a procedure called PrintD and is also now in the system. Chad Bye has
added an excellent Polygon Editor (and pather for the other avoider) called
pather. To invoke it, simply put (MakePath doit:) in the appropriate place
in your debug module (or wherever). Documentation for all is coming soon
(soon is a relative term), but for now, look at the modules for the
programmers own docs. Sorry this is so long, but I have been delinquent
at keeping this up to date, and a lot has happened. As always...
we're looking for new tools, so let me know if you've made something
that is nice and general purpose and fills a gap in our current library.
08/04/90 Mark Wilden
Added new FileIO functions fileFindFirst, fileFindNext and fileExists.
Added Memory function MCopy.
08/02/90 Mark Wilden
The function selectors for stack usage kernel calls were backwards;
i.e. (StackUsage MStackSize) returned the size of the processor
stack instead of the PMachine stack.
07/09/90 Mark Wilden
IBMKBD.DRV and TANDYKBD.DRV were changed. Now the only keyboard
event modifiers are when shift keys (including Ctrl and Alt) are
pressed. The state of Ins, Caps Lock, etc. as well as differences
in certain BIOSs are now ignored. The new drivers are in I:, S:
and the tester directory.
07/03/90 Mark H.
The Feature class now allows the programmer to decide wether or not
they would like the proximity checks done if a shift or control click
was detected. The define NOCHECKMOUSE should be or'ed with the verb
number for the shftClick and contClick properties.
(i.e. (theActor shftClick: (| NOCHECKMOUSE verbLook))
Also a bug in the setChecks method was discovered and fixed.
The Feature writer now also will allow testing of features created
and also allows editing of Features, Views etc that were already in
the room.
07/02/90 Mark H.
Actors code property now gets done even if object is not updating .
View and PicView can no longer inherit the dispose method of Feature
since Feature's dispose now deletes it from the features list.
06/26/90 Mark H.
There have been several additions to the interpreter.
Memory allocation and deallocation has been added as well as
List manipulation functions. Heap memory allocation is handled through
the kernel call Memory and has three enumerated function definitions:
(= thePointer (Memory MNeedPtr amount)) -
requests that "amount" bytes will be allocated and the pointer
to the memory is returned to thePointer. If the memory is not
available SCI aborts with the all to familiar "Out of Heap Space".
(= thePointer (Memory MNewPtr amount))
same as above, but simply returns a null pointer if memory is not
(Memory MDisposePtr thePointer)
Deallocates the memory pointed to by pointer.
This function should be used carefully and make sure to deallocate all
the memory that you have allocated. List manipulations can now be sped up
with the ListOps kernel call.
The lines of Code below will speed up the list processing by approximately
a factor of four.
(method (eachElementDo theSelector)
(ListOps LEachElementDo theSelector &rest)
Also available as function definitions are LFirstTrue and LAllTrue.
Bob has also put the kernel hooks in for the AIPath from the
Chris Iden. More about that later... Stay tuned.
06/20/90 Mark Wilden
The File class and kernel calls have been changed and added to. In
the kernel there is now just one entry point for all file functions:
FileIO. An enumerated value is sent to FileIO to indicate the desired
function (see kernel.txt or for these values). Several new
file functions were added: read and write, which operate on arbitrary
data; seek, which moves the file pointer; and unlink, which deletes a
The File class was changed to reflect these modifications; in
particular, the read: and write: methods now refer to raw file
access--use readString: and writeString: to read or write zero-
terminated strings.
06/13/90 Mark H.
Added new cycler that takes care of the out of sync walk cycler
with moveSpeeds greater than 1. Its called SyncWalk and it is in Also the need for the rebuild is that user has a property
called verbMessager that lets you define your own verb message
numbers. This will make more sense when my documentation is finished.
06/11/90 Mark H.
We have a new system, folks. A rebuild of your game will be
necessary if you are using \games\sci\system. After receiving
a lot of great input from Bob, Pablo, Corey, Mark W., Chris I.,
the SQ4 crew and anyone else I forgot to mention, the Feature
class has been completely rewritten (again). The documentation
is following closely behind, so sometime tomorrow it should be
complete. Besides all the stuff added to Feature, User canInput
is now a method. This gives you the ability to break on it and
also allows redefinition of it to do things with the cursow
(or whatever). There is also a setHeading method of Actor
that should now always be used. Instead of code like
(anActor loop: facingSouth) you should write something like
(anActor setHeading: 180). Besides keeping things consistant
between an actors heading and his loop, (for those using sorted
features), it also fires a looper if one is attached. There is an
optional whoCares parameter (like motion and cyclers) that will
cue something when the turn is completed. IF ANY BUGS OR
If you don't like the way something works don't abandon it!!!
Tell me your suggestions and the system will be better for it.
There will be much better doco and examples coming soon.
For those wanting to get started with the feature writer
let me know and I'll step you through.
06/04/90 Mark H.
The IsOffScreen procedure in has been changed due
to a bug pointed out by Mark W.. It now correctly used the
southEdge define instead of the SCRNHIGH define. 0 is now
also considered on screen.
05/24/90 Mark H.
Added MoveFwd Class. Just pass a distance you want to move
and the Actor will move in the direction he is pointing.
As usual, either preload the module or dispose of it when
you're done to prevent frags. See module for usage
05/08/90 Corey
Removed initialization of "version" in, since you
can't auto-initialize a global variable to a string pointer.
It is now *required* that you have a line such as:
(= version {x.yyy____})
(or anything else you want to initialize "version" to) in the
(init) method of your room 0 instance of Game. Actually, this
was always needed, but simply gave you bad Save games before.
Suggested strings are either {x.yyy____} or {x.yyy.zzz} for
"incver" compatibility (either can be used for auto-incrementing
version number via incver).
05/04/90 Mark Wilden & Corey Cole
Fixed bugs in "Extra" class when minPause, minCycles, or hesitation zero.
Also improved behavior of ExtraEndAndBeginLoop (now allows the pauseCel
to be the last cel of the loop).
05/03/90 Bob
GetTime SYSDATE returns date since 1980.
04/02/90 Mark H.
The module has a slight change to fix a bug pointed
out by Mark W. and Gary K. If a horizon was non-zero in a room
and ego was ignoreHorizon, Then if ego walked above the horizon
he could walk east and not change rooms. Also a fix in
03/20/90 Larry & Corinna
The op. code mod accomodates negative numbers now.
03/20/90 Corey
Does not save control map if it's not going to draw into it
for stop updated actors.
03/20/90 Larry & Corinna
When get an "Out of heap space" error, if running with the
sci debugging on (-d) it goes into the sci debugger then exits.
If running without debugging on, it just exits (this is in
case a customer runs into this error).
01/18/90 Stuart
All new and some-what improved sound drivers in system directory.
Changed restart controller to return to loop point in sound,
instead of beginning of sound. This change should not effect
game programmers.
01/08/90 Bob
Increased required "minimum hunk" available to 320K from 136K.
This should not affect anyone during development, and is intended
to reduce problems encountered in the field. Please let me know
if this change causes problems.
12/09/89 Bob
Modified GetTime kernel call as follows to provide more functions:
(GetTime) - returns low word of 60th second counter (unchanged)
(GetTime SYSTIME1) OR (GetTime 1) or (GetTime TRUE) are all
equivalent and will return the same value as before, but NOTE
the "1" or "TRUE" are the non-prefered forms although the value
of SYSTIME1 is also 1.
(GetTime SYSTIME2) - returns a 24 hour clock that is limited to
2 seconds of resolution.
(GetTime SYSDATE) - returns the systems concept of the day it is
in a packed YEAR/MONTH/DAY word.
The standard system files have been modified to conform to this new
For those who have "frozen" systems and NEED new interpreter
(required for those groups using LOGGER), changes were needed
in,, and
This change has a great degree of backward compatibility. To ensure
that you have no problems, merely GREP for GetTime in all your
source file and ensure that IF you passed an argument it was == to
1 (ie "1" or TRUE). If this is not the case change each occurrence
and recompile.
follows some code showing how to use each case. Defines for each
function have been placed in KERNEL.SH.
; print current 12 hour time as in 01:30:22 (assume PM)
(= tm (GetTime SYSTIME1))
(>> tm 12)
(& (>> tm 6) %111111)
(& tm %111111)
; print current 24 hour time as in 13:30:22
(= tm (GetTime SYSTIME2))
(>> tm 11)
(& (>> tm 5) %111111)
(* (& tm %11111) 2)
; print current DATE as in 12/09/1989 (only good through 1999)
; years value is number of years since 1980
(= tm (GetTime SYSDATE))
(& (>> tm 5) %1111)
(& tm %11111)
(+ 80 (>> tm 9)) ; you must add 80 to return value
12/01/89 Stuart:
Minor changes to INSTALL.HLP -
1. A warning label for the MT-32
2. Changes in the text of Casio help screens
11/17/89 Jeff:
There is now a "fragment analyser" built into the debugger. It is
invoked by 'F' and displays all allocated heap following the first
free block. Objects are displayed as usual. Other allocated memory
has a code inside angle brackets, followed by the address. The codes
<l> a list
<n> a list node
<e> an event
<mxxx> module node for module xxx
<sxxx> sound node for sound xxx
If people don't find this particularly useful, let me know. We don't
have the code space to make it more useful, and I'd like to pull it
out (reducing interpreter size) if it's not being used.
The SC compiler has a new switch (-w) which causes words in the