Microsoft-3D-Movie-Maker/SRC/SHARED/UTIL.CHT

426 lines
16 KiB
Plaintext

/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
// ---------------------------------------------------------
//
// Revisions:
//
// mm-dd-yy
// ??-??-94 ****** - Created
// 05-16-95 ****** - remove unimplemented hooks
// 06-15-95 ****** - Added globals list
// ---------------------------------------------------------
//
// Global Variables:
//
// cnoMidi Manage the midi soundtrack. Always music playing -- music
// siiMidi pointed to by cnoMidi. siiMidi is the Kauai Sound Instance
// ID associated with the soundtrack.
//
// kstEntry This indicates which entry point into a room the user
// is using.
//
// fHelpOn Indicates whether Help is turned on in the Building. If Help
// is turned on, McZee's (and Melanie's) Help bubbles appear
// automatically upon entry into a room. Conversely, if the
// user clicks on McZee (or Melanie) to bring up the Help bubble,
// fHelpOn gets set.
//
// fMovie Indicates whether there is currently a movie loaded; i.e.,
// whether there is a movie selected in the Portfolio.
//
// fTrans Palette transition variables. fTrans indicates that the next
// cnoPal SETPALETTE should do a palette-to-palette transition effect.
// Setting it to fFalse, turns off the transition effect for the
// next SETPALETTE, after which it will be reset to fTrue.
// cnoPal stores the current palette so that SETPALETTE can
// determine if a palette change is really necessary.
//
// keys keys is a bitfield describing the Set of enabled hotkeys.
// keysTmp keysTmp is used to save the set of valid hotkeys between
// DISABLE and ENABLE hotkeys calls.
//
// cDisable Number of times the keyboard accelerators have been disabled
// from script via cidDisableAccel.
//
//
#include "helptops.h"
// ---------------------------------------------------------
// Initialization script for shared.chk is called by app on startup. It
// creates kgobUtil and runs its Script0.
// ---------------------------------------------------------
SCRIPTCHUNK("Init Shared", kcnoInitShared)
DEBUGCMD(PrintStr("Running shared init script"));
CreateChildThis(kgobUtil, kgobUtil);
RunScriptGob(kgobUtil, kchidScript0);
ENDCHUNK
// -----------------------------------------------------
// help TOPIC definitions
// -----------------------------------------------------
// WARNING: Since help topics declared here are actually provided as part of
// the Building chunk, these numbers need to be the same as the ones in
// building\socdefn.h
#define ktpcQuitAlert 0x00016043
#define ktpcHelpAbout 0x0001604f
WAVE_CHUNK( "shared\sound\util\splot.wav", kwavSplot )
WAVE_CHUNK( "shared\sound\util\ding.wav", kwavDing )
// ---------------------------------------------------------
// The following is the object definition for the utility
// object.
// ---------------------------------------------------------
GOBCHUNK( "Utility object", kgobUtil, 0 )
DEFAULT_POSITION( 0,0, 0 )
ENDCHUNK
// ---------------------------------------------------------
// This is the first Gob to get created. Do a whole lot of
// initialization stuff.
// ---------------------------------------------------------
CHILD_SCRIPT( "Util:start up", kchidScript0 )
SETKEYS(kflgBuildingAll);
// The following are well known 'global' variables connected
// to the UTIL gob... it's assumed that this list will grow
// NOTE: MAKE SURE ALL GLOBALS ARE INITIALIZED HERE!
SETGLOBAL(cnoMidi, cnoNil);
SETGLOBAL(fHelpOn, fTrue);
SETGLOBAL(fMovie, fFalse);
SETGLOBAL(cnoPal, cnoNil);
SetProp(kpridBuildingState, kst1);
// Initializing a global variable used for tracking the voice over WAVE file
// and stoping it when needed. Used in the macros VOICE(..) and ENDVOICE();
::siiVoice = 0;
// A global variable used to track if there is a scene transition occuring.
::fTransition = fFalse;
// These flags are used to indicate whether or not we've visited this
// room previously in this session.
SETGLOBAL( fLobby1PS, fTrue ); // Flag, for Lobby1, indicates 1st time in room per session (PS)
SETGLOBAL( fBackstagePS, fTrue );// Flag, for Backstage, indicates 1st time in room per session (PS)
SETGLOBAL( fIdeasPS, fTrue ); // Flag, for Ideas room, indicates 1st time in room per session (PS)
SETGLOBAL( fTicketPS, fTrue ); // Flag, for Ticketbooth, indicates 1st time in room per session (PS)
SETGLOBAL( fStudioPS, fTrue ); // Flag, for Studio, indicates 1st time in room per session (PS)
// These flags are used to indicate whether or not we've seen the
// help/introduction animation for this room or not. They are fTrue
// if the help has not been seen.
SETGLOBAL(fLob1stHelp, fTrue);
SETGLOBAL(fTic1stHelp, fTrue);
SETGLOBAL(fBkstg1stHelp, fTrue);
// read bio page found flag
BIO_INIT();
// global flag: has the McZee in front of studio tools intro been played?
::fStdIntro = fFalse;
If( GetProp( kpridMcZeeAudio ) & kflgMcZeeAudio );
// suppress the intro too -- the RonPa fix!
::fStdIntro = fTrue;
End;
// set according to help status in the studio, keep track of which is the Next Project
::fHelpOn = fFalse;
::NextProject = 1;
// Initialize more global globals.
::volume = 50;
::kgobCurrentPlace = kidNil;
::fInStudio = fTrue;
// First palette is set without a transition effect.
SETGLOBAL(fTrans, fFalse);
// Number of times we've called disable is 0 to start with.
kgobUtil->cDisable = 0;
// Set this gob up to filter for map, open, and new commands;
// Redirect them to Script6.
// Note: Ctrl+O and Ctrl+N are translated by the app's accelerator
// table into cidOpen and cidNew. We want to filter for those cids
// as well, but only when the building is loaded, so those filters
// are turned on in the Building Script0 and turned off in LOADTOOLS.
FilterCmdsThis( cidMap, kidNil, kchidScript6 );
ENDCHUNK
// ---------------------------------------------------------
// Switch from one place to another. Maintains ::kgobCurrentPlace.
//
// _parm[0] is the cno of the place we're to go next.
// _parm[1] is the state we're to enter that place in.
// ---------------------------------------------------------
CHILD_SCRIPT( "Util:nextplace function", kchidScript1 )
ASSERT(_parm[0] != kidNil);
ASSERT(_parm[1] >= kst1);
DEBUGCMD(PrintStr("Moving to ", NumToStr(_parm[0], ""), " with state = ", NumToStr(_parm[1], "")));
If (_parm[0] != GET_CURRENTPLACE());
SETGLOBAL(kstEntry, _parm[1]);
If (GET_CURRENTPLACE() != kidNil);
DestroyGob(GET_CURRENTPLACE());
End;
SET_CURRENTPLACE(_parm[0]);
CreateChildGob(GidParThis(), _parm[0], _parm[0]);
End;
FlushUserEvents(kgrfevtAll);
ENDCHUNK
//----------------------------------------------------------
// This function is called when the user calls up the Portfolio via
// CTRL+O and then closes it by pressing either Cancel or OK. The
// Portfolio is opened in the Keyboard handler in Script6.
//
// _parm[2] is fTrue if the user pressed OK; fFalse if they
// pressed Cancel.
//----------------------------------------------------------
CHILD_SCRIPT("Util: Portfolio Callback", kchidScript2)
// End this filter as it is no longer required.
FilterCmdsThis(cidPortfolioClosed, cidNil, chidNil);
If (_parm[2]); // User clicked OK
LOADTOOLS(kgobStudio1, kst1, chidNil);
End;
ENDCHUNK
//----------------------------------------------------------
// Function to lock out hot spots.
//
// _parm[0] is hot key state as well
//----------------------------------------------------------
CHILD_SCRIPT( "Util: glass function", kchidScript3 )
If( FGobExists( kgobGlass0 ) == fFalse);
// create the balloon and set hotkeys appropriately
CreateChildGob(GET_CURRENTPLACE(), kgobGlass0, kgobGlass0);
End;
SETKEYS( _parm[0] );
ENDCHUNK
//----------------------------------------------------------
// Function to manage midi music. see SETMUSIC() #define
// in util.h --- _parm[0] = cno of the MIDI chunk
// _parm[1] = bool : loop or not.
//----------------------------------------------------------
CHILD_SCRIPT( "Util: midi function", kchidScript4 )
If( _parm[0] != .cnoMidi );
If( .cnoMidi != cnoNil );
// stop the last MIDI played. .siiMidi is always ok.
// because of .cnoMidi usage
StopSound( .siiMidi );
End;
If( _parm[0] != cnoNil );
cnt = ( _parm[1] ) ? 0x00010000 : 1;
.siiMidi = PlaySoundGob( kgobUtil, kctgMidi, _parm[0], 1, 0x00010000, cnt, 4, ksclBldgSound );
End;
.cnoMidi = _parm[0];
End;
ENDCHUNK
// ---------------------------------------------------------
// These script invokes and handle confirm exit help balloon
// ---------------------------------------------------------
CHILD_SCRIPT( "Util:quit app", kchidScript5 )
// Put up the glass and then a help ballooon to confirm quit
CreateChildGob( SUPERPARENT(), kgobGlass1, kgobGlass1 );
CreateHelpGob( kgobGlass1, ktpcQuitAlert );
.keysTmp = KEYSTATE(); // save valid hotkeys
SETKEYS( kflgKEYNONE ); // then disable all hotkeys
ENDCHUNK
// ---------------------------------------------------------
// Script to handle Incoming cids.
// ---------------------------------------------------------
CHILD_SCRIPT( "Util:handle cids", kchidScript6 )
// _parm[0] = gid/hid
// _parm[1] = CID (cidMap, cidOpen, cidNew or cidLoadStudioDoc)
//---------------------------PORTFOLIO KEY--------------------------
If (_parm[1] == cidOpen && KEYENABLED(kflgKEYPORTFOLIO));
// Bring up the Movie Open portfolio.
EnqueueCid(cidPortfolioOpen, 0, kpfPortOpenMovie, 0, 0, 0);
// Look out for the cid indicating that the portfolio has been closed.
FilterCmdsThis(cidPortfolioClosed, cidNil, kchidScript2);
Elif (_parm[1] == cidOpen && !KEYENABLED(kflgKEYPORTFOLIO));
ModalHelp(ktpcercSocCantGoToStudio, -1);
//---------------------------TOOLS KEY--------------------------
Elif (_parm[1] == cidNew && KEYENABLED(kflgKEYTOOLS));
// Open the tools with a new movie.
EnqueueCid(cidPortfolioClear, 0, 0, 0, 0, 0);
LOADTOOLS(kgobStudio1, kst1, chidNil);
Elif (_parm[1] == cidNew && !KEYENABLED(kflgKEYTOOLS));
ModalHelp(ktpcercSocCantGoToStudio, -1);
//---------------------------MAP KEY----------------------------
Elif (_parm[1] == cidMap && KEYENABLED(kflgKEYMAP));
If (::fInStudio);
DEBUGCMD(PrintStr("Bringing up map from studio"));
CreateChildGob(kidBackground, kgobMapMain, kgobMapMain);
Else;
DEBUGCMD(PrintStr("Bringing up map from building"));
CreateChildGob(GET_CURRENTPLACE(), kgobMapMain, kgobMapMain);
End;
Exit();
Elif (_parm[1] == cidMap && !KEYENABLED(kflgKEYMAP));
ModalHelp(ktpcercSocCantGoToMap, -1);
//------------------------cidLoadStudioDoc----------------------
Elif (_parm[1] == cidLoadStudioDoc && KEYENABLED(kflgLOADSTUDIO));
LOADTOOLS(kgobStudio1, kst1, chidNil);
Elif (_parm[1] == cidLoadStudioDoc && !KEYENABLED(kflgLOADSTUDIO));
EnqueueCid(cidPortfolioClear, 0, 0, 0, 0, 0);
ModalHelp(ktpcercSocCantGoToStudio, -1);
End;
ENDCHUNK
//----------------------------------------------------------
// Function to switch to a new palette, doing a palette transition
// if necessary. Also sets cnoPal, which always contains the current
// building palette.
//
// _parm[0] is the palette to switch to.
//----------------------------------------------------------
CHILD_SCRIPT( "Util:switch palette", kchidScript7 )
::fTransition = fFalse;
If ( (_parm[0] != GLOBAL( cnoPal)) && GLOBAL(fTrans) && (_parm[0] != cnoNil) );
// different palette than what we had + okay to transition
Transition(kgftDissolve, 0, kTransitionTime, Transparent, _parm[0]);
::fTransition = fTrue;
Else;
// either the same palette or not allowed to transition, so just
// switch the palette
If( _parm[0] != cnoNil );
SetColorTable(_parm[0]);
End;
End;
SETGLOBAL( cnoPal, _parm[0] );
SETGLOBAL(fTrans, fTrue); // Reset default state of fTrans.
ENDCHUNK
// --------------------------------------------------------------
// Function to load the studio tools. First, it sets up
// kpridBuildingGob with the place to return to. Corresponds to
// LOADTOOLS macro defined in sharutil.chh.
//
// _parm[0] specifies where the studio should come back to when it
// returns to the Building.
// _parm[1] specifies what state the return place in the Building
// should enter in.
// _parm[2] specifies which project the tools should be loaded with, if
// any. Set to 0 to indicate no project.
// --------------------------------------------------------------
// cnoForeign and kgobForeign indicates that a non-building place is the
// current place and it has a potentially different palette from the return
// place.
#define cnoForeign cnoNil
#define kgobForeign kidNil
CHILD_SCRIPT("Util: Load Studio", kchidScript8)
ASSERT(_parm[0] != kidNil);
DEBUGCMD(PrintStr("Util: Loading Studio"));
StartLongOp();
// Stop filtering for these -- let the studio filter for them now.
FilterCmdsThis(cidOpen, kidNil, chidNil);
FilterCmdsThis(cidNew, kidNil, chidNil);
FilterCmdsThis(cidLoadStudioDoc, kidNil, chidNil);
// And make sure our hotkeys are enabled -- the Studio takes care
// of enabling/disabling hotkeys from here in.
ENABLEHOTSPOTS(kflgBuildingAll);
.kgobCurrentPlaceT = GET_CURRENTPLACE();
SetProp(kpridBuildingGob, _parm[0]);
SETGLOBAL(cnoPal, cnoForeign);
SETGLOBAL(kstEntry, _parm[1]);
SetProp(kpridBuildingState, _parm[1]);
SET_CURRENTPLACE(kgobForeign);
// Deal with failure to load the studio.
FilterCmdsThis(cidLoadStudioFailed, kidNil, kchidScript9);
// Stop the soundtrack.
PLAYMIDI(cnoNil);
EnqueueCid(cidLoadStudio, 0, .kgobCurrentPlaceT, _parm[2], 0, 0);
::fInStudio = fTrue;
ENDCHUNK
// --------------------------------------------------------------
// This function gets called if we try to load the tools in
// Script8 and fail for whatever reason. We just need to undo
// everything we did in Script8 before enqueuing the LoadStudio
// command. A couple things won't be restored -- cnoPal will still
// be set to cnoForeign; the soundtrack will still be stopped.
// --------------------------------------------------------------
CHILD_SCRIPT("Util: Load Studio Failed", kchidScript9)
DEBUGCMD(PrintStr("Load Studio Failed handler"));
::fInStudio = fFalse;
SET_CURRENTPLACE(.kgobCurrentPlaceT);
EnqueueCid(cidPortfolioClear, 0, 0,0,0,0);
FilterCmdsThis(cidLoadStudioFailed, kidNil, chidNil);
FilterCmdsGob(kgobUtil, cidOpen, kidNil, kchidScript6);
FilterCmdsGob(kgobUtil, cidNew, kidNil, kchidScript6);
EndLongOp(fTrue); // If the studio set the wait cursor, turn it off.
ENDCHUNK
// ---------------------------------------------------------
HELP_SCRIPT( ktpcQuitAlert )
// _parm[0] = what happenned. 0=init, 1=exit, 2=cancel
If( _parm[0] == 2 ); // cancel
DestroyGob( kgobGlass1 );
SETKEYS(kgobUtil->keysTmp); // restore hot key setting
DestroyGob( GidParThis() );
Elif( _parm[0] == 1 );
EnqueueCid( cidQuit, 0,0,0,0,0 );
End;
ENDCHUNK
// ---------------------------------------------------------
// This is the glass behind the help balloon
// ---------------------------------------------------------
OBJECT( "glass#1", kgobGlass1, 1000, kcrsArrow1 )
REP_FILL( CHID1(krepDefault),"glass1", 0,0, 640, 480, Palette( 15 ), Transparent )
PATTERN_50
ENDCHUNK
CLICK_SCRIPT( "glass#1 clicked!" )
// play a honk sound here.
ENDCHUNK
// ---------------------------------------------------------
// This object is used to lock out clicks on hot spots.
// ---------------------------------------------------------
OBJECT( "glass#0", kgobGlass0, 975, kcrsArrow1 )
REP_FILL( CHID1(krepDefault),"glass0", 0,0, 640, 480, Palette( 15 ), Transparent )
PATTERN_0
ENDCHUNK
CLICK_SCRIPT( "glass#0 clicked!" )
PlaySoundThis( kctgWave, kwavSplot, 1, 0x00010000, 1, 0, 789 );
ENDCHUNK
// -----------------------------------------------------
// script to handle 'Help, About' balloon
// -----------------------------------------------------
HELP_SCRIPT( ktpcHelpAbout )
If( _parm[0] != 0 );
DestroyGob( GidParThis() );
End;
ENDCHUNK